*ロボットの紹介 [#y51accda] +上から見たロボット #ref(./image (2).jpg,50%,ロボット) -全体的にも前にレゴが集中しているので最初の方はライトセンサーが床についてしまうということがあったか改良をして傾かなくなった +アームの部分(缶を挟むのに必要) #ref(./image (3).jpg,100%,ロボット) -上の黒のアームはモーターに連動しているが下の黄色のアームは固定されている。最初はモーターに連動するアームだけでやっていたが缶を掴んでからライントレースする際に缶が倒れてしまい下に固定したアームをつけることで少しは改善されたがまだ倒れてしまうことがあった +横から見たロボット(下のファイルより見てください) #ref(./image(9).jpg,15%,ロボット) #ref(./image(9).jpg ,15%,ロボット) -白のモーターに連動しているものは、モーターを回しすぎてしまった時にモーターに負担がかからないように、空回りすようになっているもの +下から見たロボット #ref(./image (4).jpg,50%,ロボット) -青のレゴ・・ライトセンサー -固定しているのが見える +ロボットで少し工夫したところ #ref(./image (5).jpg,50%,ロボット) -RCXの場合、黄色のRCXレゴがとても取れやすく、とても持ち運びにくいという問題があったので、うしろのところに持ち運びやすくするために、工夫した・・・・黒の少し出ているレゴの部分を持って持ち運びする *コース攻略法 [#icba8cc7] #ref(./robotics-2013a-mission1.jpg,100%,コース) -タイマーを用意してライントレースにかかる時間を測定しながら時間を設定していった +まず缶をつかむまでの時間を測定し、缶をつかむまでのラインとレースのプログラムを作成する +それから時間を何個か区切って、ライントレースの作成をするが、その時間と時間の間で音をならし、また、その時に缶をつかむようにモーターを回すようにした。そうしなければライントレースの振動で缶が倒れたり、アームの中からはみ出てしまうからである +交差点を通過するさいはカウンターをつけて同じうごきをnMAX繰り返したら交差点を通化するというプログラムにした +最後の缶を置くプログラムは缶を置く目標の地点にUターンした時につく(ライントレースをしていてその地点に達した時間ではなくその地点をこえてUターンした時にその地点に達するようにすること)時間を測定してその時間に超えたらUターンし缶をはなし、バックしてからまたUターンするようなプログラムを作成した *プログラムの説明 [#kd73bee5] #define THRESHOLD 45 // しきい値を設定した #define HIPOWER 7 // モーターを強く回す時のパワーの大きさ(直進するときに使用する) #define LOWPOWER 3 // モーターを弱く回すときのパワーの大きさ(カーブするときにライントレースからはみ出ないように使用する) #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,LOWPOWER); #define go_fwd set_power_H; OnFwd(OUT_AC); // 直進 #define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); // アームを閉じる #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B); // アームを開く #define turn_left1 set_power_L ;OnFwd(OUT_C);OnRev(OUT_A); // 左折1(その場で曲がりやすい) #define turn_left0 set_power_L ;\ OnFwd(OUT_C);Off(OUT_A); // 左折0(その場で曲がりにくい) #define turn_right0 set_power_L ;\ OnFwd(OUT_A);Off(OUT_C); // 右折1(その場で曲がりにくい) #define turn_right1 set_power_L ;\ OnFwd(OUT_A);OnRev(OUT_C); // 右折0(その場で曲がりやすい) #define STEP 1 #define nMAX 200 // 通常の旋回で許容できる繰り返しの最大値 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 300 // 交差点を通過するのにかかる時間 #define cross_line set_power_L;\ OnFwd(OUT_A);OnRev(OUT_C);\ Wait(CROSS_TIME);short_break; // 交差点を渡る task main () { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // カウンタに0を代入する ClearTimer(0); // タイマーをクリアする /* 黒を続けてnMAX回繰り返さない&タイマーが6秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=600){ while(nOnline < nMAX && FastTimer(0)<=600){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラスする }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタを0にする } Wait(STEP); } } arm_fwd; PlaySound(SOUND_CLICK); // 音を鳴らす /* 黒を続けてnMAX回繰り返さない&タイマーが16秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=1600){ while(nOnline < nMAX && FastTimer(0)<=1600){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす ClearTimer(0); // タイマーをリセット turn_right1; Wait(10); arm_fwd; /* 黒を続けてnMAX回繰り返さない&タイマーが12秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=1200){ while(nOnline < nMAX && FastTimer(0)<=1200){ if(SENSOR_2< THRESHOLD -15) { turn_right1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -13){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD +2){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_DOWN); // 音を鳴らす turn_left1; Wait(10); arm_fwd; /* 黒を続けてnMAX回繰り返さない&タイマーが20秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=2000){ while(nOnline < nMAX && FastTimer(0)<=2000){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_LOW_BEEP); // 音を鳴らす turn_right1; Wait(20); arm_fwd; /* 黒を続けてnMAX回繰り返さない&タイマーが29秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=2900){ while(nOnline < nMAX && FastTimer(0)<=2900){ if(SENSOR_2< THRESHOLD -15) { turn_right1; nOnline++; カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -13){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD +2){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } PlaySound(SOUND_FAST_UP); arm_fwd; /* 黒を続けてnMAX回繰り返さない&タイマーが45秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=4500){ while(nOnline < nMAX && FastTimer(0)<=4500){ if(SENSOR_2< THRESHOLD -13) { turn_right1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } } /* 缶を話す作業 */ PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす turn_left1; Wait(275); arm_bwd; OnRev(OUT_AC); Wait(100); turn_left1; Wait(275); /* 黒を続けてnMAX回繰り返さない&タイマーが55秒を超えるまで通常のライントレースをする */ while(FastTimer(0)<=5500){ while(nOnline < nMAX && FastTimer(0)<=5500){ if(SENSOR_2< THRESHOLD -13) { turn_left1; nOnline++; // カウンタを1プラス }else{ if(SENSOR_2< THRESHOLD -11){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } /* 交差点の通過 */ short_break; turn_right1;Wait(nMAX*STEP); cross_line; nOnline=0; // カウンタをリセット } } *まとめ [#jbc6ba2d] -時間を測定するのが難しい。また、その時によってライントレースにかかる時間がちがく、うまくいかないことが多かった。缶を運ぶときにライントレースでの揺れに耐えることができずに缶が倒れてしますという課題も完璧に克服することができなかったのが残念。 -課題1をクリアできなかったことがとても残念だった。けど、今回の課題1から学ぶことができたことも多々あったので次回の課題2はグループの人たちと協力してクリアしたいです。プログラム・ロボットの作成ででた今回の課題を次回に活かしていきたいと思います。 -友達の力を借りてプログラムを作ることが多かったので次回はなるべく自分だけでプログラムを作り、成功したいです。