*紙パックを運搬するロボットのプログラム &color(red){New!}; [#be133fb8] //作成者:SAS //作成日時:2/4、最終更新日:2/12 //作成日時:2/4 最終更新日:&lastmod; #define go_st OnFwd(OUT_A+OUT_C); //前に進むマクロ #define go_ba OnRev(OUT_A+OUT_C); //後ろに進むマクロ #define turn_l OnFwd(OUT_C);OnRev(OUT_A); //左に旋回するマクロ #define turn_r OnFwd(OUT_A);OnRev(OUT_C); //右に旋回す るマクロ #define float Float(OUT_A+OUT_C); //滑らかに止まるマクロ #define SPA(t) SetPower(OUT_A,t); //Aのトルクを変えるマクロ #define SPC(t) SetPower(OUT_C,t); //Cのトルクを変えるマクロ #define white1 SENSOR_1 >= 42 #define green1 (SENSOR_1 >= 33)&&(SENSOR_1 <= 41) #define black1 SENSOR_1 <= 32 #define white3 SENSOR_3 >= 42 #define green3 (SENSOR_3 >= 33)&&(SENSOR_3 <= 41) #define black3 SENSOR_3 <= 32 int count ; //countという変数を使う int r_angled; task main () { r_angled = 86; //直角に曲がる時間 SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1と2を SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサーに定義 ClearMessage(); //メッセージを消す count = 0; //countに0を代入 SPA(2);SPC(2); Wait(1000); SendMessage(1);until(Message() !=0) if(Message() !=0) {SendMessage(2);Wait(400); turn_r; //右に旋回する until(black1&&white3);} //左のセンサーが黒、右のセンサーが白になるまで if(black1&&white3) //左のセンサーが黒、右のセンサーが白ならば {start line_trace_for;} //タスク line_trace_for を実行する } task line_trace_for () { if(white1&&white3) //白いところは {SPA(1);SPC(1);go_st;} // トルク1で前進する if(black1&&white3) //左のセンサーが黒なら {SPA(3);SPC(1);turn_l;} // 左右のトルクが3:1で左旋回 if(white1&&black3) //右のセンサーが黒なら {SPA(1);SPC(3);turn_r;} // 左右のトルクが1:3で右旋回 if(green1&&green3) //両方 緑 なら {SPA(7);SPC(7); //左右のトルクを7に戻し、 while (true) //真の間繰り返す { if(green1&&green3) //左右のセンサーが 緑 なら {count += 1;} //変数 count を1増やす if(Message() == count) //メッセージの番号と変数 count が一致したら、 {start put_box;} //タスク put_box を実行し、 stop line_trace_for;} //タスク line_trace_for を終了する if(Message() != count) //メッセージの番号と変数 count が一致しなければ、 {go_st;} //前進する } } task line_trace_back () { if(white1&&white3) //白いところは {SPA(1);SPC(1);go_st;} // トルク1で前進する if(black1&&white3) //左のセンサーが黒なら {SPA(3);SPC(1);turn_l;} // 左右のトルクが3:1で左旋回 if(white1&&black3) //右のセンサーが黒なら {SPA(1);SPC(3);turn_r;} // 左右のトルクが1:3で右旋回 if(green1&&green3) //両方 緑 なら {SPA(7);SPC(7); //左右のトルクを7に戻し、 turn_r;Wait(r_angled); //90°右に旋回する stop line_trace_back;} //タスク line_trace_back を終了する } task put_box () { go_st;Wait(30);float; //前進した後滑らかに止まる turn_r;Wait(r_angled);float; //90°右に旋回した後滑らかに止まる go_ba;Wait(40); //後退して機体を真っ直ぐにする go_st;Wait(60); //前進してカゴにぶつかる OnFwd(OUT_B);Wait(100); //箱を置く OnRev(OUT_B);Wait(100); //装置を元に戻す go_ba;until(black1&&black3); //黒い線のところまで後退する go_st;Wait(10);float; //少し前進した後滑らかに止まる turn_r;Wait(r_angled);float; //90°右に旋回した後滑らかに止まる while(true) //真の間繰り返す { go_st;until(green1&&green3); //左右のセンサーが 緑 になるまで前進する if(green1&&green3); //左右のセンサーが 緑 なら、 {count -= 1;} //変数 count を1減らす if(count == 0) //変数 count が0になったら、 {go_st;Wait(10); //少し前進して、 start line_trace_back; //タスク line_trace_back を実行し、 stop put_box;} //タスク put_box を終了する else //変数 count が0でなければ、 {go_st;until(green1&&green3);} //左右のセンサーが 緑 になるまで前進する } } -'''工夫した点'''~ 「count」という変数を指定することで、ロボットに今何本目の線を通過したのか数えさせ、目的の色のカゴまで紙パックを運ばせるようにした点。 #br -'''苦労した点'''~ 苦労した点、と言うか残念だったのが、一度も動くことなくロボットの構想が変わり、どんな動きをするのか確認が出来なかった点。 #br -'''感想'''~ 結局一度も動くことは無かったが、動きの原理はそのまま次のロボットへと引き継がれているので、無駄にはならなくて良かったと思う。 #br 一晩で書いたプログラムなので、もっとマクロや他の書き方を使うことによって、さらにすっきり出来たかもしれないのが心残りである。