*ロボットの紹介 [#xad7c17c] -アームの部分が予定より大きくなってしまったので、ロボットの本体を少し後ろに設置することで重心が前に行き過ぎないようにしました。 -アームの形をシンプルにすることで、安定して缶をつかめるようにしました。 -タッチセンサーを使わないことで、缶が軽すぎて反応しないという問題点を解決しました。 *コース攻略 [#b8c0055d] -時間を、円の手前(缶をつかむ)、1個目の円、2個目の円、残りとかんを離す作業の4つにわけて攻略しようとしたが、あまり上手くいかなかった。 *プログラムの説明 [#ab8ab5e8] #define THRESHOLD 48 #define HIPOWER 7 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define arm_forward set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); #define arm_backward set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B); #define turn_left1 set_power_L ;\ OnFwd(OUT_C);OnRev(OUT_A); #define turn_left0 set_power_L ;\ OnFwd(OUT_C);Off(OUT_A); #define turn_right0 set_power_L ;\ OnFwd(OUT_A);Off(OUT_C); #define turn_right1 set_power_L ;\ OnFwd(OUT_A);OnRev(OUT_C); #define STEP 1 #define nMAX 30 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 20 #define cross_line set_power_L;\ OnFwd(OUT_A);OnRev(OUT_C);\ Wait(CROSS_TIME);short_break; task main () { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; ClearTimer(0); while(FastTimer(0)<=400){ while(nOnline < nMAX && FastTimer(0)<=400){ if(SENSOR_2< THRESHOLD -8) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -3){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +8){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } Off(OUT_AC); OnRev(OUT_B); Wait(10); arm_forward; PlaySound(SOUND_UP); while(FastTimer(0)<=900){ while(nOnline < nMAX && FastTimer(0)<=900){ if(SENSOR_2< THRESHOLD -8) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -3){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +8){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); ClearTimer(0); turn_right1; Wait(10); arm_forward; while(FastTimer(0)<=1300){ while(nOnline < nMAX && FastTimer(0)<=1300){ if(SENSOR_2< THRESHOLD -10) { turn_right1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -4){ turn_right0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +10){ turn_left0; }else{ turn_left1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); turn_left1; Wait(10); arm_forward; while(FastTimer(0)<=2000){ while(nOnline < nMAX && FastTimer(0)<=2000){ if(SENSOR_2< THRESHOLD -10) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -4){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +10){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); arm_forward; while(FastTimer(0)<=2650){ while(nOnline < nMAX && FastTimer(0)<=2650){ if(SENSOR_2< THRESHOLD -8) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -3){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +8){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); arm_forward; while(FastTimer(0)<=3100){ while(nOnline < nMAX && FastTimer(0)<=3100){ if(SENSOR_2< THRESHOLD -10) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -4){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +10){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); turn_left1; Wait(10); arm_forward; while(FastTimer(0)<=3800){ while(nOnline < nMAX && FastTimer(0)<=3800){ if(SENSOR_2< THRESHOLD -8) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -3){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +8){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } } PlaySound(SOUND_UP); turn_left1; Wait(300); arm_backward; OnRev(OUT_AC); Wait(100); turn_left1; Wait(150); while(FastTimer(0)<=6000){ while(nOnline < nMAX && FastTimer(0)<=6000){ if(SENSOR_2< THRESHOLD -8) { turn_left1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -3){ turn_left0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +8){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1;Wait(nMAX*STEP); cross_line; nOnline=0; } } *感想 [#q6db5aad] -ライントレースをするロボットを作ることは実際にやってみるととても難しく、様々な困難がありました。しかしその問題点を解決するためにどのようなロボット、そしてプログラムにすればよいかといろいろと悩むことで、新しい発見ができました。例えば、電池の残量やロボット本体の重さ・重心などの様々な原因で光センサーの値や移動速度が変化してしまうので、常に同じ動きができるわけではない。ではその問題が動作そのものにできるだけ支障を出さないようにするにはどうすればよいか。それには、Waitをあまり使わないようにすることが大切です。Waitはある一定時間その動作を続けるというプログラムなので、電池残量が大きくかかわってしまうからです。このほかにもいろいろな問題点がありましたが、そのたびになぜそうなるのか、どうすればそうならないか、を考えることで、大変でしたが何とかできるようになったと思います。 *反省点 [#gc8ee745] -自分のパソコンでUSBメモリが起動できず、ペアにとても迷惑をかけてしまった。 -この講義の勉強にあまり時間をかけられなかった。 -サブルーチンや関数などを完璧に理解できてない。 *まとめ [#rc4a5766] -最初はプログラムが全く理解できずにとても戸惑った。一応の完成はしたが、理解できていないところも多くペアには本当に迷惑をかけてしまって申し訳なかった。 -成功するときもあったが失敗のが多いので、今回の反省点を見つめなおし次回の次の課題に活かしていきたい。