[[2019a/Member]] *課題 [#je92d41b] ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。 &ref(./1.png,50%); フィールドの説明 -フィールドは課題2で使用した紙を使用する。 -生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 -残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 -プラ容器には色をつけたり文字や記号を書いてもよい。 -プラ容器は両面テープ等でフィールドに固定してもよい。 -2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。 *ロボット [#ia6d478d] アームが大きくなったためメインも大きくした &ref(./20.JPG,30%); **メイン構造 [#t930f626] 以下に光センサーがある。タイヤよりやや前に設置することで早めに感知差することができる。 三輪にすることで機動性が高くなった。 &ref(./30.png,30%); NXCの本体を横にするにことで問題となっていたアームの高さを解決した。 **アーム構造 [#f414ef9a] アームの下にあるゴム部分からボールを押さえ開閉部分を閉じることでボールを持ち上げる。 アームの開閉部分を開けることで入っていたボールが外に転がる。 &ref(./40(2).png,); *プログラム [#u0e38c38] &ref(./10.png,); &ref(./10.png,50%); 赤→青→黄の順に進んでいく基本的にライントレースで進んでいく 赤の通りに進んでいく基本的にライントレースで進んでいく メールボックスは重くならないように二つ使用 ライントレースの説明は第二回を参照 **親機のプログラム [#s742463c] ***マクロ [#rea160ef] 色の定義 #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 ***サブルーチン [#e32a61bb] 線の左をライントレース 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); } ***メインプログラム [#we688d3e] 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(); } **子機のプログラム [#dba119df] アームが上がる 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」と送る } *反省 感想[#d5e567ec] アームが重くロボットの製作に時間がかかった。アームの構造によりカップの中の玉をつかむのが運次第になってしまい改善点があった。役割分担がうまくできずに時間がかかってしまった。アームを大きくしてしまったため本体が大きくなるにつれ不具合が生じた。アームの構造をもっと簡素化させ小さい機体にすればよかった。