音声合成LSI(ATP3011F4-PU)を使ってみます

〔マイコンのトップに戻る〕


以前こちらの録音・再生IC(APR9600)を使って遊んだ事が有るのですが、音質により30秒〜60秒の
再生が可能で最大8メッセージを録音してスイッチにより任意なメッセージを再生可能と言う物です。
(8メッセージを録音する場合は、最大60秒設定なら1メッセージ辺り7秒程です) *5)

で、発声させたい声をいちいち録音させないといけないと言うメンドクサイ事を行わないとだめで、
それ故、録音回路が必要で有り、ちょっとぉ大変でした。
(こちらのキットを見て下さいこれだけの部品が必要と言う事ですよ)
まあ、肉声や色々な音が再生可能と言う所がメリットでは有るのですけどね。

そこでぇ、本日のこちらの商品。ヾ(゚ー゚ヾ)^ Σ\( ̄ー ̄;)オイオイ テレビショッピングじゃ〜ないやねん

秋月電子で販売の音声合成LSI(ATP3011F4-PU)をいじって見ようと思います。
このLSIは株式会社アクエスト(AQUEST)が"Atmel ATmega328P(Arduino)"のチップに音声合成コア
"AquesTalk pico"を乗せた物で、テキスト(ローマ字文字)を音声に変換出力する音声合成LSIです。
なので、ホストからUART/I2C/SPIの何れかでテキスト文字を送るだけです、
しかも外付け部品は不要ですよ(大きく鳴らしたいならアンプ回路は必要)。
後、最大15個のメッセージを登録可能です、それに2種類のチャイム音も持っています。

アクエストのこちらのHPで製品毎のサンプル音声を確認できます。
今回はATP3011F4-PUと言う製品をいじっています、データシートはこちらです。

尚、”かわいい系の女声”につられてATP3011F4-PUを買ったのですがぁ、ATP3012F5-PUの方が音質
は良いようです、でも、ATP3012F5-PUは外付けセラミック発振子(10MHz/16MHz)が必要。

《実験1》

ATP3011F4-PUピン構成図
左がATP3011F4-PUのピン構成図です。

8/22番をGNDに配線して、7/20番をVCC(2.5-5V)の+電源に接続です。
AOUT(12)端子が音声出力なのでスピーカに配線します。
また、このLSIを組み込む場合は、VCC-GND間に0.1uFコンデンサ
(バイパスコンデンサ)を取り付けた方が良いでしょう。

UART通信を行うなら2-3番を利用し、I2C通信なら27-28番を使い、
SPI通信では16-19番ピンにそれぞれ配線します。

PMOD0(14)/PMOD1(15)端子は動作モードの選択スイッチです。
SMOD0(4)/SMOD1(5)端子は通信モードの選択スイッチです。
PLAY(13)端子は音声発声中は信号がLOWになります。


実験1の配線図  とにかく音声を発声させて見ます、
 このLSIには予め15個のプリセットメッセージが
 登録されているのでこれを発声させましょう。
 (プリセットメッセージは変更可能です)

 スピーカの端子は極性なし、何方側でもOK。
 また、スピーカは(8Ω 8W)で実験しています。

 動作モードを"デモモード"に設定します、
 これは14・15番端子をGNDに配線です。

 さぁ、これでOK、電源を繋げれば
 メッセージが繰り返し流れるでしょう。


動作モードについて

PMOD0(14)/PMOD1(15)端子の組み合わせで行います、動作中には変更できません。

PMOD0 PMOD1 動作モード 説明
1 1 コマンド入力モード シリアル通信(UART/SPI/I2C)でメッセージを出力します
0 1 セーフモード EEPROMの設定に関わらず、UARTを9600bps にして、
I2Cのアドレスを2Ehとしてシリアル通信を行うモードです
1 0 スタンドアロンモード プリセットメッセージをPC0-PC3の端子操作で発声さ せます
0 0 デモモード 全てのプリセットメッセージを繰り返して発声させます
ちなみに、0はGNDに配線、1はVCC(5V)に配線ですよ。
尚、USARTの通信速度を9600bps以外に、又、I2Cのアドレスを2Eh以外で行う場合はモードは
"コマンド入力モード"にし、PicoRomWriterツールを利用してEEPROMを書き換える必要が有ります。

