目次 #contents *はじめに [#lfc82429] 今回の課題は半径1m以内にある懐中電灯を探して、懐中電灯にピンポン玉を当てるロボットの作成でした。&br; 今回は前回の課題で作ったロボットのセンサの向きを変えただけだったので簡単に完成させることができました。 *ロボット本体 [#n90d2dd9] **全体 [#s04d8fe6] #ref(./S__36487170.jpg,around,全体) 基本の車の形のものにアームとセンサーを付けた形になっています。&br; 写真には取り忘れてしまいましたが、センサーの周りに遮光板を付けました。動画ではついています。 #clear **アーム [#o870d1e6] モーター1つで開閉ができるようにしました。モーターを直接つなぐと動きが早すぎたのでギア比を考えてゆっくり動くようにしています。&br; プログラムをこのまま送れるように送受信センサのところには棒が一本しか通らないようにしています。アームとセンサはまとめて本体から簡単に取り外しができるようにもしています。 #clear *プログラム [#y060cbef] #define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回 task main () { SetSensor(SENSOR_3,SENSOR_LIGHT); int lightpower=10; int maxtime=0; ClearTimer(0); turnleft; while(FastTimer(0)<450){ if(SENSOR_3>lightpower){ lightpower=SENSOR_3; maxtime=FastTimer(0); } } turnright; int movetime=FastTimer(0); Wait(movetime); turnleft; Wait(maxtime); OnFwd(OUT_AC); OnRev(OUT_B); Wait(50); Off(OUT_B); Wait(60); OnRev(OUT_AC); Wait(60); Off(OUT_AC); } *説明 [#h2bcbc39] **定義 [#e8076282] まずは以下の通りその場で回転するための定義をしました。 #define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回 **動作 [#ef62e8b7] +4.5秒間左旋回しながら、一番明るいところを探します。方法としては、まず明るさを読み取った後、前回読み取った数値より明るさが大きかったら、明るさとその時の時間を残します。これを繰り返すことで一番明るいところがわかります。 SetSensor(SENSOR_3,SENSOR_LIGHT); int lightpower=10; int maxtime=0; ClearTimer(0); turnleft; while(FastTimer(0)<450){ if(SENSOR_3>lightpower){ lightpower=SENSOR_3; maxtime=FastTimer(0); } } +元のところまで同じ秒数で逆回転することで戻ります。 turnright; int movetime=FastTimer(0); Wait(movetime); +一番明るかった時の秒数動くことでライトのほうを向きます。 turnleft; Wait(maxtime); +アームを開いてシュートする。 OnFwd(OUT_AC); OnRev(OUT_B); Wait(50); Off(OUT_B); Wait(60); OnRev(OUT_AC); Wait(60); Off(OUT_AC); *結果・感想 [#x983fbb1] 前回の課題の時のものをそのまま使えたのですぐにできたのがよかったです。&br; 実際のロボット動きは動画にしたので見ていただきたいです。[[動画はこちら:http://youtu.be/s1EAoUDQzO8]]&br; グループで製作ということで、3人で相談しあいながらなんとか形にできたのは大きな達成感を得ることになりました。&br; もう一つおまけで、最大の明るさのところから経った時間だけ戻るプログラムも作りました。 もう一つおまけで、最大の明るさのところから経った時間だけ戻るプログラムも作りました。このほうが正確でそれも早く目的の位置まで行くことができました。 #define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回 task main () { SetSensor(SENSOR_3,SENSOR_LIGHT); int lightpower=10; int movetime=0; turnleft; ClearTimer(0); while(FastTimer(0)<320){ if(SENSOR_3>lightpower){ lightpower=SENSOR_3; ClearTimer(1); } } turnright; movetime=FastTimer(1); Wait(movetime); OnFwd(OUT_AC); }