CENTER:&size(35){光を追うロボット};~ 目次 #contents *課題3 [#sf0edc9b] 懐中電灯の光を追いかけて進むロボットを製作し、以下の中から2種類以上のプログラムを作成せよ。 光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す~ 光源を見失った時には明るさに比例した周波数の音を出しながら旋回して光源を探す~ 光源を見失っていないときにはある曲を演奏し、見失った時には別の曲を演奏しながら光源を探す~ 上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する~ ~ ただし支給されているモータ、光センサ、タッチセンサはいくつ使ってもよい。 *完成までの道のり [#meb236b0] 木曜、徹夜は当たり前!音楽の楽譜が見つからない....必死になってネットを開くA2の仲間。みんなコマクサということで「少年」の部屋に集合! **光探知の工夫!!! [#b027ad2c] ある一人の制作者が言った「本体ごと回転するのって、なんか不細工やなぁ。&size(25){もっとシャープに工夫したいな};。」~ みんなが振り向いて同時に言った。&size(25){「それ、俺も思ってた!」};と。~ ~ そして、回転部位の工夫が始まった。プログラミングよりも&color(red){見た目を重視};に考えてしまった結果、徹夜の旅が始まることになるのだが...~ 何はともあれ、本体ごと回さず回転部分を独立させることによって回転効率を上げることに成功。こうすることによって&color(bule){シャープ};でありながら、&color(red){効率よく};光を探すことのできる新未来型(あくまでも僕たちの中で)のロボが完成することになった。~ #ref(2006a/A2/課題3右/SN310113.JPG,30%,初号機); **音楽探し [#na71844a] 夜中2時。バイトから帰ってきてこれから寝ようかという所で僕の電話がなった。~ &size(25){『これからロボ作るぞ。俺の部屋に集合せい!!』};....軽く涙がでた。~ 課題3を見れば分かるとおり、この課題では必ず音楽を鳴らさなければならない。「何がいい?」とお決まりの相談をし、小一時間話した結果、結局簡単に作れる「かえるの歌」に決定。~ 音階・音の間隔など、適当に作ってみたら案外上手くできた。あとは微調整をし、ちょっと遅めのかえるの歌が完成。 **実力の限界? [#fa0acdce] 音楽は無事完成したが、肝心のプログラムで行き詰る。~ 回転台で認識した値にいくつかの数値をかけて、本体の旋回時間と同じようにした。だが、回転台が測定後も止まらずに動き続けるため、大きな誤差が生じるようになった。また、回転台への動力伝達は輪ゴムを使用していたため、どうしても正確さに欠けるものだった。あらゆる問題を抱え、前日は全員がリタイアとなった。 **無駄になった回転台 [#ef5bddd4] 回転台の異常動作により、急きょ回転台を回さない普通のプログラムを作った。宝の持ち腐れとはこのことである。~ 機体はよくてもプログラミングが上手くいかないと力を発揮できない。ここにきてバランスが大切だなと痛感させられた。 **回転台の改良 [#g49620ff] 本番後、回転台の弱点であった「あいまいさ」を解決した。~ これまでの回転台は、モーターの回転を抑えるため大きいプーリーと小さいプーリーを使って減速させていた。しかし、輪ゴムを仲介としているためか、どうしても一回ごとの回転量が違ってきていた。~ そこで少々手間ではあったが、ギアを組み合わせた正確な回転軸を作り上げた。しかし、作っただけで使ってはいない。&size(10){本番終わりましたから}; #ref(2006a/A2/課題3右/SN310115.JPG,30%,回転台); **おまけ [#qced0717] 今回も作ってしまいました…禁断の兵器を。~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ こちら↓~ ~ ~ ~ ~ ~ ~ ~ #ref(2006a/A2/課題3右/SN310114.JPG,30%,禁断の兵器); 地味に高い輪ゴムとの賭け事のようなものですな。いつ切れるのか… なので禁断の兵器というわけです。~ &size(11){%%これよりプログラムに集中しろよ…%%};~ &size(11){ページ作成者の心からの叫びでした。(小さいけど)}; *反省 [#t9c655be] **工夫した部分 [#a09c1d9b] -何といっても回転台。~ だが完全な形にはならず。これが成功すればかなり面白いロボットになっていただろうに…~ 光センサーのコードは上に囲い込まれていて、なるべくねじれを避けれるようにした。ロボット本体と回転台の一周する時間は違うため、プログラムで誤差を修正している。小数点が使えないことに焦ったが、何とか解決。詳細は下記のプログラムを参照。 **改善すべき点 [#ac534bad] -何といってもロボット製作とプログラミングのバランス調整。せっかくやったことが無駄になってしまう。 **感想 [#ff238e52] 結局、右チームの今までのページ、プログラミングはほとんど、ある少年がやることになってしまった。確かに寮のインターネットが繋がらなくなったのは予想外であった。だが、協力はできたと思う。誰か一人が頑張っていても、協力しあわなければいいものは作れない。今回の課題はまさにそのことが反映された結果であろう。~ この調子でロボコンを成功させることができるのであろうか… *プログラム [#dd0287ca] 課題3を見て分かるとおり、今回はいくつかのものを選んでプログラムを作らなければならない。~ このチームでは以下のものをプログラムに組み込んだ。 ・光源を見失った時には曲を演奏しながらぐるっと旋回して光源を探す~ ・上記のいずれかに『光源に近づき過ぎると停止する』という機能を追加する~ だが二つ目はどうもうまくいかず。何が原因かいまだよく分かっていない。 **回転台版のプログラム //製作者 少年 [#x89e6043] #define TURN_TIME 290 旋回時間 int light_max=0; 光の閾値設定 #define Do 523 ドの音 周波数 #define Re 587 レの音 周波数 #define Mi 659 #define Fa 698 #define Sol 784 #define ma 55 #define k 50 task play_music() かえるの歌 { PlayTone(Do,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Do,k);Wait(100); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(880,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,20);Wait(25); PlayTone(Do,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Mi,30);Wait(50); PlayTone(Re,30);Wait(50); PlayTone(Do,30);Wait(50); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); センサー1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); センサー2を光センサーと定義 Wait(100); while(1) 無限ループ { if(SENSOR_1&&SENSOR_3<55) センサー1と3が55以上の値の場合 { start play_music; かえるの歌再生 ClearTimer(0); タイマースタート OnFwd(OUT_B); 回転台回転 while(FastTimer(0)<TURN_TIME) タイマーの値がTURN_TIME以下の場合 { if(SENSOR_1>light_max) センサー1がlight_max以上の場合 { light_max=SENSOR_1;light_max=FastTimer(0); light_maxの値・時間を記録 } } OnRev(OUT_B);Wait(TURN_TIME);Off(OUT_B); 回転台を元の位置に戻す stop play_music; 音楽停止 ClearTimer(0); タイマースタート while(FastTimer(0)<light_max*143/100) 回転台で得られた数値を本体用に変換 { OnFwd(OUT_C);OnRev(OUT_A); } OnFwd(OUT_A); } if(SENSOR_1&&SENSOR_3>55) { OnFwd(OUT_A+OUT_C); } } } **回転台固定版 //製作者 少年 [#i222b894] #define TURN_TIME 320 int light_max=0; #define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define Sol 784 #define ma 55 #define k 50 task play_music() { PlayTone(Do,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Do,k);Wait(100); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(880,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,20);Wait(25); PlayTone(Do,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Mi,30);Wait(50); PlayTone(Re,30);Wait(50); PlayTone(Do,30);Wait(50); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); while(1) { if(SENSOR_1<50) { start play_music; ClearTimer(0); OnFwd(OUT_A); OnRev(OUT_C); while(FastTimer(0)<TURN_TIME) { if(SENSOR_1>light_max) { light_max=SENSOR_1;light_max=FastTimer(0); } } stop play_music; ClearTimer(0); while(FastTimer(0)<light_max) { OnFwd(OUT_A);OnRev(OUT_C); } OnFwd(OUT_C); } if(SENSOR_1>50) { OnFwd(OUT_A+OUT_C); } } } 光を追いかけるプログラム//製作者 ムーディ #define x 43//光の閾値task play_music() かえるの歌 { PlayTone(Do,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(ma); PlayTone(Re,k);Wait(ma); PlayTone(Do,k);Wait(100); PlayTone(Mi,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(880,k);Wait(ma); PlayTone(Sol,k);Wait(ma); PlayTone(Fa,k);Wait(ma); PlayTone(Mi,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,k);Wait(100); PlayTone(Do,20);Wait(25); PlayTone(Do,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Re,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Mi,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Fa,20);Wait(25); PlayTone(Mi,30);Wait(50); PlayTone(Re,30);Wait(50); PlayTone(Do,30);Wait(50); } task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT);//センサー3を光センサーと定義 while(1){ //無限ループ if(SENSOR_1>x){ //センサー1の方が明るいとき Off(OUT_A+OUT_B+OUT_C); //停止して Wait(50); OnFwd(OUT_C); until(SENSOR_1<x); //暗くなるまで左に曲がり Off(OUT_A); //止まる } if(SENSOR_3>x){ //センサー3の方が明るいとき Off(OUT_A+OUT_B+OUT_C); //停止して Wait(50); OnFwd(OUT_A); until(SENSOR_3<x); //暗くなるまで右に曲がり Off(OUT_C); //停止 } else{//それ以外は OnFwd(OUT_B); Wait(300); OnRev(OUT_B); Wait(300); //その場で回転する } } }