電子オルゴール
AVRで音を出してみたかったのですが、どのようにすればよいのかわかりませんでした。Webを検索すると 弘前大学の小山先生のページで AVRを使った、簡単にできるオルゴールに出会いましたので作ってみることにしました。したがって、ここの作品はオリジナルではありません。 少し、私流に変更してみたところがあります。

元はAT90S2313とATTINY2313を使っておられますが、私は手持ちの関係でmega48を使うことにしました。はじめはTINY26Lを使おうと 思ったのですが、TINY2313とは機能が違うようです(16ビットカウンタがありません)。IOレジスタの一覧を眺めているとmega48が似ているように思いましたので 少し変更してコンパイルしたら音が出たと言うのが本音です。
とりあえず、矩形波単音のオルゴールを作ることにしました。

音階を作るために
サンプルのプログラムとデバイスのデータシートをにらめっこしながら、こんな仕組みで動いているのかなと考えたことを書いてみます。
メロディーを作るには、音階に応じたいろいろな振動数の矩形波を作る必要があります。そのために、
16ビットタイマ/カウンタの比較一致タイマ/カウンタクリア動作(CTC)を使っています。
音の高低は周波数によって決まります。例えば、「ド」の音は261.63Hz、「ラ」の音は440Hzです。したがって「ド」の音を出すためには 3.822ミリ秒で「1」と「0」のペアが生じる振動を作ればよいわけです。次の図は、16ビットのタイマカウンタを使って可変周波数を 作る仕組みを記したものです。

圧電素子(スピーカ)がつながっているOC1Aポートの周波数がOCR1Aレジスタの16ビット値の設定で自由に変えられることがわかるでしょうか。
おたまじゃくしひとつ毎にこの16ビット値を書かねばならないのですが、とてもできないので定義ファイルmelotab1.cに DO RE MI ・・・に 対する数値が書かれています(休符の長さもですが)。

この動作のためには、設定が必要です。
16ビットタイマカウンタとして タイマ1を分周比1で使います。 TCCR1B のビット2〜0 に 001 を書きます。
CTC(比較一致タイマ/カウンタクリア)動作のために、WGM1のビット3〜0に 0100 を書きます。
 WGM1のビット3〜2 はTCCR1Bの4〜3にあります。 01を書きます。上記のビットをあわせて TCCR1Bには 0b00001001=9 を書きます。
 WGM1のビット1〜0 はTCCR1Aの1〜0にあります。00を書きます。
OC1A出力ポートをトグルにする(交互に変える)ために TCCR1AのCOM1ビット(7〜6)に01を書きます。ただし、休符の時は00を書きます。音を出さないために。
 WGM1と併せて、音を出すとき TCCR1A=0b01000000=0x40を、休符の時は0x00を書きます。
OC1Aを出力とするために、ポートを出力に指定します。DDRB=0bxxxxxx1x xは0でも1でもよいのですが、使わないので1にしています。

この他に、音符の長さ(時間)を決めるために タイマ1を使っています。 クロックを1024分周で使うために TCCR0B=5 に設定します。

ハードウエア
写真に見るとおりハードウエアは極めて簡単です。mega48には電源を配線し(写真では見えませんが裏側に0.1μFがあります)、OC1AポートとGND間に圧電素子 をつないで終わりです。ただ、ISP用のコネクタを書き込みようにつけてあります。また、タクトスイッチはリセットです(好みで1回の演奏で止めていますから 再開にはリセットが必要です)。電池で使うのでしたら電源スイッチが必要でしょう。


プログラム
このプログラムはクロック8MHz用に書いてあります。mega48のデフォルトは1MHzですから、ヒューズビットを書き換えて8MHzにしなければなりません。 なお、このプログラムは小山先生のものを自分流に少し変更したものです。また、プログラムと同じフォルダに置く定義ファイルmelitab1.cは小山先生の 作品です。ここに置く許可をお願いしているところです。(okをいただきました 050321)

このプログラムは3つの楽譜からできています。ドレミ音階と「大きな栗の木の下で」、「もりのくまさん」です。このままではコンパイルできませんから 3つの内のひとつをmain関数内のforループにコピーして、不要な部分は削除してからコンパイルしてください。
まずはじめにドレミ音階(ドレミファソラシド ドシラソファミレドだけ)を鳴らしてみましょう。megaやtinyは1万回の書き込みができますから、心配は 要りません。成功したら、音符を少し変えて調べてください。音符の書き方はmelotab1.cfをにらみつけてください。きっとわかります(困ったら掲示板へ)。

プログラム中にできるだけコメントを書き加えました。変更して違いを楽しんでください。
プログラム melod1.c melotab1.c
なお、小山先生の着メロ変換はまだ成功していません。成功したら報告しましょう。







TOPページへもどる


inserted by FC2 system