今回の課題は、下図の黒い線をたどっていくロボットとプログラムを作りゴールを目指すというものである。
私は「E地点直進プログラム」を作った。
A→E→F→Q→R→S→G→H→T→T→R→S→P→E→A と進んでいく。
今回のロボットは小回りをきかせるために出来るだけ車体を小さくし、前方に光センサーを取り付けた。
光センサーと車体の位置を極力近づけることで、旋回半径を小さくすることに成功した。
車体を二輪で作る案も検討したが、安定性と正確性を考慮した結果四輪にすることにした。
メインタスクを少しでも簡略化するためにいくつかの決まった動作を定義した。
#define sikii 40 #define migi Off(OUT_C);OnFwd(OUT_A);Off(OUT_AC);Wait(2); #define hidari Off(OUT_A);OnFwd(OUT_C);Off(OUT_AC);Wait(2); #define migisen OnRev(OUT_C);OnFwd(OUT_A);Wait(2);Off(OUT_AC);Wait(2); #define hidarisen PlaySound(SOUND_UP);OnFwd(OUT_AC);Wait(43);OnFwd(OUT_C); OnRev(OUT_A);Wait(22);OnRev(OUT_A);Wait(82);Off(OUT_AC); #define hidarimage OnFwd(OUT_AC);Wait(43);OnFwd(OUT_C);OnRev(OUT_A);Wait(15);OnRev(OUT_A);Wait(50);Off(OUT_AC); #define oto PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100); #define mae OnFwd(OUT_AC);Wait(20);
メインタスクでは、タイマー式ではなくカウントアップ方式を採用した。
最初の方はタイマー式で挑戦していたが誤作動が多く電池にも左右されやすいことからカウントアップ方式にした。
変数を大量に使ったため非常に長いプログラムとなった。
task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); int n=0; while(n < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; n++; } } hidarisen; //F int l=0; while(l < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; l++; } } oto; hidarisen; //Q int m=0; while(m < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; m++; } } mae; //R int o=0; while(o < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; o++; } } hidarimage; //S int p=0; while(p < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; p++; } } hidarisen; //G int q=0; while(q < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; q++; } } OnFwd(OUT_C); Wait(200); OnRev(OUT_A); Wait(100); Off(OUT_AC); int k=0; while(k < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; k++; } } hidarisen; //H int c=0; while(c < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; c++; } } PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100); mae; //T1 int r=0; while(r < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; r++; } } PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100); mae; //T2 int y=0; while(y < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; y++; } } oto; hidarisen; //R int e=0; while(e < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; e++; } } OnFwd(OUT_AC); Wait(20); //S int a=0; while(a < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; a++; } } hidarimage; //P int g=0; while(g < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; g++; } } PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100); hidarisen; //E int d=0; while(d < 3){ OnFwd(OUT_AC); if(SENSOR_1 >= 50){ migisen; }else if(SENSOR_1 >= sikii){ migi; }else if(SENSOR_1 >= 36){ hidari; }else if(SENSOR_1 <= 35){ hidari; d++; } } OnFwd(OUT_AC); Wait(50); }
今回の反省点は、メインプログラムが長くなってしまったことである。タイマー式ではなくカウントUP方式を採用したためwhileのたびに違う変数を定義したためどうしても簡略化することが出来なかった。一度簡略化したプログラムで試したところ理由はわからないが誤作動が多発してしまった。まだまだプログラミングの知識が足りないのでもっと勉強していきたい。。
反省点はあるものの、しっかりとゴールし与えられた課題をクリアできたのはうれしく達成感を得ることが出来た。また、前回よりも複雑なプログラムを作ったのでプログラミングの力は少しずつではあるがついてきている。次回は今回の反省を生かしてより美しいプログラムを作っていきたい。