- 追加された行はこの色です。
- 削除された行はこの色です。
#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つは後ろの風車の動力である。
-懐中電灯は人が持っているため、光センサーには少し角度をつけ、上のほうからの光にも対用できるようにした。
-風車には意味があり、風車を回転させたり止まっていることで数個あるif文の中で今どれが遂行しているかわかるようにする。
*起こった問題と解決法 [#r9e2a50e]
+音楽のプログラムを作る上で、まず楽譜が読めなくてはいけない。また楽譜が読めただけではいけなく、それぞれの音を周波数で表し、流れる音の間隔また長さを決めなくてはいけない。&color(red){&size(20){→};};楽譜を読むのは、音楽に詳しい人に協力してもらった。音の間隔は1つの目安の時間を作り、あとは実際にロボの演奏を聴き微調整していく。
+while文を数個作ったのでwhlile分の切り替えがうまくできない。&color(red){&size(20){→};};単純に時間や力の値を変えることで、違うwhile文に移るようにした。
+光を追う場面では、数個あるif文を同時に行ってしまい変な動きになってしまう。&color(red){&size(20){→};};単純に数値を定義しただけでは、そのような同時進行が起きてしまうため&&や||を使い、より細かく正確な場合分けをするようにした。
**マシンが動いている時にかかっている音楽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
#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(re/2,80);Wait(82);//*○/2というものが有りますが、これは1オクターブ低いものになります*
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);
}
}
}
--[[2006a/C1/課題3左/光を追うプログラム01]]
**プログラムの概要 [#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);
}
}
}
--[[2006a/C1/課題3左/光を追うプログラム02]]
**プログラムの概要 [#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文};に行くようにした。
+音楽の方は、吹奏楽の友人の協力によりすんなりといった。「芸は身を助ける」というか本当にその分野に精通している人がいると助かります。
+ホームページの方なんですが、音楽のプログラムを載せたせいでかなり大きくなってしまいました、見づらいと思います。許してください。
+1オクターブ高い音ってもとの音を2倍したものとほぼ同じなんですね、実際普通にすべての周波数を打ち込んだものと*2などを使ったものとでは、ほとんど同じ音でした、あと目安の時間も定義することで数値をいちいち書き込まなくてもよかったんですね。プログラムを作った後に教えてもらいました。&worried;
+ホームページの方なんですが、音楽のプログラムを載せたせいでかなり大きくなってしまいました、見づらいと思います。許してください。&color(red){訂正};→光を追うプログラムはリンクをはり、そちらを見てもらうようにしました。そのことでホームページが見やすくなったと思います。
+あとホームページで色分けをして見やすくしたつもりです、逆に見づらくなった所もあるかもしれません。
*コメントお願いします&wink; [#e5f84d1c]
-順調に開発できているようですね。素晴らしい。 -- [[ゆき(TA)]] &new{2006-07-07 (金) 16:56:43};
#comment