[[2019a/Member]] 目次 #contents *課題について [#s7271e60] 課題3については,[[2019a/Mission3]]を参照してください. *ロボットについて [#jd775774] 今回の課題では,NQCが2台使えたので,ロボットの移動,アームの動きの制御に1台ずつ使ったロボットを作った. #ref(image4.jpeg) 上の画像は,ロボット全体を撮影したものである.三輪のタイヤをつけ,そのうち前輪の22つは,2つのモーターを使って操作し,後輪は,モーターをつけず,回転しても,紙との間に摩擦が発生しずらいプラスチック製のものを用いた.また,このロボットは,ライントレースをして走行するわけではなく,通過する横棒の本数によって,動きを決めて操作した. #ref(image5.jpeg) 上の画像は,アームを伸ばした時のロボットの全体を撮影したものである.このアームには,モーターを2つ使用しており,アームの上げ下げに一つ,アームの開閉に一つ,モーターを用いた.先端部分にモーターがついており,重くなりモーターの力ではアームを上げることができなかったため,ゴムの伸縮性を利用して,アームを上げるサポートをできるようにした. *プログラムについて [#v1e0b3cf] 今回のプログラムでは,本体を2台使うため,作業を順番通りに行うため,2台の間で通信を行う. **ロボットを移動させるプログラム [#f9053f9c] ***定義について [#j8dc9f92] NQC2台の間で通信を行うため,2つの数字を定義した. #define SIGNALON_C 39 #define SIGNALON_T 2 ***サブルーチンについて [#oae16d7c] 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);} } } ***全体のプログラムについて [#b9acad38] task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); 箱の横まで前進 ClearTimer(0); black_R(); OnRev(OUT_AC); Wait(100); Off(OUT_AC); 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); SendMessage(SIGNALON_T); Off(OUT_AC); Wait(1000); スタートの位置に戻る ClearTimer(0); back(); OnFwd(OUT_AC); Wait(100); Off(OUT_AC); ClearTimer(0); back(); 右回転 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); } **アームのプログラム [#z4306c21] ***定義について [#a3ac492c] 移動用のNQCと同じ #define SIGNALON_C 39 #define SIGNALON_T 2 ***全体のプログラムについて [#o1d68c11] task main() { ClearMessage(); 39が送られてきた場合 while(true) { if(Message()==SIGNALON_C) { OnFwd(OUT_A); Wait(50); //アームを下す Off(OUT_A); OnRev(OUT_B); Wait(10); //ボールをつかむ Off(OUT_B); OnRev(OUT_A); Wait(300); //アームを上げる Off(OUT_A); } 2が送られてきた場合 else if(Message()==SIGNALON_T) { OnFwd(OUT_A); Wait(50); //アームを下す Off(OUT_A); OnFwd(OUT_B); Wait(10); //ボールを離す Off(OUT_B); OnRev(OUT_A); Wait(300); //アームを上げる Off(OUT_A);} } } *まとめと感想 [#z2e9a52f] 課題をクリアするための適切なロボットを決めるのに時間を割いてしまい,プログラミングにあまり時間をかけることができなかった.また,NQCを上に重ねると通信ができないことにギリギリになって気づいたので,修正することができずに本番に臨んでしまった.本番では失敗してしまったものの,ボールの入っている箱に到達するまではスムーズにできたので,とてもうれしかった.またこのような機会があったら,完璧なロボットを作ってみたい.