[[2009b]] #contents *課題3 [#vc5171e0] ~ 懐中電灯に向かってブロックを投げるロボットを作ろう!~ *チーム [#jcf2f834] チーム名「 株式会社 とだ 」~ 社長:とだ~ 社員:なかみう~ *ロボット [#k8d080ba] ~ ~ 今回は、「ディファレンシャルギア」を使用した。~ 「一つのギアで前進・回転できるギア」で、後退はできない。~ これが、ディファレンシャルギア。 &ref(2009b/A1/課題3右/TS3M0039.JPG,30%,これがディファレンシャルギア);~ ~ ~ ギア一つでロボを動かすので、大きくて重いロボは作れない。~ というわけで、ロボの土台はこんな感じになった。~ &ref(2009b/A1/課題3右/TS3M0040.JPG,30%,これがロボ);~ 光センサーもつけた。~ ~ ~ 次に、ブロックを投げる装置を考え、取り付けた。 それがこれ。&ref(2009b/A1/課題3右/TS3M0049.JPG,30%,これで投げる);~ ピラミッドで高さを出して、装置が回転するようにした。~ ~ ~ どの様に投げるのかというと、「アームの回転」を使う。~ ブロックを、図の位置につけ(4個装填可能)、発射する。~ 矢印の方向に回転する。~ &ref(2009b/A1/課題3右/roo.JPG,30%,投げる);~ ~ *プログラム [#hb34a8d7] **とだのプログラム [#xeb637c4] **なかみうのプログラム [#rfb2a5d9] 今回は(も?)、頑張った。 2つのプログラムを考えた。 最初に考えたのはこちら。~ #define fo 300 #define ma 80 #define su 200 #define na 500 #define l_mini 60 #define l_max 85 int t = 0; task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); while ( t < 1 ) { if (SENSOR_1 > l_mini && SENSOR_3 > l_mini ) { //両方のセンサーが、光を感知して、 PlaySound(SOUND_CLICK); if(SENSOR_1 < l_max || SENSOR_3 < l_max) { //どちらかが「光の最大値」ほど明るく感じないとき OnRev(OUT_A); //回転 } else { //両方「光の最大値」をとっているとき until( SENSOR_1 >= l_max && SENSOR_3 >=l_max)//両方「光の最大値」を取るまで PlaySound(SOUND_DOUBLE_BEEP); OnFwd(OUT_A); //前進 t = t+1; //t=1となり、これ以上繰り返さない } } else { //光を感知していないとき、 OnRev(OUT_A); //前進や Wait(ma); OnFwd(OUT_A); //後退で光をさがす。 Wait(su); } } //ライトに近づいたら Off(OUT_A); //停止し、 PlaySound(SOUND_FAST_UP); OnRev(OUT_C); //ブロック発射。 Wait(na); Off(OUT_C); //停止。 } ~ 文系な僕でしたが、数学の「場合分け」のように、ライトの明るさを中心に考えました。~ しかし、問題点が多く、~ +プログラムが複雑 +ライトを追えない時がある +一回しか作動しない +なんかよくわかんない。 など、山積みだった。~ (改良を加えれば動くには動くと思いますが。)~ そこで、M先生の助けをかり、~ もう一つのプログラムを考えた。~ #define time 700 //ロボが1回転する時間 task main() { int l_max = 0; //「光の最大値」をきろくするための変数 int t_max = 0; //時間を記録するための変数 SetSensor(SENSOR_1, SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0) <= time){ //ロボが1回転するまでで、 OnRev(OUT_A); //回転して if(SENSOR_1 > l_max){ //光センサーの値が「光の最大値」より明るいとき l_max = SENSOR_1; //その時の値を「光の最大値」に更新 t_max = FastTimer(0); //その時の時間を記録。 } //1回転した時には、 } //「光の最大値」とその時間が分かります。 PlaySound(SOUND_DOUBLE_BEEP); OnRev(OUT_A); //再び回転を始めます。 Wait(t_max); //上で求めた、最も明るいところまで回転 Off(OUT_A); //そして停止。 if(SENSOR_1 < 100 ){ //もしライトから30cm以上はなれている場合 OnFwd(OUT_A); //前進します。 } else { //30cmの位置にあれば、 Off(OUT_A); //前進をやめて OnFwd(OUT_C); //ブロックを発射。 } Off(OUT_C); //停止。 } こちらの方がシンプル。~ ~ ちなみに、「PlaySound]は~ プログラムの進行状況を確認する為につけた。~ *問題点 [#b6bfa57a] ~ 問題点は、~ 発射装置にあった。~ 回転が遅いので、ブロックが飛ばず、~ ポロッと落ちてしまった。~ 改良が必要だった。~ *コメントのコーナー [#nd5b8867] コメントをどうぞ。 - ロボットの説明と、プログラムの説明の追加をお願いします。 -- [[こさか]] &new{2010-02-10 (水) 16:00:35}; - こさかさんと同じです。終わっていないと判断したため、採点しませんでした。レゴを返してしまって写真が難しいなら、図や説明でお願いします -- [[FI]] &new{2010-02-18 (木) 06:06:56}; #comment