PICに何かのモジュールをつないでそれをPICで駆動してモジュールに音を鳴らさせるのでなくPIC単体でスピーカーを鳴らす。
「ArduinoのPROGMEMにデータを置いてPWMで音声を鳴らす。」のPIC版だ。
音のサンプリング周波数を8kHzにした点以外、音データの準備は上の通りなので書かない。
音データはここから拝借した「正解です。」だ。
環境
MPLABX IDE v5.10
XC32 Compiler v2.15
MPLAB Code Configurator v3.66 (以後MCC)
MCCで用意したMCCPのPWMを使って出力した信号でスピーカーを鳴らす。
例によってMCCでの設定画面を貼る。
System Moduleはクロックを16MHzに設定した。
TMR1は音のサンプリング周波数の8kHzに合わせて 1/8000 = 125μs 間隔で割り込みを発生させる設定にする。
ここではCalculated Periodを25usにして、Call Back Function Rateを5とした。
25us × 5 = 125us
音を鳴らすのはMCCP1によるPWMだ。
ModeはDual Edge Compare, Bufferedとした。
ていうか、いまのところこれしか理解してない。
Primary Compare Value = 0x0、Timer Period = 0x100 で、参考にしたArduinoの例でのPWMの周期に合わせてみた。
16MHz ÷ 0x100 = 62.5kHz
Secondary Compare Value (CCP1RB)の値に音声データを当てはめることになるわけだが初期値は適当に0x64としておいた。
これは、プログラム時にレジスタ名を確認しやすくするためで、あとで0x0にする。
PWMの周波数やデューティー比は以下のように決められる。
出力は2ピン(RA0)とした。
Generateする。
作成されるtmr1.cの割り込み部分にsound()という関数を呼ぶようにコードを書く。
main.cにsound()を書く。
ロジアナで測定した信号の様子。
スピーカーをPICに直接つないで鳴らし、スマホのマイクで録音した音声。
細かな設定はまだ詰めていないが、とりあえず何を言っているかわかる程度には再生できる。
Arduino Nanoは電源電圧が5.0VだったがPIC32MM0064GPL028は3.25Vなので音は小さめだ。
追記
音楽もやってみたが、5秒ほどの音でデータのサイズは38665バイト。
フリー版のビルド後に42484バイトの使用量となり、23052バイトの空きとなった。
この音質なら7秒程度は入れられるということで、簡単なメッセージや効果音には十分使えるだろう。
関連記事
「Arduino NanoでZockの起動時の音とモノアイの動きの再現」
「ArduinoのPROGMEMにデータを置いてPWMで音声を鳴らす。」