« AquesTalk pico(テキストを音声に変換するLSI) のテスト | トップページ | AquesTalk pico (テキストを音声に変換するLSI) で 数字を読み上げ »

2012年1月 9日 (月)

AquesTalk pico (テキストを音声に変換するLSI) の I2C 制御

AQUEST社 の AquesTalk pico LSI ATP3010F4 をI2Cで制御することができました。

■この LSI を I2Cで制御する上での注意点
 1.SMOD0 をLOW(アースに接続)する
 2.SDA, SCL 信号線をプルアップする

■環境
 ・Auduino ハード:Aurduino UNO Rev.3
 ・Auduino IDE  : Ver. 1.0

写真及び回路図は以下の通りです。

Pico_i2c

Pico_i2c_3

なるべくシンプル(短い行数)で書いたスケッチ

//
// 本プログラムは Picoを I2C 経由で操作するプログラムです
//

 #include <Wire.h>
#define PICO_I2C_ADDRESS 0x2E                       // PicoのデフォルトのI2Cアドレス 

void setup(){
    Wire.begin();                                                 // Arduino側をI2C Masterとして初期化   
}

 void loop(){
    isReady();                                                    // Ready待ち
    Wire.beginTransmission(PICO_I2C_ADDRESS);
   
Wire.write("aiueo\r");                                    // 「あいうえお」発声。音声コマンドの最後に'¥r'必須
    Wire.endTransmission();                                 // Picoへ送信       
    delay(3000);                                                // 発声が連発するとうるさいので delay 挿入
}
 

//
// PicoがRedyになるのを待つ
//
void isReady(){
    do{
        Wire.requestFrom(PICO_I2C_ADDRESS, 1);   // 1バイト要求
        while(Wire.available() > 0){
            if(Wire.read() ==
'>') return;                   // 正常ならここからループアウト
            delay(10);                                          // Busy応答は10msec以上待つ必要がある
        }
    }while(true);                                               // 無限ループ
}

デバッグ用になるべくスケッチ実行経過と異常値を Serial でPC に通知するようにしたスケッチ
Serial.println関数の出力はArduino IDEのシリアルモニターで見れます。

//
// なるべく異常を Serial で通知するようにしたスケッチ
// 本プログラムは以下を元にして書きました
//
// aqtkpico_i2c - I2C通信で AquesTalk Pico LSIを操作するArdionoスケッチ   
// by N.Yamazaki AQUEST Corp.  <
http://www.a-quest.com> 

#include <Wire.h>
#define I2C_ADDR_PICO 0x2E                           // PicoのデフォルトのI2Cアドレス
int COUNT = 1;

void setup(){
    Serial.begin(9600);
    Wire.begin();                                                // Arduino側をI2C Masterとして初期化   
}

void loop(){
   
Serial.println(COUNT++);                               // 実行回数
    if(isReady_Pico()){                                        // Ready待ち
        Pico_Synthe();                                         // 発声コマンド送出   
    }
    delay(3000);                                                // 発声が連発するとうるさいので delay 挿入
   
Serial.println("");                                          // 改行
}

//
// Picoにローマ字音声記号列(コマンド)を送信
//
void Pico_Synthe(){
   
Serial.println("Pico_Synthe --->");
    Wire.beginTransmission(I2C_ADDR_PICO);
    const char TALK[]=
"aiueo\r";                               // コマンドの最後のCR('¥r')を忘れずに
    if(sizeof(TALK)<32){                                   // Wireの制約で、一度に送れるのは32byteまで(未確認)
        Wire.write(TALK);   
    }else{
       
Serial.println("ERROR : sizeof(TALK) over 32");    // TALK に設定する文字数を32未満にして下さい
    }
    Wire.endTransmission();                                          // Picoへ送信
   
Serial.println("<--- Pico_Synthe");
}

//
// PicoがRedyになるのを待つ
//
boolean isReady_Pico(){
   
Serial.println("isReady_Pico --->");
    char buff[20];   
    for(;;){
        Wire.requestFrom(I2C_ADDR_PICO, 1);
        if(Wire.available()>0){
            byte c = Wire.read();
            if(c==
'>'){
                break;                                                   
  // 正常ならここからループアウト
            }else if(
c=='*' || c==0xFF){                               // pico が処理中の時はここに来る
               
sprintf(buff, "WAIT : %.2X",c);
                Serial.println(buff);          

                delay(10);                                                 // Busy応答は10msec以上待つ必要がある
            }else{
               
sprintf(buff, "ERROR : read value = %.2X",c); // 返値が予想外
                Serial.println(buff);   
            
                delay(1000);
            }
        }else { // NOACK または応答がなかった時            
            
Serial.println("ERROR : Wire.available()<=0");    // Picoが動いていない可能性が高い
            return false;                                                 // ERROR
        }
    }
   
Serial.println("<--- isReady_Pico");
    return true;                                                        // OK
}

■リンク
 ・回路及びスケッチは N.Yamazaki さんの以下のブログを参考にしました
   
N.Yamazaki's blog > [Arduino] AquesTalk pico LSI を SPI で制御する

 ・この回路で音声が出ない場合、ここに書いた pico のデモモードを試してみてください

« AquesTalk pico(テキストを音声に変換するLSI) のテスト | トップページ | AquesTalk pico (テキストを音声に変換するLSI) で 数字を読み上げ »

電子工作」カテゴリの記事