制作者:水
いきなりプログラムの完成品を製作しようとしたけれど、光を探すことも、追いかけることも何もわからなかったので、プログラムをパーツごとに分解して製作を進めることにしました。
パーツ1:光を追いかけるプログラム
パーツ2:旋回しながら光を探すプログラム
パーツ3:曲を流すプログラム
光を追いかけるプログラム パーツに分けて考えたといっても、説明を聞いただけではどうすればいいかわからなかったので、過去の先輩たちのプログラムを参考にしようと思い見てみましたが、ほとんどわかりませんでした。 結局、タイマーなどよくわからないものは使わずにライントレースと同じ要領で製作することにしました。
#define L OUT_A #define R OUT_C//今まで何度もOUT_AやOUT_Cと書いていたので省略しました("L"eft,"R"ightの略) #define tL OnFwd(R);Off(L); //左旋回("t"urn "L"eftの略) #define tR OnFwd(L);Off(R); //右旋回 ("t"urn "R"ightの略) #define gs OnFwd(L+R); //直進 ("g"o "s"traightの略) #define off Off(L+R);Wait(1); //0.01秒停止 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー1と3をライトセンサーとします while(true) { gs if(SENSOR_1>40) //センサ−1の光が40以上のとき {while(SENSOR_1>40) {tL off}} //センサ−1の光が40以上であり続ける限り左に旋回する if(SENSOR_3>40) //センサー3の光が40以上のとき {while(SENSOR_3>40 ) {tR off}} //センサ−3の光が40以上であり続ける限り右に旋回する } }
ここでも難しいことは考えずに回転して光があったら直進するだけのプログラムを作りました。
#define L OUT_A #define R OUT_C #define t OnFwd(L);OnRev(R); //回転する("t"urnの略) ほかは上記同様 #define gs OnFwd(L+R); #define off Off(L+R);Wait(1); task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−1と3は光センサー t until ((SENSOR_1>40)||(SENSOR_3>40)); //センサ−1かセンサ−3が40以上になると次に進む off gs }
残念ながら自分は音楽のことは何も(ほんとに何も)わからないので仲間に頼みました。
仲間というのは、ぼくつねのことですよ。
#define Do 523 //使う音階をはじめに定義 #define Re 587 #define Mi 659 #define Fa 698 #define So 784 #define Ra 880 #define Si 988 #define Doh 1047 #define Reh 1175 task play_music() // 音楽を演奏するタスク { while (true) { /* HOTARU no HIKARI */ PlayTone(Do,65); Wait(70); // スコットランド民謡の『蛍の光』です。 PlayTone(Fa,55); Wait(60); // ♪〜蛍の光〜窓の雪〜♪ PlayTone(Fa,35); Wait(40); PlayTone(Fa,40); Wait(48); PlayTone(Ra,50); Wait(55); PlayTone(So,55); Wait(57); PlayTone(Fa,35); Wait(40); PlayTone(So,40); Wait(50); PlayTone(Ra,45); Wait(50); PlayTone(Fa,40); Wait(45); PlayTone(Fa,40); Wait(45); PlayTone(Ra,55); Wait(60); PlayTone(Doh,40); Wait(45); PlayTone(Reh,55); Wait(60); Wait(20); } }
#define Do 523 // #define Re 587 // #define Mi 659 // #define Fa 698 // #define So 784 // #define Ra 880 // #define Si 988 // #define Doh 1047 // #define Reh 1175 // task play_music() { while (true) { PlayTone(Do,65); Wait(70); PlayTone(Fa,55); Wait(60); PlayTone(Fa,35); Wait(40); PlayTone(Fa,40); Wait(48); PlayTone(Ra,50); Wait(55); PlayTone(So,55); Wait(57); PlayTone(Fa,35); Wait(40); PlayTone(So,40); Wait(50); PlayTone(Ra,45); Wait(50); PlayTone(Fa,40); Wait(45); PlayTone(Fa,40); Wait(45); PlayTone(Ra,55); Wait(60); PlayTone(Doh,40); Wait(45); PlayTone(Reh,55); Wait(60); Wait(20); } } #define L OUT_A #define R OUT_C //今まで何度もOUT_AやOUT_Cと書いていたので省略しました("L"eft,"R"ightの略) #define t OnFwd(L);OnRev(R); //回転する("t"urnの略) #define tL OnFwd(R);Off(L); //左旋回("t"urn "L"eftの略) #define tR OnFwd(L);Off(R); //右旋回 ("t"urn "R"ightの略) #define gs OnFwd(L+R); //直進 ("g"o "s"traightの略) #define off Off(L+R);Wait(1); //0.01秒停止 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−1と3は光センサー start play_music; // 演奏を開始 t until ((SENSOR_1>40)||(SENSOR_3>40)); //センサ−1かセンサ−3が40以上になると次に進む off stop play_music ; // 演奏を停止 while(true) { gs if(SENSOR_1>40) //センサ−1の光が40以上のとき {while(SENSOR_1>40) {tL off}} //センサ−1の光が40以上であり続ける限り左に旋回する if(SENSOR_3>40) //センサー3の光が40以上のとき {while(SENSOR_3>40 ) {tR off}} //センサ−3の光が40以上であり続ける限り右に旋回する if((SENSOR_1<40)&&(SENSOR_3<40)) //センサ−1と3の光が40以下のとき { start play_music ; // 演奏を開始 t until ((SENSOR_1>40)||(SENSOR_3>40)); //センサ−1かセンサ−3が40以上になると次に進む off stop play_music ; // 演奏を停止 } } }
一応完成ということになっているが、実際に動かしてみると光がセンサ−1と3の間に入ったときには光がないとみなし停止して回転し始めてしまうので、光を追っている時よりも回転して光を探すことの方が多くなってしまった。これを改善するにはセンサーをもう一つつけるか、センサーの角度を変えるかだけど、前者はセンサーが2つしかないために無理で、角度を変えるにも角度を変えることができるように作っていなかったのですぐには不可能となってしまった。プログラムを改良するという選択肢も残っているが、今現在の自分ではおそらく不可能で、今現在でも改良しきれずに問題点を残したままになってしまった。 時間があったら本体のセンサーの部分を改良したかった。
◎音楽について 譜面を見る知識があったら、より素晴らしい音色をプログラムできたかもしれないが、結局自分の音感に頼って、適当に時間を合わせて作成した。 ゲーム音楽(少し昔の電子音バリバリのやつ)もこんな感じでプログラミングされているのかな?と少し予想がついた。結論として、音楽における課題としては、プログラミングスキルよりむしろ、音楽一般に関する知識を身につけることである。
前作にセンサーが回転するというものを付け加えたもの
#define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define So 784 #define Ra 880 #define Si 988 #define Doh 1047 #define Reh 1175 task play_music() { while (true) { PlayTone(Do,65); Wait(70); PlayTone(Fa,55); Wait(60); PlayTone(Fa,35); Wait(40); PlayTone(Fa,40); Wait(48); PlayTone(Ra,50); Wait(55); PlayTone(So,55); Wait(57); PlayTone(Fa,35); Wait(40); PlayTone(So,40); Wait(50); PlayTone(Ra,45); Wait(50); PlayTone(Fa,40); Wait(45); PlayTone(Fa,40); Wait(45); PlayTone(Ra,55); Wait(60); PlayTone(Doh,40); Wait(45); PlayTone(Reh,55); Wait(60); Wait(20); } } (仮)と変わったところ #define C OUT_B //(仮)と同様OUT_BをCに略しました(centerの略) task sensor1() //タスク『センサーが左回転する』 { SetPower(C,7); //Cの速度を遅くする while(true) //永遠に繰り返し { OnFwd(C); Wait(40); //センサーを左に向かせる OnRev(C); Wait(80); //センサーを右に向かせる OnFwd(C); Wait(40); //センサーをはじめの位置に戻す Off(C); Wait(1); } } task sensor2() //タスク 『センサーが右回転する』 { SetPower(C,7); //Cの速度を遅くする while(true) //永遠に繰り返し { OnRev(C); //センサーを右に向かせる Wait(40); OnFwd(C); //センサーを左に向かせる Wait(80); OnRev(C); //センサーをはじめの位置に戻す Wait(40); Off(C); Wait(1); } } #define L OUT_A #define R OUT_C #define t OnFwd(L);OnRev(R); #define tL OnFwd(R);Off(L); #define tR OnFwd(L);Off(R); #define gs OnFwd(L+R); #define off Off(L+R);Wait(1); #define ss1 start sensor1; //タスク『センサー左回転』を起動("S"tart "S"ensor "1"の略) #define ts1 stop sensor1; //タスク『センサー左回転』を停止(s"T"op "S"ensor "1"の略) #define ss2 start sensor2; //タスク『センサー右回転』を起動("S"tart "S"ensor "1"の略) #define ts2 stop sensor2; //タスク『センサー右回転』を停止(s"T"op "S"ensor "1"の略) #define sp start play_music; //音楽開始 ("S"tart "P"lay_musicの略) #define tp stop play_music; //音楽停止(s"T"op "P"lay_musicの略) task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(L+R,7); sp //音楽を開始する t until ((SENSOR_1>40)||(SENSOR_3>40)); off tp //音楽を停止する while(true) { gs if(SENSOR_1>40) { while(SENSOR_1>40 ) { ss1 //タスク『センサー左回転』を起動 tL off ts1 //タスク『センサー左回転』を停止 } } if(SENSOR_3>40) { while(SENSOR_3>40 ) { ss2 //タスク『センサー右回転』を起動 tR off ts2 //タスク『センサー右回転』を停止 } } if((SENSOR_1>40)&&(SENSOR_3>40)) //センサ−1と3が光に当たっているとき { while((SENSOR_1>40)&&(SENSOR_3>40)) //1と3が光に当たっている限り続ける { gs //直進 } } if((SENSOR_1<40)&&(SENSOR_3<40)) { Off(S); sp t until ((SENSOR_1>40)||(SENSOR_3>40)); off tp } } }
基本的には前作と同じため課題点も前作とほぼ同じ。ただし、センサーが動くという作業が加わったため、それに対する課題が出てきてしまった。例えば、センサーが完全に左を向いているときに光を見失ってしまった場合、センサーが左向きに固定されてしまうため、光が探しにくくなり、探し当てたとしても今度は正面が初期位置ではなく、左向きが初期位置のため、左向きを中心にセンサーが動いてしまい、下手をするとセンサーのコードが絡まりセンサーが動かなくなってしまうということです。 プログラム自体の問題点ではなく、プログラムを読むときの問題点として、命令を省略しすぎてしまったため、読む時に読みにくくなってしまいました。
上記のものは読みにくかったので多少読みやすくしたものをのせました。
#define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define So 784 #define Ra 880 #define Si 988 #define Doh 1047 #define Reh 1175 task play_music() { while (true) { PlayTone(Do,65); Wait(70); PlayTone(Fa,55); Wait(60); PlayTone(Fa,35); Wait(40); PlayTone(Fa,40); Wait(48); PlayTone(Ra,50); Wait(55); PlayTone(So,55); Wait(57); PlayTone(Fa,35); Wait(40); PlayTone(So,40); Wait(50); PlayTone(Ra,45); Wait(50); PlayTone(Fa,40); Wait(45); PlayTone(Fa,40); Wait(45); PlayTone(Ra,55); Wait(60); PlayTone(Doh,40); Wait(45); PlayTone(Reh,55); Wait(60); Wait(20); } } (仮)と変わったところ task sensor1() //タスク『センサーが左回転する』 { SetPower(OUT_B,7); //モーターBの速度を遅くする while(true) //永遠に繰り返し { OnFwd(OUT_B); Wait(40); //センサーを左に向かせる OnRev(OUT_B); Wait(80); //センサーを右に向かせる OnFwd(OUT_B); Wait(40); //センサーをはじめの位置に戻す Off(OUT_B); Wait(1); } } task sensor2() //タスク 『センサーが右回転する』 { SetPower(OUT_B,7); //モーターBの速度を遅くする while(true) //永遠に繰り返し { OnRev(OUT_B); //センサーを右に向かせる Wait(40); OnFwd(OUT_B); //センサーを左に向かせる Wait(80); OnRev(OUT_B); //センサーをはじめの位置に戻す Wait(40); Off(OUT_B); Wait(1); } } #define turn OnFwd(OUT_A);OnRev(OUT_C); #define turn Left OnFwd(OUT_C);Off(OUT_A); #define turn Right OnFwd(OUT_A);Off(OUT_C); #define go straight OnFwd(OUT_A+OUT_C); #define off Off(OUT_A+OUT_C);Wait(1); task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A+OUT_C,7); //モーターAとCの速度を遅くする start play_music //音楽を開始する turn until ((SENSOR_1>40)||(SENSOR_3>40)); off stop play_music //音楽を停止する while(true) { go straight if(SENSOR_1>40) { while(SENSOR_1>40 ) { start sensor1 //タスク『センサー左回転』を起動 turn Left off stop sensor1 //タスク『センサー左回転』を停止 } } if(SENSOR_3>40) { while(SENSOR_3>40 ) { sstart sensor2 //タスク『センサー右回転』を起動 turn Right off stop sensor2 //タスク『センサー右回転』を停止 } } if((SENSOR_1>40)&&(SENSOR_3>40)) //センサ−1と3が光に当たっているとき { while((SENSOR_1>40)&&(SENSOR_3>40)) //1と3が光に当たっている限り続ける { go straight } } if((SENSOR_1<40)&&(SENSOR_3<40)) { Off(S); start play_music turn until ((SENSOR_1>40)||(SENSOR_3>40)); off stop play_music } } }