#contents *課題[#la0886b4] **課題について [#tedb6b4d] [[課題1のページ>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]] より要約すると、コースを走るロボットを作る、ということである。 今回は、E地点右折コースを選んだ。 *ロボットについての概要 [#o6c7e1c9] 機体は取扱説明書に記載されているものを使用した。 *使用したプログラムと解説 [#oab2823b] **プログラム:定義 [#c92eaaff] #define SPEED_H 35 //スピード定義 大 #define SPEED_L 15 //スピード定義 小 #define turn_right1 OnFwd(OUT_A,SPEED_H);OnRev(OUT_C,SPEED_H); //大きく右折 #define turn_right2 OnFwd(OUT_A,SPEED_H);OnRev(OUT_C,SPEED_L); //小さく右折 #define goFwd OnFwd(OUT_AC,SPEED_H); //直進 #define turn_left1 OnRev(OUT_A,SPEED_H);OnFwd(OUT_C,SPEED_H); //大きく左折 #define turn_left2 OnRev(OUT_A,SPEED_L);OnFwd(OUT_C,SPEED_H); //小さく左折 #define TimerReset t0=CurrentTick(); //タイマーリセット #define tMAX 140 使用した定義である。 **プログラム:ライントレース [#g869df6e] sub line_trace() { SetSensorLight(S2); long t0=CurrentTick(); while(CurrentTick()-t0<tMAX){ if (SENSOR_2 <= 30){ turn_left1; }else if(SENSOR_2 <= 40){ turn_left2 TimerReset; }else if(SENSOR_2 <= 43){ goFwd; TimerReset; }else if(SENSOR_2 <= 53){ turn_right2; TimerReset; }else { turn_right1; TimerReset; } } } 使用したライントレースのプログラムである。しきい値は慎重に検討し、概ね問題なく作動した。 **プログラム:SOUND_UP、一秒停止 [#f6258598] sub stop_and_beep1() { Off(OUT_AC); PlaySound(SOUND_UP); Wait(1000); } SOUND_UPをして一秒間停止するサブルーチンである。 **プログラム:SOUND_DOUN、一秒停止 [#v3b08fe8] sub stop_and_beep2() { Off(OUT_AC); PlaySound(SOUND_DOWN); Wait(1000); } SOUND_DOWNをして一秒間停止するサブルーチンである。 **プログラム:左折と右折 [#q5c3128c] sub curve_left() { Off(OUT_AC); Wait(1000); OnFwd(OUT_A,SPEED_H); OnRev(OUT_C,SPEED_H); Wait(1000); Off(OUT_AC); Wait(1000); } sub curve_right() { Off(OUT_AC); Wait(1000); OnFwd(OUT_C,SPEED_H); OnRev(OUT_A,SPEED_H); Wait(2000); Off(OUT_AC); Wait(1000); } 一秒間停止した後、左折・右折をして一秒間停止するサブルーチンである。 課題には使用しなかった。なぜこれらのプログラムを書いたのかはわからない。 **プログラム:交差点横断 [#d70b50f5] sub ignore() { Off(OUT_AC); Wait(1000); OnFwd(OUT_AC,SPEED_H); Wait(400); Off(OUT_AC); Wait(100); } 交差点に差し掛かった際、線を一部無視して少しだけ直進するプログラムである。 十字路などを渡る際に使用した。 **プログラム:メインタスク [#zbb2b458] task main() { SetSensorLight(S2); long t1=CurrentTick(); int m=0; //交差点カウンタ設定 while(m <= 13){ line_trace (); m = m+1; //交差点カウント+1 if (m == 13){ //交差点カウンタの値が13の際… stop_and_beep2 (); Off(OUT_AC); }else if(m == 12){ //交差点カウンタの値が12の際… stop_and_beep1 (); }else if(m == 11){ //交差点カウンタの値が11の際… stop_and_beep1 (); }else if(m == 10){ stop_and_beep1 (); ignore (); }else if(m == 9){ stop_and_beep2 (); }else if(m == 8){ stop_and_beep1 (); }else if(m == 7){ stop_and_beep1 (); }else if(m == 6){ stop_and_beep2 (); ignore (); }else if(m == 5){ stop_and_beep2 (); ignore (); }else if(m == 4){ stop_and_beep1 (); }else if(m == 3){ stop_and_beep1 (); ignore (); }else if(m == 2){ stop_and_beep2 (); turn_right1;Wait(430);Off(OUT_AC);Wait(100); }else if(m == 1){ stop_and_beep1 (); turn_left1;Wait(250);Off(OUT_AC);Wait(100); } } } これがメインのタスクである。 今回は、whileで延々とライントレースを繰り返し、ライントレースのサブルーチンから外れた時を「交差点検知」とし、交差点カウンタを用いて検知した交差点の数に応じてifで条件付けをした。 *結果 [#j4782436] ゴールすることはできなかった。 *反省点 [#e120e048] 上のtask_mainを見てわかるように、まず大まかなプログラムを書き、細かい微調整を定義やサブルーチンの後に付け足していけばよいと思っていたが、やはりプログラムのみで動作を制御しきるのは無理があった。 具体的に言えば、E右折後にP点でS点に行かずQ点に向かわせる事ができなかった。SOUND_DOWN後に少し左折させることで交差点を無視させようとしたが、線にセンサーがなかなか反応せずプログラムの数値だけでは解決できなかった。 おそらくもう少しタイヤ幅を狭くして小回りを利かせるか、センサーの位置を機体の中心に近づければ成功できたかもしれない。 *まとめ [#tdad08f0]