PICで電子オルゴール

Topics PICC lite PICC Pro lite mode SDCC PICkit2 Sound Interrupt TIMER0 SLEEP PIC12F675 PIC12F629 12F1822



HI-TECH C PRO for the PIC10/12/16 MCU Family (Lite mode)に対応しました。







回路図





PICkit2/3用のICSP(JP1)が出ていますが、配線しなくても問題ありません。GP2からPIEZOに配線してある部分は、100Ω程度の抵抗を挿入することを推奨します。ICSPを利用する場合は、コイン電池を外して書き込みます。書き込み時は押しボタンスイッチを操作しないでください。

この回路は、電子砂時計と同じ構成ですので、プログラムを書き換えるだけで3分間タイマーとなります

プログラム



これらの圧縮ファイルは予め各曲のHexファイルが入っているので、そのまま書き込んで使用可能です。

PIC12F1822



スリープ時は20μA@5Vです

Date version Build Folder Device note
New
2011/9/3
1.01 MPLAB8.80,Hitech PICC Pro lite mode v9.83 C:\picsrc\piccpro\melody_12f1822 PIC12F1822 4種類の曲を同梱
Ievan Polkka like sound
Mayim Mayim like sound
Mikku Miku ni Shite yanyo like sound
Jingle Bells like sound 歌って楽しい楽譜リンク

2011/9/3
1.00 MPLAB8.76,Hitech PICC Pro lite mode v9.82 C:\picsrc\piccpro\melody_12f1822 PIC12F1822 3種類の曲を同梱
Ievan Polkka like sound
Mayim Mayim like sound
Mikku Miku ni Shite yanyo like sound


PIC12F675/PIC12F629



PIC12F675でコンパイルされたものはPIC12F629へ直接HEXファイルを書き込めます。スリープ時は0.06μA@5Vです。安定させるには、configでブラウンアウトリセットを有効にさせますが、その時のスリープ時は120uAに増えます。

Date version Build Folder Device note
New
2011/9/3
1.01 MPLAB8.80,Hitech PICC Pro lite mode v9.83 C:\picsrc\piccpro\melody_12f675 PIC12F629 / PIC12F675 3種類の曲を同梱
Ievan Polkka like sound
Mayim Mayim like sound
Jingle Bells like sound
2011/9/3 1.00 MPLAB8.76,Hitech PICC Pro lite mode v9.82 C:\picsrc\piccpro\melody_12f675 PIC12F629 / PIC12F675 2種類の曲を同梱
Ievan Polkka like sound
Mayim Mayim like sound




古いプログラムは過去の記事に掲載しています。



ドキュメント




MML仕様書 音符を打ち込む時はMML仕様を参考にしてください。

ボードレイアウト

Make Tokyo Meeting 07(2011/12/3,4)開催で頒布したキットのドキュメント一式です。
MS word 形式、パターン図、MBE基板図
PIC12F_general_evalution_system01_20111203-021234.ZIP


専用基板のキットを頒布しています。
ご希望の方はこちらからコメントをお願いします



取扱説明書ダウンロード(pdf)


動作説明



電源を入れると、一瞬LEDが光り待機状態になります。
スイッチを押すと曲が流れます。
曲が流れている時にスイッチを押すと、曲が途中で止まります。更にスイッチを押すと途中から曲が始まります。
曲が一周すると、待機状態となります。




アドバイス



音符を打ち込む時はMML仕様を参考にしてください。
ボタン電池で動作させる場合、CR2032等のボタン電池は200〜240mAh程度(FDK参考)なので、スタンバイ電流の小さいPIC12F629がオススメです。PIC12F1822の場合、同一条件では1年強の電池寿命になります。PIC12LF1822ではデータシート上では20nAと1000分の1の電力となる様です。








過去の記事



PICkit2に対応しました。それに伴い回路図をしています。

クリスマス企画として、イルミネーションでもやろうかと思ったんですが、74HC14を並べてランダムにLEDを光らせるとか、何だかありふれているので、ここは一つ実用的で、なおかつスキルの上がるような事をやろうかなと考えました。
で、何をしようか、そうだオルゴールを作ろう。というわけで、マイクロチップテクノロジー社の安いマイコン、PICを使って、オルゴールを作ってみることにしました。
ぬいぐるみへの実装例はこちらです。

