このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| speakerドリル [2015/03/31 18:51] – member | speakerドリル [2015/04/01 01:01] (現在) – member | ||
|---|---|---|---|
| 行 71: | 行 71: | ||
| これはプログラムの一番最初に書いてください。\\ | これはプログラムの一番最初に書いてください。\\ | ||
| - | 例えば | + | 例えば |
| - | するとra0に440という数が" | + | するとla0に440という数が" |
| 以降、「ふつうのラの周波数はえっーーーと440Hzだ」ではなく\\ | 以降、「ふつうのラの周波数はえっーーーと440Hzだ」ではなく\\ | ||
| - | 「ふつうのラの周波数はra0」と調べたり思い出す時間、手間を省けます\\ | + | 「ふつうのラの周波数はla0」と調べたり思い出す時間、手間を省けます\\ |
| + | ちなみにドレミはイタリア語で「do re mi fa sol la si do」です。\\ | ||
| 他にもモーターを回す際にポートを調べたり、覚えたりする手間が省けます。その際は\\ | 他にもモーターを回す際にポートを調べたり、覚えたりする手間が省けます。その際は\\ | ||
| 行 99: | 行 100: | ||
| これで完成です。 main関数に sound_player(do0, | これで完成です。 main関数に sound_player(do0, | ||
| + | |||
| + | 一行で音が流せましたね?\\ | ||
| + | |||
| + | メロディを一行で流すこともできますが少し難易度が高いです。 | ||
| + | void music_player(int sound[255], | ||
| + | そしてsound_player関数をmelo_countでfor文を使って、ループさせます。 | ||
| ===5.動作中の音楽再生(マルチタスク)=== | ===5.動作中の音楽再生(マルチタスク)=== | ||
| + | 項目1~4で自由にメロディーが鳴らせるようになりましたね。 | ||
| + | ここまででも十分楽しいですが、今のままでは音楽を流している間、他の動作は出来ません。ライントレースをしながらメロディーを流したいという人もいますね。 | ||
| + | |||
| + | |||
| + | そこで、マルチタスクのプログラムのヒントを書いていきます。 | ||
| + | |||
| + | |||
| + | 項目1の「ラ(440Hz)の音を鳴らす」を例にとります。 | ||
| + | |||
| + | 先ほどの復習ですが、 | ||
| + | まず割り込みの関数内で1ずつ加算される変数sound_countを用意します。 | ||
| + | そして、メイン関数で、 | ||
| + | while(1){}のかっこの中に1秒間に440回ON/ | ||
| + | |||
| + | このままではメイン関数ではラの音を鳴らす以外のことはできません。 | ||
| + | |||
| + | では、次のことをしてみてください。 | ||
| + | | ||
| + | |||
| + | どうですか。上手く行けばラの音がなるはずです。 | ||
| + | |||
| + | 鳴ったところでプログラムを見返してみると、メイン関数ではやることが無くなっているはずです。割り込み関数ではラの音を鳴らしています。ここからがんばって、一つの音を出す関数、メロディーを流す関数を作りましょう。 | ||
| + | |||
| + | 完成すると、メイン関数ではなにもせず、割り込み関数だけでメロディーがならせるようになるはずです。 | ||
| + | ここまで来れば完成です。 | ||
| + | ライントレーサーのプログラムと合体させてもトレースと平行してメロディーが鳴らせますね。 | ||