通信モードについて

SMOD0(4)/SMOD1(5)端子の組み合わせで行います、動作中には変更できません。

PMOD0 PMOD1 通信モード
1 1 UART
0 1 I2C
1 0 SPI(MODE3)
0 0 SPI(MODE0)
MODE0:クロックの極性はLOWで、アイドル0Vで、5V->0Vに変化で転送するモード。 *4)
MODE3:クロックの極性はHIGHで、アイドル5Vで、5V->0Vに変化で転送するモード。 *4)

《実験2》

では次にメッセージを送信して発声させて見ましょう。

この音声合成LSIはチップに"Atmel ATmega328P"を使っているので互換性が有ります、だからぁ、
Arduinoボードを持っている人は、ボードのATmega328とこのLSIを差換える事が出来ます。
その後は、ArduinoIDEのシリアルモニター画面を起動させメッセージを送れば簡単に発声させる事が
可能です。
その方法はデータシートの15頁を見て下さい、 またこちらアクエストのHPでその動画も有ります。

ここでは前回FT232RLモジュールを記事にしたので、それを使った場合の記事を紹介して置きます。
なので、FT232RLモジュールの話は前回の記事を参照下さい。

実験2の配線図  電源はUSBからの電源5Vを使用します。
 LEDはパソコンからメッセージが送られて来たら
 点灯します。

 PMOD0(14)/PMOD1(15)端子の動作モードは、
 "セーフモード"(左図の青色線)に設定です。
 SMOD0(4)/SMOD1(5)端子の通信モードは、
 "UARTモード"(左図の緑色線)に設定しています。

あ、しまったぁ、肝心のスピーカを配線するのを
忘れました、上の配線図を参考にしてね m(_ _)m

