下↓↓↓の課題を作成しました。
今回のマシン「ファーストコンタクトRJG2号」です。→
名前の由来は、本を見たり友達からのアドバイスをもらうにせよ、今回がマシンと僕との初めての格闘となったことを考えていると、ふと耳に入ってきたルパン?世の曲(携帯の着メロ)を聞いて、「これだ!」と思ってこの名前をつけようと思い、舞ちゃんに聞くと、ダメとは言わなかったのでこの名前でいかせていただくことにしました。勝手に名前つけてごめんね、舞ちゃん(汗)。
次に、下の写真は今回の課題その1とその3で使うホイールを乗せた写真です。ホイールに関しては、後でアームに関する所で説明しますが、色々あってゴムは無しでいくことにしました。ちなみにファーストコンタクトが右利きなのは、僕が右利きだからです(笑)。
この写真は、マシンの土台部分の写真です。黒く長い棒を上でつなげている灰色のブロックの上にちょうどRCXがぴったりと納まります。
黒く長い棒の外側左からタイヤにつながっているギアにのびている、先っぽに灰色のものがついている棒は、ギアの回転を止めれるようにうまく引っかかってくれています。モーターがついている方が前で、「マシンについて」で載せた写真で見ると上に黒いブロックが沢山乗っているところですが、説明した灰色のものがついた棒が、バック回転する際にこの棒が引っかかって止まります。
この写真は、上の写真で隠れている大事なギアの部分を写している写真です。
なぜ!大事かというと、、、焦げ茶色のギアがなければ、課題の「使っていいモーターは2つまで」という条件が満たせないのです!!なぜなら、二つをタイヤをまわすのにひとつずつ使っていたら、タイヤのホイールを投げるのにモーターが使えません。かといってタイヤを一つにしてモーターひとつでマシンを動かしていては安定しないし前に進んだりバックができても、曲がって光を探すことができません。そこで使うのがこの焦げ茶色のギアなのです!!
この写真は、マシンについてで載せた写真では見にくかった前輪部分の写真です。
今回使えるモーターは2つまでということで、そのモーターにつけたギアなどの拡大写真です。
本当にこいつも困りました(汗)
上でも書いたとおり、当初完成したファーストコンタクトは、タイヤの方が前輪の予定だったので、プログラミングを入れて走らせた時には泣きそうになりました(泣)。なぜなら、先ほど書いたとおり、前進しなければならないのにというのもあったのですが、光センサーをどうしたらいいんだろうという気持ちもあったからです。でもそんな気は、数分考えたのち、「ギアを逆から止めればええやん!」という発想にかき消されました。
しかし!現実はそんなに甘くはなく、ファーストコンタクトとの激闘に敗れた末、またしても絶望の時がやってきました・・・とまぁこんな風に「こいつのため」にといっても過言ではない程、ファーストコンタクトには手を焼かされました(汗)。最終的には、下のにある写真のように、黒い曲がったブロックをちょうどうまい具合に光センサーがはさんでくれたので、このようなかたちに納まってくれました。
←前輪の上の灰色のブロックと土台をとった部分
上の写真のとおり、アームはこのようになりました。説明すると、右側の上を向いた鈎爪の部分にホイールがのります。次に、左の下を向いた鈎爪は、モーターに直接つながる部分で、端に付いた黒い棒がほんの少し出ているのが見えると思いますが、その部分が直接モーターとつながります。
最後に真ん中の変な飛び出した黒い棒は、ミスではなく大事な役割を果たしてくれていて、下の写真をご覧ください。
この写真の赤丸の部分を見れば分かるとおり、RCX2.0にこの黒い棒が引っかかってくれています。この黒い棒が無ければ、アームはどこにも引っかかることなく、真ん中の四つの黄色い曲がった棒をつなげるために黒い棒をつけただけでは、その黒い棒がタイヤに引っかかってしまいます。ファーストコンタクトは右利きなので、引っかかるのは右のタイヤです。右のタイヤについているギアは、左のタイヤより一つ多いので、ただでさえ走りにくいのに、アームが引っかかるとさらに走りにくくなってしまいます。ですから、この飛び出している黒い棒が果たす役割は大きいものなのです!
次の写真をご覧ください。
上の写真は見ての通りタイヤを乗せたアームの写真です。なぜこの写真を載せたかというと・・・
乗り方に注目してほしかったからです。
タイヤをこの乗せ方にして投げると、床に落ちた時にラグビーボールのように激しくあっちへ行ったりこっちへ行ったりします。「じゃあこうしろよ」と
と、この写真のようなものを思い浮かべるかもしれません。確かに、ゴムをつける方がやりやすかったので、ゴムをつけたかったのですが、この写真のようにタイヤを置くと、ファーストコンタクトが小刻みに走った時にアームから落ちてしまうというアクシデントが起こる時があるので、それは避けたかったという思いからゴムをとることにしました。
それぞれの課題に合わせて、プログラムを1、2、3と三つ作りました。
改めて↓↓
課題 | |
プログラム1 | 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 |
プログラム2 | 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。 |
プログラム3 | 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 |
以上の3つです。
二人で3つのプログラムを作りました。
#define THRESHOLD 39 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光センサー while(true){ //繰り返し if((SENSOR_1 > THRESHOLD) || (SENSOR_3 > THRESHOLD)) //センサー1が光に触れる { //もしくは、センサー3が皮下に触れた時 OnRev(OUT_C);Wait(10); //アームを回転=投げる Off(OUT_C);Wait(100); //アームを停止 } else{ //センサー1・センサー3のどちらも触れていない時 OnFwd(OUT_A);Wait(30); //回転 Off(OUT_A);Wait(30); //識別のために停止 } } }
●工夫、苦労した点
アームが動き過ぎたり、足りなかったり、投げ方がおかしかったりしたという事がありました。
動作時間の調節と、その後のOffが短かったことが原因でした。
#defineTHRESHOLD39 //光センサー反応させる値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサーであることを示す式 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光センサーであることを示す式 SetPower(OUT_A,5); //モーターAの出力を5にセットする式 while(true) { if((SENSOR_1 <= THRESHOLD) && (SENSOR_3 <= THRESHOLD)) //両方の光センサーに光が当たってない時に光を探す { OnFwd(OUT_A);Wait(20); Off(OUT_A);Wait(20); } if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) //両方の光センサーが反応した時に光に向かっていく { while(true) { OnFwd(OUT_A);until(SENSOR_3< THRESHOLD); OnRev(OUT_A);until(SENSOR_1< THRESHOLD); } } if((SENSOR_1 <= THRESHOLD) && (SENSOR_3 > THRESHOLD)) //光センサー1が反応してない時に左折する { OnFwd(OUT_A);Wait(15); Off(OUT_A);Wait(20); } if((SENSOR_1 > THRESHOLD) && (SENSOR_3 <= THRESHOLD)) //光センサー3が反応してない時に右折する { OnRev(OUT_A);Wait(30); Off(OUT_A);Wait(20); } } }
●工夫、苦労した点
左折と右折で曲がるスピードが違ったので、それを解消するためにuntilを使いました。また、ifのなかにwhileを入れてずっと光に向かって動かすようにしました。
#define THRESHOLD 47 //閾値を47に設定 #define RUN_TIME 200 //RUN_TIME=2秒とする 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){ while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //センサー1,3共に閾値より小さい時 { OnFwd(OUT_A);Wait(10); //右に曲がる Off(OUT_A);Wait(5); } while((SENSOR_1 >= THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //センサー1が閾値以上&3が閾値より小さい時 { OnRev(OUT_A);Wait(5); //左に曲がる Off(OUT_A);Wait(1); } while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD)) //センサー1が閾値以上&3が閾値より小さい時 { OnFwd(OUT_A);Wait(1); //右に曲がる Off(OUT_A);Wait(1); } while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) //センサー1,3共に閾値以上の時 { ClearTimer(0); //タイマー0をリセット while((Timer(0) <= RUN_TIME) && (SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) { //タイマー0がRUN_TIME以下かつセンサー1,3共に閾値以上の時 OnFwd(OUT_A); //前進 Wait(10); OnRev(OUT_A); Wait(20); } if((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD)) //センサー1,3共に閾値以上の時 { Off(OUT_A); //ローラーを停止 OnFwd(OUT_C);Wait(10); //アームを回転、停止 Off(OUT_C);Wait(300); } } } }
●工夫、苦労した点
「光が停止している」をどの様に見分けさせるかという点で悩みました。
ある程度の光量以上になったら1度止まらせ、少し後でも同じようにその光量以上だったら止まっている、という考えに至り、そのようにプログラムしました。
今回初めてマシンと本格的に向かい合って、本当に大変な時もありましたが、なかなか走ってくれないもどかしさが、走った時の喜びに変わるなんとも言えないいい体験ができて本当によかったと思います。プログラミングの方は、2を担当したといっても、最後の方は舞ちゃんに手伝ってもらうという結果になってしまいました。次のロボコンでは、担当する所では、しっかり役に立てるようになりたいと思います。
ロボットは任せて、プログラミングの方を中心につくりました。
1つ目のプログラムは簡単にできたのですが、2つ目でつまずき、3つ目は2つ目以上に悩みました。
間違えていたところが、while(無限ループ)の書き忘れだったり、repeatをwhileに書き換えればスムーズにいくといった様なことで、注意不足で、まだまだコマンドを使いこなせていないなと思いました。
今まで3回課題をやってきましたが、私はほとんどロボット制作に触れていなかったです。
「どうして1つのモーターで左右転換ができるか」ということも教えて貰うまで理解できませんでした。
もっとロボットの構造の事も理解したいです。