[[2011a]] *目次 [#dd0e85da] #contents *メンバー [#m574672a] イーノック&mika *今回の課題 [#iec5feda] センサーで動くロボット★コースのゼッタイの規則↓↓ 1、急カーブを曲がんなきゃいけないこと。 2、ロータリー(左周り)を回んなきゃいけないこと。(直進) 3、直角OR近道を克服すること。 4、2人いるんだから反対周りすること。 5、交差点は2つ以上。 6、道幅は1.5〜2mmで。 7、どっかで音楽を鳴らすこと。 *コース [#p1d7dd15] &ref(SA380010.JPG); *ロボット制作 [#h1f90d4c] **土台 [#y332e107] &ref(robo1.jpg); 小回りがきくように結構小さめにしてみた。本体を立ててみた。 前輪と後輪を違うものにすることで、ロボットがコンパクトになり、滑りにくい構造に。 あまり余計な付属品はつけなかった。 &ref(robo3.jpg); センサーは二つ。その方がプログラミングを簡略化できるので。 センサーは二つ。その方がプログラミングを簡略化できるので。センサー間もできるだけ狭くした。 **センサー部分 [#q4ec15f6] &ref(robo2.jpg); 地面から離れすぎていると、センサーが線を感知できないので、できるだけ下目に設置。 *プログラム [#f32de5e5] **イーノック [#jd9e25c0] ☆直角版(ゴールからスタート) とりあえず、定義づけ。 #define T 40 //闢値 #define FIRST_TIME 25 #define SECOND_TIME 120 #define THIRD_TIME 110 #define FOURTH_TIME 170 #define FIFTH_TIME 35 #define SIX_TIME 170 #define SEVEN_TIME 30 #define EIGHT_TIME 110 #define TURN_TIME 0 #define t90 75 //90度旋回 #define t270 225 //270度旋回 #define Go OnFwd(OUT_A); OnFwd(OUT_C); //進む #define STOP Off(OUT_A); Off(OUT_C); //止まる #define T_R OnFwd(OUT_A);OnRev(OUT_C); //右に曲がる #define T_L OnFwd(OUT_C);OnRev(OUT_A); //左に曲がる #define BC OnRev(OUT_A);OnRev(OUT_C); //バックする task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を設置 SetSensor(SENSOR_3,SENSOR_LIGHT); //せんさー3を設置 次にパートごとに分けてみた。 ***パート1 [#b2b55d90] ClearTimer(0); while(Timer(0)<= FIRST_TIME){ Go;} //ともかく直進 ***パート2 [#x8cb4dc8] ClearTimer(1); while(Timer(1)<= SECOND_TIME){ if((SENSOR_1>T)&&(SENSOR_3>T)){ BC;} //両方白なら後退 else if((SENSOR_1>T)&&(SENSOR_3<T)){ T_L;} //右のみ白なら左に路線調整 else if((SENSOR_1<T)&&(SENSOR_3>T)){ T_R;} //左のみ白なら右に路線調整 else if(SENSOR_1<T)&&(SENSOR_3<T)){ Go;} } //両方黒なら直進 ***パート3 [#f47d78d1] ClearTimer(2) while(Timer(2)<= THIRD_TIME){ if((SENSOR_1>T)&&(SENSOR_3>T){ t90;} //両方白で90度旋回 if((SENSOR_1>T)&&(SENSOR_3<T)){ t270;} //右のみ白で270度旋回 else { go;}} //その他で直進 ***パート4 [#zbcb1f93] ClearTimer(1) while(Timer(1)<= FOURTH_TIME){ if((SENSOR_1>T)&&(SENSOR_3>T)){ BC;} //両方白なら後退 else if((SENSOR_1>T)&&(SENSOR_3<T)){ T_L;} //右のみ白なら左に路線調整 else if((SENSOR_1<T)&&(SENSOR_3>T)){ T_R;} //左のみ白なら右に路線調整 else if(SENSOR_1<T)&&(SENSOR_3<T)){ Go;} } //両方黒なら直進 ***パート5 [#j5b3b99a] ClearTimer(0) while(Timer(0)<=FIFTH_TIME){ Go;} //ともかく直進 ***パート6 [#g486c303] ClearTimer(1) while(Timer(1)<=SIX_TIME){ if((SENSOR_1>T)&&(SENSOR_3>T)){ BC;} //両方白なら後退 else if((SENSOR_1>T)&&(SENSOR_3<T)){ T_L;} //右のみ白なら左に路線調整 else if((SENSOR_1<T)&&(SENSOR_3>T)){ T_R;} //左のみ白なら右に路線調整 else if(SENSOR_1<T)&&(SENSOR_3<T)){ Go;} } //両方黒なら直進 ***パート7 [#n3c0b49f] ClearTimer(0) while(Timer(0)<=SEVEN_TIME){ Go;} //ともかく直進 ***パート8 [#q2f37923] ClearTimer(1) while(Timer(1)<=EIGHT_TIME){ if((SENSOR_1>T)&&(SENSOR_3>T)){ BC;} //両方白なら後退 else if((SENSOR_1>T)&&(SENSOR_3<T)){ T_L;} //右のみ白なら左に路線調整 else if((SENSOR_1<T)&&(SENSOR_3>T)){ T_R;} //左のみ白なら右に路線調整 else if(SENSOR_1<T)&&(SENSOR_3<T)){ Go;} } //両方黒なら直進 ***パート9 [#e040e027] ClearTimer(3) while(EIGHT_TIME<Timer(3)){ STOP; PlaySound(SOUND_DOUBLE_BEEP) } //ゴール付近で停止とともに断末魔の如き音 } **mika [#oea2f41f] ☆近道版(スタートからゴール) #define mae OnFwd(OUT_A);OnFwd(OUT_C);//前に進む #define migi OnFwd(OUT_A);OnRev(OUT_C);//右に曲がる #define hidari OnFwd(OUT_C);OnRev(OUT_A);//左に曲がる #define ushiro OnRev(OUT_A);OnRev(OUT_C);//後ろに進む #define tomaru Off(OUT_A); Off(OUT_C);//止まる(終わり) #define first_TIME 20//1、最初の直進 #define second_TIME 35//2、最初のロータリー #define third_TIME 150//3、2回交差するとこ #define forth_TIME 35//4、2回目のロータリー #define fifth_TIME 25//5、近道の時の直進 #define sixth_TIME 40//6、最後のカーヴと直進 #define THRESHOLD 40 //閾値 #define Do 523//音階(ドレミファソラシ♪) #define Re 587 #define Mi 659 #define Fa 698 #define So 784 #define La 880 #define Shi 988 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//端子1&3に接続されたセンサは光センサである SetSensor(SENSOR_3,SENSOR_LIGHT); PlayTone(Do,25); Wait(30); // Wait時間を長く同じ音を続けて鳴らしても一つの音にならないようにしている PlayTone(Fa,25); Wait(30); //『大きなのっぽの古時計』でBGM PlayTone(Mi,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(So,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(So,15); Wait(20); PlayTone(La,15); Wait(20); PlayTone(La,15); Wait(20); PlayTone(Shi,15); Wait(20); PlayTone(La,15); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(So,15); Wait(20); PlayTone(So,15); Wait(20); PlayTone(Fa,20); Wait(25); PlayTone(Fa,15); Wait(20); PlayTone(Fa,15); Wait(20); PlayTone(Mi,25); Wait(20); PlayTone(Re,15); Wait(20); PlayTone(Mi,15); Wait(20); PlayTone(Fa,30); Wait(35); Wait(20); ClearTimer(0);//1、最初の前進。 while(Timer(0)<=first_TIME){mae;} ClearTimer(0);//2、最初のロータリーの攻略。 while(Timer(0)<=second_TIME){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ushiro;}//両方白なら後退 else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){hidari;}//右のみ白なら左へ else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){migi;}//左のみ白なら右へ else if((SENSOR_1<THRESHOLD )&&(SENSOR_3<THRESHOLD)){mae;}}//両方黒なら前進 ClearTimer(0);//3、交差が2回あるところを直進とかカーヴして線に沿って進む。 while(Timer(0)<=third_TIME){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ushiro;}//両方白なら後退 else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){hidari;}//右のみ白なら左へ else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){migi;}//左のみ白なら右へ else if((SENSOR_1<THRESHOLD )&&(SENSOR_3<THRESHOLD)){mae;}}//両方黒なら前進 ClearTimer(0);//4、2回目のロータリーの攻略。 while(Timer(0)<=forth_TIME){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ushiro;}//両方白なら後退 else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){hidari;}//右のみ白なら左へ else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){migi;}//左のみ白なら右へ else if((SENSOR_1<THRESHOLD )&&(SENSOR_3<THRESHOLD)){mae;}}//両方黒なら前進 ClearTimer(0);//5、直進(近道)。 while(Timer(0)<=fifth_TIME){mae;} ClearTimer(0);//6、最後のカーヴとその後の直進。 while(Timer(0)<=sixth_TIME){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ushiro;}//両方白なら後退 else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){hidari;}//右のみ白なら左へ else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){migi;}//左のみ白なら右へ else if((SENSOR_1<THRESHOLD )&&(SENSOR_3<THRESHOLD)){mae;}}//両方黒なら前進 Off(OUT_A+OUT_C);}//終わり。 *感想&反省 [#p691a0b0] ***イーノック [#jfe79e01] 無謀に挑戦することこそが漢のロマン… と意気込んでみたはいいけれど、理想と現実の相違に悩まされて、心に深い傷を負ってしまった僕をそっと励ましてくれたコーギー1号はもういません。 いまさらですが、このロボットの名前はコーギー3号〜夕暮れのロマネスク〜です。 「夕暮れのロマネスク」の部分はたった今つきました。 地味に3号なのは本当です。 1号…帰らぬ犬に、、、 2号…元気でしたが、元気すぎて半壊。 3号…今の姿です。 さて、本題。 プログラミングに頭を抱えました。えげつないほど試行錯誤した結果、パートごとに区切って1つ1つ確実にこなしていくことを決意。世間でいう、小さなことから骨粗鬆症、ちりも積もれば大和撫子戦法です。 タイマーを使っていくにしたがって電池がおかしいぐらい減っていったので、1日に実践訓練を行えるのは5回と定めたら、ありえないぐらい時間がかかってしまいました。反省… 今回の工夫点は、 同じ動作を極力やらせまくるという点です。そうすることで、似たようなカーブはクリアできました。 直角カーブが右左折両方作ってしまったので、90度と270度回して突破させました。 ロータリーはなぜか全部曲がってくれたので結果オーライ。(本来なら、黒・黒では直進のはずなのに…orz) 謎の親切補正以外は、大方成功です。 親切補正のみいまだに謎のままです。 以上!!! ***mika [#l0985eb1] プログラミングがめっちゃ厶ズかった…「ほんま、これなんの記号なん?」ていうのばっかやった。前の課題も難しかったけど、プログラミングに関しては比べられへんぐらいこっちの方が嫌やった。発表の前の週には結構完成してる班が多くてめっちゃすごいなぁって思った。 音楽に関して…私はアニメタッチの主題歌がよかったのに、いくらネットで探しても諳譜が出てきてくれなかった。やからちょっと残念www ☆反省→改善したこと 近道のコースを書くとき何も考えずに書いてしまった→とてもプログラミングができずにコースの書き直し… 交差点でつっかえる→コースの書き直し(わたしは最初は本当に交わってる交差点にしてたけど、そうしてしまったらロボットがロータリーの入口と交差点の区別が判断できないから…) *コメントどーぞ [#n3b9a8f6] - mikaさんのプログラムについて、もう少しきちんと字下げをすれば、どこからどこまでがどのifブロックなのかwhileブロックなのか、見やすくなります。 -- [[松本]] &new{2011-06-30 (木) 15:55:45}; #comment