*目次 [#sbce686f] #contents *1,トレースマシンとは? [#caccecd9] トレースマシンとは、光センサーを使うことにより、外部の明るさを感知し、黒線の上を動くことのできるロボット。前回の書道ロボットでは初めからプログラミングされている動作を実行するのに対し、今回のトレースマシンは、外部からの明るさという情報によって動きが変わる。 **光センサー [#u5fe34ab] #ref(./hikari!.jpg,100%,ok) *2,コース [#q6cd109e] #ref(./コース.jpg,100%,course) *3,コースの攻略ポイント [#cf23e64f] -カーブ -交差点 -衝突時 -音楽 **カーブ [#m9f320a2] #ref(./cabu.jpg,100%,cabu) 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) 今回最大の課題であろう交差点。初めはセンサーがともに黒を感知したときにタイマーを作動させ一時停止を可能にしようと思った。しかし、コースを横断するときにもセンサーがともに黒を感じてしまうので、この考えは失敗に終わった。そこで、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(./arm.JPG,75%,arm) if(SENSOR_2==1) //タッチセンサーが感知したとき { Off(MOTOR);Wait(300); //モーターが止まり3秒待つ OnFwd(MOTOR); //その後直進する } **音楽 [#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のファンファーレを流したかった。 *4,全体プログラム [#p8026d1b] これまでの、カーブ、交差点、衝突を組み合わせると・・・ #define THRESHOLD 40 #define MOTOR OUT_A+OUT_C task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); while(true) { if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) { OnFwd(OUT_A); Off(OUT_C); } if((SENSOR_3>THRESHOLD)&&(SENSOR_1<THRESHOLD)) { OnFwd(OUT_C); Off(OUT_A); } if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) { Off(MOTOR);Wait(100); OnFwd(MOTOR);Wait(150); } if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) { OnFwd(MOTOR); } if(SENSOR_2==1) { Off(MOTOR);Wait(300); OnFwd(MOTOR); } } } *5,工夫点 [#nb5a6eb5] -光センサーをどの位置につけるか。黒線を挟むように作るか、黒線の上を通るように作るかで悩んだ。結論としては、写真を見て分かるように、黒線を挟むようにつけた。理由としては、黒線の太さは2cmで、はみ出た瞬間に曲がるプログラムを組むため、あまりにも小刻みな動きをしてしまうため。黒線を挟むことで、多少ぎざぎざな動きになるものの、直進とあまり変わらない速度で動くことが可能になった。 -タッチセンサーをどこにつけるか。前か後ろか。それぞれにメリット、デメリットがある。前につけると、重さが前に偏ってしまう。後ろにつけると、読み取る位置が後ろになってしまい、黒線上を動く時に、不思議な感じになってしまう。もしくはタイヤを逆回転させなければならない。これを決めた、最大の理由は、前につけるとカブトムシに見える! -やはり交差点。『 Wait()の間は他の指令が有効でない 』と、いうことを使ったことにある。 *6,感想 [#jd2c2c85] -今回は、前回のプログラミングとは異なり、細かい微調整がいらず面倒なことはあまりなかった。しかし、until()の使い方をしっかり理解していなかったために、途中混乱することもあったが、until()if()の違いがわかってからはあっという間にプログラムが仕上がり、心折れることなく、最後まで完成させることができた。 -また、授業のはじめの段階で習ったWait()の本当の意義について明確に理解でき、新めて今までしてきたプログラムの理解にも繋がったと思う。今後の課題にもWait()の性質を生かしていきたいと思う。 -アドバイス等お願いします! -- [[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