今回はモーターを2つ使って,ボールをととる動作と,ボールを放す動作に分けて動くようにした.
ボールを取る動作はゴムを使う機構にした.上からボールを押したときにゴムでとるような造りだ.
ボールを箱に入れる動作は長い棒をうまく使ってできるようにした.
長い棒が閉じているときはボールが落ちないようになっているが,長い棒が開くとそこからボールが落ちるような仕組みだ.
両側から閉じたかったので歯車を2枚使った.
足まわりのところはアームが重くなってしまっているので本体を乗せる部分を強化したりタイヤの部分を中心に強くした.
光センサーはタイヤの近くに設置しライントレースをしやすくした.
前回と違うところはNXTが2つあるので2つを連結させて動かしたところだ.2台のNXTの連結はBluetoothと呼ばれる近距離の無線を使って2台で通信することによって作動させる.
2台のうちの片方がマスターとなりもう一台はスレーブという役割になる.プログラムについては次に説明する.
今回も課題2の時と同様に光センサーを使ってライントレースをするプログラムにした.
#define BL 40 // 灰色 #define WH 47 // 灰白 #define HB 32 // 灰黒 #define HW 55 // 真っ白
#define left OnFwd(OUT_B,45);OnRev(OUT_C,40); // より左折 #define right OnFwd(OUT_C,45);OnRev(OUT_B,40); // より右折 #define lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25); // 少し左折 #define rights OnFwd(OUT_C,38);OnFwd(OUT_B,25); // 少し右折
#define CONN 1 // スレーブの接続番号
sub arm_up() //アームを上げる { int msg; // 受け取った値を格納する変数 until(BluetoothStatus(1)==NO_ERR); // 接続できるまで待つ RemoteStartProgram(1,"TAI(S1).rxe"); while(msg !=11){ ReceiveRemoteNumber(MAILBOX1,true,msg); // MAILBOX1の値を受け取りmsgに格納 } Wait(2000); }
sub arm_up_s() { OnRev(OUT_C,50); Wait(5000); Off(OUT_C); } task main() { arm_up_s(); SendResponseNumber(MAILBOX1,11); // MAILBOX1に11を送信 }
sub arm_down() //アームを下げる { int msg; //受け取った値を格納する変数 until(BluetoothStatus(1)==NO_ERR); // 接続できるまで待つ RemoteStartProgram(1,"TAI(S2).rxe"); while(msg !=12){ ReceiveRemoteNumber(MAILBOX1,true,msg); // MAILBOX1の値を受け取りmsgに格納 } Wait(2000); }
sub arm_down_s() { OnFwd(OUT_C,30); Wait(3000); Off(OUT_C); } task main() { arm_down_s(); SendResponseNumber(MAILBOX1,12); // MAILBOX1に12を送信 }
sub arm_open() //棒を開ける { int msg; //受け取った値を格納する変数 until(BluetoothStatus(1)==NO_ERR); //接続できるまで待つ RemoteStartProgram(1,"TAI(S3).rxe"); while(msg !=13){ ReceiveRemoteNumber(MAILBOX2,true,msg); // MAILBOX2の値を受け取りmsgに格納 } Wait(2000); }
sub open_s() { OnFwd(OUT_B,30); Wait(3000); Off(OUT_B); } task main() { open_s(); SendResponseNumber(MAILBOX2,13); // MAILBOX2に13を送信 }
sub arm_close() //棒を閉める { int msg; //受け取った値を格納する変数 until(BluetoothStatus(1)==NO_ERR); //接続できるまで待つ RemoteStartProgram(1,"TAI(S4).rxe"); while(msg !=14){ ReceiveRemoteNumber(MAILBOX2,true,msg); //MAILBOX2の値を受け取りmsgに格納 } Wait(2000); }
sub close_s() { OnRev(OUT_B,50); Wait(5000); Off(OUT_B); } task main() { close_s(); SendResponseNumber(MAILBOX2,14); // MAILBOX2に14を送信 }
sub hidari() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<=250){ if(SENSOR_3>HW){ // センサー3がHWより大きかったらより右に曲がる right; t0=CurrentTick(); }else if(SENSOR_3>WH){ // センサー3がWHより大きかったら少し右に曲がる rights; t0=CurrentTick(); }else if(SENSOR_3>BL){ // センサー3がBLより大きかったら直進する OnFwd(OUT_BC,30); t0=CurrentTick(); }else if(SENSOR_3>HB){ // センサー3がHBより大きかったら少し左に曲がる lefts; t0=CurrentTick(); }else{ left; // それ以外の値だったらより左に曲がる } } Off(OUT_BC); }
交差点の横断は前回と同じように連続して黒が一定の時間続いたらで止まるようにする.
交差点に来たら下記の通りに進んで横断する
sub oudann() { right; //右折 Wait(300); Off(OUT_BC); OnFwd(OUT_BC,30); //直進 Wait(500); Off(OUT_BC); }
横断した後はラインに戻るために下記のようなプログラムにした.
sub magari() { SetSensorLight(S3); int nOnline=0; while(nOnline<4600){ if(SENSOR_3>HW){ right; nOnline++; //カウント...白に入ってる秒数をカウントし停止する }else if(SENSOR_3>WH){ rights; }else if(SENSOR_3>BL){ OnFwd(OUT_BC,30); }else if(SENSOR_3>HB){ lefts; }else{ left; } } Off(OUT_BC); }
task main() { hidari(); oudann(); magari(); arm_up(); OnFwd(OUT_BC,30); Wait(300); Off(OUT_BC); arm_down(); arm_close(); left; Wait(1500); Off(OUT_BC); OnFwd(OUT_BC,30); Wait(2000); Off(OUT_BC); arm_up(); arm_down(); left; Wait(2500); Off(OUT_BC); OnFwd(OUT_BC,40); Wait(5000); Off(OUT_BC); hidari(); oudann(); hidari(); oudann(); hidari(); arm_up(); arm_open(); }
ロボコンの結果は一つもボールをとれなかった.
初めての4人作業でしっかりと協力できたので良かったと思う.しかし,機械の方ではアームの部分が重くなってしまったので重心が傾いたり,思うように動かない場面があったり,プログラミングの方では,本番で全然思い通りに動かなかったりした部分があったので課題の残るものとなってしまった.光センサーを2つ使っているところもあり学ぶ部分も多かった.人間ならボールを容器に入れるなんて簡単なのに、ロボットでやるとうまくいかなかった.。だから、人間や動物が目的を達成するためにする行動をプログラムによって、再現するのは難しいと思った。また、人間のような動きをさせることが共通の課題なんだろうと思った.。