以前のリビジョンの文書です
ライントレーサーに載せてあるスピーカーを使っていきたいと思います。
ここまで来た人はタイマー割り込み(CMT)が理解できていますよね?
それではやっていきます。
音ってなんでしょう。皆さんなら波動であることは知っていますよね?スピーカーは電気的な波を受けることによって音波に変換してくれます
(構造は面白いので時間があったら調べてみるといいかも)
電気的な波を起こすには一定の時間ON,OFFを繰り返す必要があります。
一定の時間ということでCMT割り込みを使っていきます。
皆さんは1/1000秒(1ms)に一回割り込んでますね?
しかし音を鳴らすのにはもっと速く割り込んでもらわないといけません。
そこで25倍の速さ、1/25000秒(40μs)で割り込んでみてください。
LEDが1秒毎にON,OFFするはずのプログラムが
嫌になるような高速でチカチカするようになるはずです。
できましたか?ヒント;initCMTの割り込み周期を変えよう
音の周波数の基準値というのは440Hz(ふつうのラ)だそうです。
楽器を習ったことのある人は知っているかも
まず、割り込みの関数内で1ずつ加算される変数sound_countを作ってください。
次に440Hzの電気的な波、つまり1秒間に440回ON/OFFの波を送ってみてください。
とりあえずON,OFFのプログラムをwhile(1){}の中に入れてみましょう。
ヒント;(ONまたはOFFの時間)=(周期/2) 周期=(1/周波数)
上手くいかない人へ;カウントリセットを忘れていませんか?
出ました?といっても絶対音感の持ち主じゃなきゃわからないですよね?\\スマホのピアノ(鍵盤)アプリとかをダウンロードして、ラの音(これはわかるよね)を出してみてください。
1では永遠に「ラ」の音が出ているプログラムが書けましたね。
音程は周波数の部分を変えるだけです。それぞれの音の周波数はここで
好きな音、無ければドの音を出してみてください。
次に長さを変えてみたいと思います。
いろいろと方法はありますが、一番簡単だと思われる方法でやっていきます。
sound_countと同じようにlength_countを用意してください。
while(1)の部分をwhile(length_count⇐流したい時間(ms)×25)にしてみましょう
音楽チョー得意だぜって人はいいですが、そうでない人は下のをやってみてください
「ソ」250msを3回、「レ#」1250msを1回、「ファ」250msを3回、「レ」1250msを1回
きっと皆さんが知っている曲が流れると思います。
くれぐれもカウントリセットを忘れずに!!
人によっては知っているかもしれませんが、プログラムには定義文というものがあります。
定義文は次のように書くことが出来ます。
#define (定義名) プログラム
これはプログラムの一番最初に書いてください。
例えば #define ra0 440 のように書いてみます。
するとra0に440という数が”定義”されました
以降、「ふつうのラの周波数はえっーーーと440Hzだ」ではなく
「ふつうのラの周波数はra0」と調べたり思い出す時間、手間を省けます