2012.03.01 Thursday
音声テスターを作ってみた(その2 ソフト編)
音声テスターを作ってみた(その1 ハード編)のつづきです。
制御用マイコン(ATmega328P)にファームウェアを書き込んで動作させるまでの内容です。

Arduino UnoとAVRISP mkII
開発環境
必要なもの
ATmega328Pへのファーム書き込みは、上記写真にあるようなAVRISP mkIIとArduino Unoの組み合わせを使いました。この組み合わせはUSBで電源もとれるので便利です。
あと、何か動作に問題があった時用にオシロスコープはあったほうが良いです。というか無いとトラブルの解決は厳しいかと...
プログラム
TalkingTester.c ←ダウンロードできます。
main()
起動音の出力後、約1秒間隔でテスターから値を取得して(72行)、AquesTalk Pico LSIに転送します(83行)。なお、前回と同じ値の場合は読み上げしません(82行)。また、テスターの応答がないなど何らかのエラーの場合は、パワーダウンします(89行)。
my_delay()
約1秒のディレイルーチンです。省電力化のためにウォッチドッグタイマーを利用してスリープ状態で待機します。
Init()
初期化ルーチンでは、UART、I2Cの周辺回路のパラメータを設定しています。
GetData()
テスターから測定値を読み込みます。任意の1バイトとして'¥r'をテスターに向けて送信します(158行)。その後、'¥r'が来るまでのバイト列を読み込みます(161行)。
Str2Cmd()
テスターの応答を、AquesTalk pico 用の音声記号列に変換しています。数値部分はNUMKタグを利用して数値を桁読みさせます(217行)。その後、単位を付与します(227行)。
なお、計測値がマイナスの時は先頭に"mainasu/"をつけます(214行)。例えば、"DC 3.306 V"という応答の場合には、"<NUMK VAL=3.306>bo'ruto" という文字列を生成します。
Speak()
音声記号列をAquesTalk picoに送信します。制御用マイコンとAquesTalk pico との通信にはI2Cを用います。送信に先立ち、Ready状態を示す'>'が返るかチェックし(251行)、'>'が返るのを確認してから、音声記号列を送信します(256行)。
ファームの書き込み
動作チェック

音声テスター基板
ファームのプログラムを変更すれば、読み上げ間隔や、読み上げ条件(今回は前回と同じ値の場合は読みあげないようにした)、メッセージの内容などを好きなようにカスタマイズできますね。
LINK
音声テスターを作ってみた(その1 ハード編)
テスターMAS-345の通信仕様
紹介動画 音声テスター youtube ニコ動
AquesTalk pico LSI ATP3011F4-PU
制御用マイコン(ATmega328P)にファームウェアを書き込んで動作させるまでの内容です。

Arduino UnoとAVRISP mkII
開発環境
必要なもの
- AVR Studio 5.0
- AVRISP mkII
- Arduino Uno
- Windows PC
- オシロスコープ
ATmega328Pへのファーム書き込みは、上記写真にあるようなAVRISP mkIIとArduino Unoの組み合わせを使いました。この組み合わせはUSBで電源もとれるので便利です。
あと、何か動作に問題があった時用にオシロスコープはあったほうが良いです。というか無いとトラブルの解決は厳しいかと...
プログラム
TalkingTester.c ←ダウンロードできます。
main()
起動音の出力後、約1秒間隔でテスターから値を取得して(72行)、AquesTalk Pico LSIに転送します(83行)。なお、前回と同じ値の場合は読み上げしません(82行)。また、テスターの応答がないなど何らかのエラーの場合は、パワーダウンします(89行)。
my_delay()
約1秒のディレイルーチンです。省電力化のためにウォッチドッグタイマーを利用してスリープ状態で待機します。
Init()
初期化ルーチンでは、UART、I2Cの周辺回路のパラメータを設定しています。
GetData()
テスターから測定値を読み込みます。任意の1バイトとして'¥r'をテスターに向けて送信します(158行)。その後、'¥r'が来るまでのバイト列を読み込みます(161行)。
Str2Cmd()
テスターの応答を、AquesTalk pico 用の音声記号列に変換しています。数値部分はNUMKタグを利用して数値を桁読みさせます(217行)。その後、単位を付与します(227行)。
なお、計測値がマイナスの時は先頭に"mainasu/"をつけます(214行)。例えば、"DC 3.306 V"という応答の場合には、"<NUMK VAL=3.306>bo'ruto" という文字列を生成します。
Speak()
音声記号列をAquesTalk picoに送信します。制御用マイコンとAquesTalk pico との通信にはI2Cを用います。送信に先立ち、Ready状態を示す'>'が返るかチェックし(251行)、'>'が返るのを確認してから、音声記号列を送信します(256行)。
ファームの書き込み
- Arduino UnoのAVRマイコンを今回ファームを書き込むマイコン差し替えます。
- Arduino Unoに、USBを接続して電源を供給(USBは、データ転送には使いません)。
- Arduino Unoに、AVRISP mkII を接続。
- プログラムをビルドして生成したHEXファイルをAVR Studioの"AVR Programming"で書き込み。
- フューズバイトを、次のように書き込み(内蔵RCクロック8MHz、8分周)。EXTENDED = 0xFF、HIGH = 0xD7、LOW = 0x62
- ファームを書き込んだAVRマイコンを音声テスターの基板に差し替えれば、完成!
動作チェック
- テスターに接続しない状態で、電源(3V)を供給します。
- 「ポン! テスターの応答なし」と聞こえればOK。
- その後、テスターと接続し、テスターの電源をONにして
- 音声テスター基板のリセットボタンを押せば、順次測定値が読み上げられます。

音声テスター基板
ファームのプログラムを変更すれば、読み上げ間隔や、読み上げ条件(今回は前回と同じ値の場合は読みあげないようにした)、メッセージの内容などを好きなようにカスタマイズできますね。
LINK
音声テスターを作ってみた(その1 ハード編)
テスターMAS-345の通信仕様
紹介動画 音声テスター youtube ニコ動
AquesTalk pico LSI ATP3011F4-PU
| AquesTalk pico LSI | 16:20 | - | - |













