目次
黒い線で作成したコースに沿って動くロボットを製作する。
ただし交差点では次のような動きをさせる。
一人目
一回目に交差点にさしかかったときは直進
二回目は左折
三回目は直進
四回目は右折
五回目は右折 → ゴールへ
二人目
一回目に交差点にさしかかったときは左折
二回目は右折
三回目は左折
四回目は直進
五回目は直進 → ゴールへ
以下を参照
自分は二人目の動作をさせた。
最初の冊子にのっていたライントレース用のロボットは、カーブでセンサーが黒線から外れてしまったので、光センサーを本体からなるべく近くに設置しなおした。
これによってセンサーが外れることはなくなった。
基本的には冊子に乗っていたライントレースのプログラムを利用した。
#define THRESHOLD 45 //センサーのしきい値 #define SPEED_H 50 //前進するときのモーターのスピード #define SPEED_L 25 //曲がるときのモーターのスピード
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
前進
#define go_forward OnRL(SPEED_H,SPEED_H);
左に曲がる(両輪)
#define turn_left1 OnRL(SPEED_L,-SPEED_L);
左に曲がる(片輪)
#define turn_left0 OnRL(SPEED_L,0);
右に曲がる(片輪)
#define turn_right0 OnRL(0,SPEED_L);
右に曲がる(両輪)
#define turn_right1 OnRL(-SPEED_L,SPEED_L);
#define STEP 1
交差点のしきい値
#define nMAX 150
1秒止まる
#define short_break Off(OUT_BC);Wait(1000);
交差点を渡る時間
#define CROSS_TIME 200
交差点を渡る
#define closs_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
task main() { SetSensorLight(S3); int nOnline=0; int closs_number=1; //交差点の番号(何回目の交差点か)
while(true){ while(nOnline < nMAX){ if(SENSOR_3 < THRESHOLD-15){ //ほぼ黒線上 turn_left1; PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす nOnline++; }else{ if(SENSOR_3 < THRESHOLD-7){ //黒に近い turn_left0; }else if(SENSOR_3 < THRESHOLD+7){ //中間 go_forward; }else if(SENSOR_3 < THRESHOLD+15){ //白に近い turn_right0; }else{ //ほとんど白 turn_right1; PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす } nOnline=0; } Wait(STEP); }
/*交差点であるとき*/ if(closs_number != 3){ //3回目の交差点のとき、曲がる(回数はとりあえず) short_break; turn_right1;Wait(nMAX*STEP); closs_line; nOnline=0; //回数を1増やす closs_number++; //交差点の番号を1増やす PlaySound(SOUND_CLICK); //クリック音を鳴らす } else //そうでないとき { nOnline=0; //回数をリセット closs_number++; //交差点の番号を1増やす PlaySound(SOUND_UP); //「テレレー↑」という音をならす } } }
いくつか問題が発生して、解決できたものとできなかったものがあった
交差点を正しく認識できなくなった。何度も走らせて確かめたところ、毎回交差点を曲がり角と誤認して左に曲がってしまっていた。
(完全に黒線上にいた回数) < (交差点の判断基準となる回数) となっているはずなので、交差点の判断基準であるnMAXの値を300から150に変更したところ、正常に判断できるようになった。
センサーを近くしたことで大きなカーブでは問題なく黒線を追えるようになったが、小さい円の部分を曲がるときにセンサーが外れてしまった。このときのタイヤの動きを観察したところ、外側のタイヤのみが回転して曲がっていたため、内輪差でセンサーが外れてしまっていることがわかった。
外側のタイヤの回転だけでは曲がりきれないので、内側のタイヤを逆回転させればよいと思われる。(時間切れで実装に至らなかった。)
プログラムの問題を修正することに時間がかかってしまい、結局目的の動きをさせることはできなかった。交差点の判断はできているはずなので、あとはカーブを曲がれるようになればあとは「いまが何回目の交差点か」をかぞえて、if文を使って曲がる or 曲がらないの判断をすれば、課題は達成できると思う。
問題に気づくのが遅れてしまい、対策を考えるのが遅くなったので、次回はもっと早めに試す機会を作るようにしたい。