こんにちは。
お久しぶりです。
本日はスイッチで音階を鳴らせるようにしました。
ただROBOMECHに持って行っていた私のPi:Co Classic2が午前中帰ってきていなかったため、青木のPi:Co Classic2で行いました。
音はそれぞれ周波数が違います。
以下例になります。
440 ラ
466 ラ♯
493 シ
523 ド
554 ド♯
587 レ
622 レ♯
659 ミ
698 ファ
739 ファ♯
783 ソ
830 ソ♯
880 ラ
923 ラ♯
987 シ
まずStep 4のサンプルプログラムをコンパイル、インストールしドレミの音がでることを確認しました。
次に音階を増やすようにプログラムを書き換えます。
完成したのが以下のものです↓
#define FREQ_C 523 //ドの周波数 #define FREQ_D 587 //レの周波数 #define FREQ_E 659 //ミの周波数 #define FREQ_F 698 //ファの周波数 #define FREQ_G 783 //ソの周波数 #define FREQ_H 880 //ラの周波数 #define FREQ_I 987 //シの周波数 #define FREQ_J 1046 //ドの周波数 #define FREQ_K 1174 //レの周波数 #define FREQ_L 1318 //ミの周波数 #define FREQ_M 1396 //ファの周波数 #define FREQ_N 1566 //ソの周波数 #define FREQ_O 1760 //ラの周波数 #define FREQ_P 1974 //シの周波数 #define FREQ_Q 2092 //ドの周波数 void exec_by_mode(int mode) //モード番号に従って実行する { switch(mode) { case 1: SET_BUZZER_FREQ(FREQ_C); //ブザーの周波数をドに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ドの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる case 2: SET_BUZZER_FREQ(FREQ_D); //ブザーの周波数をレに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 レの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 3: SET_BUZZER_FREQ(FREQ_E); //ブザーの周波数をミに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ミの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 4: SET_BUZZER_FREQ(FREQ_F); //ブザーの周波数をファに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ファの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 5: SET_BUZZER_FREQ(FREQ_G); //ブザーの周波数をソに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ソの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 6: SET_BUZZER_FREQ(FREQ_H); //ブザーの周波数をラに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ラの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 7: SET_BUZZER_FREQ(FREQ_I); //ブザーの周波数をシに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 シの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 8: SET_BUZZER_FREQ(FREQ_J); //ブザーの周波数をドに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ドの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 9: SET_BUZZER_FREQ(FREQ_K); //ブザーの周波数をレに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 レの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 10: SET_BUZZER_FREQ(FREQ_L); //ブザーの周波数をミに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ミの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 11: SET_BUZZER_FREQ(FREQ_M); //ブザーの周波数をファに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ファの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 12: SET_BUZZER_FREQ(FREQ_N); //ブザーの周波数をソに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ソの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 13: SET_BUZZER_FREQ(FREQ_O); //ブザーの周波数をラに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ラの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 14: SET_BUZZER_FREQ(FREQ_P); //ブザーの周波数をシに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 シの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break; case 15: SET_BUZZER_FREQ(FREQ_Q); //ブザーの周波数をドに設定 ENABLE_BUZZER; //ブザーを発振させる wait_ms(1000); //1秒間 ドの音を鳴らす DISABLE_BUZZER; //ブザーの発振を停止させる break;
青色のスイッチを押して二進数が増えると音階も上がり
赤色のスイッチを押して二進数が減ると音階が下がるようになりました。
上記のbreakはcaseと対になっているように見えますがそうではなく切りたい場所にいれるだけなので、breakがないならその次にあるブログラムとつながって動くだけです。
最後に本日のオフショットです。
2番目の写真はドレミファが鳴らせて喜んでるところです。