ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
フィールドの説明
アームが大きくなったためメインも大きくした
以下に光センサーがある。タイヤよりやや前に設置することで早めに感知差することができる。
三輪にすることで機動性が高くなった。
NXCの本体を横にするにことで問題となっていたアームの高さを解決した。
アームの下にあるゴム部分からボールを押さえ開閉部分を閉じることでボールを持ち上げる。
アームの開閉部分を開けることで入っていたボールが外に転がる。
赤の通りに進んでいく基本的にライントレースで進んでいく
メールボックスは重くならないように二つ使用
ライントレースの説明は第二回を参照
色の定義
#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 hidari() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<=250){ if(SENSOR_3>HW){ right; t0=CurrentTick(); }else if(SENSOR_3>WH){ rights; t0=CurrentTick(); }else if(SENSOR_3>BL){ OnFwd(OUT_BC,30); t0=CurrentTick(); }else if(SENSOR_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){ //白を4.6秒カウントしたら止まる 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); }
アームが上がる
sub arm_up() { int msg; //メッセージを送る定義(以下同) until(BluetoothStatus(1)==NO_ERR); //子機にノーエラーが出るまで待つ(以下同) RemoteStartProgram(1,"TAI(S1).rxe"); //子機番号1のプログラム"TAI(S1)"を開始させる while(msg !=11){ //メッセージ「11」を受け取るまで停止 ReceiveRemoteNumber(MAILBOX1,true,msg); //メールボックス1からメッセージを受け取る(以下同) } Wait(2000); }
アームが下がる
sub arm_down() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S2).rxe"); //子機番号1の”TAI(S2)”を開始させる while(msg !=12){ //メッセージ「12」を受け取るまで停止 ReceiveRemoteNumber(MAILBOX1,true,msg); } Wait(2000); }
アームが開く
sub arm_open() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S3).rxe"); //子機番号1の”TAI(S3)”を開始させる while(msg !=13){ //メッセージ「13」を受け取るまで停止 ReceiveRemoteNumber(MAILBOX2,true,msg); //メールボックス2からメッセージを受け取る(以下同) } Wait(2000); }
アームが閉じる
sub arm_close() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S4).rxe"); //子機番号1の”TAI(S4)”を開始させる while(msg !=14){ //メッセージ「14」を受け取るまで停止 ReceiveRemoteNumber(MAILBOX2,true,msg); } Wait(2000); }
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(); }
アームが上がる
TAI(S1)
sub arm_up_s() { OnRev(OUT_C,50); //アームが上がる Wait(5000); Off(OUT_C); } task main() { arm_up_s(); SendResponseNumber(MAILBOX1,11); //メールボックスに「11」と送る }
アームが下がる
TAI(S2)
sub arm_down_s() { OnFwd(OUT_C,30); //アームが下がる Wait(3000); Off(OUT_C); } task main() { arm_down_s(); SendResponseNumber(MAILBOX1,12); //メールボックス1に「12」と送る }
アームが開く
TAI(S3)
sub open_s() { OnFwd(OUT_B,30); //アームが開く Wait(3000); Off(OUT_B); } task main() { open_s(); SendResponseNumber(MAILBOX2,13); //メールボックス2に「13」と送る }
アームが閉じる
TAI(S4)
sub close_s() { OnRev(OUT_B,50); //アームを閉じる Wait(5000); Off(OUT_B); } task main() { close_s(); SendResponseNumber(MAILBOX2,14); //メールボックス2に「14」と送る }
アームが重くロボットの製作に時間がかかった。アームの構造によりカップの中の玉をつかむのが運次第になってしまい改善点があった。役割分担がうまくできずに時間がかかってしまった。アームを大きくしてしまったため本体が大きくなるにつれ不具合が生じた。アームの構造をもっと簡素化させ小さい機体にすればよかった。