目次
詳しくは,2019a/Mission3を参照.
ロボットは大まかにアーム,タイヤ,RIS本体の3つの部分に分かれている.
この2枚の写真では,アームを上下に動かすための部品を写している.モーターを2つ使って上下させる.
これはボールを掴むためのパーツである.モーターを1つ用いて開閉を行う.タイヤを複数用いることにより,ボールをしっかり掴んで離さないようになっている.
タイヤは全部で5輪取り付けた.後ろの補助輪は,ロボット全体のバランスを保つ役割を果たしている.前の4輪は,モーターを2つ用いて動かす.また,ライントレース用に光センサーを一つ用いた.
これからプログラムの説明をしていくが,これはロボコンで発表するために作成したものである.このプログラムはボールを一つキャッチするところまでを目標にしているが,成功はしていない.それを踏まえたうえで説明していく.送信側のRISはタイヤを,受信側のRISはアームを動かす.
課題2で説明済みのため,ここでは省略する.詳しくは2019a/Member/miruama/Mission2を参照.
#define OPEN 13 #define UP 14 #define FREEZE 15
これらは2台のRIS本体でメッセージの送受信を行うために定義したものである.
#define black 37
ライントレースのために定義した数値である.光センサーの示す値がこの数値より大きければ白を,小さければ黒を見ているという判断をさせる.
sub intersection_stop_leftside() //線の左側をトレース// { ClearTimer(0); while(FastTimer(0)<30) //タイマーの作動時間は0.3秒間// { if (SENSOR_2 > black) //白を見ている場合// { OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); } //左側へ移動&タイマーをリセットする// else if (SENSOR_2 < black) //黒を見ている場合// { OnFwd(OUT_C);Off(OUT_A); } //右側へ移動&タイマーが作動中のため規定時間以上黒をトレースするとプログラムが終了// } Off(OUT_AC); } sub intersection_stop_rightside() //線の右側をトレース// { ClearTimer(0); while(FastTimer(0)<30) //タイマーの作動時間は0.3秒間// { if (SENSOR_2 > black) //白を見ている場合// { OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); } //右側へ移動&タイマーをリセットする// else if (SENSOR_2 < black) //黒を見ている場合// { OnFwd(OUT_A);Off(OUT_C); } //左側へ移動&タイマーが作動中のため規定時間以上黒をトレースするとプログラムが終了// } Off(OUT_AC); }
「intersection_stop_○○side」で,線の○○側をトレースする.「連続して黒になる時間」が規定時間以上になると,交差点にいるとみなしプログラムが終了,ロボットが停止する.
sub corner_stop() { ClearTimer(0); while(FastTimer(0) < 63) //タイマーの作動時間は0.63秒// { if(SENSOR_2 < black) //黒を見ているとき// { OnFwd(OUT_C);Off(OUT_A);ClearTimer(0); } //右側へ移動&タイマーをリセット// else if(SENSOR_2 > black) //白を見ているときは// { OnFwd(OUT_A);Off(OUT_C);} //左側へ移動&タイマーが作動中のため規定時間以上白を感知するとプログラムが終了// } Off(OUT_AC);//Wait(100);// while(SENSOR_2 > black) { OnFwd(OUT_A);OnRev(OUT_C); } Off(OUT_AC);//Wait(100);// }
E,F点を上手く曲がるためのサブルーチンである.ライントレースとは反対に,連続して白になる時間が規定時間以上になるとプログラムが終了し,ロボットが停止するようになっている.連続して白になる時間の計り方は,前述の「連続して黒になる時間の計り方」の黒と白を入れ替えたものとなっている.
#define open(t) OnFwd(OUT_B);Wait(t);OnRev(OUT_B);Wait(5);
このプログラムでアームを開く.
#define up(t) OnFwd(OUT_AC);Wait(t);
このプログラムでアームを上げる.
また,アームの閉,下げは自然に起きるのでプログラムは必要ない.
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); FastTimer(0); ClearMessage(); intersection_stop_rightside(); corner_stop(); //ヘアピンカーブのところで停止// OnFwd(OUT_A);OnRev(OUT_C);Wait(180); //反転// SendMessage(OPEN); //OPENのメッセージを送信&アームが開く// OnFwd(OUT_AC);Wait(100); //ボールをアームの中に// ClearMessage(); //メッセージの値をリセット&アームが閉じる// OnFwd(OUT_C);OnRev(OUT_A);Wait(130); //箱が正面になるよう回転// SendMessage(UP); //UPのメッセージを送信&アームが上がる// OnFwd(OUT_AC);Wait(100); ClearMessage(); //メッセージの値をリセット&アームが下がって箱の中に// SendMessage(OPEN); //OPENのメッセージを送信&アームが開く// SendMessage(UP); //UPのメッセージを送信&アームが上がって箱の外に// ClearMessage(); //メッセージの値をリセット// }
task main() { ClearMessage(); while(true) { ClearMessage(); while(Message() == OPEN) //OPENのメッセージを受信している間は// { open(300); } Off(OUT_AC); while(Message() == UP) //UPのメッセージを受信している間は// { up(300); } Off(OUT_AC); } }
ロボット自体は大変素晴らしいものができたと思っている.だが,このロボットに見合うプログラムを完成させることができなかった.ロボットに可能性を感じていただけに,非常に残念である. もう少し時間があればボールを一つ掴むことくらいはできたかもしれない.