実験2の実行図  "Tera Term"を起動させましょう。
 設定を変更します、[Setup]→[Terminal...]をクリックし
 設定画面を表示させます。
 "Receive:"を"CR+LF" へ 、"Local echo"にチェックを
 入れます。
 では、左の文字を打ち込み後[Enter]を押しましょう。
 さぁ、Let's try みたいなぁ、(*^^*)
 いや、ちょっとぉこれ恥ずかしいから ヾ(- -;)
 いちどぉ、言われてみたくてぇ (*´σー`)ゞ  ┐(-。ー;)┌


コマンドフォーマット

xxxx[CR]でxxxは ASCII 文字列(音声記号列)です、文字列の最期はCR(0x0D)を送信します。
フォーマットの長さは127バイトです。
例えば、"ohayo[CR]" なら[CR]を受信した時点で "おはよ"の発声が始まります。
詳しい音声記号列の記述方法はデータシートの16頁以降を読みましょう。

*が表示されたらLSIは今発声中でBusy状態です。
>が表示されたら発声終了、またはコマンドに対する正常応答でReady状態です。
E???(???は数字)が表示されたら指示に対するエラーです、
例えばE105ならメッセージ音声記号列に未定義の読み記号が指定されたとなります。
(エラーの場合は発声はされません)

Pico Rom Writer について

音声合成LSIの内臓EEPROMには各種設定情報が書き込まれています、
この内容を変更する為のツールがPico Rom Writer です。
Pico Rom Write はアクエスト社のこちらのHPからダウンロード出来ます。

設定は、USARTの通信速度・I2Cのアドレス・発話速度変更やプリセットメッセージの登録に
チャイム音の編集などが行えます。
また、プリセットメッセージとチャイム音はテストでPCから鳴らせます、
なのでこれで音声記号列のチェックが出来るでしょう。

《実験3》

こんどは音声合成LSIとPIC12F1822を接続して、
USART/I2C/SPI とそれぞれのモードでプログラミングをして見ます。

(SPI)

PICピン構成図(SPI)  PIC12F1822のピン構成図です。

 SPI接続のSDO端子は7番/3番が有りますが
 今回は7番ピンを使用しています。
 音声合成LSIをセレクト(SS)する端子は
 RA4(3番)ピンを使用しています。


実験3の配線図(SPI)  動作モードは"セーフモード"
 通信モードは"SPI(MODE0)"
 に設定しています。

 ちなみに、電源3.3Vでも動作は
 します、音声が小さくなるけどね。

 尚、SPIの基本概要等はこちら
 参照ください。

(SPI用ダウンロードプログラムについて)

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
ATP3011-SPI.lzh(ver 1.00)
ATP3011-SPI.lzh("skSPIlib.c"を変更 2014/09/27) *2)
ATP3011-SPI.lzh ライブラリとMPLAB X用に変更 *3)
ATP3011-SPI.lzh("skSPIlib"を変更) *4)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *3)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
ATP3011.c・・・・・・・・・ 本体のサンプルプログラムソースファイル *3)
skATP30xx.c・・・・・・・ 音声合成LSIとSPIで通信を行うライブラリ関数ソースファイル *4)
skATP30xx.h・・・・・・・ 音声合成LSIとSPIで通信を行う関数のヘッダファイル
skSPIlib.c・・・・・・・・・・ SPI通信を行うライブラリ関数ソースファイル *3) *4)
skSPIlib.h・・・・・・・・・・ SPI通信を行う関数のヘッダファイル *3) *4)

ATP3011.c

このサンプルプログラムは約5秒毎にチャイムが鳴り音声を1話発声と言う事を繰り返すだけです。

SPI信号のSDI(RA2:5番)端子はTRISAレジスタにてデジタル入力に設定して下さい。
TRISA = 0b00000100 ;   // RA2(SDI)ピンは入力、その他は出力に割当(SPI時の設定)

skATP30xx.c

音声合成LSIとSPIで接続して通信を行う為のライブラリ関数集です、
この関数集にはskSPIlib.c/skSPIlib.hのファイルが必要です。

 Talk_Init( )
  音声合成LSIをSPIで接続する為の初期化処理です
  音声合成LSIのSPIでの最大クロックは1MHzとなっていますが、FOSC(8MHz)/16なら500KHzで
  OKと思えますが上手く行かなくてFOSC(8MHz)/64にしたらOKでした。
  (ちなみにArduinoではFOSC(16MHz)/16で動作したのですがぁ....)

 ans = Talk_MessageOut(sw,*msg)
  音声合成LSIにメッセージデータを送信する処理です
  送信可能メッセージの長さは127byteまでとします。
   sw  :メッセージの発生が終了するまで待つなら=1 待たないなら=0
   *msg :送信するメッセージデータを格納した変数を指定
   ans  :0=Ready -1=送信したデータに対するエラー -3=指定のメッセージが長すぎる
       (−1のエラー時はTalk_ERRcode変数にエラーコード(Exxx)が保存されます)
  例)
       ans = Talk_MessageOut(1,"o'hayo-") ;
       if (ans == -1) {
            printf(Talk_ERRcode) ;
       }

 ans = Talk_ChimeOut(kind)
  音声合成LSIのチャイムを鳴らせる処理です
  登録チャイムは2種類で、チャイムが鳴り終わるまで待ちます。
   kind :鳴らせるチャイムの種類を指定します('J'か'K'を指定)
   ans :0=Ready -1=送信したデータに対するエラー

 InterTalk( )
  音声合成LSIのSPI関連の割り込み処理です。
  この関数は、メインプログラム(例"ATP3011.c")の割込み処理で必ず呼びます。
 *2)

skATP30xx.h

音声合成LSIとSPIで通信を行う為のライブラリ用のヘッダファイルです。
"skATP30xx.c"を利用する場合に
#include "skATP30xx.h" をメインプログラムの先頭で記述して下さい。

又、下記の様に記述されています、クロック周波数やSDO/SSピンを変更する場合は書換えて下さい。
#define _XTAL_FREQ 8000000    // 使用するPIC等により動作周波数値を設定する
#define ATP30XX_SDO 7         // 音声合成LSIに接続しているPICのSDO端子番号
#define ATP30XX_SS  RA4       // 音声合成LSIに接続しているPICのSSピンデジタル番号

skSPIlib.h *3)

SPI通信を行う関数のヘッダファイルです。
"skSPIlib.c"を利用する場合に
#include "skSPIlib.h" をプログラムの先頭で記述して下さい。

デフォルトではMSSP1を使う様になりますが、PICによってはMSSP2が有ります。
MSSP2側を使う場合は、"#define SPI_MSSP2_USE"を記述して下さい。

skSPIlib.c *3)

このライブラリはSPI通信を行う為の関数集です。
この関数集は、PIC12F1822/PIC16F18xx/193x/PIC18F2xK22で使用出来ます。

SPI通信を行う関数の使い方を説明します。

SPI_Init(mode,divider,sdo)
 SPIモードの設定と初期化を行う処理
  mode   :SPIの転送モードを設定します(クロック極性とクロック位相の組み合わせ) *4)
        SPI_MODE1 = クロック極性(0:LOW) クロック位相(0:アイドル0Vで、0V->5Vに変化で転送)
        SPI_MODE0 = クロック極性(0:LOW) クロック位相(1:アイドル0Vで、5V->0Vに変化で転送)
        SPI_MODE3 = クロック極性(1:HIGH) クロック位相(0:アイドル5Vで、5V->0Vに変化で転送)
        SPI_MODE2 = クロック極性(1:HIGH) クロック位相(1:アイドル5Vで、0V->5Vに変化で転送)
  divider :SPIの通信速度を設定します
        SPI_CLOCK_DIV4   = Fosc/4 (PIC動作周波数の4分の1で動作)
        SPI_CLOCK_DIV16  = Fosc/16 (PIC動作周波数の16分の1で動作)
        SPI_CLOCK_DIV64  = Fosc/64 (PIC動作周波数の64分の1で動作)
        SPI_CLOCK_DIVT2  = TMR2の出力の1/2 (タイマー2の速度で動作)
        SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
  sdo     :使用するSDO送信のピン番号を指定する

SPI_setDataMode(mode)
 SPIの転送モード設定を行う処理
  mode   :SPIの転送モードを設定します(上記参照)

SPI_setClockDivider(divider,rate)
 SPIの通信速度設定を行う処理
  divider :SPIの通信速度を設定します(上記参照)
  rate    :SSPxADDに設定するクロック分周値(SPI_CLOCK_DIVADDを指定する場合に設定する値)
       SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
       rate=0は指定不可です、”SPI_CLOCK_DIV4”を使いましょう。

ans = SPI_transfer(dt)
 SPI通信でのデータ送信とデータ受信を行う処理
  dt  : 8ビットの送信するデータを指定します
  ans: 8ビットの受信したデータを返します

(I2C)

PICピン構成図(I2C)  PIC12F1822のピン構成図です。

 I2C接続のSCL端子は6番、SDA端子は
 5番です。


実験3の配線図(I2C)  動作モードは"セーフモード"
 通信モードは"I2Cモード"
 に設定しています。

 I2C用プルアップ抵抗は5KΩと
 データシートに書いて有りますが
 手持ちから1KΩにしています。

 又、電源3.3Vでも動作はします。

 尚、I2Cの基本概要等はこちら
 参照ください。

(I2C用ダウンロードプログラムについて)

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
ATP3011-I2C.lzh
ATP3011-I2C.lzh ライブラリとMPLAB X用に変更 *3)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *3)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
ATP3011.c・・・・・・・・・ 本体のサンプルプログラムソースファイル *3)
skATP30xx.c・・・・・・・ 音声合成LSIとI2Cで通信を行うライブラリ関数ソースファイル *3)
skATP30xx.h・・・・・・・ 音声合成LSIとI2Cで通信を行う関数のヘッダファイル
skI2Clib.c・・・・・・・・・・ I2C通信を行うライブラリ関数ソースファイル *3)
skI2Clib.h・・・・・・・・・・ I2C通信を行う関数のヘッダファイル *3)

ATP3011.c

このサンプルプログラムは約5秒毎にチャイムが鳴り音声を1話発声と言う事を繰り返すだけです。

I2C信号のSCL(6番)端子とSDA(5番)端子はTRISAレジスタにてデジタル入力に設定して下さい。
TRISA = 0b00000110 ;   // ピンはRA1(SCL)/RA2(SDA)のみ入力(I2C時の設定)

skATP30xx.c

音声合成LSIとI2Cで接続して通信を行う為のライブラリ関数集です、
この関数集にはskI2Clib.c/skI2Clib.hのファイルが必要です。

 Talk_Init( )
  音声合成LSIをI2Cで接続する為の初期化処理です
  I2Cのマスターモードで、通信クロックは100KHz(CPU8MHz)で初期化しています。
  (音声合成LSIのI2C通信最大クロックは400KHzとなっています)

 ans = Talk_MessageOut(sw,*msg)
  音声合成LSIにメッセージデータを送信する処理です
  送信可能メッセージの長さは127byteまでとします。
   sw  :メッセージの発生が終了するまで待つなら=1 待たないなら=0
   *msg :送信するメッセージデータを格納した変数を指定
   ans  : 0=Ready -1=送信したデータに対するエラー -2=I2C関連のエラー
       -3=指定のメッセージが長すぎる
       (−1のエラー時はTalk_ERRcode変数にエラーコード(Exxx)が保存されます)

 ans = Talk_ChimeOut(kind)
  音声合成LSIのチャイムを鳴らせる処理です
  登録チャイムは2種類で、チャイムが鳴り終わるまで待ちます。
   kind :鳴らせるチャイムの種類を指定します('J'か'K'を指定)
   ans  :0=Ready -1=送信したデータに対するエラー -2=I2C関連のエラー

 InterTalk( )
  音声合成LSIのI2C関連の割り込み処理です。
  この関数は、メインプログラム(例"ATP3011.c")の割込み処理で必ず呼びます。

skATP30xx.h

音声合成LSIとI2Cで通信を行う為のライブラリ用のヘッダファイルです。
"skATP30xx.c"を利用する場合に
#include "skATP30xx.h" をメインプログラムの先頭で記述して下さい。

又、下記の様に記述されています、クロック周波数やI2Cアドレスを変更する場合は書換えて下さい。
#define _XTAL_FREQ 8000000    // 使用するPIC等により動作周波数値を設定する
#define ATP30XX_ADRS 0x2E     // 音声合成LSIのI2Cアドレス
skI2Clib.c/skI2Clib.h *3)

I2C通信を行う為の関数集です。
この関数集は12F1822/16F182x/16F193x/18F25K22系で利用可能です、
又、SSP1/SSP2何方でもOKです。
関数集の使い方はこちらを参照下さい。

(USART)

PICピン構成図(USART)  PIC12F1822のピン構成図です。

 USART接続のRX/TX端子は6番/7番が有ります
 が、今回は2番/3番ピンを使用しています。
 LSIからの返答を無視するならTXピン1本でも
 良いと思います。


実験3の配線図(USART)  動作モードは"セーフモード"
 通信モードは"UARTモード"
 に設定しています。

 又、電源3.3Vでも動作はします。

 尚、USARTの基本概要等は
 こちらを参照下さい。

(USART用ダウンロードプログラムについて)

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
ATP3011-UART.lzh
ATP3011-UART.lzh ライブラリとMPLAB X用に変更 *3)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *3)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
ATP3011.c・・・・・・・・・ 本体のサンプルプログラムソースファイル *3)
skATP30xx.c・・・・・・・ 音声合成LSIとUSARTで通信を行うライブラリ関数ソースファイル
skATP30xx.h・・・・・・・ 音声合成LSIとUSARTで通信を行う関数のヘッダファイル
skUARTlib.c・・・・・・・・ USART通信を行うライブラリ関数ソースファイル *3)
skUARTlib.h・・・・・・・・ USART通信を行う関数のヘッダファイル *3)

ATP3011.c

このサンプルプログラムは約5秒毎にチャイムが鳴り音声を1話発声と言う事を繰り返すだけです。

USART信号のRX(2番)端子はTRISAレジスタにてデジタル入力に設定して下さい。
TRISA = 0b00100000 ;   // RA5(RX)ピンは入力、その他は出力に割当(USART時の設定)

skATP30xx.c

音声合成LSIとUSARTで接続して通信を行う為のライブラリ関数集です、
この関数集にはskUARTlib.c/skUARTlib.hのファイルが必要です。

 Talk_Init( )
  音声合成LSIをUSARTで接続する為の初期化処理です
  通信速度は9600bps、8ビット、1ストップビット、ノンパリティで初期化されています。
  音声合成LSIの通信速度は400〜76800bpsに変更可能ですが、音声合成LSIにボーレート自動設定
  を行う為のコマンドを発行しないとダメです、ここではその処理を行っていないので動作モードを
  "セーフモード"としています。

 ans = Talk_MessageOut(sw,*msg)
 ans = Talk_ChimeOut(kind)
 InterTalk( )
  SPIの所を参照下さい、同じです。

skATP30xx.h

音声合成LSIとUSARTで通信を行う為のライブラリ用のヘッダファイルです。
"skATP30xx.c"を利用する場合に
#include "skATP30xx.h" をメインプログラムの先頭で記述して下さい。

又、下記の様に記述されています、クロック周波数やRX/TX/ボーレートを変更する場合は書換えて下さい。
#define _XTAL_FREQ  8000000   // 使用するPIC等により動作周波数値を設定する
#define ATP30XX_RX  2         // 音声合成LSIに接続しているPICのRX端子番号
#define ATP30XX_TX  3         // 音声合成LSIに接続しているPICのTX端子番号
#define ATP30XX_BRG 51        // USART通信のボーレートを指定(9600bps)
尚、ボーレートの指定方法は、USARTの基本概要を参照下さい。

skUARTlib.c/skUARTlib.h *3)

USART通信を行う為の関数集です。
この関数集自体は現在 12F1822 16F1823/1826/1827 16F1938/19xx に対応しています。
その他に、16F1705 16F1825/1829 18F2xK22(USART1/2) 1814K50 18F8722でも動作するでしょう。
関数集の使い方はこちらを参照下さい。

《その他》

実験風景  左はPIC12F1822からUSARTで接続した
 時の実験写真です。

 んん、やはり業務的な声って言うかぁ、
 一本調的って言うかぁ、もう少し抑揚が
 有ればなぁ....

 登録したプリセットメッセージは、
 PC0-PC3端子4本配線しないとダメで、
 シリアル通信のコマンドでこれを
 発声させれば配線(I2C/UART)が少なく
 なる様な気がするのですがぁ....
 コマンド追加して欲しいなぁ....

 SDカードに音声記号列を書き込み、
 読み込んで発声させれば良いかもね。
 あ、SDカードはSPI接続になるから
 音声合成LSIもSPI接続かぁ?

 音声を大きく鳴らすアンプ回路は、
 データシートの14頁を参照するか
 他のサイトさまを検索して下さい。

音声認識の話は、”音声認識組込みモジュール(SR-MOD100)を使ってみます”(PIC編) (Arduino編)
参照下さい。 *1)



リンク切れ見直し(*5) 2017/01/12
"skSPIlib"のSPI_MODEのCKE(クロック位相)を変更(*4) 2016/06/16
ライブラリとMPLAB X用に変更(*3) 2015/10/27
"skSPIlib.c"を変更(*2) 2014/09/27
追記(*1) 2013/11/01


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.