ぐっさん&タイスケ
今回の課題分担
課題1、3 → ぐっさん
課題2 → タイスケ
○キャタピラを使ったロボット。全体的にゴツゴツしているが、 キャタピラを使うことで全体のバランスをとりやすくしている。投擲の際の安定性もキャタピラで組んだ理由である。
タイヤを軽量でかつ強度を保つため一本でつなげたかったので、連結できるパーツを使い長さをだした。
しかし、重量が重すぎて一つのモーターでは馬力が足りずにこのロボを断念して軽量化することにした。
○今度はタイヤを使ったロボット。なるべく土台が安定するようにした。
ロボット全体像(正面)
全体的にコンパクトにまとめられている。
光センサーをわずかに内側へ向けることにより、より広範囲の光源を補足可能となっている。
1→センサー1が光を感知すればロボが右回りに進行する。
2→センサー3が光を感知すればロボは左回りに進行する。
↑今回モーター1つで動くための大事な部分のひとつであるブレーキ。
タイヤの動きを止める事となる。
○光センサーをロボと平行にするのではなく、自由に方向を選べるようにした。
#define THRESHOLD 40 sub throw()//ホイールを投げる動作 { OnFwd(OUT_A); Wait(100); Off(OUT_A); } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット repeat(10000){ while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //光センサー1,3共に光を感知せず { OnFwd(OUT_B);//右回りに進む Wait(100); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず { OnFwd(OUT_B);//右回りに進む Wait(100); Off(OUT_B); } while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず { OnRev(OUT_B);//左回りに進む Wait(30); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知する { throw();//ホイールを投げる Off(OUT_B); } } }
#define THRESHOLD 45 sub throw() { OnFwd(OUT_A); Wait(100); Off(OUT_A); } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット int i; //iの定義付け int i_min=1, i_max=10; int x; //xの定義付け int x_min=1,x_max=10000; for(x=x_min;x<=x_max; x++){ while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3共に光を感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず { OnRev(OUT_B); Wait(30); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知する { throw(); Off(OUT_B); x=10000; //ホイールを投げる動作が終わったので、xに10000を加える } } Off(OUT_B); //ロボの動きを止める OnRev(OUT_A);//ホイールを投げ出す装置を元に戻す Wait(50); Off(OUT_A); }
#define THRESHOLD 45 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while (true) { if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサー1、3共に光を感知していない場合。 { OnFwd(OUT_B); //右回りに進む。 Wait(30); } if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサ−1のみ光を感知した場合。 { OnFwd(OUT_B); //右回りに進む。 Wait(30); } if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー3のみ光を感知した場合。 { OnRev(OUT_B); //左回りに進む。 Wait(6); } if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー1、3共に光を感知した場合。 { OnFwd(OUT_B); //左右の車輪を交互に回転させ前進する。 Wait(30); OnRev(OUT_B); Wait(6); } } ]
基本的には課題1と同じようなプログラムとなっている。
#define THRESHOLD 40 sub throw()//ホイールを投げる動作 { OnFwd(OUT_A); Wait(100); Off(OUT_A); } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを2にセット int i; int i_min=1, i_max=10; //文字iの定義 int x; int x_min=1,x_max=10000; //文字xの定義 for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す { while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3ともに光を感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず { OnRev(OUT_B); Wait(30); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知した場合 { for (i=i_min; i<=i_max; i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る { OnFwd(OUT_B); Wait(10); OnRev(OUT_B); Wait(10); } throw(); Off(OUT_B); } } }
#define THRESHOLD 45 sub throw()//ホイールを投げる動作 { OnFwd(OUT_A); Wait(100); Off(OUT_A); } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを2にセット int i; int i_min=1, i_max=10; //文字iの定義 int x; int x_min=1,x_max=10000; //文字xの定義 for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す { while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1,3ともに光を感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知せず { OnFwd(OUT_B); Wait(100); Off(OUT_B); } while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知せず { OnRev(OUT_B); Wait(30); Off(OUT_B); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知した場合 { for (i=i_min; i<=i_max; i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る { OnFwd(OUT_B); Wait(10); OnRev(OUT_B); Wait(10); } throw(); Off(OUT_B); x=10000; //ホイールを投げる動作が終わったので、xに10000を加える } } Off(OUT_B); //ロボの動きを止める OnRev(OUT_A);//ホイールを投げ出す装置を元に戻す Wait(100); Off(OUT_A); }
●今回も最初に作ったロボはボツになってしまったが、ロボの欠点を認識したら今までの教訓から学んで、さっさと次のロボットを作成した。
●どちらのロボットも共通して大事にしたのは、ホイールを投げるパーツをロボの上に乗せる予定だったので、土台を安定するようにした。
●まず頭の中で考えていたのは、ぐるぐる回って光センサー1,3が共に感知すればホイールを投げるようにする事である。
しかしどれくらい探す動作を繰り返せばいいか場合によって変わってくるので、repeatを使い、
おそらく10000回繰り返せば事足りると思い、repeat(10000)を使った。
そのためホイールを投げ終えた後でも果てしなく動作を繰り返すので、課題はクリアーしているとは思うが、プログラム的には不完全である。
→[改良]課題3のプログラムが完成したので、課題3のプログラムを多少いじることにより、
repeat(10000)を使わないで、forを使いプログラムが完成した。
●左右の車輪がギアの関係上、時間毎の回転数が異なるために、直進させるプログラムにおいてそれぞれの車輪の回転させる時間の比率を変えることによって、結果直進するように組んだ。
無駄は無いが、面白みのないプログラムとなってしまった。
●課題1とほとんどプログラムは同じなのだが、光センサー1,3が共に光を感知している時のプログラムを変えた。
for (i=i_min; i<=i_max; i++)//for以下の動作を10回繰りしたらホイールを投げる動作に移る
を使うことにより、光を探し当てた後も、少しずつ光に近づいてホイールを投げるようにした。
●今回はrepeatを用いるのではなく、forを使うことで、10000回繰り返すまで終わらないプログラムを解消しようとした。
予定ではホイールを投げた後に
for(x=x_min;x<=x_max; x++) //for以下の動作をxの値が10000になるまで繰り返す
のxに10000を加えれば、xが10000を越えてこのfor以下のプログラムを停止するようにできるかな?と思ったのだが、
エラーが出てきてしまったので、やむを得ず課題3のプログラムも10000回繰り返すまで終わらない不完全なプログラムとなってしまった。
→[改良]
x=10000;
をホイールを投げた動作の後で組み込む事で、プログラムが終わるようにした。
";"を入れ忘れていた事に気づいてエラーが発生した理由がわかった。
●今回の課題は一週間しか期限がなかったので、急いでロボを組み立てプログラム作りに着手することができたので、なんとか間に合った。
しかし、プログラムに不完全性が生じているのでそれだけが心残りである。
→[改良]ついにエラーが出ていた謎が解明した。
x=10000;
の”;”が抜けていただけという、しょうもない見落としだった。
でもこれでプログラムが完成して満足だ。
●音楽に手を出す余裕がなかったのが、まだまだ余裕のないところを示しているように思える。
●これからの課題としてはどうにかホイールをなげればプログラムを停止するように、変数の使い方をちゃんと理解して自分の成長につなげたい。
コメントをどうぞ