*ライントレーサーをつくろう! [#le2c373e] **目次 [#v84fa079] #contents **ロボット紹介 [#oead820a] ***黒い線を辿る構造 [#x9d24dc6] 今回のロボットは光センサ1つ、カラーセンサ1つを使用し黒い線の上を動くものです。&br; 作られるプログラムによって、二つのセンサで黒い線を挟む方法と一つのセンサで動かす方法が考えられます。&br; #ref(2011b/A4/課題2左/,100%,センサの写真) ***ロボットの構造 [#mcf74e21] 基本的な構造は三輪車で中心に光センサ、少し右前にずれてカラーセンサがついています。今回は二人とも線を挟むプログラムを作ったためこの様なセンサの配置となりました。&br; #ref(2011b/A4/課題2左/,100%,ロボットの外形) 今回のロボットの特徴は本当にどうでもいいことなのですが見た目です。機能性よりはるかに見た目を大事にしました。&br; 最初は説明書のロボットより軽量で強度のあるものを作りましたが線を探しながら進む姿に創作意欲が・・・&br; テーマは「生き物」です。&br; #ref(2011b/A4/課題2左/,100%,ロボットの外形) 最初は角、次にしっぽ、そして目玉をつけました。&br; 目玉、角は自由に動かすことができ、しっぽはロボットのが動くのに合わせて動きます。&br; はっきり言ってこのロボットは重心が偏り、動きが雑です。しかしこの見た目がいい!だからこのままにしました。&br; ***このロボットの問題点と改善点 [#j5adfb40] - - - - - **コース解説 [#yd121929] 今回A4チームで作ったコースは次のコースです。 #ref(2011b/A4/課題2左/,100%,コースの写真) 直線的なコースです。 **プログラム紹介 [#v7d4321f] ***中村 (右回り、近道)[#h0689ae2] ***志村(左回り、直角) [#qefd2dd7] 今回私は、通常光センサ1つを使い黒い線を辿るプログラムにしました。&br; カラーセンサは交差点とロータリーの認識に使いました。&br; 変数を使用し交差点、ロータリーを何個過ぎたかを数えロボットの対応を変えています。 #define run_sokudo1 40 //速度1の設定 #define run_sokudo2 45 //速度2の設定 #define run_sokudo3 50 //速度3の設定 #define run_sokudo4 75 //速度4の設定 #define light_b 30 //光センサの黒の値 #define light_w 62 //光センサの白の値 #define color_w INPUT_WHITECOLOR//カラーセンサの白の値 #define color_b INPUT_BLACKCOLOR//カラーセンサの黒の値 #define time_run 10 //一回に走る時間 #define VOL 4 //音量4 #define oto_do4 262 //ドの音 #define oto_mi4 294 //ミの音 #define oto_so4 392 //ソの音 int ro_ko; //交差点とロータリーの回数の変数を定義 task main() { ro_ko=0;//変数の初期化 SetSensorLight(IN_1); // ポート1に光センサ SetSensorColorFull(IN_2); // ポート2にカラーセンサ while(true)//無限ループ { if (Sensor(IN_1)>light_b && Sensor(IN_1)<light_w)//黒白 { if(Sensor(IN_2)==color_b )//ロータリーor交差点 { ro_ko=ro_ko+1;//ロータリーと交差点 PlayToneEx(oto_mi4, 100, VOL, FALSE); if(ro_ko==4||ro_ko==5||ro_ko==9||ro_ko==10)//ロータリー内での出口判断 { OnFwd(OUT_A,run_sokudo1); Wait(500); Off(OUT_A); OnFwd(OUT_AC,run_sokudo2); Wait(150); Off(OUT_AC); } else//交差点かロータリーの判断 { if(ro_ko==7) { OnFwd(OUT_A,run_sokudo1); Wait(380); Off(OUT_A); OnFwd(OUT_AC,run_sokudo2); Wait(110); Off(OUT_AC); } else { OnFwd(OUT_A,run_sokudo1); Wait(85); OnFwd(OUT_AC,run_sokudo2); Wait(350); Off(OUT_AC); } } if(Sensor(IN_1)<light_w && Sensor(IN_2)!=color_b)//交差点(3、4、7、8回目の交差点と判断したときはロータリー内) { PlayToneEx(oto_do4, 100, VOL, FALSE); if(ro_ko==5 || ro_ko==10)//ロータリー内の出口(出る時) { OnFwd(OUT_C,run_sokudo4); OnRev(OUT_A,run_sokudo4); Wait(700); Off(OUT_AC); } } else//ロータリー { PlayToneEx(oto_so4, 100, VOL, FALSE); OnRev(OUT_A,run_sokudo4); Wait(500); Off(OUT_A); } } else//黒白の直線または曲線 { OnFwd(OUT_AC,run_sokudo4); Wait(10); Off(OUT_AC); } } else//線からずれている { if(Sensor(IN_1)<light_b)//黒 { OnFwd(OUT_C,run_sokudo4); Wait(time_run); Off(OUT_C); } else//白 { OnFwd(OUT_A,run_sokudo4); Wait(time_run); Off(OUT_A); } } } } このプログラムの問題点 - - - - **感想・考察 [#yadc1790] ***中村 [#t8a635b5] ***志村 [#g4cad49d] 今回の課題で私が苦労したところはロータリーと交差点交差点をどう判別するか、ロータリーに進入した後にどうやって1つ目の出口を無視して2つ目の出口で抜け出すかでした。今回私は変数を使い交差点とロータリーの数を数えることでこの問題を解消しました。一回成功しても次に失敗することもありプログラム上での修正に苦労しました。 **コメント [#nd3e1c28] 気になったこと等ありましたらお気軽にコメントして下さい。 #comment