今回の課題は次の3つです。(練習問題のページからのコピー&ペーストです。
1:全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
2:懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
3:懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
次の写真がロボットの全体像です。
今回の課題の難関であるホイールを投げる、という部分は次の様にシンプルに仕上げました。
構造は単純でモーターの回転でアームが連動しホイールを投げる。
それだけの構造です。
ただ、回転の勢いで壊れてしまわない様にアーム周辺は下の様に強化を施してあります。
また回転しすぎないようストッパーの役割も持たせてあります。
今回の課題では、モーターをアーム部分とタイヤ部分含めて合計2個のモーターで行え、という制限がありました。 そのため、下の様に左右のタイヤを接続しています。 この写真にはついていませんが、3つ目の課題を行う時には、前進するために車輪にストッパーを取り付けました。
また、3つ目の課題以外は、ロボット本体が動く必要がないため回転の補助用に車輪を後ろに付けてあります。
最後に、光センサはこんな風に取り付けてあります。
プログラム製作 マツブチ リュウタ
全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
これ用のプログラムは以下のようになります。
#define LIGHT_1 45; #define LIGHT_2 40; sub shoot()//ブロックの発射のためのプログラムです { OnFwd(OUT_A); Wait(50); Off(OUT_A); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while((SENSOR_1<LIGHT_1)&&(SENSOR_3<LIGHT_2))//センサ1とセンサ3に強い光を感知しなかった場合時計間回りに1秒回転する { OnFwd(OUT_C); Wait(100); Off(OUT_C); } while((SENSOR_1<LIGHT_1)&&(SENSOR_3>=LIGHT_2))//センサ3に強い光を感知した場合光の方向に回転する { OnFwd(OUT_C); } while((SENSOR_3<LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1に強い光を感知した場合光の方向に回転す { OnRev(OUT_C); } if((SENSOR_3>=LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1と3の数値が定義した数値と同じの場合に、ブロックを発射する { shoot(); } }
懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
この課題用のプログラムは以下のようになります。
#define LIGHT_1 45; #define LIGHT_2 40; sub shoot()//ブロックを発射するためのプログラム { OnFwd(OUT_A); Wait(50); Off(OUT_A); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while((SENSOR_1<LIGHT_1)&&(SENSOR_3<LIGHT_2))//センサ1とセンサ3に強い光を感知しなかった場合時計間回りに1秒回転する { OnFwd(OUT_C); Wait(100); Off(OUT_C); } while((SENSOR_1<LIGHT_1)&&(SENSOR_3>=LIGHT_2))//センサ3に強い光を感知した場合光の方向に回転する { OnFwd(OUT_C); } while((SENSOR_3<LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1に強い光を感知した場合光の方向に回転する
{ OnRev(OUT_C); } if((SENSOR_3>=LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1と3の数値が定義した数値と同じの場合で、3秒間数値に変化がなければ、ブロックを発射する
{ Wait(300); shoot(); } }
懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
これ用のプログラムは以下のようになります。
#define LIGHT_1 45; #define LIGHT_2 40; sub shoot()//ブロックを発射するためのプログラム { OnFwd(OUT_A); Wait(50); Off(OUT_A); } sub walk() { while((SENSOR_1>=50)&&(SENSOR_3>=45))//ライトに近づくためのプログラム。日が理解点と右回転を交互に行うことで、ほふく前進の要領で前進する。 { OnFwd(OUT_A); Wait(30); OnRev(OUT_A); Wait(30); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while((SENSOR_1<LIGHT_1)&&(SENSOR_3<LIGHT_2))//センサ1とセンサ3に強い光を感知しなかった場合時計間回りに1秒回転する
{ OnFwd(OUT_C); Wait(100); Off(OUT_C); } while((SENSOR_1<LIGHT_1)&&(SENSOR_3>=LIGHT_2))//センサ3に強い光を感知した場合光の方向に回転する
{ OnFwd(OUT_C); } while((SENSOR_3<LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1に強い光を感知した場合光の方向に回転する
{ OnRev(OUT_C); } if((SENSOR_3>=LIGHT_2)&&(SENSOR_1>=LIGHT_1))//センサ1と3の数値が定義した数値と同じの場合で、3秒間数値に変化がなければ、ライトに近づいてからブロックを発射する。 { Wait(300); walk(); shoot(); } }
・苦労した点は、今回の課題の期間が短かったことです。しかし、班の人の協力によってなんとか仕上げることができました。
・工夫した点は、ブロックを投げる装置です。最初は、凝ったものを作ろうと試行錯誤しましたが、搭載スペースや時間の関係で西洋の投石器のような単純な構造に落ち着きました。これはこれで単純なために、安定した動作を得ることができました。
ロボットの説明は良いです。
プログラムについて
1:相対的に光の強さが最大の方向に投げられると良いです。
2:このままではセンサー1と3が閾値以上の光を感じた3秒後に、無条件に投げてしまいます。
3:50cmの距離を判定できればなお良いです。I