[[2018a/Member]]~ 目次 #contents *課題 [#b3e98902] #ref(Inked2018a-mission2_LI.jpg) 今回の課題は上図の矢印をトレースするロボットを作ることである。 *ロボットの概要 [#jb77275a] ロボットを製作する段階でいくつかの工夫を施した。~ -センサーの位置~ センサーでライントレースする際にセンサーがロボットから離れていると急なカーブに対応できない。よって今回のロボットは前輪の位置になるべく近くなるよう設計した。~ -後輪の構造~ センサーを前輪になるべく近づけるにあたり、本体をモーター部分にのせる形となった。そのため本体の重さに耐えるべく後輪のタイヤを二つ使い支えるようにした。 #ref(image1.jpeg) -缶を運ぶ仕組み~ 缶はつかんで運ぶのではなく、四角形の枠で缶をとらえ、引きずりながらかこぶことにした。~ 横から機体を見たときは下図のようになり、灰色の部分が缶を捉えるわくであり、黒の矢印のように上下することによって缶を捉える。 #ref(プレゼンテーション1.jpg) *ライントレースのプログラム [#h3913291] **基本プログラム [#mc53c1c3] ライントレースを行う際に必要なプログラムを以下のように定義した。~ #define kuro 36//線上 #define haiiro 42//境界 #define siro 48//白の部分 #define spd 2 #define turn_l OnFwd(OUT_B,spd);OnRev(OUT_C,spd);//その場左回転 #define turn_r OnFwd(OUT_C,spd);OnRev(OUT_B,spd);//その場右回転 #define sasetu OnFwd(OUT_B,spd);OnRev(OUT_C,10);//左折 #define usetu OnRev(OUT_B,10);OnFwd(OUT_C,spd);//右折 #define tyoku OnFwd(OUT_BC,spd);//直進 #define STEP 1//一回の判定で進む時間 ラインの左側をトレースするプログラムを以下のように組んだ~ task main () { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } ラインの右側をトレースするプログラムを以下のように組んだ。~ task main() { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } **A〜Cのルート[#l93306a4] A〜Cのルートではラインの左側をトレースするプログラムを採用した。~ Cで停止後は軌道の修正を行った。 sub AC() { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); Wait(1000);//Cまで終了 turn_r; Wait(150); tyoku; Wait(1000); i=0;//カウンタリセット **C〜Dのルート [#t7875f38] このルートも左側をトレースした。~ sub CD() { while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); Wait(1000); tyoku; Wait(100); turn_l; Wait(1100); i=0;//カウンタリセット Off(OUT_BC); while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); i=0;//カウンタリセット Wait(1000);//空き缶前 tyoku; Wait(200); OnRev(OUT_A,spd); Wait(500); Off(OUT_A); OnRev(OUT_BC,spd); Wait(500); turn_l; Wait(1300); **D〜Fのルート [#j15593b4] ここも左側をトレースした。ただし途中Eの部分で交差点と認識してしまうところがある。そのため交差点と認識したあと起動を修正し、少しの直進を加えることで突破した。~ sub DF() while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット tyoku; Wait(300);//E終了 while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//F終了 **F〜Iのルート [#fba5757c] ここも左側をトレースした。~ sub FI() turn_l; Wait(1500); while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//H終了 Wait(1000); turn_r; Wait(1500); while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//I終了 Wait(1000); **I〜Jのルート [#i572c3da] 左側トレースではJに到達したか認識することができない。そのためここではラインの右側をトレースした。LとKの突破は先のEと同じ方式をとった。~ sub IJ() while(i<500) { if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//L終了 i=0;//カウンタリセット tyoku; Wait(300); while(i<500) { if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//K終了 i=0;//カウンタリセット tyoku; Wait(300); while(i<500) { if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//J到達 i=0;//カウンタリセット Wait(1000); tyoku; Wait(200); turn_l; Wait(1300); OnFwd(OUT_A,spd); Wait(500); Off(OUT_A); OnRev(OUT_BC,spd); Wait(800); **ゴールに向かう [#jc1ac1c1] 空き缶を置いた後はゴールに向かう。ここでは左側のトレースを採用する。~ sub JA() turn_r; Wait(2000);//Bに向かう while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Wait(1000); turn_l; Wait(1100);//Aに向かう while(i<500) { if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } tyoku; Wait(500); Off(OUT_BC);//A到達 } **プログラムの完成 [#fce5bee8] 完成したプログラムは以下のようになった。 task main() { AC(); CD(); DF(); FI(); IJ(); JA(); } *まとめ [#kadb3099] 今回はトレースするプログラムを作るのに時間がかかった。サブルーチンを用いたり、関数を用いたりと、今回は前回課題に比べ大きく成長することができたと思う。~ 今回は交差点の認識には黒が続いた回数をカウントする方式をとった。~ 機会があれば次はタイマーを用いたプログラムを使ってみたい。