- 追加された行はこの色です。
- 削除された行はこの色です。
[[2004/A5/コンテスト用ロボ]]
-プログラム
#define forwards(t) OnFwd(OUT_A+OUT_C);Wait(t);
#define backwards(t) OnRev(OUT_A+OUT_C);Wait(t);
#define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
#define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_TOUCH);
start wall;
forwards(200); //台から降りる動作
PlayTone(523,50);
start search;
}
task search()
{
while(true)
{
if(SENSOR_1 > 37) //緑又は白のパックが見つかるまで
{
repeat(3)
{
forwards(200);
turn_left(50);
turn_right(100);
turn_left(50);
}
turn_left(100); //パックを探しながら往復
}
if(SENSOR_1 < 37) //パックを見つけた場合
{
forwards(400); //パックに向かって前進
start check_sensors;
}
if(SENSOR_1 < 29)
{
PlaySound(4);Wait(50);
backwards(200);
turn_left(60);
}
}
}
task check_sensors()
{
Off(OUT_A+OUT_C);
while(true)
{
if(SENSOR_1 < 30) //黒の場合
{
PlaySound(4);Wait(50);
backwards(200);
turn_left(80);
stop check_sensors; //パックを放して45度旋回
}
else //緑の場合
{
PlayTone(587,50);
turn_left(60);
forwards(100);
OnFwd(OUT_A+OUT_C);until(SENSOR_2 < 35);
PlayTone(659,50);
start comeback;
}
}
}
task comeback()
{
ClearTimer(0);
do
{
stop search;
ClearMessage();
SendMessage(188);
until(Message() != 0);
if(Message() == 189) {PlaySound(1);Wait(100);SendMessage(190);Wait(100);}
if(Message() == 191) {PlaySound(5);Wait(100);forwards(500);backwards(200);turn_left(120);}
Off(OUT_A+OUT_C);
}
until (Timer(0) < 150);
turn_left(40);
start search;
}
task wall()
{
while(true)
{
if(SENSOR_3 == 1)
{
stop search;stop check_sensors;stop comeback;
PlaySound(4);Wait(50);
backwards(250);
OnRev(OUT_A);Off(OUT_C);Wait(120);
start search;
}
}
}
-解説
~このプログラムは基本的には左右に首を振って牛乳パックを探しながら往復し、白か黄緑のパックを見つけると回収(黒は回避する)、3号のもとへ運ぶというものです。この際、3号との通信を利用してもとの場所へ帰ってくるようにする・・・つもりだったのですが、当日の終盤になってプログラムに不備があったことが発覚。まあどちらにせよ、本番ではうまく動いてくれなかったので、意味は無かったのですが。
~このプログラムは基本的には左右に首(ってゆーか全身)を振って牛乳パックを探しながら往復し、白か黄緑のパックを見つけると回収(黒は回避する)、3号のもとへ運ぶというものです。この際、3号との通信を利用してもとの場所へ帰ってくるようにする・・・つもりだったのですが、当日の終盤になってプログラムに不備があったことが発覚。まあどちらにせよ、本番ではうまく動いてくれなかったので、意味は無かったのですが。
-組み立てについて
#ref(dscn1816_medium.jpg)
~
~このロボットは牛乳パックを1つずつ運ぶことが目的なので、パックをしっかりホールドできるように長いアームを装備しています。2つのアームの付け根をゴムで留めてあり、パックを持ったまま旋回してもパックを放さないようにしました。(放すときは、パックに対して真っ直ぐ後退します。)
アームの下にあるタイヤは一見前輪のように見えますが、これは台から降りるための補助輪であり、通常は床から浮くようになっています。
#ref(200502121407001.jpg)
~真の前輪はこちら↑。最初の写真のものにはついていないのですが、後輪と補助輪の中間あたりについています。最初は普通にタイヤを使っていたのですが、旋回するときに強い抵抗がかかるため、キャスター風のパーツに変更しました。走っている途中で外れないように、強度の確保にかなり気を使いました。
#ref(200502121957001.jpg)
~こちらは最終バージョン。上のものは左右1つずつキャスターがついていたのに対して、これは機体中央に1つだけ装備しています。これにより旋回性能をさらに高めることを狙いました。
#ref(200502121711000.jpg)
~左補助輪の付け根に取り付けたタッチセンサー。壁にぶつかると反応し、気体が180度旋回するようにしました(プログラムのtask wallの部分)。これで壁も大丈夫・・・のハズだった・・・のです・・・が
#ref(dscn2089_medium.jpg)
~えーと・・・これは予選2回戦だったかな?ステージの袋小路に入り込んでしまい、旋回しようとしてもアームが引っかかって抜け出せない罠。
この反省を活かし、旋回する前に少し後退するようにプログラムを書き直しました。
-反省
まず、チーム全体のコンセプトを考えたのは僕なのですが、ロボ3台すべてをスタート地点の台に載せようとするとかなり無理があることに、本番になってから気づきました。事前によく確認しておけば、それぞれをコンパクトに作ることも出来た筈です。
僕の製作した2号については、なんか結局役に立たなかったような(汗)。具体的には、1つずつ運ぶことを考えて作ったため、「牛乳パックの山」を相手にしたときにうまく機能してくれないのが最大の問題点でした。もっとまとめて運べるようにするべきだったろうなあ・・・。