ロボット課題3
↑↑全体
写真中央にあるのが発射台です。
左上の青いブロックが光センサーで懐中電灯の光を感知します。
↑↑RCX
#define TURN_TIME 400 //1周の時間を設定 #define throw OnFwd(OUT_A);Wait(1);Off(OUT_A); //投げるときの定義
task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); // センサ−1をライトセンサーと設定 SetPower(OUT_C,2); //モーターCの出力を制限 int light_max=0; //光の最大値 int t_max=0; //最大値のときの時間 ClearTimer(0); //タイマーを0にして OnFwd(OUT_C); //探し始めます
while(FastTimer(0)<TURN_TIME){ //回っている間 if(SENSOR_1>light_max) //最大値の光を見つけたら { light_max=SENSOR_1; //最大値の光と設定 t_max=FastTimer(0); //タイマーを入れる } } Off(OUT_C); Wait(50); OnFwd(OUT_C); Wait(t_max); //最大値の光までまわる Off(OUT_C); throw //投げる }
作成者:竹
比較的うまく探すことができました。
#define TURN_TIME 400 // 1周の時間を設定 #define throw OnFwd(OUT_A);Wait(1);Off(OUT_A); // 投げるときの定義 #define straight Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20); // 近づくときの定義
task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); // センサ−1をライトセンサーと設定 SetPower(OUT_C,2); //モーターCの出力を制限 int light_max=0; //光の最大値 int t_max=0; //最大値のときの時間 ClearTimer(0); //タイマーを0にして OnFwd(OUT_C); //探し始めます
while(FastTimer(0)<TURN_TIME){ //1周しているとき if(SENSOR_1>light_max){ //最大値の光にあったら light_max=SENSOR_1; //最大値の光と設定 t_max=FastTimer(0); //最大値の光のところまでの時間をはかる } } Off(OUT_C); Wait(50); OnFwd(OUT_C); Wait(t_max); //最大値の光まで回って Off(OUT_C); straight //近づいて throw //投げる }
作成者:中立な稲妻
課題を当初勘違いしていました。 イメージしてプログラムを作ったので、こちらで評価していただければと思います。
#define THERSHOLD 50 //光の閾値を設定 #define throw_light 65 //投げるときの光の強さを設定 #define throw OnFwd(OUT_A);Wait(1);Off(OUT_A); // 投げるときの定義 #define straight Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20); // 近づくときの定義
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと設定 SetPower(OUT_C,1); //モーターCの出力を1とする while (true){ if(SENSOR_1<THERSHOLD){ //光が見つからない時 OnFwd(OUT_C); //ぐるぐるまわって探す } if((SENSOR_1>THERSHOLD)&&(SENSOR_1<throw_light)){ //光を見つけた時 Off(OUT_C); straight //近づく } if(SENSOR_1>throw_light){ //懐中電灯が止まり、近づいたら throw //投げる } } }
閾値と最大値の光は過去のを参考にして設定しました。 2のプログラムはタイマーよりも閾値を試行錯誤しながら探しだしてプログラムに使用する方がいいのではないかと 思いました。
#define THERSHOLD 50 //光の閾値を設定 #define throw_light 65 //投げるときの光の強さを設定 #define throw OnFwd(OUT_A);Wait(1);Off(OUT_A); // 投げるときの定義 #define straight Off(OUT_C);Wait(10);OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20); // 近づくときの定義 #define t_RIGHT OnRev(OUT_A); //右に曲がるときの定義 #define t_LEFT OnFwd(OUT_A); //左に曲がるときの定義
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーと設定 SetPower(OUT_C,1);
while (true) { if((SENSOR_1>THERSHOLD)&&(SENSOR_3>THERSHOLD)){ //センサ1、3が閾値より大きいとき straight //前進する } if ((SENSOR_1>THERSHOLD)&&(SENSOR_3<THERSHOLD)){ //センサ1のみが閾値より大きいとき t_RIGHT //右に回る } if((SENSOR_1<THERSHOLD)&&(SENSOR_3>THERSHOLD)){ //センサ3が閾値より小さいとき t_LEFT //左に回る } if((SENSOR_1>throw_light)&&(SENSOR_3>throw_light)){ //センサ1、3が共にthrow_lightより大きいとき throw //ブロックを投げる break; //投げたらbreakしてwhileから抜ける } } Off(OUT_A+OUT_C); //止まる }
修正点は光センサーを二つにして、左右に懐中電灯が動いたときにも対応できるようにしたところです。
中立な稲妻
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while(ture) {
if(SENSOR_1!=SENSOR_3) //二つの光センサーの値が等しくないとき、すなわち、懐中電灯に向かっていない時 { Off(OUT_B); //前進を停止 OnFwd(OUT_A); //探す }
else //探した時 { Off(OUT_A); //探すことを停止 OnFwd(OUT_B); //進む }
until(SENSOR_1>65) //ある程度の近さ Off(OUT_A+OUT_B); OnFwd(OUT_C); //投げる }
}
前回の課題よりは難しくなかったですが、タイマーを使ったプログラムは初めてだったのでちょっと大変でした。 また移動させるためのモーター一つというのも難しい課題でした。
かなり難しい課題ですよね。 直接投げる方は簡単ですけど、人並みの設計が嫌いですので、独特な面白い(たぶん?)ロボットを作りました。 輪ゴムを使ったら一番早い初速度を得られるかもしれないですけど、切れたら面倒ですのでその方案を放棄しました。
お願いします。