- 追加された行はこの色です。
- 削除された行はこの色です。
[[2006b/A3]]
*課題3 [#r1e59d97]
懐中電灯などの光源を用意する。まず明るさに比例した周波数の音を出しながら全方角の中から光源のある方角を探し、探した後は、光源の光を追いかけて進むロボットを作成せよ。
懐中電灯などの光源を用意する。まず明るさに比例した周波数の音を出しながら全方角の中から光源のある方角を探し、探した後は、光源の光を追いかけて進むロボットを作成せよ。
*ロボット作成について [#jdfac5b9]
今回はモーターを3つ使って2つはタイヤを動かすためのモーター、もう1つはセンサーだけを回転させるように作りました。本体全体で光を探すために回転すると時間がかかってしまう。しかし、光センサーだけが回転すると時間を大幅に削減することができます。また、センサーを回転させるのには輪ゴムにより動力を伝達させました。ギアだと組み合わせるのが大変であり、また輪ゴムの方がスムーズに動けるんではないかと思ったので、ギアはやめました。光源を見つけたらロボットは光源に向かって直進し、光を見失ったらまたセンサーだけ回転して光を探しまします。
#ref(2006b/A3/課題3右/kaiten.jpg)
#ref(2006b/A3/課題3右/kaiten2.jpg)
*苦労した点&工夫した点 [#y98c646d]
+センサーを回転させる時にコードが絡まってしまいコードが絡まないように歯車で動かす方法からゴムにより回転させる方法に変えた。さらに回転した後に逆回転することでコードを絡ませないですむ。
#ref(2006b/A3/課題3右/kaitenn1.jpg)
+メロディーを作るときにうまく音程が合わず何度も数値をかえて大変だった。しかし、しっかり聞き取れるくらいまでにできてよかった。
+センサーの回転時間と本機の回転時間とでは回転角度が違ってくるのでそれぞれのモーターでの回転数をほぼ同じにした。また回転する軸をしっかり固定するのが大変であり、輪ゴムの力で軸がうまく固定できなかった。だが、ブロックである程度固定することである程度安定できた。
*プログラム [#ca62de6e]
#define Do 523
#define Do 523 //音程を定義
#define Re 587
#define Me 659
task play_music1()
{
while(true)
while(true) //チャルメラ演奏
{
PlayTone(Do,15); Wait(20);
PlayTone(Re,15); Wait(20);
PlayTone(Me,30); Wait(40);
PlayTone(Re,15); Wait(20);
PlayTone(Do,15);Wait(25);
PlayTone(Do,13);Wait(18);
PlayTone(Re,13);Wait(18);
PlayTone(Me,13);Wait(18);
PlayTone(Re,13);Wait(18);
PlayTone(Do,13);Wait(18);
PlayTone(Re,30);Wait(40);
Wait(20);
}
}
#define d_ 440
#define re_ 494
#define me_ 523
#define d_ 440 //音程を定義
#define re_ 494
#define me_ 523
#define fa_ 587
#define so_ 659
#define ra_ 698
#define si_ 784
#define dd 880
#define ree 988
task play_music2()
{
while(true)
while(true) //スターウォーズ演奏
{
PlayTone(d_,20);Wait(25);
PlayTone(so_,20);Wait(25);
PlayTone(fa_,10);Wait(15);
PlayTone(me_,10);Wait(15);
PlayTone(re_,10);Wait(15);
PlayTone(dd,20);Wait(25);
PlayTone(so_,20);Wait(25);
PlayTone(fa_,10);Wait(20);
PlayTone(me_,10);Wait(20);
PlayTone(re_,10);Wait(20);
PlayTone(dd,20);Wait(25);
PlayTone(so_,20);Wait(25);
PlayTone(fa_,10);Wait(15);
PlayTone(mi_,10);Wait(15);
PlayTone(fa_,10);Wait(15);
PlayTone(ree,25);Wait(30);
Wait(20);
}
}
#define TURN_TIME 400
ここまでは音楽のプログラム。↑
次は機械を動かすためのプログラム。↓
#define TURN_TIME 150
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
int light_max=0;
int time_max=0;
ClearTimer(0);
OnFwd(OUT_A); OnRev(OUT_C);
while (FastTimer(0)< TURN_TIME)
SetSensor(SENSOR_1,SENSOR_LIGHT);
int time_max; //時間を変数と定義
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)< TURN_TIME) //タイマーが回っている間
{
OnFwd(OUT_A);OnRev(OUT_C);
start play_music1;
light_max=SENSOR_1;
if (SENSOR_1> light_max)
start play_music1; //音楽1スタート
OnFwd(OUT_B); //センサーがついてるモーター回転
if(FastTimer(0)<TURN_TIME) //もし光源を見つけたら
{
light_max=SENSOR_1;
time_max=FastTimer(0);
ClearTimer(1); //タイマー1をリセット
}
}
OnRev(OUT_A);OnFwd(OUT_C);
Wait(TURN_TIME - time_max);
OnFwd(OUT_A);
}
}
OnRev(OUT_B);Wait(150); //モーターを逆回転
Off(OUT_B); //センサーを止める
OnFwd(OUT_A);OnRev(OUT_C); //タイヤを光源に向かせる
Wait(FastTimer(1));
OnFwd(OUT_C); //光源に向かって前進
stop play_music1; //音楽1ストップ
while(true)
{
start play_music2; //音楽2スタート
if(SENSOR_1<50) //もしセンサーが光源を見失ったら
{
Off(OUT_A+OUT_C); //前進ストップ
ClearTimer(2); //タイマ−2をリセット
ClearTimer(3); //タイマ−3をリセット
OnFwd(OUT_B); //モーターを回転し光源捜索
if(fastTimer(3)==150); //1.5秒過ぎたら
{
Onrev(OUT_B);Wait(150); //センサーを戻して
Off(OUT_B); //探索を止める
}
until(SENSOR_1>=50); //光源を見つけたら
OnRev(OUT_B);Wait(FastTimer(2)); //見つかったらモーター逆回転して止まる
Off(OUT_B);
OnFwd(OUT_A);OnRev(OUT_C);Wait(FastTimer(2)); //光源を向く
OnFwd(OUT_C);
}
else //他は
{
OnFwd(OUT_A+OUT_C); //光源に向かって直進
}
}
}
*感想 [#q20453a1]
プログラムが複雑で作るのが大変だったけどなんとかできてよかった。次はいよいよロボコンに向けたロボット、プログラム作りなのでがんばっていきたいです。
プログラムやホームページに関するコメントお願いします。
-センサを回転する機構の写真があればぜひ掲載してください。 -- [[松本(教員)]] &new{2007-01-09 (火) 13:57:08};
-プログラムのコメントをきちんとつけてください。 -- [[まいける(TA)]] &new{2007-01-12 (金) 07:33:15};
-[[前回の授業で撮った写真をアップ:http://yakushi.shinshu-u.ac.jp/robotics-photo/2006b/]]しましたので、是非使ってください。 -- [[松本(教員)]] &new{2007-01-17 (水) 16:21:52};
-ソースが比較的読みやすくて良いですね。コメントは、ちゃんと // 〜 の形で書いて下さいね。(コピー&ペーストでコンパイルできるように) -- [[ゆき(TA)]] &new{2007-01-23 (火) 12:52:16};
-「センサーだけを回転させるように作りました。これにより機体全体を動かすよりも時間が短縮でき、すぐ次の動作に移ることができるようにしました。」について、もう少し詳しい動作の解説や、プログラムの解説が欲しいですね。 -- [[まいける(TA)]] &new{2007-01-26 (金) 13:44:26};
-プログラムを見ると、SENSOR_1>=50となるまで回転を続けるようですが、どの角度でもSENSOR_1<50となった場合(光源がなくなった場合など)、ケーブルがどんどんよじれてしまうのではないでしょうか。また、光源を見つける事ができても、長時間動かしていると、毎回すこしずつケーブルがよじれてしまうため、いつか人間がよじれを戻してやる必要があるのではないでしょうか。センサーを回転させるというアイデアはすばらしいです。 -- [[ゆき(TA)]] &new{2007-02-02 (金) 12:50:10};
#comment