[AVR]Play WAV file

WAVファイルの音声データをAVRマイコンのPWM機能で鳴らす方法を紹介します。

音声データをマイコン内のフラッシュROMに記憶させていますので、マイコンとスピーカがあるだけで作ることができます。

フラッシュROMの容量的な問題で、長時間喋らせることができません。

用意する部品は次のとおりです。

 ATmega168/328マイコンボードキット : http://akizukidenshi.com/catalog/g/gK-04590/

 圧電スピーカ : http://akizukidenshi.com/catalog/g/gP-01251/

回路図です。

WAVファイルを読み込んで、Cのソースファイルを生成するプログラム(HSP3)。

WAVファイルは無圧縮状態の8ビットデータに対応。WAVファイルは構造が単純でヘッダファイルの後はベタのデータになっています。無音状態が128(0x80)です。

冒頭の無音を読み飛ばす機能もあります。

上の写真は「いらっしゃいませ」と喋ってる音声です。1.1秒で言い終わっていますので、1.5秒に収まりました。22kHzで録音しましたが、8kHzに変換するように作りました。

ステレオの音声データは左側の音だけ使っています。右側の音は捨ててしまいます。

PWM機能を使って波形を出力します。無音状態が約2.5Vです。

マイコンはATmega168Pを使います。全容量は16KBです。そのうち12KBを割り当ててWAVファイルのベタデータを格納します。

サンプリングのデータは1つあたり8ビット。サンプリング周波数は8kHzとしました。8000バイト/秒。12Kバイトで1.5秒だけ再生できます。

現時点では再生時間が短いことと、音質が悪いことが難点です。増幅していないので音量が小さいです。

音質についてはD/Aコンバータを使うと良くなると思います。

再生時間を伸ばすには、外部のメモリが使うといいかもしれません。その場合、8KB/秒=64Kbosのスピードでメモリを読み込める性能が求められます。

Download

以下が作成したプログラムです。Atmel Studio 6.2で動作します。

https://nicotak.com/download/playwavm168.html