課題2とは違うロボットを製作した。
モーターの役割はそれぞれ
ボールを当てる動作にはロボット上部に付けたアームから転がり落とす構造をとった。
超音波センサーは本体の前方下部に取り付けた。
なるべくボールをバウンドさせずまっすぐ転がし、かつ勢いをつけるためにボールをセッティングしておく部分を高いところにし、レールとなるアームを長くした。
#define short_break Off(OUT_ABC);Wait(5000); sub find_can() { int rantime=7000; //1週するのにかかる時間 int lightmin=100; //仮の距離 int timemin=0; //仮の時間 int turn_time=rantime-timemin; //発見した缶の方を向くのにかかる時間 SetSensorLowspeed(S1); long t0 = CurrentTick(); while(CurrentTick()-t0<rantime) { OnFwd(OUT_B,30); OnRev(OUT_C,30); //左旋回 if(SensorUS(S1)<lightmin) //1メートル以内に缶があったら時間を 記憶し一番近いものとする { lightmin=SensorUS(S1); timemin=CurrentTick()-t0; } } short_break; OnFwd(OUT_B,-30); OnRev(OUT_C,-30); //右旋回 Wait(turn_time); //缶のところまで戻る short_break; ResetSensor(S1); } sub approach_can() //缶との距離を25センチにする { SetSensorLowspeed(S1); if(SensorUS(S1)>25) { OnFwd(OUT_BC,30); until(SensorUS(S1)==25); //25センチより離れていたら前進する } if(SensorUS(S1)<25) { OnRev(OUT_BC,30); until(SensorUS(S1)==30); Off(OUT_BC); OnFwd(OUT_BC,30); until(SensorUS(S1)==25); //25センチより近かったら後退する } } task main() { find_can(); approach_can(); short_break; OnFwd(OUT_A,30); //アームを降ろしてボールを転がす Wait(500); }
1メートル以内にある物体で最も近くにあるものを缶と認識するプログラム。
旋回して約360度見渡す間に100センチより近いところに物体があった場合、その時間と距離の値をだし、その距離より小さい値が見つかったら更新していく。一周して最少だったところへ時間を利用して戻り、距離を25センチにとりボールを転がす。
缶の位置を記憶するのに時間を用いた。グループのメンバーと話し合ったのだが角度と時間しか思いつくことができなかった。
ぴったり360度回る時間を把握することはできなかったので、缶を探す動作と缶のほうを向く動作を逆回転にすることで時間で制御できる。
失敗に終わった。「缶のところまで戻る」動作がうまくいかなかった。 おそらくint turn_time を入れる場所が違ったのだと思う。
ロボットを返却した後なので試すことができないが以下のプログラムで成功するはずである。
#define short_break Off(OUT_ABC);Wait(5000); sub find_can() { int rantime=7000; //1週するのにかかる時間 int lightmin=100; //仮の距離 int timemin=0; //仮の時間 SetSensorLowspeed(S1); long t0 = CurrentTick(); while(CurrentTick()-t0<rantime) { OnFwd(OUT_B,30); OnRev(OUT_C,30); //左旋回 if(SensorUS(S1)<lightmin) //1メートル以内に缶があったら時間を 記憶し一番近いものとする { lightmin=SensorUS(S1); timemin=CurrentTick()-t0; } } int turn_time=rantime-timemin; //発見した缶の方を向くのにかかる時間 short_break; OnFwd(OUT_B,-30); OnRev(OUT_C,-30); //右旋回 Wait(turn_time); //缶のところまで戻る short_break; ResetSensor(S1); } sub approach_can() //缶との距離を25センチにする { SetSensorLowspeed(S1); if(SensorUS(S1)>25) { OnFwd(OUT_BC,30); until(SensorUS(S1)==25); //25センチより離れていたら前進する } if(SensorUS(S1)<25) { OnRev(OUT_BC,30); until(SensorUS(S1)==30); Off(OUT_BC); OnFwd(OUT_BC,30); until(SensorUS(S1)==25); //25センチより近かったら後退する } } task main() { find_can(); approach_can(); short_break; OnFwd(OUT_A,30); //アームを降ろしてボールを転がす Wait(500); }
超音波センサーの最小値を更新するプログラムをどのようにwhileでくくるか考えさせられた。
まっすぐ転がすためにアームを長くするのと自重でアームが降りてしまうところのバランスが難しかった。
角度での缶の探し方はプリントが配られたので意地でも時間でやってみたかった。しかしその結果、うまくいかなかったので残念だった。
もう一つどんな缶の発見の仕方があるか気になった。