[[2019a/Member]] *目次 [#ha636ac0] #contents *課題3について [#aef2e5c2] ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。 #ref(./2019a-mission3.png,50%) **フィールドの説明 [#p46f0058] +フィールドは課題2で使用した紙を使用する。 [#u9060bc7] +生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 [#td676de2] +残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 [#j65b10ce] +プラ容器には色をつけたり文字や記号を書いてもよい。 [#ve058b85] +プラ容器は両面テープ等でフィールドに固定してもよい。 [#ica99d81] +2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。 [#bbc29639] **基本ルール [#o668dedf] +競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 +図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 +開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 +競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 +途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 +競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。 +競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。 *ロボットの説明 [#c0f90928] 全体像↓ #ref(./IMG_20190807_054224.jpg,10%,) 1つのNXTは機体を動かすためのもので,もう1つのNXTはアームを動かすためのものにした.機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした. **アームについて [#p64e7a0d] 正面から↓ #ref(./IMG_20190807_054248.jpg,10%,) 斜め横から↓ #ref(./IMG_20190807_131625.jpg,10%,) 歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大3個まで一度に運ぶことが出来る.また,アームを開くことにより,黒い棒で抑えられていたボールが落ちる **光センサーについて [#s43b0a65] 光センサーを出来るだけ前につけることにより,ライントレースをしやすいようにした. *プログラミングの説明 [#z3e0b25c] 今回の課題ではNXTを2つ使ったので片方をマスター,もう片方をスレーブとして,Bluetoothを用いて通信する. **定義の説明 [#fe0401c3] 光センサーで感知する色を以下のように定義する. BL 40 //灰色に近い黒 WH 47 // 灰色に近い白 HB 32 //真っ黒 HW 55 //真っ白 また以下のように動きを定義する. left OnFwd(OUT_B,45);OnRev(OUT_C,40); //左回り right OnFwd(OUT_C,45);OnRev(OUT_B,40); //右回り lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25); //左曲がり rights OnFwd(OUT_C,38);OnFwd(OUT_B,25); //右曲がり #ref(./色の定義.png,70%,) CONN 1 //Bluetoothの接続 **交差点の認識方法 [#b67bc650] 直角の交差点は,カーブに比べて,黒い部分に滞在する時間が長くなるので,その時間差を利用して認識する.直角の交差点で止まり,カーブでは進み続ける時間は0,25秒だった. #ref(./line2.png,70%,) **ライントレース(マスター側) [#b6d6b773] sub hidari() { SetSensorLight(S3); //光センサー起動 long t0=CurrentTick(); while(CurrentTick()-t0<=250){ //0,25秒以上経過するまで続ける 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); } **交差点の横断(マスター側) [#hf7a7ce2] sub oudann() { right; //右回り Wait(300); Off(OUT_BC); OnFwd(OUT_BC,30); //直進 Wait(500); Off(OUT_BC); } **直角のライントレース(マスター側) [#c866a05b] 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); } **アームを上げる(マスター側) [#l351203a] sub arm_up() { int msg; until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ RemoteStartProgram(1,"TAI(S1).rxe"); //スレーブ側にTAI(S1)を命令 while(msg !=11){ ReceiveRemoteNumber(MAILBOX1,true,msg); //MIALBOX1からメッセージを受け取る } Wait(2000); } **アームを上げる(スレーブ側) [#rdd701ba] sub arm_up_s() { OnRev(OUT_C,50); Wait(5000); Off(OUT_C); SendResponseNumber(MAILBOX1,11); //MAILBOX1に11と送る **アームを下げる(マスター側) [#je6a013a] sub arm_down() { int msg; until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ RemoteStartProgram(1,"TAI(S2).rxe"); //スレーブ側にTA1(S2)を命令 while(msg !=12){ ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1からメッセージを受け取る } Wait(2000); } **アームを下げる(スレーブ側) [#qa3f499b] sub arm_down_s() { OnFwd(OUT_C,30); Wait(3000); Off(OUT_C); SendResponseNumber(MAILBOX1,12); //MAILBOX1に12と送る } **アームを開く(マスター側) [#vaa50dbf] sub arm_open() { int msg; until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ RemoteStartProgram(1,"TAI(S3).rxe"); //スレーブ側にTA1(S3)を命令 while(msg !=13){ ReceiveRemoteNumber(MAILBOX2,true,msg); //MAILBOX2からメッセージを受け取る } Wait(2000); } **アームを開く(スレーブ側) [#s01d2d3c] sub open_s() { OnFwd(OUT_B,30); Wait(3000); Off(OUT_B); SendResponseNumber(MAILBOX2,13); //MAIKBOX2に13と送る } **アームを閉じる(マスター側) [#t4d6fe11] sub arm_close() { int msg; until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ RemoteStartProgram(1,"TAI(S4).rxe"); //スレーブ側にTA1(S4)を命令 while(msg !=14){ ReceiveRemoteNumber(MAILBOX2,true,msg); //MAILBOX2からメッセージを受け取る } Wait(2000); } **アームを閉じる(スレーブ側) [#wd805956] sub close_s() { OnRev(OUT_B,50); Wait(5000); Off(OUT_B); SendResponseNumber(MAILBOX2,14); //MAILBOX2に14と送る } **全体ののプログラミング [#i4255e8b] **全体のプログラミング [#i4255e8b] 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(); } *結果 [#v09d3370] ロボコンではボールを運ぶどころかほとんど起動しないまま終わってしまった.電池切れが原因か. *まとめ・感想 [#we0fb2b7] テスト期間に近いこともあり,あまり時間を割けなかったので,あまり良い結果にはならなかった.しかし,この授業を通して,1つのことに集中したり,長い時間をかけたりすることができ,結果はともあれ,良い経験になったと思う.