[[2013a/Member]] *ロボットの紹介 [#r757f719] 自分たちのロボットは、最初に相手のパスを受けるので、いかにパスを受けてからパスを出す動作につなげるかというところを重視して作りました。まず、アームにブロックを使わずにやわらかいチューブを使ってボールの保持力を上げました。これにより、キャッチをした後のボール運びも安定しました。次にシュートです。ここは、前進しながらアームを上げるというシンプルな作りにしました。 *コース攻略 [#g4ffa1ab] まず初めに、コースには障害物として4つの空き缶が置かれています。なので、ロボットを小型にして、立ちまわりに支障が出ないようにしました。また、空き缶と空き缶の間からシュートするので、アームが空き缶にぶつからないように幅を調整しました。 *プログラムの説明 [#y6cb181e] #define THRESHOLD 48 //しき値 #define HIPOWER 7 // #define LOWPOWER 2 #define NOMALPOWER 5 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,NOMALPOWER); #define set_power_S SetPower(OUT_B,HIPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L ;\ #define HIPOWER 7 //モーターの強さ #define LOWPOWER 2 //モーターの強さ #define NOMALPOWER 5 //モーターの強さ #define set_power_H SetPower(OUT_AC,HIPOWER); //モーターACの強さ #define set_power_L SetPower(OUT_AC,LOWPOWER); //モーターACの強さ #define set_power_N SetPower(OUT_B,NOMALPOWER); //モーターBの強さ #define set_power_S SetPower(OUT_B,HIPOWER); //モーターBの強さ #define go_forward set_power_H; OnFwd(OUT_AC); //前進する #define turn_left1 set_power_L ;\ //左に曲がる OnFwd(OUT_C);OnRev(OUT_A); #define turn_left0 set_power_L ;\ #define turn_left0 set_power_L ;\ //左に曲がる OnFwd(OUT_C);Off(OUT_A); #define turn_right0 set_power_L ;\ #define turn_right0 set_power_L ;\ //右に曲がる OnFwd(OUT_A);Off(OUT_C); #define turn_right1 set_power_L ;\ #define turn_right1 set_power_L ;\ //右に曲がる OnFwd(OUT_A);OnRev(OUT_C); #define STEP 1 #define nMAX 300 #define short_break Off(OUT_AC); Wait(100); #define short_break Off(OUT_AC); Wait(100); //休憩 #define CROSS_TIME 20 #define cross_line set_power_L;\ go_forward;\ Wait(CROSS_TIME);short_break; #define arm_forward set_power_N; OnFwd(OUT_B); #define arm_backward set_power_N; OnRev(OUT_B); #define shoot set_power_S; OnRev(OUT_B); #define arm_forward set_power_N; OnFwd(OUT_B); //モーターBの強さ、回転 #define arm_backward set_power_N; OnRev(OUT_B); //モーターBの強さ、逆回転 #define shoot set_power_S; OnRev(OUT_B); //モーターBの強さ、逆回転 #define SIGNALON 1 #define SIGNALOFF 2 task main () { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; ClearTimer(0); while(FastTimer(0)<=200){ if(SENSOR_2< THRESHOLD -10) { turn_right1; ClearTimer(0); //タイマーをリセット while(FastTimer(0)<=200){ //二秒まで if(SENSOR_2< THRESHOLD -10) { //センサーの値が-10より低いとき turn_right1; //右に曲がる nOnline++; }else{ if(SENSOR_2< THRESHOLD -4){ turn_right0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +10){ turn_left0; if(SENSOR_2< THRESHOLD -4){ //センサーの値が-4より低いとき turn_right0; //右に曲がる }else if(SENSOR_2< THRESHOLD +3){ //センサーの値が+3より低いとき go_forward; //直進する }else if(SENSOR_2< THRESHOLD +10){ //センサーの値が+10より低いとき turn_left0; //左に曲がる }else{ turn_left1; turn_left1; //左に曲がる } nOnline=0; } Wait(STEP); } PlaySound(SOUND_UP); turn_left1;Wait(120);Off(OUT_AC); arm_backward;Wait(100);Off(OUT_B);Wait(1500); arm_forward;Wait(10);Off(OUT_B); turn_left1;Wait(120);Off(OUT_AC); //左に1.2秒間曲がる arm_backward;Wait(100);Off(OUT_B);Wait(1500);アームを上げて15秒待機 arm_forward;Wait(10);Off(OUT_B); //アームを下げる PlaySound(SOUND_UP); turn_left1;Wait(130);Off(OUT_AC); turn_left1;Wait(130);Off(OUT_AC); //左に1.3秒間曲がる 以後同様に ClearTimer(0); while(FastTimer(0)<=300){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; } if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } PlaySound(SOUND_UP);Off(OUT_AC); turn_right1;Wait(145);go_forward;Wait(30); shoot;Wait(50);Off(OUT_AC);Wait(0);Off(OUT_B); OnRev(OUT_AC);Wait(80);turn_left1;Wait(130);Off(OUT_AC); ClearTimer(0); while(FastTimer(0)<=700){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; } if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } PlaySound(SOUND_UP); turn_right1; Wait(120); arm_backward; ClearTimer(0); while(FastTimer(0)<=2600){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_left1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_left0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_right0; }else if(nOnline < nMAX){ turn_right1; } nOnline=0; }if(nOnline >= nMAX){ short_break; turn_right1; Wait(STEP); cross_line; nOnline=0; } } PlaySound(SOUND_UP); arm_forward; ClearTimer(0); while(FastTimer(0)<=4000){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; }if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } } *まとめ [#c8597bea] 今回が最後のロボットコンテストでした。今まで学んだことをすべて活用しなければクリアできない課題だったと思います。休みの日に10番教室に行ったら必ず誰かがいたので、みんなも全力で取り組んでいたのがわかりました。このロボティクス入門ゼミを通して、自分でロボットを作り、さらにそのロボットを自分で作ったプログラムで動かす素晴らしさ、楽しさを理解することができました。授業だけにとどまらず、自分の一つの趣味としてこれからもロボットに関わっていきたいです。