音声合成LSIの実験(その3)

はじめに

音声合成LSIのATP3012を使って、温度と湿度を発声させる実験です。

概要

SHT31温湿度センサーモジュールから取得した温度と湿度値を、ホストのPICマイコンで音声記号列にしてATP3012に送信/発声させます。温湿度センサーとはI2Cで、音声合成LSIとはUARTでPICマイコンと通信します。なお、SHT31については、過去記事の「温湿度計(+メッセージ表示)の作製」を参照して下さい。

内容

使用したマイコンPIC16F18326は、UART通信のためのEUSARTモジュールを内蔵しており、MCCから簡単に設定できます。下図は、EUSART(非同期通信方式)の送信ダイヤグラムです。

ソフトで送信レジスタ(TX1REG)にデータを書き込むと、送信シフトレジスタ(TSR)が空の状態(TRMTフラグが1)になるのを待ってデータがTSRに転送されます。TSRでは、UART形式に従い、スタートビット’0’で通信を開始し、データは最下位ビット(LSB)から順にボーレートで送信(TX)ピンに出力され、最上位ビット(MSB)まで出力したら、最後にストップビット’1’を出力して通信終了となります。

下は、EUSARTモジュールのMCC設定画面です。ATP3012のUART通信条件を合わせます。

以下はコードの説明です。
UART_Sendは、文字型のポインタ(char *Str)を使って、終端のnull文字(\0)まで1バイトずつ送信レジスタ(TX1REG)に書き込む関数です。書き込む前にTRMTフラグをチェック(ポーリング)し、送信シフトレジスタ(TSR)が空になるまで待機します。

次の文字配列は、タグ記号を使って温度湿度値を発声させるためのものです。それぞれを組み合わせることで、0~99を表現できます。タグ記号(棒読み)は、<NUMK VAL=(数値)> の書式で表され、数値を直接指定すれば読み上げてくれます。

次はメインループ部です。発声シーケンスでは、温度値、湿度値を10の桁と1の桁の2つに分けてそれぞれ発声させます。

例えば、温度値(Temp)の10の桁(TM10)と1の桁(TM01)は次式で求められます。

次にTM10とTM01からswitch文で分岐先を指定します。分岐先のcase定数式に、先述した数字音声記号をそれぞれ配置し、10の桁と1の桁に対応する数値を発声します。湿度の発声も同様です。

結果

ブレッドボードに下図の回路を組んで実験しました。(LCDは温度湿度値のモニター)
動画(ここ)では、ATP3012が温度と湿度を正確に読み上げていることが分かります。

まとめ

今回は、温度湿度の発声を試しましたが、ネットワークにつながるシングルボード・コンピュータをホストにして、Webから日時や気象情報を取り込んで読み上げれば、目の不自由な人にも役立つガジェットになるでしょう。他にも、音声で応える玩具やゲームにも使えそうです。色々なアイデアや使い方を試してみるのも面白いと思います。

– 以上 –