[[2009a]]課題2 黒い線に沿って動くロボット *目次 [#n63933ef] #contents *メンバー紹介 [#hc046c2b] -Mas:主にホームページの作成担当 -Y.Y:主にロボットの製作担当 *課題内容 [#ib6c29f4] 1.紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む 2.紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む *ただしどちらの場合においても速さと正確さを追求し、コースを3周したら自動的に止まらなければならない *コースの紹介 [#u41c67c5] ロボが反応しやすいよう交差点を直交させ、できるだけシンプルなコースに。 そのため直線を多用したコースになっている。 &ref(090703_1558~01.jpg); *ロボットの紹介 [#j7d3fc30] 最終的なロボの全体像。少し大きくなり過ぎてしまった感は否めない。 そのため曲がる際に設置した紙パックを動かしてしまうこともしばしば。 &ref(090703_1620~01.jpg); 初めはタイヤ4つでいこうと思っていたが、もう少しスムーズに曲がれるようにこのような形にした。 ただ、少し強度が弱かったので途中はずれてしまうこともあった。 &ref(090703_1620~02.jpg); 最初は光センサーの反応が悪く、コースに沿って進むことができなかった。光センサーを紙面にできるだけ近づけることで解消された。 コース通りに進んでくれたときは少し感動した。 &ref(090703_1621~01.jpg); 紙パックに対する反応の精度を上げるためにこのような形になった。以前はタッチセンサーが反応せずに、そのまま運んでいってしまっていた。 &ref(090703_1621~02.jpg); *プログラムの紹介 [#rcd02ec0] **Masのプログラム [#l25d8b96] #define front(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進の定義 #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退の定義 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(time);Off(OUT_A+OUT_C); //左折の定義 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time);Off(OUT_A+OUT_C); //右折の定義 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); int n; //交差点を通った回数 n=0; while(n<12) { if ((SENSOR_1>light)&&(SENSOR_3>light)) //左右両方が白の場合 { OnFwd(OUT_A+OUT_C); //前進 } if ((SENSOR_1> light)&&(SENSOR_3<light)) //左が白、右が黒の場 合 { OnFwd(OUT_A); OnRev(OUT_C); //右折 } if ((SENSOR_1< light)&&(SENSOR_3>light)) //左が黒、右が白の場合 { OnFwd(OUT_C); OnRev(OUT_A); //左折 } if (SENSOR_2==1) //タッチセンサーが作動する場合 { front(50); //0,5秒前進 turn_left(90); //左に180度旋回 back(50); //0,5秒後退し、牛乳パックを置く turn_left(90); //左に180度旋回 } } if((SENSOR_1<light)&&(SENSOR_3<light)) //左右両方黒の場合 { Off(OUT_A+OUT_C); //停止 Wait(200); OnFwd(OUT_A+OUT_C); //前進 Wait(50); n=n+1; //関数nに+1する } Off(OUT_A+OUT_C); //停止 } } **Y.Yのプログラム (紙パック回避)[#w05d9aaa] #define time 65 #define light 50 #define front(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進の定義 #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退の定義 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(time);Off(OUT_A+OUT_C); //左折の定義 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time);Off(OUT_A+OUT_C); //右折の定義 sub avoid() //紙パックを避ける { back(50); //後退 turn_right; //右折 front(150); //前進 turn_left; //左折 front(250); //前進 turn_left; //左折 front(150); //前進 turn_right; //右折 } task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); int n; //交差点を通った回数をカウントする n=0; while(n<12) { if ((SENSOR_1>light)&&(SENSOR_3>light)) //左右両方が白の場合 { OnFwd(OUT_A+OUT_C); //前進 } if ((SENSOR_1> light)&&(SENSOR_3<light)) //左が白、右が黒の場合 { OnFwd(OUT_A); OnRev(OUT_C); //右折 } if ((SENSOR_1< light)&&(SENSOR_3>light)) //左が黒、右が白の場合 { OnFwd(OUT_C); OnRev(OUT_A); //左折 } if (SENSOR_2==1) //タッチセンサーが作動する場合 { avoid(); //紙パック回避 } if((SENSOR_1<light)&&(SENSOR_3<light)) //左右両方黒の場合 { Off(OUT_A+OUT_C); //停止 Wait(200); OnFwd(OUT_A+OUT_C); //前進 Wait(50); n=n+1; //関数nに+1する } Off(OUT_A+OUT_C); //停止 } } *感想 [#d4370612] Mas:プログラミングにおいてもロボ作りにおいても、Y.Y氏に迷惑をかけっぱなしだった。ごめんなさい。 Y.Y: 今回も前回と同じでロボの制作に手間取ってしまい、なかなかプログラムが出来なかった。 4輪を3輪に変えたとき以前よりも遥かによく曲がるようになってびっくりした。 紙パックを避けるプログラムはあまり思い通りにいかないので大変だった。 **コメント [#w84e1655] コメントをお願いします - ぜひインデント(ifの階層などごとに入れる字下げ)を入れてください。どこからどこまでがどのifの中身なのかわかりやすくなります。シンプルでわかりやすいプログラムですが、nが何をカウントしているかなどもぜひ説明してください。 -- [[こさか]] &new{2009-07-10 (金) 12:24:32}; #comment