[[2015a/MemberOnly]] *課題3について [#b9d3da05] ~今回の課題は、半径1m以内にある懐中電灯を探して、懐中電灯にピンポン玉を当てるロボットを製作するというものでした。 *ロボット本体の説明 [#oe4d569e] #ref(2015a/Member/Daitoku/Mission3/1438255300269.jpg,10%,robotto1) ~今回使用したロボットは、課題2で使ったロボットとほとんど同じですが、前方にある光を認識させるために光センサーを前に付け替えました。 *プログラム [#v7f521cd] #define ageru OnRev(OUT_B);Wait(9);Off(OUT_B); //アームを上げる #define utu OnFwd(OUT_AC);Wait(50);ageru;OnRev(OUT_AC);Wait(50);Off(OUT_AC); //玉を打つ task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーを2に接続 int runtime=400; //機体が一周するのにかかる時間 int litemax=0; //センサーの初期値 int timemax=0; //時間の初期値 int litemax=0; //閾値の最大値 int timemax=0; //閾値が最大のときの時間 while(SENSOR_2 < 63){ ClearTimer(0); OnFwd(OUT_A);OnRev(OUT_C); while(SENSOR_2 < 63){ //センサーの値が63以上で懐中電灯の近くとみなす ClearTimer(0); //タイマーで時間の測定開始 OnFwd(OUT_A);OnRev(OUT_C); //左旋回 while(FastTimer(0) < runtime){ if(SENSOR_2 > litemax){ litemax=SENSOR_2; timemax=FastTimer(0); while(FastTimer(0) < runtime){ //一周するまで繰り返す if(SENSOR_2 > litemax){ //センサーの値がそれまでの閾値の最大を超えたとき litemax=SENSOR_2; //新たな最大値を記録 timemax=FastTimer(0); //新たな最大値を記録したときの時間を記録 } } Off(OUT_AC);Wait(100); OnFwd(OUT_C);OnRev(OUT_A); Wait(runtime-timemax); Off(OUT_AC);Wait(100); OnRev(OUT_AC);Wait(100); Off(OUT_AC);Wait(100); //一時停止 OnFwd(OUT_C);OnRev(OUT_A); //右旋回 Wait(runtime-timemax); //閾値が最大となったときの方向を向くまで Off(OUT_AC);Wait(100); //一時停止 OnRev(OUT_AC);Wait(100); //前進 } utu; } **プログラムの説明 [#j2da1117] ~課題2のときと同様にピンポン玉をアームで囲みながら運び、懐中電灯の前まで来たら機体全体で球を押し出すようにしました。 ~モーターの接続も課題2と同様で、ageruでアームを上げ、utuで機体が前進して球を打ち出すように定義しました。 ~intで整数型の変数であることを宣言し、初期値を設定しました。 ~あらかじめ機体が一周する時間(runtime)を計っておき、センサーの値が63を超えたら懐中電灯の近くであるとみなし、最も明るくなったときの時間(timemax)として記憶させ、次の回転で機体が懐中電灯の方向を向くようにしました。2回目の回転は1回目とは逆回転なので、回転させる時間は( runtime)-(timemax)で求められます。 *工夫した点 [#ge5da7c2] +光センサーを機体の中央につけ、正面からの光を認識させやすくしました。 +タイマーを使って時間を記憶させ、より少ない回数で懐中電灯を認識させました。