目次 #contents *課題 [#he699fa0] **ロボコン [#p91ba67a] [[詳細はこちら>2010a/ロボコン]] **メンバー [#ud8a88ce] 田島・新谷・みさいづ・みのう *ロボットの製作 [#j55e780b] **製作したロボット(橋の役目をする側) [#i746af83] #ref(./100806robo01.jpg,around,80%,ロボット(橋側:展開)) #ref(./100806robo02.jpg,around,80%,ロボット(橋側:収納)) #clear **製作したロボット(玉を回収する側) [#t0ba302e] #ref(./100806robo03.jpg,80%,ロボット(玉回収側)) **ロボット合体 [#j189426d] #ref(./100806robo_c.jpg,80%,ロボット合体) **工夫した点 [#mea520b7] -RCXが互いに通信できる位置に配置した。 **今後改善すべき点 [#kc9649f1] -バランスが悪いロボットになってしまった。 *プログラムの作成 [#h067f65d] **作成したプログラム(橋の役目をする側) [#k1b4435d] int move_time;//光センサーが両方共黒を認識したの回数 int move_back;//戻るための変数 #define CHILD_MOVE_BEGIN 1// 玉回収開始信号 #define CHILD_MOVE_END 2// 玉回収終了信号 #define CHILD_MOVE_STOPCHECK 3// 玉回収終了信号受信確認信号 #define LAST_TIME 300//最後に初期位置に戻るための時間 #define UP_TIME 230//橋を上げる時間 #define DOWN_TIME 180//橋を下げる時間 task main() { move_time = 1;//まず初めに1を代入 SetSensor(SENSOR_1,SENSOR_LIGHT);センサー1は光センサー SetSensor(SENSOR_2,SENSOR_TOUCH);センサー2はタッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT);センサー3は光センサー move_back=0;//0を代入 while(move_back==0) {//橋をかけるまで繰り返す if((SENSOR_1 < 45)&&(SENSOR_3 < 45)&&(move_time == 1)) {//一回目 Off(OUT_A+OUT_C);//一旦止まる Wait(50); OnFwd(OUT_A+OUT_C);//前進 Wait(100); move_time++;//変数を1増やす }else if((SENSOR_1 < 45)&&(SENSOR_3 < 45)&&(move_time == 2)) {//二回目 Off(OUT_A+OUT_C);//一旦止まる Wait(50); OnFwd(OUT_A+OUT_C);//前進 Wait(30); OnFwd(OUT_A);//右回転 OnRev(OUT_C); Wait(100); Off(OUT_A+OUT_C);//止まる move_time++;//変数を1増やす }else if((SENSOR_1 < 45)&&(SENSOR_3 < 45)&&(move_time == 3)) {//三回目 Off(OUT_A+OUT_C);//一旦止まる Wait(50); OnFwd(OUT_A+OUT_C);//前進 Wait(50); OnRev(OUT_A);//左少し下がる Wait(40); OnRev(OUT_A+OUT_C);//後退 Wait(20); OnFwd(OUT_C);//右少し進む Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);//前進する until(SENSOR_2==1);//タッチセンサーが反応するまで Off(OUT_A+OUT_C);//止まる move_time++;//変数を1増やす } else if (SENSOR_3 < 45) {//ライントレース OnFwd(OUT_A); OnRev(OUT_C); } else if (SENSOR_1 < 45) { OnFwd(OUT_C); OnRev(OUT_A); }else{ OnFwd(OUT_A+OUT_C);} if (SENSOR_2==1){//タッチセンサーが反応 OnRev(OUT_C+OUT_A);//後退 Wait(40); Off(OUT_A+OUT_C);//止まる OnFwd(OUT_B);//橋を下げる Wait(DOWN_TIME); Off(OUT_B); SendMessage(CHILD_MOVE_BEGIN);//回収ロボ動作開始信号送信 ClearMessage(); until(Message()==CHILD_MOVE_END);//回収ロボが戻ってくるまで待つ move_back++;//戻るプログラムへ move_time=0;//クリア } } while(move_back==1) {//初期位置に戻る if(move_time == 0) { SendMessage(CHILD_MOVE_STOPCHECK);//止まっているか確認 Off(OUT_A+OUT_C); move_time++;//変数を1増やす OnRev(OUT_B);//橋を上げる Wait(UP_TIME); Off(OUT_B); OnRev(OUT_C+OUT_A);//後退 Wait(100); OnRev(OUT_A);//左回転 OnFwd(OUT_C); Wait(120); Off(OUT_A+OUT_C);//止まる OnFwd(OUT_A+OUT_C);//交差点を認識しないように少し前進 Wait(50); Off(OUT_A+OUT_C); } else if (SENSOR_1 < 45) {//ライントレース OnFwd(OUT_C); OnRev(OUT_A); } else if (SENSOR_3 < 45) { OnFwd(OUT_A); OnRev(OUT_C); } else if ((SENSOR_1 > 45)&&(SENSOR_3 > 45)) { OnFwd(OUT_A+OUT_C); } if (SENSOR_2==1){//タッチセンサーが反応 Off(OUT_A+OUT_C);//一旦止まる Wait(50); OnRev(OUT_A+OUT_C);//後退 Wait(100); OnRev(OUT_A);//左回転 OnFwd(OUT_C); Wait(120); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);//前進 Wait(LAST_TIME); Off(OUT_A+OUT_C); move_back++;//動作停止 } } } **作成したプログラム(玉を回収する側) [#c2cf51d6] #define go_straight() OnRev(OUT_A);OnFwd(OUT_C); // 前進 #define go_back() OnFwd(OUT_A);OnRev(OUT_C); // 後退 #define go_stop() Off(OUT_A+OUT_C); // 停止 #define arm_up() OnRev(OUT_B); // アーム上昇 #define arm_down() OnFwd(OUT_B); // アーム降下 #define arm_stop() Off(OUT_B); // アーム停止 #define CHILD_MOVE_BEGIN 1 // 玉回収開始信号 #define CHILD_MOVE_END 2 // 玉回収終了信号 #define CHILD_MOVE_STOPCHECK 3 // 玉回収終了信号受信確認信号 #define armlength 140 // 玉回収時前後移動量 #define armuptime 90 // アーム上昇量 #define armdntime 75 // アーム降下量 #define bgmaxcount 6 // 玉回収最大試行回数 int prework = 1; // 玉回収開始信号待ちフラグ int dowork = 0; // 玉回収中フラグ int lastwork = 0; // 玉回収終了信号送信、玉回収終了信号受信確認信号待ちフラグ int revbool = 0; // 玉回収(後退)中フラグ int bg1bool = 0; // 玉回収(アーム降下)中フラグ int bg2bool = 0; // 玉回収(前進)中フラグ int bg3bool = 0; // 玉回収(アーム上昇)中フラグ int bgcount = 0; // 玉回収試行回数 task main() { SetSensor(SENSOR_2, SENSOR_TOUCH); ClearMessage(); while(prework) { // 玉回収信号待ち Off(OUT_A+OUT_B+OUT_C); if(Message() == CHILD_MOVE_BEGIN) { // 玉回収信号受信 ClearMessage(); prework = 0; // フラグを切り替え玉回収へ移行 dowork = 1; ClearTimer(1); } } while(dowork) { // 玉回収 if(bg1bool) { // 玉回収(アーム降下) go_stop(); arm_down(); if(FastTimer(0)>armdntime) { // アーム下げたらフラグ切り替え arm_stop(); bg1bool = 0; bg2bool = 1; ClearTimer(0); } } else if(bg2bool) { // 玉回収(前進) go_straight(); if(FastTimer(0)>armlength) { // 玉回収時前後移動量進んだらフラグ切り替え go_stop(); bg2bool = 0; bg3bool = 1; ClearTimer(0); } } else if(bg3bool) { // 玉回収(アーム上昇) arm_up(); if(FastTimer(0)>armuptime) { // アーム上げたらフラグ切り替え arm_stop(); bgcount++; bg3bool = 0; if(bgcount >= bgmaxcount) { // 玉回収最大試行回数試行したら回収終了 bg3bool = 0; // フラグ切り替えて玉回収終了信号送信開始、玉回収終了信号受信確認信号待ち dowork = 0; lastwork = 1; ClearMessage(); } ClearTimer(0); } } else if((SENSOR_2 || revbool) && !(bg1bool || bg2bool || bg3bool) && FastTimer(1)>450) { // 玉回収(後退)、橋から降りている間(動作開始後4.5秒間)は反応しない go_back(); if(!revbool) { // タッチセンサが離れても後退を継続するためのフラグを立てる revbool = 1; ClearTimer(0); } if(FastTimer(0)>armlength) { // 玉回収時前後移動量下がったらフラグ切り替え revbool = 0; bg1bool = 1; ClearTimer(0); } } else { // 通常 go_straight(); // 前進 } } while(lastwork) { // 玉回収終了信号送信、玉回収終了信号受信確認信号待ち go_back(); // 後退 if(FastTimer(0) >= 100) { // 1秒ごとに玉回収終了信号送信 PlaySound(SOUND_CLICK); SendMessage(CHILD_MOVE_END); ClearTimer(0); } if(Message() == CHILD_MOVE_STOPCHECK) { // 玉回収終了信号受信 go_stop(); // 停止 lastwork = 0; // フラグ下げて動作停止 } } } **工夫した点 [#q1db4e68] -変数をつかって光センサーが黒を両方とも認識した回数を数えて誤動作が起きないようにした。 -玉を回収する側が戻ってきたときに通信が確実に行えるようにした。 **今後改善すべき点 [#oa6648ea] -プログラムの動作確認が全く足りなかった。 -ロボットの形やバランスを考えてプログラムを考えべきだった。 *反省・感想 [#m0f5f047] -(田島) -今回のロボコンでは、障壁である真ん中の木を越すところとボールを回収するところが特に難しかったと思う。ほとんどのチームがそうであったように、僕たちのチームのロボットもここでつまずいた。ボールを持って帰ることが出来なかったのは、非常に残念だった。(田島) -ロボットの製作が遅くなってしまって、プログラムをあまり工夫できなかった。(新谷) -上のロボットから作ってしまったために、壁を越えることができなかった。土台部分からつくっていくべきだった。(みさいづ) -今回はあまりにも無計画だったと思う。まずは壁を超えることが重要なのに、玉を回収する方から考えてしまった。事前にしっかり優先順位を確認すべきだった。競技については、他の班のユニークなロボットを見ることができて良かった。(みのう) *コメントをどうぞ [#dc28d5e7] #comment