★☆最終課題:ロボットコンテスト☆★ |
今回の課題は、最終課題、ロボコンのロボット&プログラミングの作成です。
8月4日に行うロボティクス入門ゼミのロボコンに向けて、各グループで課題を作ります。
紙パックを収集して所定の位置にできるだけ高く積み上げる。
黒線の交差している場所に置いてある紙パックを持ち、真ん中の円の中に運ぶ。
制限時間は2分30秒。開始2分で紙パックが10個以上積み上がっていれば、30秒延長。
スタートはどこからでもよい。
開始時点で、ロボットは3個以下。
課題の詳しい内容はロボコンのページを参照してください。
→ロボコンのページ
1、7月26日:ロボティクス入門ゼミの最後の授業
2、8月1日 :夏休み中1回目のロボット作成
3、8月2日 :2回目の集合 今日は朝からです。
4、8月3日 :明日は本番 ロボット完成なるか
ロボットの最終形態です。
←正面から 横から→ | →後ろから |
完成したロボットを細かくパーツに分けて説明
毎度おなじみ、移動手段には2種類のタイヤを2つずつ組み合わせています。
→拡大→ |
このアーム↓で紙パックを掴み、上下にスライドさせ持ち上げます。
←正面から 横から→ |
左の2つを噛み合わせて、アームの上下を行うスライドの部分(右図)になります。
→→→ |
最初の段階(左図)では、紙パックが斜めになってしまい入らなかったので
入り口を広げて入りやすいようにしました(右図)。
→→→ |
最初の段階(2つの右図)から形は変わりませんが、補強・軽量のため改良を加えました。
→→→ |
ただ左図の様に押すだけではタッチセンサーが作動しなかったため(紙パックの重量がかなり小さかった)
先生のアドバイスによりてこの原理を利用して改めてタッチセンサーを作成(右図)。
→→→ |
ライントレースのために光センサーを装着。
最初と少しだけ位置はうごきましたが、ほぼ変更なし。
#define line 40 //ライン認識の閾値 #define turn_left OnFwd(OUT_C);Off(OUT_A); //左に方向修正 #define turn_right OnFwd(OUT_A);Off(OUT_C); //右に方向修正 #define go_straight OnFwd(OUT_A+OUT_C); //直進 #define back OnRev(OUT_A+OUT_C); //後退 #define get 1 //通信機能のためのサブルーチン #define end 2 #define set 3 #define put 4 #define end_2 5 int through ; //中心の円との接点を抜けるために使う変数 int box ; //積んだ箱を中心に置く際に使う変数
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A+OUT_C,7); ClearMessage(); box = 0; while(true) { while((Message() == 0)||(Message() == end)) { through = 0 ; if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 >= line)) { go_straight; //直進 } if((SENSOR_1 <= line)&&(SENSOR_2 <= line)) { go_straight; //直進 } if(SENSOR_1 <= line) { turn_right; //右に修正 } if((SENSOR_2 <= line)&&(SENSOR_3 >= line)) { turn_left; //左に修正 } if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 <= line)) { through = 1 ; if(through == 1) //円と格子の接点部分を通過させる { OnFwd(OUT_A+OUT_C); //一定距離直進 Wait(150); if(SENSOR_1 <= line) //左に寄った場合 { turn_right; //右に修正 } if((SENSOR_1 >= line)&&(SENSOR_2 <= line)) //右に寄った場合 { turn_left; //左に修正 } through = 0 ; //式の終了 } } } if((Message() == get)||(Message() == end)) //箱を積み込む間のプログラム { Off(OUT_A+OUT_C); until(Message() == end); ClearMessage(); } if((Message() == set)||(Message() == end_2)) //箱を中心に戻すためのプログラム { box ++; //中心に戻る際のルートを変更 if((box == 1)||(box == 2)) //1と2の場合のルート { OnFwd(OUT_C); OnRev(OUT_A); Wait(150); go_straight; Wait(250); Off(OUT_A+OUT_C); } SendMessage(put); //メッセージ送信 until(Message() == end_2); back; Wait(100); Off(OUT_A+OUT_C); if(box == 1) //1のルート { OnFwd(OUT_A); OnRev(OUT_C); Wait(90); go_straight; ClearMessage(); } if(box == 2) //2のルート { Off(OUT_A+OUT_C); Wait(200); ClearMessage(); } } } }
#define get 1 //通信機能のためのサブルーチン #define end 2 #define set 3 #define put 4 #define end_2 5 #define t_a 100 #define t_b 200 int box ; //積んだ箱の数をカウントする変数
sub up() //箱を積み上げるサブルーチン { OnFwd(OUT_A); Wait(t_a); OnFwd(OUT_B+OUT_C); Wait(t_b); }
task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); SetPower(OUT_A,7); SetPower(OUT_B+OUT_C,6); ClearMessage(); box = 0; while(true){ if(SENSOR_1==1){ //タッチセンサが反応 SendMessage(get); //メッセージ送信 box ++; //箱をカウント if((box == 1)||(box == 4)){ //箱積み1個目 up(); SendMessage(end); } if((box == 2)||(box == 5)){ //箱積み2個目 Wait(100); Off(OUT_B+OUT_C); Wait(150); OnRev(OUT_A); Wait(t_a); Off(OUT_A); Wait(250); up(); SendMessage(end); } if((box == 3)||(box == 6)){ //箱積み3個目 SendMessage(set); until(Message() == put); Wait(100); Off(OUT_B+OUT_C); Wait(100); OnRev(OUT_A); Wait(t_a); Off(OUT_A); SendMessage(end_2); } } } }
(3個積みのプログラムとほぼ同じプログラムですので、説明は割愛させていただきます。)
#define line 40 #define turn_left OnFwd(OUT_C);Off(OUT_A); #define turn_right OnFwd(OUT_A);Off(OUT_C); #define go_straight OnFwd(OUT_A+OUT_C); #define back OnRev(OUT_A+OUT_C); #define get 1 #define end 2 #define set 3 #define put 4 #define end_2 5 int through ; int box ;
sub t_c() { OnFwd(OUT_C); OnRev(OUT_A); Wait(150); go_straight; Wait(250); Off(OUT_A+OUT_C); }
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A+OUT_C,7); ClearMessage(); box = 0; while(true) { if((Message() == 0)||(Message() == end)) { through = 0 ; if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 >= line)) { go_straight; } if((SENSOR_1 <= line)&&(SENSOR_2 <= line)) { go_straight; } if(SENSOR_1 <= line) { turn_right; } if((SENSOR_2 <= line)&&(SENSOR_3 >= line)) { turn_left; } if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 <= line)) { through = 1 ; if(through == 1) { OnFwd(OUT_A+OUT_C); Wait(150); if(SENSOR_1 <= line) { turn_right; } if((SENSOR_1 >= line)&&(SENSOR_2 <= line)) { turn_left; through = 0 ; } } } } if(Message() == get) { Off(OUT_A+OUT_C); until(Message() == end); ClearMessage(); } if(Message() == set) { OnFwd(OUT_C); OnRev(OUT_A); Wait(150); go_straight; Wait(250); Off(OUT_A+OUT_C); box ++; SendMessage(put); Off(OUT_A+OUT_C); until(Message() == end_2); } if(Message() == end_2) { back; Wait(100); Off(OUT_A+OUT_C); if((box == 1)||(box == 2)||(box == 3)) { OnFwd(OUT_A); OnRev(OUT_C); Wait(90); go_straight; ClearMessage(); } if(box == 4) { Off(OUT_A+OUT_C); Wait(200); ClearMessage(); } } } }
#define get 1 #define end 2 #define set 3 #define put 4 #define end_2 5 #define t_a 100 #define t_b 200 int box ; int siki ;
sub up() { OnFwd(OUT_A); Wait(t_a); OnFwd(OUT_B+OUT_C); Wait(t_b); }
task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); SetPower(OUT_A,7); SetPower(OUT_B+OUT_C,4); ClearMessage(); box = 0; siki = 0; while(true) { if((SENSOR_1==1)&&(siki == 0)) { SendMessage(get); box ++; if(box == 1) { up(); SendMessage(end); } if(box == 2) { SendMessage(set); siki = 1; } } if(siki == 1) { OnFwd(OUT_A); until(Message() == put); Wait(100); Off(OUT_B+OUT_C); Wait(100); OnRev(OUT_A); Wait(t_a); Off(OUT_A); SendMessage(end_2); box = 0; siki = 0; } } }
自分たちで決めたスタート地点から出発。
↓
紙パックを掴み、持ち上げ、持ち上げた下に紙パックを入れ、
上にある紙パックを離し、下の紙パックをまた掴み持ち上げる。(2回繰り返す)
↓
方向転換をして円に向かい、円の中に紙パックを下ろす。
→→ | →→ |
………という予定でしたが、タッチセンサーが作動しなかったり、強度が足りなかっりして失敗してしまいました。
A1 | A2 | A3 | A4 | A5 | A6 | A7 | A8 | A9 | A10 | ave | 基本 | 合計 | 順位 | |
A7 | 14 | 13 | 14 | 15 | 13 | 16 | 15 | 12 | 13 | 13.9 | 0 | 13.9 | 7 |
紙パック運びは成功せず、基本点は残念なことになってしまいました。
けれど技術点は高めで、他のチームに評価されていい線はいっていたと感じました。
→全体の結果へ