手持ちのPIC12C508/JWでやろうかと思いましたが、あんな紫外線でいちいち消さないといけないような、命令のさらにしょぼくなった割込みの無い8ピンデバイスをつかうよりも、14ビットでフラッシュ内蔵で150円で買えるマイコンの方がはるかに扱いやすいわけなので、今回は12F675を使うことにしました。※12F629でも使用できます。

なんとか、完成しました。曲を止められる機能がついています。12F675のスリープ命令を使っています。ボタンを押すと曲が始まり、曲が終わると停止します。
途中でボタンが押されると、曲が途中で停止し、その後またボタンが押されると、途中から開始します。
電池は手持ちに浮き電池(パナソニックBR435 3V 50mAh)があったのでそれを使いました。待機時の電流は、殆ど0です(手持ちのテスターでは測定不能)。電池の経年変化によるリーク電流の方が多いかもしれません。CR2032あたりは220mAhですので良く鳴らす場合にはこちらを使ったほうが良いでしょう。アルカリ単三だと、電池の方が先に腐るんじゃないかな?LEDは動作試験用のためにつけている程度です。LEDをはずせば消費電流を抑えられます。

ハードスペック

電源 2.2V〜5.5V
動作電流 LED無で最大410μA、LED付は700μアンペア
待機電流 0.06μA (melodyのBORをoffに設定した場合。通常では100uA消費)

ソフト対応状況 MML仕様書

Step Program Hex Sound Out Max note Hard GP0 GP1 GP2 GP3 Introduction
melody(SDCC) zip mono3oct >360 4 - #LED Piezo #SW PICkit2対応
SDCCコンパイラ対応版(12F675/629)
melody zip mono3oct >360 4 - #LED Piezo #SW PICkit2対応
mplab7.62/PICC9.60対応版(12F675/629)
melodyd txt txt 2voice 3oct Unknown 3 - Piezo- Piez+ - 2和音(Timer0,1を使用する)
melodyc2 txt txt mono3oct 377 2 #SW #LED Piezo - サスペンド・レジウム対応
melodyc txt mono3oct 406 1 - - Piezo - 音符がたくさん入る
melodyb txt mono3oct 237 1 - - Piezo - プログラム構造が理解しやすい


