以下の動きをするプログラムを作る。
その1、全方向から懐中電灯の方向を探しだし、懐中電灯に向かってブロックを投げる。(懐中電灯は動かさない。)
その2、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めるとブロックを投げる。
その3、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めると50cmの距離まで近づいてブロックを投げる。
今回は、コリンとあやこで制作することになりました。女子2人でとっても不安でした・・・。
<条件> 使用できるモータは2つまで!
↑改良前の全体像
光センサの着き方がもろく、すぐ取れてしまいます。
↑改良前の全体像その2
折角、写真を撮ったので載せてみました。
↑改良後の全体像
光センサが着くところを強化しました。これで、大丈夫!!
↑補助輪
あえて、タイヤのゴムを付けないことでスムーズな動きが実現しました!!あと、なるべく小さくすることを心がけて作りました。付け根の部分は、自由に回転するようにしました。
↑ギアのストッパー
モータの回転を逆にした時に、反対のタイヤが動くようにするためにつけました。
#define IKICHI 50 // 閾値を50に設定 task main() { SetSensor(SENSOR_1 , SENSOR_LIGHT); // センサ端子1に接続したセンサを光センサに設定 SetSensor(SENSOR_3 , SENSOR_LIGHT); // センサ端子3に接続したセンサを光センサに設定
SetPower(OUT_A+OUT_C,3); // モータの出力を3に設定 while((SENSOR_1 > IKICHI) || (SENSOR_3 < IKICHI)) // センサ端子1の光センサが閾値より大きく { // かつ、センサ端子3の光センサが閾値より小さい時 OnFwd(OUT_A); // 時計周りに回って、懐中電灯の光を探す } Off(OUT_A); // whileが成り立たなくなった時、A出力のモータを止める Wait(100); // 1秒間停止した後、 OnRev(OUT_B); // アームを動かしてブロックを投げる Wait(30); // アームを動かす時間は0,3秒に設定 Off(OUT_B); // B出力のモータを止める }
#define IKICHI 60 // 閾値を60に設定 task main() { SetSensor(SENSOR_1 , SENSOR_LIGHT); // センサ端子1に接続したセンサを光センサに設定 SetSensor(SENSOR_3 , SENSOR_LIGHT); // センサ端子3に接続したセンサを光センサに設定 SetPower(OUT_A+OUT_C,2); // モータの出力を2に設定
while(true){ if((SENSOR_1 >= IKICHI) && (SENSOR_3 >= IKICHI)) // センサ端子1の光センサが閾値以上、 { // または、センサ端子3に光センサが閾値以上の時、 repeat(2) // 前進する行動(1回0,4秒)を2回繰り返す { OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } Off(OUT_A); // 繰り返した後、A出力のモータを止める OnFwd(OUT_B); // アームを動かしてブロックを投げる Wait(100); // アームを動かす時間は1秒 Off(OUT_B); // B出力のモータを止める } if((SENSOR_1 < IKICHI) && (SENSOR_3 > IKICHI)) // センサ端子1の光センサが閾値より小さい、 { // または、センサ端子3の光センサが閾値より大きいとき OnFwd(OUT_A); // 時計回りに回って懐中電灯の光に向かって進む } if((SENSOR_1 > IKICHI) && (SENSOR_3 < IKICHI)) // センサ端子1の光センサが閾値より大きい、 { // または、センサ端子3の光センサが閾値より小さいとき OnRev(OUT_A); // 反時計回りに回って懐中電灯の光に向かって進む } } }
#define IKICHI 60 // 閾値を60に設定 task main() { SetSensor(SENSOR_1 , SENSOR_LIGHT); // センサ端子1に接続したセンサを光センサに設定 SetSensor(SENSOR_3 , SENSOR_LIGHT); // センサ端子3に接続したセンサを光センサに設定 SetPower(OUT_A+OUT_C,2); // モータの出力を2に設定
while(true){ if((SENSOR_1 >= IKICHI) && (SENSOR_3 >= IKICHI)) // センサ端子1の光センサが閾値以上、 { // または、センサ端子3に光センサが閾値以上の時、 repeat(2) // 前進する行動(1回0,4秒)を2回繰り返す { OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } repeat(8) // 前進する行動(1回0,4秒)を8回繰り返して { // 懐中電灯に近づく OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } Off(OUT_A); // 繰り返した後、A出力のモータを止める OnFwd(OUT_B); // アームを動かしてブロックを投げる Wait(100); // アームを動かす時間は1秒 Off(OUT_B); // B出力のモータを止める } if((SENSOR_1 < IKICHI) && (SENSOR_3 > IKICHI)) // センサ端子1の光センサが閾値より小さい、 { // または、センサ端子3の光センサが閾値より大きいとき OnFwd(OUT_A); // 時計回りに回って懐中電灯の光に向かって進む } if((SENSOR_1 > IKICHI) && (SENSOR_3 < IKICHI)) // センサ端子1の光センサが閾値より大きい、 { // または、センサ端子3の光センサが閾値より小さいとき OnRev(OUT_A); // 反時計回りに回って懐中電灯の光に向かって進む } } }
<苦労した点>
全体的にプログラムを作るのが難しかった。特に、懐中電灯を追いかけるプログラムでは、光センサの感度が悪く、調整がうまくできなかったので大変だった。他にも、前進するときに、タイヤの着いてるモータを交互に少しずつ動かさなければいけないが、モータを動かす時間を調節することが難しかった。
<工夫した点>
ロボットを支える補助輪がスムーズに動くように、あえてタイヤにゴムを付けなかったところ。 ロボット全体をコンパクトにするように心がけた。 ブロックを投げるときに、遠くに飛ぶように、アームが動く途中にストッパーをつけた。また、アームが動く前の待機位置にもストッパーを付けた。
課題1では相対的に最も明るい方向を探せるプログラムにしてください。I