*目次 [#jefb00fb] #contents *課題 [#o97581ef] -(1)黒いライン上から外れることなく、ライン上の牛乳パックをよけて進め! -(2)黒いライン上から外れることなく、ある交差点上にある牛乳パックを次の交差点に運び進め! -(3)黒いライン上から外れることなく、最初の交差点では右、次の交差点では左...のように進め! 以上のようなプログラミングを作成せよ!! By Boss松本 *コースの紹介 [#w0d5b93f] 僕たちのコースの特徴は以下の3点です。 -(1)曲がり角の角度が急である #ref(090616_1900~0003.jpg) -(2)交差点が2つある #ref(090616_1900~0002.jpg) -(3)コースがシンプルである #ref(090616_1900~0001.jpg) *ロボットの紹介 [#x5377f26] -足部 タイヤを小さくすることによって、全体的に見た目をよくし、小回りを聞くようにしました。こうすることによって、コースの特徴(1)にあげた「曲がり角の角度が急である」ということを難なくこなすロボットに仕上げました。 #ref(090616_1736~0001.jpg) -タッチセンサー部 #ref(090612_1949~0001.jpg) #ref(090624_1909~0001.jpg) 上にある写真のように初めは作りました。しかし、真中にきちんと当たった場合にしかタッチセンサーが反応せず、牛乳パックが軽すぎるせいもあり、このスタイルはボツにせざるをえませんでした。しかし、電池をかえることによって、反応がよくなり、試行錯誤の甲斐なくこの形を採用する結果となりました。また、課題2のときは下の写真の形にしました。 -光センサー部 はじめは、光センサーの幅を広くし過ぎうまくプログラミングができませんでした。そこで、今度は二つの光センサーをくっつけ他ものを作成したが、これもうまくいかず...試行錯誤の結果、写真の幅にたどり着き、プログラムもなんとかうまくいきました。 #ref(090616_1737~0001.jpg) *プログラミングの紹介 [#h36edba7] -課題2-(1)(MOMOの製作) #define THRESHOLD 44 //閥値44と定義 #define Run_time 1000 // ランタイムを1000と定義 #define a OUT_A //モーターAをaと定義 #define c OUT_C //モーターCをcと定義 int b; //bを回数カウントとして定義 task main() { ClearTimer(0); //タイマー0セット while(Timer(0) <= Run_time){ b=0; SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサー左をセット SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーをセット SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサー右をセット while(b<12){ /交差点の個数を12回使う if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) { if((b==2)||(b==3)||(b==6)||(b==7)||(b==10)||(b==11)) //交差点の数2,3,6,7,10,11の時は直進 { Off(a+c); Wait(100); OnFwd(a+c); Wait(30); } else{ //交差点の数0,1,4,5,8,9の時は迂回 Off(a+c);Wait(50); OnRev(a+c) ; Wait(80); //直進(0、8秒) Off(a+c);Wait(50); OnFwd(a); //右回転(0、9秒) OnRev(c); Wait(90); OnFwd(a+c); //直進(1、4秒) Wait(140); OnFwd(c); //左回転(1秒) OnRev(a); Wait(100); OnFwd(a+c); //直進(2、5秒) Wait(250); OnFwd(c); //左回転(0、9秒) OnRev(a); Wait(90); OnFwd(a+c); //直進(1、4秒) Wait(140); OnFwd(a); //右回転(0、9秒) OnRev(c); Wait(90); OnRev(a+c); //後退(1、1秒) Wait(110); }b++; } if(SENSOR_1>THRESHOLD){ //黒い線をトレース if(SENSOR_3>THRESHOLD){ OnFwd(a+c); } else{ //光センサー左が黒線上にいる時右回転 if(SENSOR_1>THRESHOLD){ OnFwd(a); OnRev(c); } } } else{ //光センサー右が黒線上にいる時左回転 if(SENSOR_3>THRESHOLD){ OnFwd(c); OnRev(a); } else{ Off(a+c); Wait(100); OnFwd(a+c); Wait(40); } } } } Off(a+c); } -課題2-(2) (Matchの製作) #define THRESHOLD 44 //閥値44と定義 #define Run_time 1000 // ランタイムを1000と定義 #define a OUT_A //モーターAをaと定義 #define c OUT_C //モーターCをcと定義 int b; //bを回数カウントとして定義 task main() { ClearTimer(0); //タイマー0セット while(Timer(0) <= Run_time){ b=0; SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサー左をセット SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーをセット SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサー右をセット while(b<12){ //交差点の個数を12回使う if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) { if((b==0)||(b==2)||(b==3)||(b==4)||(b==6)||(b==7)||(b==8)|| //交差点の数が0,2,3,4,6,7,8,10,11の時はライントレースを続ける (b==10)||(b==11)) { Off(a+c); Wait(100); OnFwd(a+c); Wait(30); } else{ //交差点の数が1,5,9,12の時は交差点に牛乳パックをおくプログラム Off(a+c);Wait(50); OnFwd(a+c); //直進(1、8秒) Wait(180); OnFwd(a); //右回転(1、8秒) OnRev(c); Wait(180); OnRev(a+c); //後退(0、8秒) Wait(80); OnFwd(a); //右回転(1、8秒) OnRev(c); Wait(180); OnRev(a+c); //後退(1、4秒) Wait(140); }b++; } if(SENSOR_1>THRESHOLD){ //黒い線をトレース if(SENSOR_3>THRESHOLD){ OnFwd(a+c); } else{ //光センサー左が黒線上にいる時右回転 if(SENSOR_1>THRESHOLD){ OnFwd(a); OnRev(c); } } } else{ if(SENSOR_3>THRESHOLD){ //光センサー右が黒線上にいる時左回転 OnFwd(c); OnRev(a); } else{ Off(a+c); Wait(100); OnFwd(a+c); Wait(40); } } } } Off(a+c); } -課題2-(3)(SYOの製作) #define THRESHOLD 44 //閥値44と定義 #define Run_time 1000 // ランタイムを1000と定義 #define a OUT_A //モーターAをaと定義 #define c OUT_C //モーターCをcと定義 int b; //bを回数カウントとして定義 task main () { b=0; SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサー左をセット SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサーをセット SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサー右をセット while (b<19){ //交差点の個数を19回使う if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) { if((b==0)||(b==2)||(b==4)||(b==6)||(b==8)|| //交差点の数が0,2,4,6,8,10,12,14,16,18の時右に曲がる (b==10)||(b==12)||(b==14)||(b==16)||(b==18)) { Off(a+c); Wait(100); OnFwd(a+c); Wait(40); OnFwd(a); OnRev(c); Wait(85); OnFwd(a+c); Wait(30); } else{ //交差点の数が1,3,5,7,9,11,13,15,17,19の時左に曲がる Off(a+c); Wait(100); OnFwd(a+c); Wait(40); OnFwd(c); OnRev(a); Wait(90); OnFwd(a+c); Wait(30); }b=b+1; } if (SENSOR_1>THRESHOLD){ //黒い線をトレース if(SENSOR_3>THRESHOLD){ OnFwd(a+c); } else{ //光センサー左が黒線上にいる時右回転 if(SENSOR_1>THRESHOLD) OnFwd(a); OnRev(c); } } } else{ //光センサー右が黒線上にいる時左回転 if(SENSOR_3>THRESHOLD){ OnRev(a); OnFwd(c); } } Off(a+c); } } *工夫や頑張った点 [#a4200492] ・タッチセンサーのところで、はじめ箱にあたっても反応しなかったので少し当たっただけで反応するようにしました。すると、今度は動いてる時の振動で反応するようになってしまってとても困りました。軽い箱に反応して、かつ動いてる時の振動に反応しないようにする微調整がとても大変でした。 ・ライントレースを細かい動きですることで、急なカーブも曲がれるようにしました。 *感想 [#i3755bd6] -今回の課題もとても難しく、大苦戦でした…。 -ロボが本当に気まぐれで、同じプログラムでも反応したりしなかったり...最終的にはなんとか完成させるごとができたが、ロボの気まぐれにはメンバー全員苛ついていました。 -各プログラムともメンバーで意見を出し合い、いくつもプログラムをやり直し大変な苦労でした。 **コメント欄 [#y0cb6c56] ご自由にどうぞ^^ - ロボットの説明がわかりやすいです。プログラムには、インデント(ifなどの階層ごとに行う字下げ)を入れてもらうと、見やすいです。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 23:16:05}; #comment