- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#sbce686f]
#contents
*1,トレースマシンとは? [#caccecd9]
トレースマシンとは、光センサーを使うことにより、外部の明るさを感知し、黒線の上を動くことのできるロボット。前回の書道ロボットでは初めからプログラミングされている動作を実行するのに対し、今回のトレースマシンは、外部からの明るさという情報によって動きが変わる。
トレースマシンとは、光センサーを使うことにより、外部の明るさを感知し、黒線の上を動くことのできるロボット。前回の書道ロボットでは初めからプログラミングされている動作を実行するのに対し、今回のトレースマシンは、外部からの明るさという情報によって動きが変わる。その入ってきた情報をどう認知するかを予測し、プログラミングさせたのがトレースマシンである。
**光センサー [#u5fe34ab]
値40を境とし、白と黒を分ける。40以下なら黒・つまりコース上、40以上なら白・つまりコース外と認知する。
#ref(./hikari!.jpg,100%,ok)
*2,コース [#q6cd109e]
#ref(./course.jpg,100%,course)
初めは写真にもうっすら写っているようにもう少し急なカーブと、交差点が垂直に交わっていないコースでしたが、斜めに交わる交差点が難所だったので少しはなだらかに変えました。
#ref(./コース.jpg,100%,course)
*3,コースの攻略ポイント [#cf23e64f]
-カーブ
-交差点
-衝突時
-音楽
**カーブ [#m9f320a2]
#ref(./cabu.jpg,100%,cabu)
OnFwd(OUT_A)//右に曲がる
Off(OUT_C)
until(SENSOR_1<40)//センサ−1が黒に入るまで
OnFwd(OUT_C)//左に曲がる
Off(OUT_A)
until(SENSOR_3<40)//センサー3が黒に入るまで
これで、黒線の上を走行することが可能になった
if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサー1がコースから外れでセンサ−3が
{ コース上のとき
OnFwd(OUT_A); //右折する
Off(OUT_C);
}
if((SENSOR_3>THRESHOLD)&&(SENSOR_1<THRESHOLD)) //センサー1がコース上でセンサ−3がコース
{ からはずれたとき
OnFwd(OUT_C); //左折する
Off(OUT_A);
}
if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) //センサー1、3ともにコースから外れている
{ とき
OnFwd(MOTOR); //直進する
}
**交差点 [#s811f504]
#ref(./cross.jpg,100%,cross)
OnFwd(OUT_A+OUT_C);
until((SENSOR_1<50)&&(SENSOR_3<50));//両方白のとき直進
OnFwd(OUT_A+OUT_C);
until((SENSOR_1>40)&&(SENSOR_3>40));//両方黒のとき直進
今回最大の課題であろう交差点。初めはセンサーがともに黒を感知したときにタイマーを作動させ一時停止を可能にしようと思った。しかし、コースを横断するときにもセンサーがともに黒を感じてしまうので、この考えは失敗に終わった。そこで、Wait()の間は他の指令が実行されないことを利用し、単純なOff()とOnFwd()で書くことにした。
if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサ−1、3ともに黒を感知したとき
{
Off(MOTOR);Wait(100); //モーターが止まり1秒待つ
OnFwd(MOTOR);Wait(150); //その後1.5秒間直進する
}
**衝突時 [#tb85bcba]
タッチセンサーを使うことにより、衝突したときに、数秒間停止するプログラムを組んだ。
#ref(./yokoarm.jpg,75%,arm)
#ref(./sannrinn2.JPG,75%,ararm)
until(SENSOR_2==1);//衝突したら
OnRev(OUT_A+OUT_C);Wait(100);//1秒後進する
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
**音楽 [#rc78e852]
ゼルダの伝説 時のオカリナ
&size(20){ゼルダの子守唄};
#define Do 523//ド
#define Re 587//レ
#define Mi 659//ミ
#define Fa 698//ファ
#define So 784//ソ
#define Ra 880//ラ
#define Si 988//シ
#define KDo 1047//高音ド
#define KRe 1175//高音レ
#define KMi 1319//高音ミ
#define KSo 1568//高音ソ
#define KRa 1760//高音ラ
task play_music()
{
while(true)
{
PlayTone(Si,75) ; Wait(77);
PlayTone(KRe,45); Wait(47);
PlayTone(Ra,90); Wait(95);
PlayTone(So,15); Wait(17);
PlayTone(Ra,13); Wait(16);
PlayTone(Si,75); Wait(77);
PlayTone(KRe,45); Wait(48);
PlayTone(Ra,90); Wait(115);
PlayTone(Si,70); Wait(77);
PlayTone(KRe,45); Wait(47);
PlayTone(KRa,65); Wait(67);
PlayTone(KSo,39); Wait(42);
PlayTone(KMi,55); Wait(57);
PlayTone(KDo,23); Wait(25);
PlayTone(Si,23); Wait(25);
PlayTone(Ra,70); Wait(75);
Wait(35);
}
}
task main()
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
start play_music ;
OnFwd(OUT_A+OUT_B);
until (SENSOR_1 == 1);
stop play_music ;
Off(OUT_A+OUT_B);
}
わかる人はわかるデス。最後音が合ってないかもしれないと思う。制作者/杉G
本当はFF7のファンファーレを流したかった。
#ref(./arm.JPG,75%,arm)
if(SENSOR_2==1) //タッチセンサーが感知したとき
{
Off(MOTOR);Wait(300); //モーターが止まり3秒待つ
OnFwd(MOTOR); //その後直進する
}
*4,全体プログラム [#p8026d1b]
これまでの、カーブ、交差点、衝突を組み合わせると・・・
#define THRESHOLD 40 //闘値を定義
#define MOTOR OUT_A+OUT_C //MOTORはOUT_A+OUT_Cとおく
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
while(true)
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサーであると定義
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2はタッチセンサーであると定義
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光センサーであると定義
while(true)
{
OnFwd(OUT_A+OUT_C);
until((SENSOR_1>40)&&(SENSOR_3>40));
if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //コースを左にそれてしまったと
{ ときに右折する
OnFwd(OUT_A);
Off(OUT_C);
until(SENSOR_1<40);
}
if((SENSOR_3>THRESHOLD)&&(SENSOR_1<THRESHOLD)) //コースを右にそれてしまったと
{ ときに左折する
OnFwd(OUT_C);
Off(OUT_A);
until(SENSOR_3<40);
OnFwd(OUT_A+OUT_C);
until((SENSOR_1<50)&&(SENSOR_3<50));
until(SENSOR_2==1);
OnRev(OUT_A+OUT_C);Wait(100);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
}
if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //センサー1・3がともに『黒』と
{ 感知したとき1秒止まり、その
Off(MOTOR);Wait(100); 後1.5秒間のみ直進する
OnFwd(MOTOR);Wait(150);
}
if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) //センサー1・3がともに『白』と
{ と感知したとき直進する
OnFwd(MOTOR);
}
if(SENSOR_2==1) //センサー2に『触った』という情
{ 報が伝わってきたとき3秒間止ま
Off(MOTOR);Wait(300); り、その後直進する
OnFwd(MOTOR);
}
}
}
*5,工夫点 [#nb5a6eb5]
-光センサーをどの位置につけるか。黒線を挟むように作るか、黒線の上を通るように作るかで悩んだ。結論としては、写真を見て分かるように、黒線を挟むようにつけた。理由としては、黒線の太さは2cmで、はみ出た瞬間に曲がるプログラムを組むため、あまりにも小刻みな動きをしてしまうため。黒線を挟むことで、多少ぎざぎざな動きになるものの、直進とあまり変わらない速度で動くことが可能になった。
-タッチセンサーをどこにつけるか。前か後ろか。それぞれにメリット、デメリットがある。前につけると、重さが前に偏ってしまう。後ろにつけると、読み取る位置が後ろになってしまい、黒線上を動く時に、不思議な感じになってしまう。もしくはタイヤを逆回転させなければならない。これを決めた、最大の理由は、前につけるとカブトムシに見える!
-やはり交差点。「両方が黒線に入ったら直進させる」と思いついたときは爽快だった。
-やはり交差点。『 Wait()の間は他の指令が有効でない 』と、いうことを使ったことにある。
*6,感想 [#jd2c2c85]
-今回は、前回のプログラミングとは異なり、細かい微調整がいらず面倒なことはあまりなかった(そのぶん、プログラミングにIfやwhileなどがでてくることになったが・・・
)ので、心折れることなく、最後まで完成させることができた。
-感想は乾燥であってはならない。サハラ砂漠ほどの乾燥ならば、それは乾燥をこえて、観想となるだろう。しかし、渋谷のような乾燥であってはならない・・・乾燥・・・乾燥という言葉が生まれるには、潤った場所がなければならない。もしくは、過去に乾燥という状態がなければならない。ということは、おそらく、どこにでも潤っている状態があったはず。そしてすべてが乾燥してしまうはずがない。絶対にどこかにオアシスがあるはずである。乾燥していると一見見える場所にも、そこにオアシスがあるかもしれない。
-今回は、前回のプログラミングとは異なり、細かい微調整がいらず面倒なことはあまりなかった。しかし、until()の使い方をしっかり理解していなかったために、途中混乱することもあったが、until()if()の違いがわかってからはあっという間にプログラムが仕上がり、心折れることなく、最後まで完成させることができた。
-また、授業のはじめの段階で習ったWait()の本当の意義について明確に理解でき、新めて今までしてきたプログラムの理解にも繋がったと思う。今後の課題にもWait()の性質を生かしていきたいと思う。
-また、プログラミングをしていて『〜なとき』という条件を頻繁に打ったと思います。前回との大きな違いである『入ってきた情報で動く』という課題の特性を大いに感じました。
-発表のときは交差点の優先道路ではないときに、一時停止しなければならないということを忘れてプログラムを作ってしまいました。今度はそれを踏まえて作り直しました。
今日、温泉に行った。外人がいる。シャンプー忘れたみたいだ・・・どうぞ・・・
僕もオアシスになれるかな・・・
-DIVE INじゃないですか
-アドバイス等お願いします! -- [[10L]] &new{2007-06-20 (水) 09:49:58};
-個々のプログラムの解説と、全体のプログラムとの関係がよくわからない?のですが。 -- [[まいける(TA)]] &new{2007-06-21 (木) 10:29:00};
-図示しているのは良いが、全体としてのまとまりをもう少し持たせると良いのでは。 -- [[ヒロヤ]] &new{2007-06-21 (木) 13:39:21};
-音楽を演奏するプログラムをウェブ上に掲載する際には、著作権に関して十分注意してください。その曲の著作権者の了承を得るか、自分で作曲した曲や著作権の切れた曲を使用しましょう。 そもそもこの課題は音楽を演奏するプログラムを作成することではありません。-- [[松本]] &new{2007-06-25 (月) 17:50:20};
-採点する人の立場になってレポートを作成しましょう。ひとつひとつの文をよく吟味してください。例えば感想の後半の文章は何を伝えたいのかよくわかりません。 -- [[松本]] &new{2007-06-25 (月) 17:59:31};
#comment