インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)
以下の動作をするロボットを製作する
・全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
・懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
・懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
今回の課題は前回の様な小刻みの方向転換を繰り返すことがなくよりスムーズな方向転換を想定してタイヤを用いた。
まずは「四輪」の機体を作成してみたものの、
「三輪」が方がはるかにスムーズな動作が可能であると判断した。
しかし、実際にプログラムをして動作確認したところ、あえてタイヤをつけるよりも簡単な土台をつけることによりゴムのタイヤをつけることにより生じる摩擦を軽減させたほうがさらにスムーズな動作が確認できた。
ディファレンシャルギアを利用し、一つのモーターで前後運動及び回転運動をすることができるようにした。
一度はタイヤをつけ回るようにしたが、実際に動かしてみたところ回転した後に前進した場合にタイヤが捩れてしまいうまく動作しなかった。
そのため簡単な土台を設置することで、問題を解決することに成功。
後方には発射台を設置した。
機体に設置するスペースが全くなかったために、新たに設置するのに苦労した。
発射台は連射が可能なように制作した。
最初は発射台上部のアームが固定されていなかったため、連射ではなく散弾になっていたので、改善した。
上部アームを若干の余裕を持たせつつ、固定し込めた弾が投擲したときに全て飛ばないとうにする。
光源を探すために前方に光センサーを設置した。
左右それぞれ光の強さを判断出来るように、間に衝立を設置した。
最初は光センサーを斜めに設置しようとしたが、そうすると間に衝立を設置できなくなりまた固定が出来なくなってしまうため断念した。
#define TURN_TIME 225 //1周にかかる時間 int light_max=0,time_max=0; //変数を定義
sub throw_block() { OnRev(OUT_B); Wait(15); Off(OUT_B); }
task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(0);OnRev(OUT_A); //タイマーをリセットして右のタイヤを中心に回転 while(FastTimer(0)<TURN_TIME){ //1周まわるまでの間 if(SENSOR_1>light_max) //最も強い光を探す { light_max=SENSOR_1; time_max=FastTimer(0); } } OnRev(OUT_A); //最初の向きをむいたので、最も強い光の場所まで再び回転 Wait(time_max); Off(OUT_A); throw_block(); }
#define THRESHOLD 65 //閾値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに定義する SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに定義する SetPower(OUT_A+OUT_C,7); //AとCのモーターの出力を7にする while(true) { if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサー1と3が受ける光が閾値より強ければ前進 OnRev(OUT_C); Wait(15); OnFwd(OUT_C); Wait(15); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //センサ−3が受ける光が暗くなったら左折 OnRev(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサ−1が受ける光が暗くなったら右折 OnFwd(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //光がなければ時計回りに回転 OnFwd(OUT_C); Off(OUT_A); } } Off(OUT_A+OUT_C); }
#define THRESHOLD 65 //閾値 #define RUN_TIME 25 //RUN_TIMEを2,5秒に定義する task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに定義する SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに定義する SetPower(OUT_A+OUT_C,7); //AとCのモーターの出力を7にする ClearTimer(0); //タイマーをクリアする while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD) || (Timer(0) <= RUN_TIME)) {//光が閾値より弱くタイマーが2,5秒以下ならば実行 if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサー1と3が受ける光が閾値より強ければ前進 OnRev(OUT_C); Wait(15); OnFwd(OUT_C); Wait(15); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //センサ−3が受ける光が暗くなったら左折 ClearTimer(0); //タイマーをクリアする OnRev(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサ−1が受ける光が暗くなったら右折 ClearTimer(0); //タイマーをクリアする OnFwd(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //光がなければ時計回りに回転 ClearTimer(0); //タイマーをクリアする OnFwd(OUT_C); Off(OUT_A); } } Off(OUT_C); OnRev(OUT_A); Wait(50); //前進を2,5秒以上続けたらブロックを投げる OnFwd(OUT_A); Wait(50); Off(OUT_A); }
コメントをお願いします
課題1を相対的に最も明るい方向を探すようにしてください。
細かいことを言えば、課題1のwhileの中に Off(OUT_A);はいらないだろうし、(SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)の否定は
「両方とも受ける光が閾値より強い」ではないです。I