クーロン茶、tako(ru-)、おかじ
今回のプログラムは何かと回転したりしてよく動き回り、さらに正確に光を探すことが求められます。そこで土台に安定した動きをするキャタピラを採用しました!!!上の写真は製造過程の物です。今からいろいろといじくります。
そして見事にいじくったロボットが上の写真です。前にセンサーがついていますが、実はうしろにもついてます!しっぽみたいなのがそうです。頭のプロペラ?は一応動く様にしましたが、プログラムに組み込むと容量がでかくなるので今回は組み込んでありません。ちなみに動かしたときにはタケ●コプターのごとく激しくうごきました。
課題編〜 光を探している時だけチャルメラの音楽を鳴らすプログラムです。
1、これがチャルメラの音楽ベースです。
#define Sol 784 //ソの音階 #define Ra 880 //ラの音階 #define Si 988 //シの音階 void play_music() //VOIDのプログラム(チャルメラ)です。 { PlayTone(Sol,20);Wait(25); //ソを演奏 PlayTone(Ra,20);Wait(25); //ラを演奏 PlayTone(Si,60);Wait(65); //シを演奏 PlayTone(Ra,20);Wait(25); //ラを演奏 PlayTone(Sol,15);Wait(30); //ソを演奏 PlayTone(Sol,15);Wait(20); //ソを演奏 PlayTone(Ra,15);Wait(20); //ラを演奏 PlayTone(Si,15);Wait(20); //シを演奏 PlayTone(Ra,15);Wait(20); //ラを演奏 PlayTone(Sol,15);Wait(20); //ソを演奏 PlayTone(Ra,60);Wait(65); //ラを演奏 }
2、そしてこれが完成形!課題1のプログラムです。
#define Sol 784 //ソの音階 #define Ra 880 //ラの音階 #define Si 988 //シの音階 void play_music() { PlayTone(Sol,20);Wait(25); //ソを演奏 PlayTone(Ra,20);Wait(25); //ラを演奏 PlayTone(Si,60);Wait(65); //シの音階 PlayTone(Ra,20);Wait(25); //ラを演奏 PlayTone(Sol,15);Wait(30); //ソを演奏 PlayTone(Sol,15);Wait(20); //ソを演奏 PlayTone(Ra,15);Wait(20); //ラを演奏 PlayTone(Si,15);Wait(20); //シの音階 PlayTone(Ra,15);Wait(20); //ラを演奏 PlayTone(Sol,15);Wait(20); //ソを演奏 PlayTone(Ra,60);Wait(65); //ラを演奏 } task main() //メインタスク { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1がライトセンサーであると宣言 while(true) //以下を無限ループ { if (SENSOR_1>=50){ //閾値が50以上の時 OnFwd(OUT_A+OUT_C); //前に進む }if (SENSOR_1<50){ //閾値が50未満の時 OnFwd(OUT_A); //モーターA前進 OnRev(OUT_C); //モーターC後退 {play_music();} //チャルメラ演奏 } } }
次は課題2、『光を探している時に音楽をならし、光を見つけたら別の音楽を鳴らしながら進むプログラム』です。製作tako,音楽おかじ(小フーガト単調)、tako(ru-)(チャルメラ)
#define Lre 400 #define Hsi 988 define GO OnFwd(OUT_A+OUT_C);Wait(300); #define TRUN OnFwd(OUT_A);OnRev(OUT_C);Wait(152); #define Do 523 #define Do2 554 #define Re 587 #define Re2 622 #define Mi 659 #define Fa 698 #define Fa2 740 #define So 784 #define So2 831 #define Ra 880 #define Ra2 932 #define Si 950 #define Do1 1047 #define Re1 1175 void play_music() //ベートーベン(運命)より最初の部分 { PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Lre,60);Wait(100); PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Lre,60);Wait(100); PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Do,20);Wait(50); PlayTone(Hsi,40);Wait(100); } void clasic_music() //小フーガト単調より第一楽章 { { PlayTone(So,55); Wait(60); PlayTone(Re1,55); Wait(60); PlayTone(Si,75); Wait(80); PlayTone(Ra,45); Wait(50); PlayTone(So,35); Wait(40); PlayTone(Si,35); Wait(40); PlayTone(Ra,35); Wait(40); PlayTone(So,35); Wait(40); PlayTone(Fa2,35); Wait(40); PlayTone(Ra,35); Wait(40); PlayTone(Re,55); Wait(60); PlayTone(So,40); Wait(45); PlayTone(Re,40); Wait(45); PlayTone(Ra,40); Wait(45); PlayTone(Re,40); Wait(45); PlayTone(Si,45); Wait(50); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,35); Wait(40); PlayTone(Re,52); Wait(57); PlayTone(So,50); Wait(55); PlayTone(Re,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,45); Wait(50); PlayTone(Re,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(Si,45); Wait(50); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,40); Wait(45); PlayTone(Re,28); Wait(33); PlayTone(Re1,28); Wait(33); PlayTone(Do1,28); Wait(33); PlayTone(Si,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Si,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Fa2,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,43); Wait(48); Wait(50); } } task main() //メインタスク { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1がライトセンサーであると宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3がライトセンサーであると宣言 while(true) //以下無限ループ { if(SENSOR_1>=50){ //閾値が50以上の時 OnFwd(OUT_A+OUT_C); //前進 {clasic_music();} //小フーガト短調を演奏 } if (SENSOR_1<50){ //閾値が50未満の時 {play_music();} //ベートーベンを演奏 GO; //前に進む TRUN; //90度回転 GO; //前に進む TRUN; //90度回転 GO; //前に進む TRUN; //90度回転 GO; //前に進む TRUN; //90度回転 } } }
1、足回り。タイヤだと回転するスピードが早く、光を追いかけにくくなるので、スピードが落ち着いていて、かつ小回りが効くキャタピラを使用した。
2、ロボットの車体は安定性を重視して、マニュアルどおりの車体を採用。
3、プログラムに関して、音楽とメインタスクとを混合する所が何度試してもうまくいかず音楽が流れなかった。そこで過去の先輩達のプログラムを見ていた所、一昨年のプログラムに、VOIDなるものを発見しました。これは使えると思いすぐに実践したところ、演奏に成功しました。先輩達に感謝しています。
4、 光を探す際に、ただ回るだけでは面白みがないので、正方形に探し、そのあとに回転しながら探す様にしました。
1、小フーガの音階。一見簡単そうに見えますが、音階を合わせるのはかなり難しかった。これが1番苦労した。
2、プログラムにVOIDを使いました。これが一番スムーズに起動しました。
3、写真をみてもわかるように、前後にライトセンサーを装着しました。そうすることで死角をすくなくしました。
1、今回VOIDを使うことで音楽とサーチライトを複合することに成功しました。しかしほんとうならLIGHTMAXを使いたかったのですが、なぜかプログラムに組み込むと音楽が流れず、しかも光を感知せずグルグル回るだけになってしまいました。私達にもう少し技術があればもっと質のよいプラグラムが作れたと思います。我らなが 情けないです。m(==)m
2、小フーガに関してですが、本当なら光を探す音楽を第2楽章にしたかったのですが、容量が重いせいか光の感知が鈍くなり、うまく反応してくれなくなってしまいました。どうにかしてほかの容量をうまく削って第2楽章をいれたかったのですが、期限に間に合いませんでした。すいません。
3、ここまで作っといてなんですが、このプログラムでは光に反応し動くことは動くのですが、急激な方向転換を行う場合、光を追うことができません。それにvoidは関数なので行動と音楽を平行して行うことができませんでした。そこで.... このプログラムをベースに新たにプログラムを作成しました。今度は大丈夫です。
1、課題1のプログラム(その1) 『製作者』tako
#define Sol 784 #define Ra 880 #define Si 988
task play_music() //チャルメラのテーマ演奏プログラム { PlayTone(Sol,20);Wait(25); PlayTone(Ra,20);Wait(25); PlayTone(Si,60);Wait(65); PlayTone(Ra,20);Wait(25); PlayTone(Sol,15);Wait(30); PlayTone(Sol,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Si,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Ra,60);Wait(65); } task main() //メインタスク { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1がライトセンサーであると定義 while(true) //以下無限ループ { if (SENSOR_1>=50){ //光センサーが閾値50以上の時 OnFwd(OUT_A); //モーターA前進 Wait(50); //0,5秒起動 Off(OUT_A); //モーターA停止 OnFwd(OUT_C); //モーターC前進 Wait(50); //0,5秒起動 Off(OUT_C); //モーターC停止 }else{ //閾値が50未満の時 start play_music; //チャルメラのテーマ演奏 OnFwd(OUT_A); //モーターA前進 Wait(200); //2秒起動 Off(OUT_A); //モーターA停止 OnFwd(OUT_C); //モーターC前進 Wait(100); //1秒起動 Off(OUT_C); //モーターC停止 stop play_music; //チャルメラのテーマ演奏停止 } } }
課題1のプログラム(その2) 『制作者』 クーロン茶
#define Sol 784 #define Ra 880 #define Si 988 task play_music() { while(1) { PlayTone(Sol,20);Wait(25); PlayTone(Ra,20);Wait(25); PlayTone(Si,60);Wait(65); PlayTone(Ra,20);Wait(25); PlayTone(Sol,15);Wait(30);Wait(10); PlayTone(Sol,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Si,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Ra,60);Wait(65); Wait(10); } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); while(1){ if (SENSOR_1>=50){ OnFwd(OUT_A+OUT_C); }if(SENSOR_1<50){ start play_music ; OnFwd(OUT_A); OnRev(OUT_C); until(SENSOR_1>=50); stop play_music ; } } }
2、課題2のプログラム 『制作者』クーロン茶
#define Lre 400 #define Hsi 988 #define Do 523 #define Do2 554 #define Re 587 #define Re2 622 #define Mi 659 #define Fa 698 #define Fa2 740 #define So 784 #define So2 831 #define Ra 880 #define Ra2 932 #define Si 950 #define Do1 1047 #define Re1 1175 #define Sol 784 task play_music() { while(1){ PlayTone(Sol,20);Wait(25); PlayTone(Ra,20);Wait(25); PlayTone(Si,60);Wait(65); PlayTone(Ra,20);Wait(25); PlayTone(Sol,15);Wait(30);Wait(10); PlayTone(Sol,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Si,15);Wait(20); PlayTone(Ra,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Ra,60);Wait(65); Wait(10); } } task clasic_music() { while(1){ PlayTone(So,55); Wait(60); PlayTone(Re1,55); Wait(60); PlayTone(Si,75); Wait(80); PlayTone(Ra,45); Wait(50); PlayTone(So,35); Wait(40); PlayTone(Si,35); Wait(40); PlayTone(Ra,35); Wait(40); PlayTone(So,35); Wait(40); PlayTone(Fa2,35); Wait(40); PlayTone(Ra,35); Wait(40); PlayTone(Re,55); Wait(60); PlayTone(So,40); Wait(45); PlayTone(Re,40); Wait(45); PlayTone(Ra,40); Wait(45); PlayTone(Re,40); Wait(45); PlayTone(Si,45); Wait(50); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,35); Wait(40); PlayTone(Re,52); Wait(57); PlayTone(So,50); Wait(55); PlayTone(Re,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,45); Wait(50); PlayTone(Re,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(Si,45); Wait(50); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Ra,40); Wait(45); PlayTone(Re,28); Wait(33); PlayTone(Re1,28); Wait(33); PlayTone(Do1,28); Wait(33); PlayTone(Si,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Si,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,28); Wait(33); PlayTone(Fa2,28); Wait(33); PlayTone(Ra,28); Wait(33); PlayTone(So,43); Wait(48); Wait(50); } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); while(true){ if(SENSOR_1>=50){ start play_music; OnFwd(OUT_A+OUT_C); until(SENSOR_1<50); stop play_music ; } if (SENSOR_1<50){ start clasic_music; OnFwd(OUT_A); OnRev(OUT_C); until(SENSOR_1>=50); stop clasic_music ; } } }
*ロボットもシンプルに製作し直しました。
そうした方が重さが軽いせいか、動きに機敏性が出てきました。 シンプルって美しい!!!
1,今度こそ本当に光を追うプログラムが完成しました。光を追う際に、従来のただまっすぐに直進ではなくて、短いタイムスパンで小刻みにジグザグ前進することで、光を機敏かつ、早く追えるようにしました。
2,光を見失った際も、従来のその場回転を、2つのモーターの起動時間を変えてやることで、ジグザグに回転します。つまり回転スピードが緩やかになり、そうすることでだだ回転するだけでは回転スピードが早すぎて反応できなかった光に反応することができ、質のいい動きを作ることができました。最初の失敗があってこそ、いまのプログラムができたので、まんざら最初のプログラムもばかにできませんでした。
1,光を探す際に質量を軽くしたせいか、予想以上に回転早くなり、微妙な光加減を追うことができなくなってしまいました。この問題を解決するためにプログラムにいろいろ試した事が苦労しました。最終的にジグザグ回転で少しずつ回転することで、回転スピードがゆっくりになり、うまく光をおうことができました。
2,ロッボトに関して、前までは外装にこだわりユニークなものを製作していましたが、今回は前のプログラムを書き直す際に先生から、もっとシンプルにした方がいいと指摘され、あらゆる手をつくしロボットをよりシンプルに仕上げることに苦労しました。車体を軽くするために、土台の不要な部分など抜き取り全く無駄のないロボットにしました。
1,私たちは課題を勘違いしていて、最初のプログラムを作ってしまいました。先生に言われるまでは全く気づきませんでした。もっと早いうちに気づいていればよかったです。
2,プログラムに関してですが、流れる音楽が切り替わる際に、切り替わった最初の音階が微妙にずれてしまいます。おそらく前の曲の音階が微妙に混ざるせいだと思うのですが。前もって曲のはじめをワンテンポ空けておけば、おそらくはっきりとした音が流れたかとおもいます。曲に力を入れていいものを仕上げただけに、音が濁ったのは残念で仕方がありません。