- 追加された行はこの色です。
- 削除された行はこの色です。
[[2004/A4/ロボコン]]
最初は、親機の方でパックも集めるつもりだったから、みんなで親機の方に取り掛かっていたけど、親機に機能を付けていくにつれてだんだんパックを集めるのが窮屈になってきたので「パックを集める。」「パックを台に乗せる。」という作業を2つの機械で分担しようということになった。なったのだが、実際誰もやろうとしないので自分が取り掛かり始めた。これが、きっかけ。
***写真@子機 [#ocba2d82]
#ref(dscn2013_medium.jpg,around)
構造はシンプルですね。後ろのタイヤは初めに台から降りるためのものです。この課題には親機の方でもかなり悩まされました。アーム自体は動きません。(挟むアーム作りかった。)アーム内にセンサーが組み込まれています。パックの色を判別します。詳しくは下の顔リンクをクリック[[&worried;>2004/A4/解説]]
ちゃんと白のパックを選んで壁の方へ向かってますね。このまま壁沿いに親機が待っているはずの場所まで走ります。親機いなかったけど。さあ、この先で小学生の団子サッカー状態に・・・。
#clear
#ref(dscn2011_medium.jpg,around)
こうなると試合になりません。結局両ティーム、リスタート希望ということで再試合となりましたが、小学生サッカーが繰り返されました。
#clear
***プログラム@子機 [#j9d40e79]
最終的にロボコンで使用したプログラムです。
詳しいプログラム解説はこちら→ [[&worried;>2004/A4/解説]]
sub t_left (){ OnFwd(OUT_C);OnRev(OUT_A);}
sub t_right(){OnFwd(OUT_A);OnRev(OUT_C);}
sub left(){OnFwd(OUT_C); } sub right(){OnFwd(OUT_A);}
sub go(){OnFwd(OUT_A+OUT_C);}
sub back(){OnRev(OUT_A+OUT_C);}
sub off(){Off(OUT_A+OUT_C); Wait(50);}
sub off2(){Off(OUT_A+OUT_C);}
void go_off(){go();Wait(50);off();}
void jig(){left();Wait(30);off2();right();Wait(30);off2();}
int level; //変数。何段階かを代入する
int n; //ジグザグの回数を記録
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);SetSensor(SENSOR_3,SENSOR_LIGHT);
while(true)
{
back(); //バックで降りる
Wait(250);
off();
t_left(); //左回転
Wait(100);
off();
level =0;
PlaySound(SOUND_UP);
while (level == 0) //箱を探しに行く第0段階
{
go(); //直進
Wait(200);
off();
t_right(); //右回転
Wait(100);
off();
PlaySound(SOUND_UP);
level = 1; //1を代入
}
n = 0;
while(level == 1) //これから入れようとする第1段階
{ //空ならジグザグ。白、緑なら第2段階へ。黒なら抜く
if(SENSOR_1>=49 && SENSOR_3>=49) //空の状態 49に変更。本番の状況で逐一変更
{jig(); n=n+1;}
if(SENSOR_1>40 && SENSOR_1<49) //白い箱、緑の箱
{PlaySound(SOUND_UP);ClearMessage();level = 2;}
if(SENSOR_3>40 && SENSOR_3<49) //白い箱、緑の箱
{PlaySound(SOUND_UP);ClearMessage();level = 2;}
if(SENSOR_1<=35 || SENSOR_3<=35) //黒い箱
{back();Wait(100);off2()
t_left();Wait(50);off2();go();Wait(50);off2();
t_right();Wait(50);off2();go();Wait(50);off2();n=5;}
//黒い箱を抜いて再び探しに行く
if(n == 20){
PlaySound(SOUND_LOW_BEEP);
back();Wait(300);off2();t_left();Wait(80);off2();
go();Wait(50);off2();t_right();Wait(50);off2();
n = 0;}
}
while(level == 2) //移動の第2段階
{
//壁の方を向く(垂直になってはいけない。できるだけ平行に)
t_right();Wait(50);off();go();Wait(50);off();
//壁にぶつけて、まっすぐになるように。長い時間が必要
go();
until(Message() == 64); //64を受け取ればバックに移る
PlaySound(SOUND_UP);
off();back();Wait(450); off(); //元の位置(左回転終えて直進前)へback
t_left();Wait(100); off(); //90°左回転
PlaySound(SOUND_FAST_UP); level = 0;
}
}
}
***脆弱性@SetPower [#l91594d2]
正直、ここのが一番有用な情報かも。
子機製作中に何度もバグってスイッチが利かなくなり、結局電池を抜いてもう一度firmwareから入れ直さないといけなくなるということが起こりました。初め原因がわからず電池を何度も替えていましたが、高価な電池でも起こってしまうので中途半端な電力の電池が無駄に増えました。松本先生に相談するともしかしたらSetPowerが原因かもしれないということで、SetPowerでスピードを遅くする代わりにギアを使って、プログラムからSetPowerうんぬんを消すと、さっきまでぶん投げてやろうかと本気で思わせていたRCXがぶいぶいと調子よくなり、結局最後までそのままいけました。松本先生に言わすと、基本的にSetPowerは使わないということで、そのままバグが残ってしまったのかもしれません。本当に松本御大は偉大だと思います。
一日に何十回とfirmwareを入れるのに疲れたら、是非ギアでスピードを変えましょう。
***最後に [#u4d7aa83]
敗因は、相手がいるということを想定した上で製作していくことができなかったことだろう。フィールドがパックで埋まることは予想していたが、あんなにパックの押し合いになってマシンが動けなくなるとは思わなかった。こんな初歩的な問題は試運転の段階で出てこなければいけない。しかし、一度大体のマシンの形や作戦をだいたい作っておきたかったので、後々出てくるだろう問題をできるだけ考えないようにしていた。そんなことをしている内にロボコンの日が来てしまった。ちゃんとパックを全部置いての試運転は1、2回しかできていない。相手を置いての試運転なんて1回もやっていない。こんなことで実践で台に積めるわけないのだ。もっと効率よくやっていかなければいけなかった。すごく悔しい。
ロボコンを通して得たものも多い。いままでこんなに議論しながら複数人で作業するということがまずなかった。高校の学園祭的な雰囲気とロボという興味の対象としては最高のおもちゃですごく楽しめたし良い経験ができた。