目次
懐中電灯に向かって飛ばすロボット
黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成する。
ただし1,3は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。
2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。
1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。(K.H担当) 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。(ドン担当) 3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。(D.Y担当)
ドン 工学部 機械システム工学科
K.H 工学部 電気電子工学科
D.Y 工学部 情報工学科
■真上から見た様子
写真を見ればわかる人はわかるかもしれませんが、今回のベースは説明書の基本ドライブベースです。説明書に載っているだけあって運動性は高いので、実は下手に1から作るよりそのまま流用したほうがよかったりします。
■正面から見た様子
前面はほぼ砲身及び発射機構となっています。前にだいぶ飛び出していてかなりバランスが悪そうに見えますが、実は後ろのバッテリー部分が重いため案外バランスはいいです。
■光センサー
今回は機体最上部乗っているだけなので簡単に増設及び位置変更ができます。
■弾発射機構
レール状の砲身を2つ作り、弾に力を加えるパーツが別々のタイミングで弾にぶつかるようにすることにより、1つのモーターで2発の弾を違うタイミングで発射する事に成功しました。また、弾は回転するアームで打ち出すことで発射されるので、1発打ち出すごとにアームは半回転します。
■弾
電車の車輪のようなパーツを取り付けることにより、発射前に砲身部分をレールとして利用できるようになっています。それにより地面に落ちる前まではかなりの精度でまっすぐ飛びます。
1.構造が難しくなるリロード機構を撤廃したことで全体の重量がかなり軽量であること。
2.構造を簡略化したことで、旋回性能が高いがあまり大きな機構は乗せられないという特性を持つ教科書に載っているドライブベースを使えたので1回転にかかる時間を抑えられたこと。
3.光センサーを組み込み式にせず後から付けるタイプにしたため増設・位置変更が容易であるため応用性が高いこと。
4.発射機構を短いとはいえレール状にしたため滞空中は弾がしっかり直進すること。
5.とにかく構造に余裕があるので今回は使わないタッチセンサーなども必要があれば増設できること。
1.モーターのパワーの制約により、弾の飛距離をあまり得られなかったこと。
2.弾が落下した後は転がって進むのですが、安定してまっすぐ転がらないため最終的な精度はあまりよくないこと。
ベースとなる車体部分は今のものと同じでした。しかし、モーターが一つなので、1つの砲身を使い弾をリロードさせることで2発発射させようとしたが、リロードするための機構をうまく作れなかった点が失敗でした。
モーターから長さの違う2本の棒を伸ばし、長い方で下の砲身に乗っている弾を発射し、短い方で上に乗っている弾を下の砲身部分に落として次弾として使おうという構造でしたが、上の弾がうまく下の砲身に乗ることはありませんでした.
#define turn_right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); //右回りにt秒回転をturn_right(t)定義 #define shoot OnFwd(OUT_B);Wait(10);Off(OUT_B); //弾発射動作をshootと定義 #define limit 750 //懐中電灯方向の明度 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //センサー2は光センサーとする SetSensorMode(SENSOR_2,SENSOR_MODE_RAW); //光センサーを高感度モードに設定 int s=0; //弾発射回数をsと置く while (s<2){ //2発弾を撃ちきるまで以下の動作をする if (SENSOR_2 >= limit) //懐中電灯を向いたときの明度以下しか感知できないとき {turn_right(5);} //右に少し動く else if (SENSOR_2 < limit) //懐中電灯の明度が感知されたとき {shoot; //弾を発射 s++; //発射回数+1 turn_right(80);} //その懐中電灯の光を通過 } Off(OUT_A+OUT_B+OUT_C); //モーターの電源を切る }
ライトが遠くにある場合光量が弱くなるが、その光量が750より弱くなった場合ライトがあっても反応しなくなること。
#define turn_right OnRev(OUT_A);OnFwd(OUT_C);Wait(5);Off(OUT_A+OUT_C); //右に回転をturn_rightで定義 #define turn_left(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左にt秒回転をturn_left(t)で定義 #define shoot OnFwd(OUT_B);Wait(10);Off(OUT_B); //弾発射動作をshootと定義 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //センサー2は光センサーとする SetSensorMode(SENSOR_2,SENSOR_MODE_RAW); //光センサーを高感度モードに int lmax=0; //現在の最大光量をlmaxと定義 int lmax2=0; //現在の次点光量をlmax2と定義 int tmax=0; //最大光量を観測した時間をtmaxで定義 int tmax2=0; //次点光量を観測した時間をtmax2で定義 ClearTimer(0); //タイマー始動 while(FastTimer(0)<800){ //機体が1回転するまで以下の動作をする if(SENSOR_2 < lmax){ //センサー2がlmaxより強い光を感知したとき lmax2=lmax; //次点光量を現在記録している最大光量と入れ替える tmax2=tmax; //次点光量を観測した時間を現在記録している最大光量を観測した時間と入れ替える lmax=SENSOR_2; //lmaxの値を今観測した値に変更 tmax=FastTimer(0);} //tmaxの値を現時刻に変更 else if((SENSOR_2 >= lmax) && (SENSOR_2 <= lmax2)){ //センサー2がlmax以下lmax2以上の光量を感知したとき lmax2=SENSOR_2; //lmax2の値を今観測した値に変更 tmax2=FastTimer(0);} //tmax2の値を現時刻に変更 turn_right; //右に旋回 } turn_left(400-tmax); //最大光量を感知した方向を向く shoot; //弾を発射 turn_left(tmax-tmax2); //次点光量を感知した方向を向く shoot; //弾を発射 Off(OUT_A+OUT_B+OUT_C); //全モーター停止 }
注:説明文を消さないとエラーで動きません。またこのプログラムは実機でのテストは行われていません。
#define go OnFwd(OUT_C+OUT_A); //前進を定義する #define throw OnFwd(OUT_B);Wait(10);Off(OUT_B); //弾を投げることを定義する #define turn_R OnFwd(OUT_A);OnRev(OUT_C); //右回転を定義する #define turn_L OnFwd(OUT_C);OnRev(OUT_A); //左回転を定義する #define stay Off(OUT_C+OUT_A); //止まることを定義する #define THRESHOLD1 650 //光センサーの境を650と定義する #define THRESHOLD2 780 //光センサーの境を780と定義する task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーとする SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); //センサー1を高感度にする SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーとする SetSensorMode(SENSOR_3,SENSOR_MODE_RAW); //センサー3を高感度にする while(true){ if((SENSOR_1>THRESHOLD1)&&(SENSOR_3<THRESHOLD1)){ //センサー1が650より大きく、センサー3が650より小さいとき turn_R; //右回転 until((SENSOR_1>THRESHOLD1)&&(SENSOR_3>THRESHOLD1)) //センサー1が650より大きく、センサー3が650より大きいとき stay;Wait(10); //止まる } else if((SENSOR_1<THRESHOLD1)&&(SENSOR_3>THRESHOLD1)){ //センサー1が650より小さく、センサー3が650より大きいとき turn_L; //左回転 until((SENSOR_1>THRESHOLD1)&&(SENSOR_3>THRESHOLD1)) //センサー1が650より大きく、センサー3が650より大きい stay;Wait(10); //止まる } else((SENSOR_1<THRESHOLD1)&&(SENSOR_3<THRESHOLD1)){ //センサー1が650より小さく、センサー3が650より小さいとき go; //前進する until((SENSOR_1<THRESHOLD2)&&(SENSOR_3<THRESHOLD2)) //センサー1が780より大きく、センサー3が780より小さいとき throw; //弾を飛ばす } } }
プログラム自体は前回より簡単でしたが、期間が1週間しかなかったことと1つのモーターで2回弾を発射する機構の作成にかなり苦労しました。また、精度と飛距離に関してはもう少しどうにかしたかったなと思います。
テスト前と言うことと、期間の短さにかなり苦戦させられた。また、弾をどのように飛ばすのかを考えるのに時間が掛ってしまいプログラムを考える時間が削られてしまって思っていたより大変だった。