課題については2019a/Mission3を参照。
主に土台部分、アーム部分を担当するRISの2つからなり、通信することで一台のロボットとした。通信についての簡単な説明はプログラミングの所で行う。アームは、センサーが黒を感知しても機体がすぐには止まらないことを考慮し右寄りにつけることで微調整をあまりしなくてすむようにし、プログラムをなるべく短くできるようにした。モチーフは“あの”ディーゼル10。
思い描いていた動きの説明する。
1,右の光センサーを使い、箱の横で止まるようにする。
2,90度右に回転し、上の本体にセンサーを送る。(上のRISにセンサーが届くとクレーンが動く。)
3,数秒止まった後、90度左に回転。
4,右のセンサーを使い、スタートの位置まで戻る。
5,90度左に回転する。
6,左のセンサーを使い、空の箱の前で止まる。上の本体にセンサーを送る。
7,8,右のセンサーを使い、スタートの位置に戻り右に90度回転する。
この動きを繰り返すことで箱の中の玉を2つとも運ぼうと考えた。
今回の課題では今までの課題で使用してきた光センサーやdefineなどの他に通信を行う。通信は片方のRISが数字を送り、もう片方がその数字を受け取ることで行う。
まずは土台のプログラミングの説明をする。
最初に2つのRISの間での通信に使う数字を決める。
#define SIGNALON_C 39 #define SIGNALON_T 2
次にサブルーチンで左右の光センサーを使い、前進と後退するプログラムをする。
sub black_R() //右の光センサーを使い前進 { while(FastTimer(0)<10) { if(SENSOR_3<37){Off(OUT_AC); Wait(100);} else{OnRev(OUT_AC); ClearTimer(0);} } } sub black_L() //左の光センサーを使い前進 { while(FastTimer(0)<10) { if(SENSOR_1<37){Off(OUT_AC); Wait(100);} else{OnRev(OUT_AC); ClearTimer(0);} } } sub back() //右の光センサーを使い後退 { while(FastTimer(0)<10) { if(SENSOR_3<37){Off(OUT_AC); Wait(100);} else{OnFwd(OUT_AC); ClearTimer(0);} } }
ここから動きのプログラム
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT);
1の動き
ClearTimer(0); black_R(); OnRev(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); black_R();
2の動き
OnFwd(OUT_C); //ここから OnRev(OUT_A); Wait(55); Off(OUT_AC); //ここまでが右回転 Wait(100); SendMessage(SIGNALON_C); Off(OUT_AC); Wait(1000);
3の動き
OnFwd(OUT_A); //ここから OnRev(OUT_C); Wait(60); Off(OUT_AC); //ここまでが左回転 Wait(100);
4の動き
ClearTimer(0); back(); OnFwd(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); back(); Wait(100);
5の動き
OnFwd(OUT_A); OnRev(OUT_C); Wait(60); Off(OUT_AC); Wait(100);
6の動き
ClearTimer(0); black_L(); OnRev(OUT_AC); Wait(100); Off(OUT_AC); SendMessage(SIGNALON_T); Off(OUT_AC); Wait(1000);
7の動き
ClearTimer(0); back(); OnFwd(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); back();
8の動き
OnFwd(OUT_C); OnRev(OUT_A); Wait(55); Off(OUT_AC); Wait(100);
ここからは同じプログラミングの繰り返し
ClearTimer(0); black_R(); OnFwd(OUT_C); OnRev(OUT_A); Wait(55); Off(OUT_AC); Wait(100); SendMessage(SIGNALON_C); Off(OUT_AC); Wait(1000); OnFwd(OUT_A); OnRev(OUT_C); Wait(60); Off(OUT_AC); Wait(100); ClearTimer(0); back(); OnFwd(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); back(); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(60); Off(OUT_AC); Wait(100); ClearTimer(0); black_L(); OnRev(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); back(); OnFwd(OUT_AC); Wait(100); Off(OUT_AC); SendMessage(SIGNALON_T); Off(OUT_AC); Wait(1000); ClearTimer(0); back(); OnFwd(OUT_C); OnRev(OUT_A); Wait(55); Off(OUT_AC); Wait(100); }
上のRIS
#define SIGNALON_C 39 #define SIGNALON_T 2 task main() { ClearMessage(); while(true) { if(Message()==SIGNALON_C) //39が送られてきたときの動き { OnFwd(OUT_A); //アームを降ろす Wait(50); Off(OUT_A); OnRev(OUT_B); //アームを閉じる Wait(10); Off(OUT_B); OnRev(OUT_A); //アームを挙げる Wait(300); Off(OUT_A);} else if(Message()==SIGNALON_T) //2が送られてきたときの動き { OnFwd(OUT_A); Wait(50); Off(OUT_A); OnFwd(OUT_B); //アームを開く Wait(10); Off(OUT_B); OnRev(OUT_A); Wait(300); Off(OUT_A);} } }
下の土台の動きに苦戦していたためクレーンの動きにあまり時間を使えずうまくいかなかった。確実に通信が行えるような形のロボットを作れたら良かった。本番では上手くいかなかったものの、土台の動きなど今までの技を組み合わせ、思った通りの動きをしてくれたときはとてもうれしかった。
センサーを2つつけたのには、安定して黒を判断できるようにするため以外の理由がある。当初の予定では箱の中のボールを運び終えた後、ライントレースを行って地面のボールも回収するつもりでいた。そのため、あらかじめ2つつけていたのだが、想像以上に箱の中のボールをとることが難しく、地面のボールまでプログラムが出来なかった。