上図のようなコースで、緑の位置にある缶を赤の位置にある缶の上にできるだけ多く積み上げることを目的としたロボコンを開催しました!!
できあがったロボットは上のようになりました。構造としては前面に取り付けたハサミをモーターで持ち上げ缶を積み上げる形にしました。今回のポイントとしてはハサミを軽量化したところです。これにより持ち上げの負荷を軽減できたと思います。また、ハサミを持ち上げるレール部に隙間をなくすことで、垂直なままハサミを持ち上げることに成功しました。あとは、ファームウェアを2つとも後ろにつけることで前後のバランスを取ろうとしました。
図のようにモーター(裏側にもある)2つを用いて、レール構造によってによってハサミを持ち上げました。このとき、レールとタイヤがしっかりあっていないとハサミを持ち上げた時に傾いてしまうのが難しかったです。
正面から見たものです。画像の青で囲んだところにある歯車でハサミに取り付けられた歯車をそれぞれ逆回転させることで、モーター1つでハサミを動かせるようになりました。ロボットの軽量化と効率化に大きく影響しました。
実際に持ち上げてみました。持ち上げる動作自体はほぼ100%成功するまでになりました〜♪
反省点:
構造に時間をかけすぎて、プログラミングがおろそかになってしまいました。もっと計画的にできればよかったと思います。
構造上の問題としては、ハサミやレールに大量のパーツを使用したため、後方部のパーツが足りずしっかりしていない構造になってしまいました。また、全体の重量感が否めなく、バランスだけでなく、旋回能力も低くなってしまいました。
マスター側プログラム
//**************************************// // 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; } } }