目次
ロボットが決められた位置にある空き缶を運び中身の入っている缶の上に積み上げ、積み上げた個数によって得点を競う競技です。
詳しい競技説明とルール、得点については以下をご覧ください。
これがロボットの全体像です。前方に缶を挟むための大きなハサミ、後方にnxt2台を乗せました。センサーは光センサーを2つひとつは中央のラインを読むため、もう1つは、缶の正確な場所を見つけるために使いました。また、nxtのマスター側は、ロボットの駆動輪、センサー、スレイブ側は、ハサミの開閉と上下を制御できるよう配線しました。
これがハサミの全体像です。後ろにレールをつけて、ハサミ全体を持ち上げるようにして、缶を持ち上げます。
これがハサミの機構です。1つのモータでハサミの両側を動かすことができます。真ん中のネジの様な部品が回転することで、その隣のギアがそれぞれ逆回転し、ハサミを開閉することができます。
これがマスター側の駆動輪、光センサー部分です。光センサーは、駆動輪の間と左側の2か所についています。
ハサミ部分は、真ん中の上の方についている大きな2つのタイヤでハサミのレールをはさむようにして差し込みます。この2つのタイヤを回転させることで、ハサミを上下させます。
これが持ち上げた時の様子です。
反省は、まずロボット自体が大きくなりすぎてしまい、小回りが利かなくなってしまったことです。これによりライントレースができなくなってしまいました。それ以外では大きな問題点はありませんでしたが、大きくなってしまった分、強度が無くなり、壊れやすくなってしまいました。
マスター側でセンサーと駆動輪、スレイブ側でハサミの開閉上下を制御しました。
最初に、下の図のように一番手前の缶をターゲットにして、前を向いている状態から回転センサーを使って狙いをつけます。そしてそのまま直進し、缶の間を抜けながら、コースの真ん中の線がある位置まで行きます。この時、缶を2つつかんでしまわないように最初にハサミを缶の1.5倍くらい開いておきます。(そうしないと缶を2つ持ち上げてしまう。)無事、缶を持ち上げ、コースの真ん中の線まで来たら車体を右に回転させながら、光センサーを用いて、中身の入った缶の正確な位置を探します。中身の入った缶は、黒いので、センサー値が大きく変化します。センサーが缶の左端に反応したら、そこで回転センサーを用いて、センサーとハサミのずれている分だけ移動することで、ちょうど缶を積み上げることができます。
マスター側プログラム
//**************************************// // nxtプログラム MASTER // //**************************************// #define turn90 420 #define turn45 170 #define close 2000 #define open 2500 #define up 490 #define down 480 #define BT_CONN 1 #define get_sBOX 1 #define get_fBOX 2 #define out_sBOX 3 #define out_fBOX 4 void turn_l(int i){ Float(OUT_BC); RotateMotor(OUT_C,70,i); Wait(200); Off(OUT_BC); Wait(200); } void turn_r(int i){ Float(OUT_BC); RotateMotor(OUT_B,70,i); Wait(200); Off(OUT_BC); Wait(200); } task main(void){ int get_s=0,get_f=0,out_s=0,out_f=0; int modeM; SetSensorLight(IN_2); SetSensorLight(IN_3); ResetTachoCount(OUT_B); modeM=1; while(1){ switch(modeM){ case 1: turn_r(turn45); modeM=2; break; case 2: RotateMotor(OUT_BC,50,1300); Wait(200); modeM=3; break; case 3: modeM=4; CoastEx(OUT_BC,0); get_s=1; break; case 4: SendRemoteBool(BT_CONN,get_sBOX,get_s); //スレイブ側にブール値を送信 ReceiveRemoteBool(get_fBOX, true,get_f); //スレイブ側からブール値を受信 if(get_f==1){ //スレイブ側からブール値を受信するまで待機 modeM=5; PlayTone(TONE_C4,150); } break; case 5: Wait(200); modeM=6; break; case 6: OnFwd(OUT_BC,40); if(Sensor(IN_3)<40){ modeM=7; } break; case 7: if(Sensor(IN_3)<55){ modeM=8; CoastEx(OUT_BC,0); } break; case 8: OnFwd(OUT_B,50); if(Sensor(IN_2)<35){ modeM=9; } break; case 9: RotateMotor(OUT_B,60,180); Wait(200); CoastEx(OUT_BC,0); out_s=1; modeM=10; break; case 10: SendRemoteBool(BT_CONN,out_sBOX,out_s); //スレイブ側にブール値を送信 ReceiveRemoteBool(out_fBOX, true,out_f); //スレイブ側からブール値を受信 if(out_f==1){ //スレイブ側からブール値を受信するまで待機 modeM=11; } break; case 11: RotateMotor(OUT_BC,-50,500); modeM=12; break; case 12: CoastEx(OUT_BC,0); break; } } }
スレイブ側プログラム
//**************************************// // nxtプログラム SLAVE // //**************************************// #define turn90 420 #define turn45 210 #define close 2500 #define open 2500 #define up 490 #define down 480 #define BT_CONN 1 #define get_sBOX 1 #define get_fBOX 2 #define out_sBOX 3 #define out_fBOX 4 task main(void){ int get_s=0,get_f=0,out_s=0,out_f=0; int modeS; modeS=1; while(1){ switch(modeS){ case 1: ReceiveRemoteBool(get_sBOX,true,get_s); //マスター側からブール値を受信 if(get_s==1){ //マスター側からブール値を受信するまで待機 modeS=2; } break; case 2: PlayTone(TONE_C4,150); RotateMotor(OUT_A,-90,close); Wait(200); modeS=3; break; case 3: RotateMotor(OUT_BC,-65,up); Wait(200); modeS=4; break; case 4: get_f=1; SendResponseBool(get_fBOX,get_f); //マスター側へブール値を送信 ReceiveRemoteBool(out_sBOX,true,out_s); //マスター側からブール値を受信 if(out_s==1){ //マスター側からブール値を受信するまで待機 modeS=5; } break; case 5: PlayTone(TONE_C4,150); RotateMotor(OUT_A,90,open); Wait(200); modeS=6; break; case 6: out_f=1; SendResponseBool(out_fBOX,out_f); //マスター側へブール値を送信 break; } } }
プログラムの反省は、最初に通信がうまくいかず、設定等に時間がかかってしまいました。また、プログラムのプラン的に少し無理があるような感じになってましました。もう少し、正確に缶を積み上げられるようにプログラムのプランをもう少し考えればよかったと思いました。
最初、下の写真のようなマジックハンドのようにして、缶を持ち上げようとしました。しかし、かなりの重量で、マジックハンドを伸ばすのに相当な力が必要で、モータで動かすことができない構造になってしまいました。
また、超音波センサーを使って缶との距離を測ろうとすると、缶の側面が曲面になっているので、上手く値が安定せず、正確に測ることができませんでした。
今回テスト等もあり、時間が少なく、制作にあまり時間が当てられませんでした。その中でも、ハードウェアの製作にかなり時間がかかってしまいました。よってプログラムの時間がほとんどなくなってしまいました。ハードウェアに時間がかかってしまった要因として、組立のプランがなかなかまとまらなかったという点がありました。今後は、制作期限を考え、しっかり計画を行い、制作を進めていけたらいいと思いました。