【現在編集中です】 #contents *目的 [#t6b2d6a8] 黒いラインに沿って動くロボットを作成する。 *手段 [#a42fd4f3] RC2を使用 **コース [#rc85d36b] #ref(081120_182510.jpg) **マシン [#y401a416] #ref(081209_213121.jpg) ・上から見た全体図 #ref(081204_165653[1].jpg) ・飾りのない全体像 ***工夫した点 [#eb7dc61a] ・光センサの読み取り幅を、レゴの凸凹で固定するのではなく、 軸を通すことによって臨機応変に幅を調節できるようにしてある。 #ref(081204_165725[1].jpg) *↑↓光センサの可動部分 #ref(081204_165725[1].gif) *プログラム [#hbfb1c42] ・その1 void go_straight(int t){ OnFwd(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_A+OUT_C); Wait(45); } void back_straight(int t){ OnRev(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_A+OUT_C); Wait(45); } void turn_right(int t){ OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_A+OUT_C); Wait(45); } void turn_left(int t){ OnRev(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_A+OUT_C); Wait(45); } void turn2(int t){ OnFwd(OUT_C); Wait(t); Off(OUT_A+OUT_C); Wait(45); } task main(){ int line_count; int count_value=0; int back_flag=0; int back_time=0; ClearTimer(0); ClearTimer(1); #define THRESHOLD 47 SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); OnFwd(OUT_A); OnFwd(OUT_C); while(1){ while((SENSOR_1> THRESHOLD)&&(SENSOR_3> THRESHOLD)){ if((Timer(0)>20)&&(back_flag==1)){ OnFwd(OUT_A+OUT_C); back_flag=0; back_time=back_time+20; } if((SENSOR_2>0)&&(back_flag==0)){ OnRev(OUT_A); OnRev(OUT_C); back_flag=1; ClearTimer(0); } if(Timer(1)>(2400+back_time)){ break; } } if(Timer(1)>(2400+back_time)){ break; } if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){ line_count=0; while(line_count==0){ if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){ line_count++; Wait(20); count_value++; } } }else{ if(SENSOR_1< THRESHOLD){ Off(OUT_A); while(SENSOR_1<THRESHOLD){//Left if(back_flag==0){ OnFwd(OUT_C); }else{ OnRev(OUT_A); OnFwd(OUT_C); } if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){ break; } } }else{ Off(OUT_C); while(SENSOR_3<THRESHOLD){//Right if(back_flag==0){ OnFwd(OUT_A); }else{ OnRev(OUT_C); OnFwd(OUT_A); } if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){ break; } } } } } Off(OUT_A+OUT_C); } ・その2 #define THRESHOLD 47 //閾値 int stop_line; task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサ SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサ SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサ stop_line = 0;//交差点カウント while(stop_line < 13) { //交差点通行数12=2周 if ((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) {OnFwd(OUT_A+OUT_C);}//両方白→前進 if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))//左が線上→左に回転 { OnFwd(OUT_C); OnRev(OUT_A); } if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))//右が線上→右に回転 { OnRev(OUT_C); OnFwd(OUT_A); } if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)){//両方が線上→一旦停止 Off(OUT_A+OUT_C); Wait(300); OnFwd(OUT_A+OUT_C);Wait(45); stop_line = stop_line + 1; } if(SENSOR_2 == 1){//タッチセンサオン→少し下がって一旦停止 OnRev(OUT_A+OUT_C); Wait(20); Off(OUT_A+OUT_C); Wait(300); OnFwd(OUT_A+OUT_C);Wait(30); stop_line = stop_line + 1; } } Off(OUT_A+OUT_B+OUT_C);//二周回って終了 } *結果 [#dfa17b1b] ・残念ながらここに動画は張り付けられないが、きちんと作動することが確認できた。 *考察/感想 [#xe36f72a] ・最初に書いたプログラムが全く動かなかったため、最初から打ち直さなくてはならずやや焦った。 ・結果的にそれなりに満足な動きと見た目になったため、よかったと思う。 - whileを使ってもよかったと思います<二週回って終了のライン -- [[なかむら]] &new{2008-12-11 (木) 13:55:27}; #comment 一応書くべきことはきちんとかけています。全体的にもう少し詳しく書きましょう。~ 例えば、ライントレースの原理を図で説明したり、プログラムにはどのような選択肢があって、どうしてそれを選んだのか等。 FI