- 追加された行はこの色です。
- 削除された行はこの色です。
*課題3 [#y99f8e94]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
#ref(mission3.png,,50%)
フィールドの説明
フィールドは課題2で使用した紙を使用する。
生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
プラ容器には色をつけたり文字や記号を書いてもよい。
プラ容器は両面テープ等でフィールドに固定してもよい。
2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
**ルール [#n50f30af]
基本ルール
~競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
~図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域~内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
~開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
~競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
~途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
~競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
~競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
~基本得点の計算方法
~プラ容器内の玉を1個運べば8点。二つとも運べば20点。
~L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
~競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
~競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
~競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
~競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
~競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
~技術点の計算方法
~以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチー~玉を探し取りにいくまでの動作 (3点)
~玉を掴む動作 (3点)
~玉をを運ぶ動作 (2点)
~玉を容器の中に入れる動作 (2点)
~2台のRIS、NXT、EV3の連携の良さ(2点)
~自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
~その他 (3点)
*ロボットの説明 [#z9abf1d7]
今回作ったロボットはこちらです。
#ref(image1.jpeg,,80%)
私たちのグループは二つのロボットに分けるのではなく、一体型のロボットの作った。一つのNXTの本体はタイヤを動かし、前後左右の動きを可能にそして、もう片方のNXTは、アームの部分を動かし、上下の動きを可能にする。二つのNXTはBluetoothで通信している。
**アームの機構 [#c71ef7eb]
アームの機構はこのようになっている。
#ref(image2 - コピー.jpeg,,35%)
**ボールをつかむ機構 [#afb546e3]
ボールをとるために、輪ゴムを利用した。ボールを上から二本の輪ゴムで挟み上にあげるというものである。
#ref(ボール上げ.png,,35%)
このようにしてボールをつかんでいき、ボールがお互いに押し合って、上に上がって、溜まっていく。
#ref(close.png,,35%)
溜まっていったボールは、黒い棒の開け閉めによって、ボールをとどめておいたり、出したりできるようにした。
**光センサー [#e5d234b9]
センサーの位置は下のようになった
#ref(センサー.png,,50%)
光センサーはタイヤよりも前の位置につけた。当初、光センサーの位置はタイヤよりも後ろについていたが、それだと色の認識の判断が遅れ、ライントレースができるときとできない時があったため、タイヤよりも前につけることにした。
*プログラムの説明 [#vf204729]
今回はNXTを二つ使っているので、片方をマスター、もう一方をスレーブとしてBluetoothで通信している。スレーブ側のプログラムは「アームを上げる」、「アームを下げる」、「扉を開ける」、「扉を閉める」の四つの操作を行う。コースとしては右側のマップのB→C→D→E→F→Gとライントレースをしていき、箱の中のふたつをとり、残りの二つをとるという、作戦である。
**スレーブ側のプログラム [#b0e868cf]
***アームを上げる [#o2654d2e]
プログラム名はTAI(S1)
task main()
{
OnRev(OUT_C,50);
Wait(5000);
Off(OUT_C);
SendResponseNumber(MAILBOX1,11); //マスター側にアームを上げた終わったことを伝える
}
***アームを下げる [#hc9d17c4]
プログラム名はTAI(S2)
task main()
{
OnFwd(OUT_C,30);
Wait(3000);
Off(OUT_C);
SendResponseNumber(MAILBOX1,12); //マスター側にアームを下げた終わったことを伝える
}
***扉を開ける [#f96fe191]
プログラム名はTAI(S3)
task main()
{
OnFwd(OUT_B,30);
Wait(3000);
Off(OUT_B);
SendResponseNumber(MAILBOX2,13); //マスター側に扉を開けたことを伝える
}
***扉を閉める [#bc4422b4]
プログラム名はTAI(S4)
task main()
{
OnRev(OUT_B,50);
Wait(5000);
Off(OUT_B);
SendResponseNumber(MAILBOX2,14); //マスター側に扉を閉めたことを伝える
}
**マスター側のプログラム [#h83c6e5b]
***定義したマクロ [#m84ac443]
#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 //Bluetoothの接続番号
***ライントレース [#y01440fa]
ライントレースのプログラムは以下のようになる。
sub hidari()
{
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<=250){
if(SENSOR_3>HW){
right;
right; //白なら右旋回
t0=CurrentTick(); //時間をリセット
}else if(SENSOR_3>WH){
rights; //灰白なら右に曲がる
t0=CurrentTick();
}else if(SENSOR_3>WH){
rights;
t0=CurrentTick();
}else if(SENSOR_3>BL){
OnFwd(OUT_BC,30);
OnFwd(OUT_BC,30); //灰色なら直進
t0=CurrentTick();
}else if(SENSOR_3>HB){
lefts;
lefts; //灰黒なら左に曲がる
t0=CurrentTick();
}else{
left;
left; //黒なら左旋回
}
}
Off(OUT_BC);
}
***交差点横断 [#gb1d3340]
交差点横断のプログラムは次のようになる。
sub oudann()
{
right;
Wait(300);
Off(OUT_BC);
OnFwd(OUT_BC,30);
Wait(500);
Off(OUT_BC);
}
***直角のライントレース [#tacf7b5c]
直角のところのライントレースは次のようになる。なお、このプログラムは箱の前で止まるようになっている。
sub magari()
{
SetSensorLight(S3);
int nOnline=0;
while(nOnline<4600){
int nOnline=0;
while(nOnline<4600){ //4.6秒以下の間はwhile内を実行する
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);
}
***アームを上げる [#a75642a9]
sub arm_up()
{
int msg;
until(BluetoothStatus(1)==NO_ERR);
RemoteStartProgram(1,"TAI(S1).rxe");
until(BluetoothStatus(1)==NO_ERR);
RemoteStartProgram(1,"TAI(S1).rxe"); //TAI(S1)を行うようにスレーブ側に命令
while(msg !=11){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
Wait(2000);
Wait(2000); //スレーブ側から応答があるまで待機
}
***アームを下げる [#y567662f]
sub arm_down()
{
int msg;
until(BluetoothStatus(1)==NO_ERR);
RemoteStartProgram(1,"TAI(S2).rxe");
RemoteStartProgram(1,"TAI(S2).rxe"); //TAI(S2)を行うようにスレーブ側に命令
while(msg !=12){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
Wait(2000);
}
***扉を開ける [#r0585964]
sub arm_open()
{
int msg;
until(BluetoothStatus(1)==NO_ERR);
RemoteStartProgram(1,"TAI(S3).rxe");
RemoteStartProgram(1,"TAI(S3).rxe"); //TAI(S3)を行うようにスレーブ側に命令
while(msg !=13){
ReceiveRemoteNumber(MAILBOX2,true,msg);
}
Wait(2000);
}
***扉を閉める [#r2ea2bbb]
sub arm_close()
{
int msg;
until(BluetoothStatus(1)==NO_ERR);
RemoteStartProgram(1,"TAI(S4).rxe");
RemoteStartProgram(1,"TAI(S4).rxe"); //TAI(S4)を行うようにスレーブ側に命令
while(msg !=14){
ReceiveRemoteNumber(MAILBOX2,true,msg);
}
Wait(2000);
}
***全体のプログラム [#id98e096]
task main()
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();
}
**まとめ [#b71fc230]
発表ではボールを一個もとることができず、悔しい結果となってしまった。電池はとても重要だ。