- 追加された行はこの色です。
- 削除された行はこの色です。
[[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%,)
機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした.
1つのNXTは機体を動かすためのもので,もう1つのNXTはアームを動かすためのものにした.機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした.
**アームについて [#p64e7a0d]
正面から↓
#ref(./IMG_20190807_054248.jpg,10%,)
斜め横から↓
#ref(./IMG_20190807_131625.jpg,10%,)
歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大3個まで一度に運ぶことが出来る.また,アームを開くことにより,黒い棒で抑えられていたボールが落ちる.
歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大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]
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つのことに集中したり,長い時間をかけたりすることができ,結果はともあれ,良い経験になったと思う.