#author("2020-01-09T22:52:18+09:00","Takehiko","Takehiko") #author("2020-01-10T00:00:18+09:00","Takehiko","Takehiko") *課題 [#o9c745d8] 画像の赤線のコースを通って動くロボットを作成する。 #ref(2019b-mission2a.png) 1 A地点から出発~ 2 J~ 3 H (直進)~ 4 I (ボール or キューボイドをつかんでUターン)~ 5 H (右折)~ 6 G (一時停止の後、直進)~ 7 D (右折)~ 8 E, F 通過~ 9 G (一時停止の後、直進)~ 10 C (一時停止の後、左折)~ 11 B (一時停止)~ 12 A地点に入る(ゴール)~ *作成したロボット [#s6370ea3] #ref(robo2a.JPG) 光センサーはライントレースに用いられる。超音波センサーでボールを探す。シンプルな機構にするのを心がけた。 *作成したプログラムについて [#l046dc74] -ライントレース --光センサー 上記の通り、光センサーを用いて、黒い線をトレースする。~ #define turn_l2 OnFwd(OUT_B,30);OnFwd(OUT_C,-30); /左に旋回 #define turn_l1 OnFwd(OUT_B,30); /左に回転 #define go_fwd OnFwd(OUT_BC,30); /直進 #define turn_r1 OnFwd(OUT_C,30); /右に曲がる #define turn_r2 OnFwd(OUT_B,-30);OnFwd(OUT_C,30); /右に旋回 あらかじめこのようにマクロを作った。次にしきい値を自分で設定し、if構文を用いて、センサーで判定した明るさをもとにロボットの進路を決める。このようにしてロボットが黒線(今回私は線の左側とした)をトレースする。 しきい値は以下のように設定した。 #ref(スクリーンショット.png) --交差点の判定 交差点は、センサーが黒色を感知し続ける時間の長さで判断する。今回私は、センサーの値が32以下である時間がt=150経過したら、そこを交差点であると判断するようにした。 以上2つを総括したサブルーチン void follow_line は以下のようになる。 void follow_line(long tmin=0, long tmax=10000) SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<150){ if(SENSOR_3<32){ turn_l2; }else if(SENSOR_3<36){ turn_l1; t0=CurrentTick(); }else if(SENSOR_3<40){ go_fwd; t0=CurrentTick(); }else if(SENSOR_3<48){ turn_r1; t0=CurrentTick(); }else{ turn_r2;t0=CurrentTick(); } } Off(OUT_BC); また、交差点で一時停止したのち直進/左折するサブルーチンも作った。 --一時停止から直進 void teishi_fwd (int t) { Off(OUT_BC); Wait(1500); go_fwd; Wait(t); Off(OUT_BC); } --一時停止から左折 void teishi_left(int t) { Off(OUT_BC); Wait(1500); turn_l1; Wait(t); Off(OUT_BC); } -ボールを探し捕まえる~ ライントレースの動きをしながら、超音波センサーでボールを発見したときには、ボールをキャッチしてUターンの動きに入るのを理想とした。 void fetch_ball (long tmax=3000) { SetSensorLowspeed(S2); while(SensorUS(S2)>=10){ go_fwd; } Off(OUT_BC); Wait(1000); RotateMotor(OUT_A,30,-60); OnRev(OUT_BC,70); Wait(500);OnFwd(OUT_C,70); Wait(1000); Off(OUT_BC); go_fwd; Wait(1000); } -プログラム全体 task main() { go_fwd Wait(500);/AからJ follow_line();/JからH go_fwd Wait(400);/HからI fetch_ball();/ボールをキャッチしてuターン follow_line();/IからH turn_r1;/Hで右折 follow_line();/HからG teishi_fwd;/Gで一時停止、のちに直進 follow_line;/GからD turn_r1;/Dで右折 follow_line;/EからF、FからG teishi_left;/Cで一時停止、のちに左折 follow_line;/CからB teishi_fwd;/Bで停止、のちに直進 follow_line;/BからAに } } *感想 結果うまくはいかなかった。ほかのグループが、黒線の左側と右側、それぞれをたどるプログラムを組んでいたので、そこの差が表れたのかなと思う。次の課題も頑張りたい。