Team Member Fukasawa&Kitazawa
Contents
今回の課題は懐中電灯のある方向に、黄色いホイールのパーツを打つロボットです。 詳しい課題の内容は詳しい課題内容は課題3をご覧ください。 また、それぞれ課題の内容が異なります。
Fukasawa→全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
Kitazawa→懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
完成したロボットがこちらです。
ホイールの発射の仕組みにモーターを2つ使うために、移動にはモーターを1つだけしか使うことができませんでした。そこで「ディファレンシャルギア」を使って移動する仕組みにしました。ディファレンシャルギアを使うことで、モーターを回転させる方向で次の動きをさせることができました。
歯止めの写真です。赤丸内の歯止めのおかげで、黄色の矢印の方向だけにしか、このタイヤは回ることができません。
光センサーを前に2つ付けました。2つ目の課題で課されている内容で、左右に懐中電灯を振ったときに、うまく懐中電灯を追えるようにするためです。
光センサーと発射口の位置を同じにしています。発射口を目標である懐中電灯の光の方向に確実に向けることができます。
図の青色のバーで、装填してあるホイールを押し、1つだけ下の階に落とします。黒い大きなタイヤを赤い矢印の方向へ高速回転させておき、下の階に落ちたホイールがその下を通ることによりホイールが加速し発射されます。
実物の写真での説明です。
青の矢印の向きに転がってきて、赤の矢印に高速回転しているタイヤに押し出され発射されます。
発射口をロボットの前方から見た写真です。黄丸のところでホイールとタイヤが接触します。下に弾力性のある紫色のチューブを使用したことにより、タイヤとの幅を少し狭く設定することができ、確実にホイールをタイヤと接触させることができます。
黄色の矢印の方向に軸が回ることで、青丸内で上のパーツを赤の矢印の方向にスライドしていきます。
押し出す仕組みの全体の写真です。赤丸のところに輪ゴムが巻いてあり、ロボットの前の方向に付いているモーターの力で軸を回します。
あえてスライドする部分の板のパーツを反対に取り付け、平らな部分が外側にきたことで、スムーズにスライドするようになっています。
int X; task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); X = 0 ; repeat(70){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);if(X < SENSOR_1){X = SENSOR_1;}}//明るさが一番大きいところを見つける while(X > SENSOR_1){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//明るさの一番大きいところまで車体を向ける OnRev(OUT_A);Wait(150);OnRev(OUT_C);Wait(40);Off(OUT_C);Wait(20);Float(OUT_A);Wait(150);//ホイール発射 X = 0 ; repeat(5){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);} repeat(65){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);if(X < SENSOR_1){X = SENSOR_1;}} repeat(5){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//最初に標的にしたライトをよけて一回転させ、二番目に明るい場所を見つける while(X > SENSOR_1){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//二番目に大きいところに車体を向ける OnRev(OUT_A);Wait(150);OnRev(OUT_C);Wait(40);Off(OUT_C);Wait(20);Float(OUT_A);Wait(150);}//ホイール発射
前から見て右側の光センサーに懐中電灯の光が当たっているときに前進させることにする
#define go OnFwd(OUT_B); //直進 #define spin OnRev(OUT_B); //左回転 #define eye_r SENSOR_2 //センサー2の名称を「eye_r」に定義 #define eye_l SENSOR_1 //センサー1の名称を「eye_l」に定義 #define boundary_r 800 //右側の光センサーに使う閾値。こっちの値は暗い方に際どくする。(完全に懐中電灯の光が消えたことを感知するため) #define boundary_l 450 //左側の光センサーに使う閾値。こっちの値は明るい方に際どくする。(懐中電灯の光が直に当たったことを感知するため) #define boundary_r_2 600 //右センサーに直接光が当たったことを判別するのに使う値 task main() { SetPriority(0); SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーと定義 SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); //センサー1の精度を上げる SetSensorMode(SENSOR_2,SENSOR_MODE_RAW); //センサー2の精度を上げる while (true) { ClearTimer(0); //光が当たりつづけた場合ホイールを発射するためカウントを開始 go; //普段は直進 until((eye_l<=boundary_l)||(eye_r>=boundary_r)); //下の条件式に当てはまる状況になったら、この式を終えて次の式へ移る if(eye_l<=boundary_l) { //もし左に懐中電灯の光が直に当たったら(懐中電灯が左に動いたら) spin;Wait(250); //270度左回転 go;Wait(100); //1秒間前身 spin;until(eye_r<=boundary_r_2); //前から見て右の光センサーに懐中電灯の光が当たるまで左回転 } if(eye_r>=boundary_r) { //もし右の光センサーから光が完全に外れたら(懐中電灯が右に動いたら) spin;Wait(100); //180度左回転 go;Wait(100); //1秒間前身 spin;until(eye_r<=boundary_r_2); //右の光センサーに懐中電灯の光が当たるまで左回転 } } until(FastTimer(0)>=100); //1秒間光があたり続けるまで(1秒間光が当たったらホイールを発射する) Off(OUT_B); //モーターを止める PlaySound(SOUND_DOUBLE_BEEP); //合図で音 OnRev(OUT_A);Wait(150); //発射口のタイヤを回し始める(ホイール発射時に最高速に達しておくために、ホイールを押し出すよりも早めに回し始める) OnRev(OUT_C);Wait(50); //ホイールを一つ押し出す Float(OUT_A+OUT_C); //動かしているモーター2つをゆっくりと止める }
二個以上ホイールを発射できるロボットということで、2.4秒間に六連射できる高性能なロボットをノリだけで作ってしまった。しかし、課題ではこの機能を十分に生かせなかった。壊すのがもったいない位によくできたと思います。プログラムもほぼ同じ動作の繰り返しなので簡単にできました。
ディファレンシャルギアの部分を作ったが、ロボットが完成して、いざ動かそうとしたらうまく動かなかった。組みあがったあとからの訂正はやりにくく、全体を組み上げてくれたパートナーに迷惑をかけてしまった。次からは、ある程度の動作部分ができ上がったら、動作確認くらいはしておきたいと思う。
コメントよろしくお願いします。