#hr CENTER:&size(25){課題3:光を追うロボットを作る}; #hr ○目次○ #contents ***制作者 [#v533c5b6] 子供の頃から神童 二等兵 ツノハラ **課題の内容 [#c850f360] 懐中電灯の光を追いかけるロボットを作り、次の中から2種類以上のプログラムを作る。 +&color(red){光源};を見失った時に&color(blue){音楽};を演奏しながら旋回して&color(red){光源};を探す +&color(red){光源};を見失った時には明るさに比例した&color(blue){周波数の音};を出しながら旋回して&color(red){光源};を探す +&color(red){光源};を見失っていないときには&color(blue){音楽};を演奏し、見失った時には&color(green){別の曲};を演奏しながら&color(red){光源};を探す +&color(red){光源};を見失っていないときには&color(blue){ある曲};を演奏し、見失った時には&color(green){別の曲};を演奏しながら&color(red){光源};を探す +上記のいずれかに『&color(red){光源};に近づき過ぎると停止する』という機能を追加する *マシンの図 [#cb23da2d] &ref(光を追う写真.JPG);&size(30){→&color(brown){横から見た図};→};&ref(光を追うロボ横.jpg); *マシンの製作の上で [#u836d849] -今回の課題はロボットの機構はあまり重要でないので作成に苦労はしなかった、しかし上り下りをスムーズのするため小さなタイヤを前後中心あたりにつけたり、写真をみてわかるように風車がついているなどこだわりは随所にある。 -モーターは3つ使用しており、2つは左右のキャタピラの動力、1つは後ろの風車の動力である。 -懐中電灯は人が持っているため、光センサーには少し角度をつけ、上のほうからの光にも対用できるようにした。 **マシンが動いている時にかかっている音楽01 [#gb975bb3] ○制作者○ツノハラ◎協力者◎ブライト #define mi 659 //ミ #define fa 698 //ファ #define so 784 //ソ #define sol 831//ソの# #define ra 880 //ラ #define shi 988//シ #define Do 1047//ド #define re 1175//レ #define mil 1319//1オクターブ高いミ #define fal 1397//1オクターブ高いファ #define soy 15681//オクターブ高いソ #define ral 1760 //1オクターブ高いラ task play_music() { while(true) { PlayTone(mi,40); Wait(40); PlayTone(ra,40); Wait(40); PlayTone(sol,40);Wait(40); PlayTone(ra,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(mil,240);Wait(240); PlayTone(soy,80);Wait(80); PlayTone(mil,240);Wait(240); PlayTone(ral,40);Wait(40); PlayTone(soy,40);Wait(40); PlayTone(mil,160);Wait(200); PlayTone(mil,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,20);Wait(20); PlayTone(Do,20);Wait(20); PlayTone(ra,200);Wait(200); PlayTone(Do,80);Wait(80); PlayTone(ra,400);Wait(500); } } これでわかる人はかなりすごい! 答えは→&color(blue,blue){コンドルは飛んでいく}; **マシンが動いている時にかかっている音楽02 [#zf43e6db] ●制作者●子供の頃から神童 #define TURN_TIME 600 #define mi 659 #define fa 698 #define fal 740 #define so 784 #define sol 831 #define ra 880 #define ral 932 #define shi 988 #define Do 1047 #define Dol 1109 #define re 1175 #define rel 1245 task play_music() { while(true) { PlayTone(so,80); Wait(82); PlayTone(fal,20);Wait(20); PlayTone(so,20);Wait(20); PlayTone(ra,40);Wait(42); PlayTone(mi,80);Wait(82); PlayTone(re/2,80);Wait(82); PlayTone(Do/2,80);Wait(62); PlayTone(shi/2,20);Wait(22); PlayTone(Do/2,20);Wait(22); PlayTone(re/2,40);Wait(42); PlayTone(ra/2,160);Wait(162); PlayTone(shi/2,80);Wait(82); PlayTone(Dol/2,20);Wait(22); PlayTone(re/2,40);Wait(42); PlayTone(mi,20);Wait(22); PlayTone(ra,80);Wait(82); PlayTone(re/2,80);Wait(82); PlayTone(so,80);Wait(82); PlayTone(so,20);Wait(22); PlayTone(fal,40);Wait(42); PlayTone(mi,20);Wait(22); PlayTone(re/2,160);Wait(162); } } これでわかる人は天才! 答えは→&color(green,green){威風堂々}; *プログラム(&color(red){光源};を見失った時に&color(blue){音楽};を演奏しながら旋回して&color(red){光源};を探す) [#b6f03dbb] ★制作者★子供の頃から神童 #define mi 659 //音を定義 #define fa 698 #define so 784 #define sol 831 #define ra 880 #define shi 988 #define Do 1047 #define re 1175 #define mil 1319 #define fal 1397 #define soy 1568 #define ral 1760 task play_music() { while(true)//音楽を繰り返し演奏 { PlayTone(mi,40); Wait(40); PlayTone(ra,40); Wait(40); PlayTone(sol,40);Wait(40); PlayTone(ra,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(mil,240);Wait(240); PlayTone(soy,80);Wait(80); PlayTone(mil,240);Wait(240); PlayTone(ral,40);Wait(40); PlayTone(soy,40);Wait(40); PlayTone(mil,160);Wait(200); PlayTone(mil,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,20);Wait(20); PlayTone(Do,20);Wait(20); PlayTone(ra,200);Wait(200); PlayTone(Do,80);Wait(80); PlayTone(ra,400);Wait(500); } } task main() { SetSensor(SENSOR_1, SENSOR_LIGHT);//*センサーが光センサーであることを定義* SetSensor(SENSOR_3, SENSOR_LIGHT);//上と同じ OnFwd(OUT_A+OUT_C+OUT_B); while(true)//繰り返し { SetPower(OUT_A,2); SetPower(OUT_C,2); if(SENSOR_1>SENSOR_3-20&&SENSOR_1>50|| SENSOR_1-20>SENSOR_3 &&SENSOR_3>50 )//*どちらのセンサー* { //*も懐中電灯の光が当たっていると前進* SetPower(OUT_A,4); SetPower(OUT_C,6); OnFwd(OUT_A+OUT_C); Wait(100); } if(SENSOR_1<SENSOR_3&&SENSOR_1<50)//*左のセンサーに当たる光が弱いと時計回りに回転* { OnFwd(OUT_A); OnRev(OUT_C); } if(SENSOR_1>SENSOR_3 &&SENSOR_3<50)//*右のセンサ−に当たる光が弱いと逆時計回りに回転* { OnFwd(OUT_C); OnRev(OUT_A); } else//*センサーにあたる光が両方とも弱いと音楽をかけながら回転* { start play_music ; SetPower(OUT_A,7); SetPower(OUT_C,7); OnFwd(OUT_A); OnRev(OUT_C); } } } **プログラムの概要 [#s7acf876] このプログラムは前回のライントレースのプログラムに似ていて2つのセンサーを使い左右につけ、左右の光センサーを使い両方とも光があたっていると前進、片方どちらかだと光のあたりが弱いほうをひかりに近づけ,両方のセンサーにあたる光が弱いと音楽をかけながら光を見つけるまで回転するプログラムである。 *プログラム(&color(red){光源};を見失っていないときには&color(blue){ある曲};を演奏し、見失った時には&color(green){別の曲};を演奏しながら&color(red){光源};を探す) [#i70690fd] ☆制作者☆ツノハラ #define TURN_TIME 600//*一周の時間を定義* #define mi 659 //*音を定義* #define fa 698 #define fal 740 #define so 784 #define sol 831 #define ra 880 #define shi 988 #define Do 1047 #define Dol 1109 #define re 1175 #define rel 1245 task play_music01() { while(true)//*音楽01を繰り返し演奏* { PlayTone(mi,40); Wait(40); PlayTone(ra,40); Wait(40); PlayTone(sol,40);Wait(40); PlayTone(ra,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(shi,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(mi*2,240);Wait(240); PlayTone(so*2,80);Wait(80); PlayTone(mi*2,240);Wait(240); PlayTone(ra*2,40);Wait(40); PlayTone(so*2,40);Wait(40); PlayTone(mi*2,160);Wait(200); PlayTone(mi*2,40);Wait(40); PlayTone(re,40);Wait(40); PlayTone(Do,40);Wait(40); PlayTone(re,20);Wait(20); PlayTone(Do,20);Wait(20); PlayTone(ra,200);Wait(200); PlayTone(Do,80);Wait(80); PlayTone(ra,400);Wait(500); } } task play_music02() { while(true)//*音楽02を繰り返し演奏* { PlayTone(so,80); Wait(82); PlayTone(fal,20);Wait(20); PlayTone(so,20);Wait(20); PlayTone(ra,40);Wait(42); PlayTone(mi,80);Wait(82); PlayTone(re/2,80);Wait(82); PlayTone(Do/2,80);Wait(62); PlayTone(shi/2,20);Wait(22); PlayTone(Do/2,20);Wait(22); PlayTone(re/2,40);Wait(42); PlayTone(ra/2,160);Wait(162); PlayTone(shi/2,80);Wait(82); PlayTone(Dol/2,20);Wait(22); PlayTone(re/2,40);Wait(42); PlayTone(mi,20);Wait(22); PlayTone(ra,80);Wait(82); PlayTone(re/2,80);Wait(82); PlayTone(so,80);Wait(82); PlayTone(so,20);Wait(22); PlayTone(fal,40);Wait(42); PlayTone(mi,20);Wait(22); PlayTone(re/2,160);Wait(162); } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//*センサーが光センサーであることを定義* SetSensor(SENSOR_3,SENSOR_LIGHT);//*上と同じ* int light_max=0,time_max=0;//*光と時間の最大値を0に設定* ClearTimer(0);//*タイマーをクリアー while(FastTimer(0)<15)//*タイマーの値が小さいと回転して光の最大値と一番明るい場所* { //*に行くまでの時間を定義* OnFwd(OUT_A);OnRev(OUT_C); Wait(TURN_TIME); if((SENSOR_1>light_max+50)||(SENSOR_3>light_max+50))//*最大の光を感知したら* { light_max=SENSOR_1;//*光の最大値をセンサー1に定義* time_max=FastTimer(0);//*最大に明るい場所までの時間をタイマーに定義* } } while(FastTimer(0)>15)//*最大値を定義し終わった後* { start play_music01 ;//*音楽01の演奏をスタート* Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A);OnRev(OUT_C);//*最大に明るかったところまで回転* Wait(time_max); OnFwd(OUT_A+OUT_C);Wait(100);//*少し前進* ClearTimer(0); SetPower(OUT_A,5);//*3個目のwhile文に行くためにモーターの力を変える* SetPower(OUT_C,5);//*上と同じ* } while(OUT_A<6)//*ここから光を追うプログラム* { if((SENSOR_1>=60)||(SENSOR_3>=60))//*光が当たっているところだと* { start play_music01 ;//*音楽01の演奏を始める* OnFwd(OUT_A+OUT_C);//*前進* } if((SENSOR_1<50)&&(SENSOR_3>60))//*センサー1に当たる光が弱くなると* { OnFwd(OUT_A);//*時計回りに回転* OnRev(OUT_C); } if((SENSOR_3<50)&&(SENSOR_1>60))//*センサー2に当たる光が弱くなると* { OnFwd(OUT_C);//*逆時計回りに回転* OnRev(OUT_A); } if((SENSOR_1<50)&&(SENSOR_3<50))//*センサーに当たる光が両方とも弱いと* { stop play_music01 ;//*音楽01を止める* start play_music02 ;//*音楽02を流す* OnFwd(OUT_A);//*光を探すため回転* OnRev(OUT_C); } } } **プログラムの概要 [#if12c8f0] このプログラムではまず、一回転させ光の最大値や、一番明るいところまでの時間を定義し、音楽をかけながら一番光の強い方へ向かわせる、次には最初のプログラムの要領で光を追うようにさせる、光を見失ったときには2番目の曲を演奏する。 *反省 [#eeaffd0c] +今回の光を追う課題は、課題の1番最後なだけあって、すごく大変だった。プログラムがかなり複雑になり、しかもロボットを動かしてみても思うように動いてくれず、何回も直した。まず始めには最大値の定義、これは先生が前のボードに書いたものを初めそのまま使い自分なりに加工してみたが、このタイマー機能が完全に理解できていない。苦労したもうひとつの点は数個ある&color(red){while文};をどのようにして切り替えるか、2つ目のプログラムでは、まずタイマーをクリアして0にすることを利用して光の一番強い場所を探し、その方向へむくように時間を設定する。そうするとタイマーに時間が設定されるので&color(blue){次のwhile文};に移行する。ここからが問題だった、その&color(blue){2番目のwhile文};の中に光を追いかけるプログラムをif文を使ってやろうとしたが、初めに光の強い位置に回転→前進するを繰り返すようになってしまった。そこで&color(green){3番目のwhile文};を作り、光を追うのはそっちで行うようにさせた、&color(blue){2番目のwhlie文};の最後でモーターの力を変え、力が変わったことにより&color(green){3番目のwhile文};に行くようにした。 +音楽の方は、吹奏楽の友人の協力によりすんなりといった。「芸は身を助ける」というか本当にその分野に精通している人がいると助かります。 +ホームページの方なんですが、音楽のプログラムを載せたせいでかなり大きくなってしまいました、見づらいと思います。許してください。 *コメントお願いします&wink; [#e5f84d1c] -順調に開発できているようですね。素晴らしい。 -- [[ゆき(TA)]] &new{2006-07-07 (金) 16:56:43}; #comment