[[2008b]] *目次 [#te2dadd2] #contents *課題3 懐中電灯に向かってブロックを投げるロボット [#i2f30c9c] **1 課題の概要 [#te98618a] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) ~その1 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 ~その2 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 &br;懐中電灯の代わりに携帯のライトなどを利用してもよい。 モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。 **2 ロボットの製作過程 [#o2189730] ~まず、モーター一つでロボットを動かすための本体づくりから開始。 &br;ページ上にあるヒントの写真などを参考に作成し完成。 &br;このときに試験的に動くかどうかを確認すればよかったものの、それをしないで次の作成に取り掛かってしまったせいで後々大変な目に逢うことに。 ~投げる部分などの部品作製も終り、プログラムも組んでいざ動かそうとすると、大きな音が「ガガガガ・・・」と鳴るだけで本体は全く進まない。 &br;何が原因か調べると、どうもパワーが足りないようで本体を動かせなかったからということが判明した。 &br;仕方なく、完成したロボットを少し分解し、動力を伝える部分のギアを大きいものに取り換え、また組み直したところなんとか動くようになった。 **3 ロボットの完成の様子と工夫点 [#zf6a78ee] ***ロボットの完成の様子 [#e0443e73] ~まず、完成したロボットの写真がこちら。 ~&ref(Image009.jpg,nolink); 正面から &ref(Image010.jpg,nolink); 側面から ~&ref(Image011.jpg,nolink); 真上から ***ロボットの工夫点 [#n59512ce] &br;今回の課題で工夫した点は、ブロックを投げる部分である。 &br;初めに作成したアームでは投げる動作はできるのだが、全く飛距離がなく、ロボットの前に落ちるといった感じであった。 &br;そこでアームを改良し、なるべくアームを軽量化することでのアームの部分の動きをより素早くして遠くまでブロックを投げることに成功した。 **4 ロボットのプログラム [#vbfbdfde] ***その1 [#s5c1a5fb] #define THRESHOLD 50 //闘値を50に設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに設定 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに設定 SetPower(OUT_A+OUT_C,7); //出力を7に設定 OnFwd(OUT_C); //左に回転 while(true){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ //センサ−1、3とも闘値より強い光を感知した場合、 Off(OUT_C); //タイヤを止める Wait(50); //(動作を安定させるための停止時間) OnFwd(OUT_A); //アームを動かしてブロックを投擲 Wait(50); // Off(OUT_A); //アームを止める } if(SENSOR_3>THRESHOLD){ //センサ−3が闘値より強い光を感知した場合, OnRev(OUT_C); //右に回転 } if(SENSOR_3>SENSOR_1){ //センサ−3がセンサ−1よりも強い光を感知している場合、 OnRev(OUT_C); //右に回転 } } } *相方に難しいことばかり押し付けてしまいました。唯一役立てたのは、モーター底辺に棒を差し込めることを発見したことだけです。 ***その2 [#ze1f5b99] #define hikari 53 //光を探す為の閾値 #define line 75 //ブロックを投げる為の閾値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1、3を光センサー宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A+OUT_C,7); //出力を7にする while (true) { if((SENSOR_1>hikari)&&(SENSOR_3>hikari)){ //センサー1、3がhikariより大きいならば前進する。 OnRev(OUT_C);Wait(20); OnFwd(OUT_C);Wait(20); } if ((SENSOR_1>hikari)&&(SENSOR_3<hikari)){ //センサー1のみがhikariより大きいならば右に回る。 OnRev(OUT_C); } if((SENSOR_1<hikari)&&(SENSOR_3<hikari)){ //センサー1、3ともにhikariより小さいならば左に回る。 OnFwd(OUT_C); } if((SENSOR_1>line)&&(SENSOR_3>line)){ //センサー1、3ともにlineより大きいときブロックを投げる。 Off(OUT_C); OnFwd(OUT_A);Wait(12); Off(OUT_A); break; //ブロックを投げたらbreakしてwhlieから抜ける。 } } Off(OUT_C); //停止 } 今回のプログラムでは閾値の設定が一番厄介だった気がしました。 &br;懐中電灯を使用し、実際に動かしながらちょうどよい値を見つけるのが大変でした。 &br;また、今回のプログラムは移動などの判別をすべてif文で表せるので比較的単純で、わかりやすいプログラムに仕上がったと思います。 *コメント [#we22e274] コメントがあればどうぞ #comment