[[2008a/A3/課題3左]] #hr CENTER:&size(30){光に向かってブロックを投げるロボット }; #hr CENTER:&size(20){製作者:KEN&TAKAAKI}; RIGHT:[[ロボティクス入門ゼミ]] RIGHT:[[2008a/A3]] 目次 #contents *課題 [#j2cafac0] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするように~ プログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)~ 1.全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。~ 2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。~ 3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。~ ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。 *ロボットの紹介 [#hf4feea7] **ロボットの写真 [#ab668d55] ***上 [#tb1524b4] #ref(2008a/A3/課題3左/u.jpg,50%,上) ヒントに従って光センサーの間に衝立を設置しました。 ***前 [#a8cc3d0a] #ref(2008a/A3/課題3左/f.jpg,50%,前) 前には抵抗の少ない半円球のブロックを取り付けています。 ***後 [#k80cfb08] #ref(2008a/A3/課題3左/b.jpg,50%,後) ***横 [#s1198bbf] #ref(2008a/A3/課題3左/s.jpg,50%,横) ***ディファレンシャルギア [#k37127ae] #ref(2008a/A3/課題3左/d.jpg,50%,ディファレンシャルギア) 今回はモーターが2つに制限されていたので、ヒントを利用して、このディファレンシャルギアを使いました。~ ディファレンシャルギアは実際に車にも使われているシステムで両輪の回転差を解消するために使われています。~ ***ブロック発射装置 [#tf1519cf] #ref(2008a/A3/課題3左/t.jpg,50%,ブロック発射装置) 試行錯誤の結果、タイヤで飛ばすことになりました。ブロックとタイヤの間隔が難しく、~何度も改造を加えました。結構飛ぶようになりました。~ 写真向って右側のタイヤだけギヤを介してモーターにつながっています。 **ロボット作成において苦労した点・工夫した点 [#ead5e04d] 今回のロボットのポイントはディファレンシャルギアとブロック発射装置です。~ 最初はディファレンシャルギアの仕組みがよく分からず、苦労しました。~ ブロック発射装置もL字に引っ掛けて飛ばすか、タイヤで飛ばすか、いろいろ考えましたが、~ 両方あまりうまくいかず、最後は大きいタイヤを使って何とか飛ばしました。 *プログラムの紹介 [#l69a6aa8] **プログラム① [#t8d88e5e] #define turn_time 382 //1周にかかる時間を定義 int max=0; //変数maxに0を代入 int time=0; //変数timeに0を代入 sub throw() //ブロックを投げるサブルーチン { OnRev(OUT_C);Wait(200);Off(OUT_C); } void turn_l(int t) //左に曲がるサブルーチン { SetPower(OUT_A,3);OnFwd(OUT_A);Wait(t);Off(OUT_A); } void turn_r(int t) //右に曲がるサブルーチン { SetPower(OUT_A,3);OnRev(OUT_A);Wait(t);Off(OUT_A); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと定義 ClearTimer(0); //タイマーをリッセット turn_l(turn_time); //左に曲がる while (FastTimer(0)<turn_time) //ファーストタイマーがturn_time以下のとき以下を繰り返す { if(SENSOR_1>max) //センサー1がmaxの値よりも明るいとき { max=SENSOR_1; //そのときの値をmaxに代入 time=FastTimer(0); //そのときのファーストタイマーの値をtimeに代入 } } Wait(200); turn_l(time); //もう一度左に曲がりmaxのところまで戻る throw(); //投げる } **プログラム② [#q444f0ff] #define THRESHOLD 60 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと定義 while(true){ //以下を繰り返す if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //両方明るいとき OnFwd(OUT_C); Wait(15); } if((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { OnFwd(OUT_A); Wait(15); } if((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { // OnRev(OUT_A); Wait(15); if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //両方暗いとき光を探す OnRev(OUT_A); Wait(25); } } } } **プログラム③ [#z725193d] #define THRESHOLD1 65 //センサ−1の閾値を65と定義 #define THRESHOLD3 58 //センサー2の閾値を58と定義 sub throw() //ブロックを投げるサブルーチン { OnFwd(OUT_C);Wait(20);Off(OUT_C); } void turn_l(int t) //tだけ左に曲がる { OnFwd(OUT_A);Wait(t);Off(OUT_A); } void turn_r(int t) //tだけ右に曲がる { OnRev(OUT_A);Wait(t);Off(OUT_A); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−2を光センサーと定義 while (true) //以下を繰り返す { if(SENSOR_1<THRESHOLD1 && SENSOR_3<THRESHOLD3) //両方暗いときジグザグに前進 { turn_r(100); turn_l(50); } if(SENSOR_1>THRESHOLD1 && SENSOR_3<THRESHOLD3) //センサ−1だけが明るいとき左に曲がる { turn_l(50); } if(SENSOR_1<THRESHOLD1 && SENSOR_3>THRESHOLD3) //センサー2だけが明るいとき右に曲がる { turn_r(100); } if(SENSOR_1>THRESHOLD1 && SENSOR_3>THRESHOLD3) //両方明るいとき投げる { throw(); } } } **プログラム作成において苦労した点・工夫した点 [#i0c4791b] 今回のプログラムは簡単かなと思っていましたが、結構苦労しました。 *感想・反省など [#wa25a1e9] 期限1週間はさすがにきつすぎました・・・ *未解決の問題 [#y5ab23f5] ディファレンシャルギアからたまに変な音がします・・・ *コメントをお願いします [#xccfa324] #comment --------------- RIGHT:[[ロボティクス入門ゼミ]] RIGHT:[[2008a/A3]]