音声クロックの製作 H23.1 ホームページへ戻る
マスカットさんの音声告知クロックの製作記事をみて、真似して音声で時間を知らせる音声クロックを
作りました。
マスカットさんのコンセプトをベースに製作しました。この場を借りて感謝申し上げます。m(_
_)m
仕様・概要
CPU ATMEGA88P 内蔵RC発振器 4MHz(EEPROM書込時2MHz)、時計用クリスタル
32.768kHz(タイマ2非同期動作)
EEPROM atmel AT24C1024
1Mbit(128kByte) I2Cインターフェイス
書込は、RS232Cインターフェイス(秋月の
AE-UM232R
でPCと接続)
音声データ 8bit 8kHzサンプリング
PCM(上記EEPROMに保存、一部CPUプログラムメモリに保存)
D/A変換 タイマ0PWM 変調周波数
15,625Hz、音声逆サンプリング周波数7812.5Hzの2倍(変調ノイズ低減策)
時計仕様 24時間制、毎正時に音声通知、タイマ2割込により6秒周期に時間カウント
アラーム 設定時刻に1分間(6秒間隔、10回)音声通知
操作ボタン SW1:音声通知・設定完了、SW2:時間調整・アラームon選択、SW3:分調整・アラームoff選択
電源単三×3 4.5V
消費電流 待機時 約3.5uA(スリープ
パワーセーヴモード、タイマ2のみ動作)
時刻計算時 数mA(6秒周期)
音声発生時 約85mA(音量VR中位)(時刻・アラーム調整時も同様)
製作に活用したソフト等
音声合成 AquesTalk 株式会社アクエスト
wavデータ変換 YAMAHA Wave Editor
wavファイル編集 Binary Editor BZ c.mos氏
RS232C制御モジュール EasyComm 木下氏
回路図
音声データの作成
・音声データの作成は、フリーの音声合成ソフトAquesTalk(株式会社アクエスト)で作成しました。
・このソフトは、フリーですが結構よい性能の音声合成ソフトです。また、WAVファイルに書き出せます。
・これを使い「0時」〜「です。」までの語句を、連続したwavファイルを作成しました。
語句と語句の間は、バイナリファイルを編集するとき区切りが判別しやすくするため無音部($80)が長くなるように無音
記号「、」を入れました。
・この
元データ (16ビット 8kHzサンプリング WAVフォーマット)を、YAMAHA Wave Editorで振幅調整(ノーマライズ)して、
8ビットwavファイルに変換しました。
・次にそのwavファイルを、Binary Editor BZを使ってPCMデータ部分を切出し途中の無音部を削り、語句の区切り部を$FF
で埋め最終的な、
wavデータ
(PCM)としました。
◇ヘッダー部を削除
◇語句の終了部
EEPROMへのデータ読書(詳細)
・EEPROMは、I2C(TWI)インターフェイスでありAVRのTWI機能を利用してデータやり取りする。
AT24C1024へのやり取りは、書き込みはページライト(256byte)ルーチン、読み出しはシーケンシャルルーチン
を作成し、必要なデータ数を繰り返し方法で行う。
・EEPROMへの書込みは専用の書込器がないので、RS232CインターフェスでPCと接続し木下さんのEasyCommを活用したVBAの
通信プログラムで行いました。
最近のPCにはRS232Cインターフェイスがないため、USBを直接TTL(CMOS)レベルに変換できる
AE-UM232Rを使用しました。
他の変換ケーブルとレベル変換回路ではエラーが発生しましたが、
AE-UM232RはEasyCommとの相性がよく問題なく
書込・読出ができました。(excel2007+XP or
win7で動作確認)
VBA転送ソフト、AVR側書込ソース、hex
マクロを実行するとデータが転送されます、その後データを読み出し照合を行います。終わるまでに数分かかる
ので我慢づよく待ちまます。成功すれば「一致しました」と表示されます。
また、作成されたwav00.datと元のwav.datを比較して確認することもできます。
なお、後で追加した機能のアラーム「オン・オフ」のデータは、EEPROMに収まりきらなかったのでプログラムメモリに置き
ました。
音声の発生
D/A変換の一般的な方法としてR-R2ラダー方式がありますが、部品点数を減らすこととPWM方式で試してみたいと思い、
双方の方式を比較確認し、PWM方式でも大差なく実現できるとわかったので、今回採用しました。
(R-R2方式とPWM方式を比較すると、正弦波を発生させると生の波形ではR-R2の方が断然きれいな波形ですが、スピーカ
接続して音にすると、変調ノイズ以外はほとんど差がありませんでした。)
EEPROM(一部プログラムメモリ)の音声データ(8bit
8kHzサンプリング)を、タイマ0のPWM周期(15,625Hz)の1/2の周期(7812.5Hz)
で読出し、PWMのパルス幅(OCR0A)の設定値とすることでD/A変換を行います。データを読まない周期では前後の値の
中間値をパルス幅に設定します。
最初、PWM周期を7812.5Hzとしてデータデコード周期と同じにしましたが、PWM変調ノイズがかなり重畳しローパスフィル
タでは、除去できなかったので2倍の周期とし、ノイズをほとんど消すことができました。
スピーカドライブ回路は、トランジスタ一個を使った簡易な回路です。(かなり適当)
メインプログラム
ソース hex eep(I2Cエラー保存用初期化データ)
・CPU速度は、タイマ0のPWM周期(15,625Hz)から逆算して4MHzとし、I2Cの転送速度は250kHzとした。
・常時は4MHz駆動のCPUをスリープのパワーセーブモードとし、タイマカウンタ2を32.768kHzのクリスタルで駆動し6秒周期で
割込処理をかけ、CPUを駆動させ時計を6秒づつ進める。
・毎正時には、音声通知を行う。
・アラーム設定時刻では、1分間(6秒周期、10回)音声告知を行う。(停止機能なし)
・プログラムメモリのデータ部には、EEPROMのアドレス(ji_dat〜alm_dat)があります。
17bitのアドレスを、2byteで表現するため少し工夫しています。
fx0_datの最後は、50分(ごじゅっぷん)のアドレスを示しており、
0x01f1の意味は
0x01f1 01は、romのhighアドレスを指し
0x01f1 fは、romのlowアドレスの上位4bitを指し下位は0000固定 (f0)
0x01f1 1は、デバイスアドレスに含まれるP0(17bit)を示す
よって、この例ではromアドレスの$101f0を表している。
・alm_on以降は、オン・オフのPCMデータになります。
・EEPROMとの通信で正常な状態符号ではないときは、エラーとして装置を停止しスリープ状態のままとなります。
この場合、エラーログ(直前の処理と状態符号)をCPUのEEPROMに保存するので、後で読出してエラーの状態を確認できます。
(初期化にはeepファイルの書込が必要)
直前処理(コード:意味:正常な状態符号)
1:送信開始:$08($10)、2:SLA+W:$18、3:SLA+R:$40、4:データ送信:$28
5:データ受信:$50、6:ラストデータ送信$58、11:再送開始:$10
送信開始のステイタスは、本来$08のはずですが時々再送開始時のステイタス$10となり、停止してしまうことが
あるので$10も正常と判定するようにしました。
操作方法
・SW1押下で現在時刻を通知 「○○時△△分」
です。
SW2とSW3を同時押下で、アラーム・時刻修正モードとなる(時計は一旦停止)
注:修正モード中は音声発生ルーチン(PWM変調)が連続動作するため、消費電流が大きいのでなるべく短時間で行う
@アラームon/off選択
現在の設定を「オン」or「オフ」
(初期値)と発声
SW2/SW3で選択 その都度「オン/オフ」
と発声
SW1で設定完了 オンの場合Aへ、オフの場合はBへ
Aアラーム時刻調整
設定時刻「○○時△△分」
発声(初期値6時)
SW2で時間が、SW3で分が進む その都度「○○時△△分」
と発声
SW1で設定完了「アラーム オン ○○時△△分」
と発声
B現在時刻調整
現在時刻「○○時△△分」
発声
SW2で時間が、SW3で分が進む その都度「○○時△△分」
と発声
SW1で設定完了「○○時△△分です」
と発声(この時点で設定時刻の0秒から再スタート)
あとがき
・今回、IC2やEEPROMのアクセス方法について理解を深めることができ自分なりに整理できました。(詳細)
・音声発声はPWMによるD/A変換で行いましたが、思ったよりいい音がでました。
音源は、音声合成ソフトで作成したのでイントネーションは若干おかしいところがありますが、逆に機械ぽい感じが出て
います。(^^;)