●Pickit2対応版(電子砂時計の回路と兼用




●単音用(サスペンドレジウム対応)



●2和音用(研究用)




※オルゴールのプログラムについては、営利目的以外であり、個人の使用を始め、学校関係や地域振興用等の教材ご使用される分にはご自由にお使いください。但し、サポートに付いては私の趣味のサイトである関係で、基本的にノーサポートとします。


SDCCの対応



以下の2つをインストールします。
sdcc Windows package with installer (i586-mingw32msvc-setup)サイトへ移動してダウンロード
gputils-win32 0.13.4 Notes (2006-08-19 18:19) サイトへ移動してダウンロード

どちらのファイルも、インストーラ形式で、インストールの最後にパスを通すかどうかの質問でNOにフォーカスされていますが、YESに選択し直してインストールを完了させます。

その後、このファイルを適当なフォルダに解凍して、make.batを実行すると、melody.hexが作成されます。(色々warning が出ますが、まだテストなので今はまだ意味がわかっていません)このhexファイルをライタで書き込めば、動作します。



以下は開発日記です。ご参考までに。




2003/12/29

とりあえず和音でメロディが鳴るようになりました。まだ、割込みの誤差分のテーブルとか、メモリー効率の検討とかやっていないので、高い音で音程が若干狂っていたりしていますが、これだけの部品で和音が鳴るようになったので暫定公開します。音の出力は5番と6番ピンから個別で出力されます。
ピエゾを使うときは、ピエゾの片側ずつ5番ピンと6番ピンにピエゾをつなげます。外部に接続する時は10kΩ程度の抵抗をそれぞれのピンに接続して適当なコンデンサをいれてください。後ほど回路図を公開します。サンプル音楽はこれです内蔵発振を使用しているのでサンプルではOSCCALを設定しなかったので、内部発振が低くなり音程が半音下がっています。(ジオシティズはmp3を直接置けないので、圧縮しておきました)





2003/12/24


これからの課題は、やっぱり和音と、ポーンとかいうエンベローブ処理かな。和音のプログラムに着手していますが、難しい。和音はなったんだけど、テンポがよれとる。ある程度できたら報告します。

電流を測定している時に、やっぱり10μAは食いすぎだなと思って色々調べたらMCLRが浮いていると、sleep時に余計な電流が流れる(といってもマイクロアンペア)事が分かりました。内蔵プルアップは、このポートだけありません。
外付けで100KΩ程度の抵抗を入れるようにします。←後日、この100KΩプルアップ抵抗は直接電池のプラス側へ接続しても問題無い事が分かりましたので、抵抗を一つ減らす事が出来ます。
これで、測定したら、sleep時は0.0μAとなりました。(この状態で数秒間電池を外してつなげても、パスコンのチャージ分でsleepを保持しているらしく、曲が途中から始まります。電解コンデンサなんてつけたらどうなるんでしょう。sleepを応用すれば、何らかのバックアップに応用できそうです)
あと、細かいところですが、ピンがスイッチ以外すべてプルアップ無しになっていましたが、このままだと静電気に弱くなるので、sleepさせる前にWPUで全てのポートをプルアップするようにしておきました。使用しないピンを出力にすることでも良かったんですが、入力の方が開発上安全かと(w 

MPLAB6とHI-TECHCとの組み合わせのデバッガはリアルタイムでCのソースを追っかけながら、ピンのシミュレートができるし、命令間の時間計測もできるので、まさにホビーでの最強開発環境といったところでしょう。

事のきっかけは、温存していたFM音源チップを使ってMIDI音源をPICで作ろうと考えたものの、いきなりはちょっとむりっぽだったので、手始めに「音階の出るブザーでいいや」と気軽な気持ちで始めました。思ったより悪戦苦闘するもんです。お陰で随分と勉強になりました。頭で考えていても実際にやってみると相当な量の問題があるわけです。最初になった音痴な音は、小学生の頃電子工作で遊んだ記憶が蘇るほど感動しました。時には填って気が付いたら朝とか。結果としては、ソースとかが大した量でもなかったりとかしますが、それ以上にこの過程を学ぶ事が大事な事を非常に痛感しました。




※YM2413は現在でも量産されています。使われているところは、パチスロ機が多い(多かった)です。相当売ったみたいですねヤマハさん。手持ちのYM2413はN-MOSだから電気食うんだよね。B無しが40mAでB付が5mAに改善されています。




2003/12/23

電源のオンオフをスライドスイッチで行っていましたが、この12F675は、驚異的なスリープ電流を誇っているのですから、これを使わない手はありません。電源を入れっぱなしにしておいて、スリープ命令にて曲のオンオフを行うことにしました。12F675のスペックシートにはものすごい低消費電流値が記載されています。0.00099マイクロアンペアっておい。これは、あくまでもコア消費電流なので、実際はこれより少し大きくなりますが、今回作ったオルゴールのsleep時でも、0.1マイクロアンペアまで測定できるテスターで0.0でしたから、これは脅威的な省電力と思いました。
音符は377音符までとなりますが、一曲入れるには何とか事足りる事と思います。

スリープ命令は、通常sleepの実行後、リセットが掛かるか、割込みが掛かるかなどの要因で復帰し、割り込みの場合は、sleep命令の次の命令を実行後、インタラプトアドレスの0004番地へ飛びます。今回は割込み(GIE)を禁止することにより、sleepの次の命令から順次実行されるようになります。(詳しくはソースを参照してください)




2003/12/20

あれから、曲を入れていると237音はデータ量として少ないかなと。
それもそのはず、置換マクロでテンポを入れているから効率が悪い。かといって、データの打ちやすさを犠牲にするのも何ですし。色々、考えた結果、constで配列指定してあげる事にしました。

曲データの最大容量が、1KWの癖に倍近くの405音符まで入ります。これは結構長い曲もサポートします。
曲を1度だけ鳴らすか、リピートで鳴らすかは、ソースの中でコメントアウトしてある永久ループ部分のコメントを外せば電源投入後一度だけ音楽が鳴るようになります。

データフォーマットは殆ど変っていません。今までのデータがそのままつかえます。
途中のテンポチェンジの所は構文が変ります。
あと、L2,L1(2分音符、全音符)については、長さカウンターの都合で、同じ音を数回指定することになります。


C L2 → C L4 C L4
F$ L1 → F$ L4 F$ L4 F$ L4 F$ L4

メモリー効率は悪くなりますが、オルゴールでこんなに長い音符はそう無いだろうと考え、このようにしました。

const char songdata[]={
 CMD 100 TEMPO //tempocont (except 255)

 A$L L16
 R L16
 A$L L16
   |
   |
 
//Rest
 R L4
//stop
 CMD END // Music Last of data
};


どんな方法で、デバッグしていたのかを紹介します。
秋月のライターに、なんか、クリスタルイヤホンが(圧電素子)






ラッピングワイヤ用のソケットを使って、給電部を足上げして、別に電源を取ってます。
しかも、プラス側から音の出力をとっているし。



単に絡げているだけです。半田付けくらいしろよと。

圧電サウンダ素子の出力は、書き込み用のポートとぶつかっていないので、こんな荒業でデバッグをしています。デバッグが終わればきちんと基板を作る予定です。ワニ口付のクリスタルイヤホンは何かと便利です。

プログラムのシンボルについて
ソースを見ると、いきなりGPIOがなに、とかTRISIOが何とか書いてありますが、これは
C:\Program Files\MPLAB IDE\MCHIP_Tools
の中に、xxxxxx.incというものがあって、その名前を使えるのです。最初のうちはプリントアウトしておくといいでしょう。中の内容は書き換えると大変かも。*.incのコピーを取っておくといいでしょう。

実は、HITECHにマイナーなバグがあって、IOC (ポートピンチェンジの有効無効の設定)のシンボルを認識しません。
Error[000] C:\picsrc\melodyc\melodyc2.c 349 : undefined identifier: IOC
対策は、__CONFIGの次に、 char IOC@0x96; 
と指定してあげるとコンパイラとアセンブラは通りました。
コンパイラでエラーになるから多分HI-techだと思いますが。
もし、シンボルを認識しないようなポートが存在したら、先ほどの様に、アドレスを指定すれば使えるようになります。
(今のところ、これしか見つかっていません)


(2004/2/27)12F675のプルアップコントロールレジスター IOCについて、HI TECHにあるユーザーフォーラムに
かなり怪しい英語を使って質問してきました。
For some reason, the 12F675's IOC register is named "IOCB" in pic12f6x.h.
なんと、IOCBというシンボルにすればよかったみたいです。聞いて見るもんですね。





2003/12/19


あ、回路かいてなかった。



これです。簡単でしょう。でも、欲を言えば、コンフィグでブラウンアウトリセットにして、電池は4.5Vでやったほうがいいです。それはなぜかというと、電源をいれても音が出ないときが、稀ですがあります。
他のPICと違い、12F675のブラウンアウトリセットは約2.1Vで機能します。

音楽を聴いてどうでしたか?え?なにこの曲?
あえて、曲名は申しあげません。

曲は各自簡単に入れられるようにしてあるのです。



ら#低いほう 16分音符 A$L L16
休符 16分音符 R L16
ら#低いほう 16分音符 A$L L16
休符 16分音符 R L16
そ#低いほう 16分音符 G$L L16
そ低いほう 16分音符 GL L16
ふぁ低いほう 12分音符 FL L12
休符 32分音符 R L32


こんな感じで採譜してつくりましょう。同じ音が連続する場合は、細かい休符をいれるといいです。またメリハリをつけるにも、休符を入れたほうがイイ場合があります。

音は、3オクターブ、音符数は約237音入ります。
ポートとか余ってますから、2曲以上の選択とか、停止とかできます。
それと、中のテンポは、数字が大きいほど遅くなります。聴きながら調整してください。外部発振セラロック4メガヘルツを使用すれば、絶対音階の音で出力されます。内蔵オシレータは、やっぱりちょっと低くなってしまいます。
OSCCALの設定をすれば解消されます。詳しくはワンポイントへ。

音階 タイマー0の割数 基準周波数 カウンター値 ソフト誤差 ソフト遅れを考慮 ソフト割算 整数化 セットするカウント値
Hz Hz 2 10進
C 261.63 8 125000 477.78 4 473.78 236.89 237 19
C# 277.18 8 125000 450.97 4 446.97 223.48 223 33
D 293.66 8 125000 425.66 4 421.66 210.83 211 45
D# 311.13 8 125000 401.77 4 397.77 198.88 199 57
E 329.63 8 125000 379.22 4 375.22 187.61 188 68
F 349.23 8 125000 357.93 4 353.93 176.97 177 79
F# 369.99 8 125000 337.84 4 333.84 166.92 167 89
G 392.00 8 125000 318.88 4 314.88 157.44 157 99
G# 415.30 8 125000 300.98 4 296.98 148.49 148 108
A 440.00 8 125000 284.09 4 280.09 140.05 140 116
A# 466.16 8 125000 268.15 4 264.15 132.07 132 124
B 493.88 8 125000 253.10 4 249.10 124.55 125 131
C 523.25 8 125000 238.89 4 234.89 117.45 117 139
C# 554.37 8 125000 225.48 4 221.48 110.74 111 145
D 587.33 8 125000 212.83 4 208.83 104.41 104 152
D# 622.25 8 125000 200.88 4 196.88 98.44 98 158
E 659.26 8 125000 189.61 4 185.61 92.80 93 163
F 698.46 8 125000 178.97 4 174.97 87.48 87 169
F# 739.99 8 125000 168.92 4 164.92 82.46 82 174
G 783.99 8 125000 159.44 4 155.44 77.72 78 178
G# 830.61 8 125000 150.49 4 146.49 73.25 73 183
A 880.00 8 125000 142.05 4 138.05 69.02 69 187
A# 932.33 8 125000 134.07 4 130.07 65.04 65 191
B 987.77 8 125000 126.55 4 122.55 61.27 61 195
C 1,046.50 8 125000 119.45 4 115.45 57.72 58 198
C# 1,108.73 8 125000 112.74 4 108.74 54.37 54 202
D 1,174.66 8 125000 106.41 4 102.41 51.21 51 205
D# 1,244.51 8 125000 100.44 4 96.44 48.22 48 208
E 1,318.51 8 125000 94.80 4 90.80 45.40 45 211
F 1,396.91 8 125000 89.48 4 85.48 42.74 43 213
F# 1,479.98 8 125000 84.46 4 80.46 40.23 40 216
G 1,567.98 8 125000 79.72 4 75.72 37.86 38 218
G# 1,661.22 8 125000 75.25 4 71.25 35.62 36 220
A 1,760.00 8 125000 71.02 4 67.02 33.51 34 222
A# 1,864.66 8 125000 67.04 4 63.04 31.52 32 224
B 1,975.53 8 125000 63.27 4 59.27 29.64 30 226

基準周波数というのは、クロック4メガヘルツの1/4がタイマー0のクロックとなり、更にそのプリスケーラ値8で割った数です。
これを音階の周波数で割ると、カウントする値が出てきます。

割り込み発生から処理までに遅れがあるので、その分のカウント値を考慮しています。どれだけ遅れていたかということが分かったのは、一度ビルドしたアセンブルソースから割り出したわけです。これしないと、高い所でかなーりずれた音程になります。

タイマー0は足し算されて増えていきます。割り込み発生する時は255から過ぎて0になった時、オーバーフロー割り込みとして割り込まれます。つまり、255からリーチカウント値を引くわけでなくて、
256(0x100)から引いた値をカウンターにセットするのが正解です。

音の基準は、Aの音を440Hzとして、高いほうは、2^(1/12)*基準周波数、低いほうは2^(-1/12)*基準周波数で平均律を求めています。





もし、検索エンジンなどでこちらへ来られた方は、一旦ここをクリックして最初のページへ進んでください。


ホーム





履歴

2012/12/9 キット頒布の告知
2011/12/18 Jingle Bellsを追加
2011/12/3 MTM07頒布用ドキュメント追加
2011/9/3 HI-TECH C PRO for the PIC10/12/16 MCU Family (Lite mode)に対応。12F1822追加。
2007/8/19 Pickit2対応版に修正
2007/7/29 最新ツールで使用できるようにしました。
2005/1/22 説明間違いの後始末(^^;色々な所で火消しをしました(爆
2004/5/24 OSCCAL対策のプログラムに修正しました。
2003/12/23 書き始め





(C)2003-2011 air variable All Rights Reserved..


ホーム