各チームで作成したコースに沿って動くロボットの作成。ただし・・・
・速さと正確さの追求
・交差点で優先側を走っていない場合は一時停止
・前方のもう一台のロボットに接触した場合には、停止して相手のロボットが行き過ぎるか、距離が離れるのを待つ
・コースを2周したら自動的に止まる
完成した写真がこちら
正面
側面
今回のロボットは課題1と同様の4輪を採用した。
今回のロボットでの工夫点は、タッチセンサ用のバンパーである。
おおまかな構成は本に載っているものと大差は無いが、2段にすることにより、より安定してタッチセンサを反応させることを可能にした。
コースを完走することができるようになったが、たまに脱線する恐れがあるので、
安定してコースを完走させることが今後の課題となってくる。
今回自分たちが作成したコースは8の字を2つ合体させたようなコースにした。
単純なコースではあるが、その分正確性、速さが求められる。
コースの全体
今回作成したプログラムがこちら(完成)
作成者 ちん
#define A OUT_A //OUT_Aの省略 #define C OUT_C //OUT_Cの省略 #define trace 39 //閾値
task main(){ int i; //停止用変数iの宣言 i = 0; SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサー宣言 SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサー宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサー宣言 while(i < 5){ //停止用変数iが5より小さければ実行する if(SENSOR_2>trace){ if(SENSOR_3>trace){ //センサーが共に白であるとき前に進む OnFwd(A+C); } else{ //センサー3が黒のとき左にまがる Off(C); OnFwd(A); } } else{ if(SENSOR_3>trace){ //センサー2が黒のとき右にまがる OnFwd(C); Off(A); } else{ //センサーが共に黒のとき Off(A+C); Wait(100); OnFwd(A+C); Wait(150); //1秒停止、1.5秒前進する i = i + 1; //停止用変数iを1増加 } } if(SENSOR_1 == 1){ //タッチセンサーが反応したとき1秒後退、3秒停止する OnRev(A+C); Wait(100); Off(A+C); Wait(300); } } if(i == 5){ //停止用変数iが5になったら停止する Off(A+C); } }
今回、最初に作成したプログラムは過去の作品を参考にtaskを2つにするプログラムを作成した。
taskを2つにすることでタッチセンサーが作動するとき、光センサーのプログラムを停止させ、誤作動を防ぐプログラムが簡単に作成できた。
1個目のプログラムでは変数iを使用し、停止線での止まる回数を利用して2周して止まるプログラムである。
しかし、タッチセンサーが反応してしまうと1個目プログラムでは、変数iのカウントが0に戻ってしまうため、2周で止まれなくなってしまう点が問題であった。
そこでtaskを2つから1つにまとめ改良を加えたのが、上にあるプログラム2個目である。
2個目ではタッチセンサーに反応しても変数iがリセットされないため、無事に2周して停止することができた。
課題発表当日になって慌ててプログラムの2個目を作成して無事に動くかどうか不安だったが、無事に動いてくれて安心した。
また、1個目のプログラムの問題であったタッチセンサーによる変数iのリセットもクリアしてプログラムは自分でも満足に動いてくれたと思った。
あとは停止線で停止してから進むときに脱線しやすいので、そこの修正ができれば良いと思った。
・コメントがあればどうぞ