今回作ったロボットはペンで書いたラインの上を走りゴールにシュートするロボットです。画用紙の書いた黒線の明暗を認識して黒線を辿って走ります。ここで問題になるのは交差点を曲がらずまっすぐ進むということです。そのため、少し交差点を曲がった後に軌道修正しなければなりません。そこが少し手こずりました。
センサーはこれによって白黒を判断して黒い部分に戻るようにプログラミングしました。地面に近いと反応しやすくなり、遠いと反応しにくくなります。
ボールは囲っている部分に入ったらアームを回して玉が出ないようにします。ゴールするときは前の方を開けて前進してゴールします。ギアの回転方向を縦に絡ませるために、前に歯が出ている歯車を使いました。
私のつくったプログラミングはCから交差点をまっすぐ行きT字路を右に曲がりAにシュートするというものです。PQ間にピンポン球を置き枠の中に入れてそのまま運びました。プログラミングをする際に悩んだことはどうやってT字路を直進するかということです。そのためにT字路を認識するためにプログラミングしました。
工夫した点は黒の値などによってセンサーの反応が変わってくるので少しずつ試しながら調整したことです。また、カーブとして許容できる回数もだいぶ小さくしました。あまり小さくし過ぎると普通のカーブも交差点と認識してしまい難しかったです。
#define go_a OnFwd(OUT_AC);Wait(60);Off(OUT_AC); //前進 #define go_b OnFwd(OUT_AC);Wait(80);Off(OUT_AC); //前進 #define nMAX 7 //通常のカーブとして許容できる繰り返しの最大値 #define STEP 1 //一回の判断で動作させる時間(0.01秒) #define THRESHOLD 32 //黒の値 #define HIPOWER 7 // 直線用のパワー #define LOWPOWER 4 // カーブのパワー #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_L; OnFwd(OUT_AC); #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);
メインプログラムで工夫した点はCから出発した場合はじめのカーブがすごい急になります。なので、右折をしやすいようにTHRESHOLD +の値を大きくしたりして右折しやすいようにしました。その結果うまく行って良かったです。
task main() { SetSensor(SENSOR_2, SENSOR_LIGHT);
int nOnline=0; //続けて黒になった回数をカウント Wait(100); //スタートアップ go_a;//最初の線越え while(nOnline < nMAX) { if (SENSOR_2 < THRESHOLD+6) { turn_left1; // 左旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_left0; // 左折 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { turn_right0; // 右折 nOnline=0; } else { turn_right1; // 右旋回 nOnline=0; } Wait(STEP); } OnFwd(OUT_A);OnRev(OUT_C);Wait(10);
Off(OUT_AC); OnFwd(OUT_B); Wait(25); Off(OUT_B); Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100); //小休止
OnFwd(OUT_A);OnRev(OUT_C);Wait(40); //進行方向修正 OnFwd(OUT_AC);Wait(70);
Off(OUT_AC); PlaySound(SOUND_CLICK); Wait(50); nOnline=0; //カウンタリセット
while(nOnline < nMAX) { if (SENSOR_2 < THRESHOLD+6) { turn_right1; // 右旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_right0; // 右折 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+19) { turn_left0; // 左折 nOnline=0; } else { turn_left1; // 左旋回 nOnline=0; } Wait(STEP); } Off(OUT_AC);
Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100); //小休止
OnRev(OUT_AC);Wait(50); OnFwd(OUT_C);OnRev(OUT_A);Wait(30); //進行方向修正 Off(OUT_AC); PlaySound(SOUND_CLICK); Wait(50); nOnline=0; //カウンタリセット OnRev(OUT_B); Wait(25); Off(OUT_B);
go_b PlaySound(SOUND_UP); }
初めのうちは本当にこんなの作れるだろうかと心配だらけでしたが、頼り甲斐のある相方のおかげで無事に課題をクリア出来て本当に良かったです。はじめのうちは誰でも何をしていいかわからないと思うのでお手本などを参考にして色々自分で試してみるのがいいと思います。そのうちにだんだん原理がわかってくると思います。ちなみに僕の相方のluminousのがもっとわかりやすいのでそちらを参考にするといいと思います。