N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
[AquesTalk pico LSI] UARTボーレート設定の注意点
音声合成LSI ATP3011F4をUART経由で動かすときの注意点です。
(I2CやSPIでは当てはまりません)

ATP3011F4は、リセット後にホストからの'?'を受信することで、ボーレートを認識して自身のボーレートを調整するようになっています。

今回は、この時のLSIの動作タイミングについて少し詳しく書いておきます。

まず、リセット後(電源投入後)、内部クロックが安定するまで約65msec待ってからLSIが動き出します。LSI内部の初期化処理は殆ど時間がかからないので、基本的にこの時間経過後からRXD端子が受信可能になります。データシートではクロックの誤差等のマージンを考えて80msec以降と記述しています。

ボーレートはLSIの起動直後のRXD端子の立ち上がり"間隔"で検出しています。そのため'?'を送信する前に他の文字を送ったり、RXD端子が不安定な電圧レベルであると、正しくボーレートが同期できなくなります。

見過ごしがちな点は、RXD端子が受信可能になる前にHIレベルに安定させておく必要がある事です。具体的にはリセット後50msec以内にHIレベルに安定させればよいでしょう(65msecのマージンをとって50msec)。
この点は、ソフト制御のUARTでは特に注意が必要です。リセット後のポートは入力端子として初期化されることが多いので、この場合、リセット直後はRXD端子が浮いた不安定な状態になり誤動作の原因となります。これはRXD端子のプルアップで解決できますね。

ちなみに、Arduinoはリセット後からスケッチが動き出すまで、かなりの時間を要しますのこの点も注意してください。

注意事項のまとめ
その1:リセット後50msec以内にRXD端子をHIに安定させる。
その2:リセット後80msec経過してから'?'を送る。

ところで、本来は、ボーレートをEEROMなどで固定値に設定するような仕様にしたかったのですが、(ATmega328の)内蔵クロックの精度が+-10%と非常にバラついているため、このような仕様になっています。

| AquesTalk pico LSI | 13:30 | - | - |
[AquesTalk pico LSI] ATP3011F4とATP3010F4の違い


ATP3011F4-PUは、音声合成LSI AquesTalk picoの新バージョンです。
ATP3010F4からの主な変更点は次のとおりです。

  • 電源電圧
    2.5Vから動作するようになりました。(ATP3010F4は3.8Vから)

  • クロック
    外付発振子から内蔵クロックにし、外付け部品をなくしました。

  • スリープ機能
    SLEEP端子をLOWにすることで待機時消費電流を1μA程度まで下げることができます。

なお、内蔵クロックの精度が良くないため、UARTのボーレートは自動調整となりました。
ボーレート設定には、通信に先立ち、ホストから'?'を送信する必要があります。ATP3010F4から置換の場合は、ご注意ください。
| AquesTalk pico LSI | 19:04 | - | - |
[Arduino] AquesTalk pico LSI を SPI で制御する
 音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4/ATP3011F4)は、UARTの他にI2CやSPIのインターフェースを持っています。
一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。
ココまでは、前回(I2C)と同じ。

今回は、SPIを使ってAquesTalk pico LSIを動かす方法を示します。

配線



通信モードをSPI(Mode0)にするため SMOD0(4pin), SMOD1(5pin)をGNDに接続、
ATP3010F4とArduinoのSPI接続は次のとおり。
SCK(19pin)   <-> D13
MISO(18pin) <-> D12
MOSI(17pin) <-> D11
/SS(16pin)    <-> D10

サンプルスケッチ

このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。

注意点が3つあります。
1. スレーブセレクト(/SS)は、独自に実装する必要があります。
今回のスケッチでは、Arduinoのpin10をこれに割り当てて、転送の開始時にLowに、終了後にHiにするようにしています。

2. SPIのバイト転送毎に10μsec以上間隔をあける必要があります。これはATP3010F4の制限によるものです。

3. 発声の終了はポーリングで確認する必要があります。
ダミーデータ0xFFを送って'>'が返るのを待ちます。
なお、ポーリングの間隔は10ms以上あけてください。

aqtkpico_spi.ino ダウンロード (コピペは"¥”にゴミが入ることがあるのでソースはダウンロードがおすすめ)
/////////////////////////////////
// aqtkpico_spi - SPI通信で AquesTalk Pico LSIを操作するArdionoスケッチ
//	 
// by N.Yamazaki AQUEST Corp.  <http://www.a-quest.com>

#include <SPI.h>

// pin10をSPIのスレーブセレクト端子(SS)とする 配線に応じて変更可
const int slaveSelectPin = 10;

// ローマ字音声記号列
//	 コマンドの最後のCR('¥r')を忘れずに
const char *TblKoe[] = {
"konnnichiwa¥r",
"yukkurisiteittene¥r",
"akuesuto-ku/pi'ko ba-jyonn <ALPHA =01a>.¥r",
"dennwaba'nngo-wa <NUM VAL=01-2345-6789>desu.¥r",
"<NUMK VAL=16 COUNTER=di>;<NUMK VAL=5 COUNTER=funn>/<NUMK VAL=35 COUNTER=byo->desu.¥r",
"#J¥r", // チャイム音J
"#K¥r", // チャイム音K
};

void setup()
{
	// pin10を出力に設定
	pinMode (slaveSelectPin, OUTPUT);

	// SPIの初期化
	SPI.begin(); 
	SPI.setClockDivider(SPI_CLOCK_DIV16); // 最大クロックは1MHz(16MHz/16)
	SPI.setBitOrder(MSBFIRST);	// MSBファースト
	SPI.setDataMode(SPI_MODE0);	// SPIモード0	SMOD1:0 SMOD0:0
//	SPI.setDataMode(SPI_MODE3); // SPIモード3	SMOD1:0 SMOD0:1

	Serial.begin(9600);
}

void loop()
{
	int iret;
	for(int iMsg=0; iMsg<sizeof(TblKoe)/sizeof(char*); iMsg++){
		// Ready待ち
		iret = Pico_WaitReady();
		if(iret==0){
			Serial.print("OK¥n");
		}
		else { // Error
			Serial.print('E');
			Serial.print(iret);
			Serial.print('¥n');
		}

		// コマンド送出
		Pico_Synthe(TblKoe[iMsg]); 
	}
}

/////////////////////////////
// Picoにコマンド送信
// 音声合成開始	引数に音声記号列を指定
// コマンド送出後、発声の終了を待たずに戻る
void Pico_Synthe(const char *koe)
{
	// SS端子をLOWに
	digitalWrite(slaveSelectPin,LOW);

	const char *p = koe;
	for(;*p!=0;){
		Pico_SPI_trans(*p++);
	}

	// SS端子をHIに
	digitalWrite(slaveSelectPin,HIGH);
}

/////////////////////////////
// PicoがRedyになるのを待つ
// コマンドが受信可能な状態(音声合成の終了)になるのを待つ
// return 0:正常終了 それ以外:エラー(エラーコード)
int Pico_WaitReady()
{
	int iret=0;

	// SS端子をLOWに
	digitalWrite(slaveSelectPin,LOW);

	for(;;){
		byte c = Pico_SPI_trans(0xff); // 0xffはダミーデータ

		 //!!  '¥r'後の最初の応答は常に'*'になるという制約有り
		if(c=='>')	break;
		else if(c=='*' || c==0xff){
			// スレーブが処理中なのでしばらく放っておく
			delay(10);		// ポーリング間隔は10ms以上
		}
		else if(c=='E'){ // 何らかのエラーを返した
			char sErr[4];
			sErr[0] = Pico_SPI_trans(0xff);
			sErr[1] = Pico_SPI_trans(0xff);
			sErr[2] = Pico_SPI_trans(0xff);
			sErr[3]=0;
			iret = atoi(sErr);
		}
	}
 
	// SS端子をHIに
	digitalWrite(slaveSelectPin,HIGH);
	return iret;
}

/////////////////////////////
// SPI で1バイトの転送(双方向)
byte Pico_SPI_trans(byte c)
{
	delayMicroseconds(20);// バイト毎の転送間隔は10usec以上必要
	return SPI.transfer(c);
}



応用

ここでは、Arduino側の/SS端子をpin10にしましたが、他の端子でもかまいません。変更した場合は、スケッチの slaveSelectPin の値もそれに合わせて変更してください。

SPIのクロックは1MHz以下であれば良いので、スケッチの SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 にしても構いません。

SPIMode0
の代わりにSPIモード3を使う場合は、スケッチのSPI_MODE0SPI_MODE3に変更し、SMOD0端子はオープンにします。
 
| AquesTalk pico LSI | 16:06 | - | - |
[Arduino] AquesTalk pico LSI を I2C で制御する
音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4/ATP3011F4)は、UARTの他にI2CやSPIのインターフェースを持っています。
一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。

今回は、I2Cを使ってAquesTalk pico LSIを動かす方法を示します。
(SPIを使う場合はこちら

配線



通信モードをI2CにするためSMOD0(4pin)をGNDに接続、
I2C通信のSCL(28pin)をArduinoのA5に、SDA(27pin)をA4に接続します。
また、このSCLとSDAは、4.7KΩ程度でプルアップ(VCCに接続)します。

サンプルスケッチ

このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。

注意点は、ArduinoのWireライブラリが1度に32byteまでしか送信できない制限があるようです(arduino-022)。
また、I2Cでは発声の完了が通知されないので、ポーリングで確認する必要があります。
そして、ATP3010F4の制限によりポーリングの間隔は10ms以上あけて行います。

実際の応用では、動的にメッセージの単語を入れ替えたり、さまざまな数値を読ませるのも良いと思います。
特に数値に関しては、単位(助数詞)を指定することで「一本、二本、三本」を「いっぽん、にほん、さんぼん」などと、読みやアクセントを正しく読む機能を持っていますので、是非ご利用ください。このあたりの詳しくは、データシートの音声記号列仕様に書いてあります。

aqtkpico_i2c.ino ダウンロード
(コピペは"¥”にゴミが入ることがあるのでソースはダウンロードがおすすめ)
/////////////////////////////////
// aqtkpico_i2c - I2C通信で AquesTalk Pico LSIを操作するArdionoスケッチ
//   
// by N.Yamazaki AQUEST Corp.  

#include 
#define I2C_ADDR_PICO 0x2E // PicoのデフォルトのI2Cアドレス

// ローマ字音声記号列
//   コマンドの最後のCR('¥r')を忘れずに
const char *TblKoe[] = {
"konnnichiwa¥r",
"yukkurisiteittene¥r",
"akuesuto-ku/pi'ko ba-jyonn .¥r",
"dennwaba'nngo-wa desu.¥r",
";/desu.¥r",
"#J¥r", // チャイム音J
"#K¥r", // チャイム音K
};

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

void loop()
{
	for(int iMsg=0; iMsg0){
			byte c = Wire.read();
			if(c=='*' || c==0xFF) delay(10); // Busy応答は10msec以上待つ必要がある
			else if(c=='>')	break;	// Ready応答
		}
		else { // NOACK または応答がなかった時
			// Picoが動いていない可能性が高い
			return 1; //ERR
		}
	}
	return 0;  // OK
}


2012/11/15 追記 AquesTalk pico LSI をArduinoで制御するためのライブラリができました。これを使うとより簡単に使えるようになります。 [Arduino] AquesTalk ライブラリ
| AquesTalk pico LSI | 12:38 | - | - |
AquesTalk pico LSI 販売開始
おまたせしました!

AquesTalk pico LSI(ATP3010F4)、オンライン販売の開始です。
といっても、本格的な製造・販売体制が整っていないため個数限定となります。
売り切れの際はご了承下さい。

Make: での先行発売同様、セラロック付きです。
価格は送料込みで 1,575円 (配送はクロネコメール便速達のみ)。
また、数量割引は用意できていません m_ _m

ご購入は、以下のサイトから
Aquest Onlne Store




| AquesTalk pico LSI | 18:00 | - | - |
AquesTalk pico LSIの次の販売は
先日のMake:Tokyo MeetingでのAquesTalk pico LSIの先行発売は、おかげ様で20〜30分のあっという間に完売しました。

ご購入いただいた方、ありがとうございます。是非、使った感想をお寄せ下さいね。
一方で、多くの方々には折角お越しいただきながら売り切れでごめんなさい。

本格的な販売にはまだ少し時間がかかりそうなので、急遽、追加で1ロット手作業で作って販売することにしました。この販売時期に関しては、まだ部品の仕入れの段階なので未確定ですが、今月中旬頃にはなんとかするよう頑張ります! 次回も、シールが貼ってあるなど手作り感たっぷりの予定ですので、お手柔らかによろしくお願い致します。

発売時期に関してお知らせするメーリングリストを作成しましたので、よろしければご登録ください。発売前にメールでお知らせいたします。

■ML参加方法
join-aquestalk_pico_lsi.fsjF[あっと]ml.freeml.com に空メール ([あっと]を@に換えてください)。
あとは返信メールのURLにアクセス 。
なお、「マイページの作成」を促されますが、このMLに関しては不要です。
※メールアドレスは管理者も含めて非公開で参加する設定にしてあります。

追記:12月16日〜 販売を開始しました。こちらを参照
| AquesTalk pico LSI | 22:47 | - | - |
もしATP3010F4の動作が不安定だったら
音声合成LSI  AquesTalk pico(ATP3010F4)の実装時の注意点です。

なんとなく動いているようでもすぐ動かなくなるとか、とても変な音がするなど・・・

OkibiWorksLaboさんが、早速ブログに、その対策について書かれております。
症状時の音声もあって大変参考になりますので、是非ご覧ください。

熾火研究所*電子工作室: ATP3010F4 がうまく動作しない場合の傾向と対策について。

クロックの配線についてはデータシートにも書いてありますが、音声出力端子(AOUT)の影響を受けやすいので、AOUTに低い入力インピーダンスのアンプ等を使うときは特に注意してください。
ちなみに、絶対最大定格は40mAですからね!!


| AquesTalk pico LSI | 18:57 | - | - |
AquesTalk pico LSI を使った Arduino 音声合成シールドの作成
先に、Arduinoを音声合成ボードに変えるというのをやりましたが、
今回は、Arduino用の音声合成シールドを作ってみます。

AquesTalk pico LSI ATP3010F4は、Arduino unoと同じATmega328pマイコンを使っていますが、ここにArduinoのスケッチを書きこんでオリジナルのArduino作品を作るなんてことはもちろんできません。そのためオリジナル作品を作るには、ArduinoボードとAquesTalk pico LSIがそれぞれ必要になり、これらを配線する必要があります。

Arduinoの世界では、無線LANとかSDカードなど機能を拡張するハードをシールドって呼ぶらしく、通常は基板になっていてArduinoボードに挿して簡単に使えるようにようになっています。
しかし、今回は基板ではなく、ICを亀の子のように2段に重ねて実装します。
部品点数も少ないですからね。

ArduinoのAVRマイコンと、AquesTalk pico LSIはI2Cシリアル通信で接続します。
I2Cは最小限の2線での通信できますので、ほとんどのポートをそのままアプリに使用することができます。UARTは、Arduino側のスケッチを書き込む時に使うので、pico LSIと同時に使用することはできません。

出力はトランジスタ1つのシンプルなアンプでスピーカを駆動します。


シールド部分で必要な部品は、これだけ。右下の黒いのはスピーカを接続するための端子で、DIPソケットを2端子だけに切断したものです。

  • ATP3010F4(AquesTalk pico LSI)
  • セラロック(16MHz)
  • 2SC1815
  • 4.7KΩ
  • DIPソケット(2端子分)

回路図は、こんな感じ。アンプ部はかっこ良く言えばフルデジタルアンプ!?
スピーカ端子は、片側がVCCにつながっているので他の装置には繋げられません!


■製作

  1. 不要な端子をカット
    ATP3010F4の2,3,5,6,11,13,14,15,16,17,18,19,21,23,24,25,26pin、覚悟を決めて根元からニッパで切断。

  2. ジャンパーを配線
    SMOD0(pin4)はGNDに落とすのでGND(22pin)に配線。

  3. セラロックを載せる
    セラロックはGNDが中央のピンなので、あらかじめこんな感じで加工しておく。


    セラロックをつけた後

  4. トランジスタと抵抗を載せる
    トランジスタは、先に、位置を決めて瞬間接着剤でLSIにつけたほうが作業しやすい。ベースは抵抗を介して、AOUT(12pin)に接続する。エミッタはGND(22pin)に接続。コレクタはそのまま。

  5. SP端子を接続してシールドの完成!
    SP端子を瞬間接着剤でLSIの端に接着。
    片側をトランジスタのコレクタに、もう一方を、LSIの裏にジャンパーを這わせてVCC(7pin)に配線。

  6. あとは、Arduinoのマイコンに重ねる。
    Arduinoのマイコンの上にATP3010F4をのせて、1,7,8,20,22,27,28pin同士をハンダ付け。
以上で、ハードウェアは完成です。この状態でも通常のArduinoの使い方ができます。
試しにサンプルスケッチBlinkでLEDが点滅するか確認してみましょう。

次回は、これを用いて、I2Cの通信をしながら音声合成を行うプログラム(スケッチ)を、簡単なアプリと共に紹介します。

| AquesTalk pico LSI | 18:13 | - | - |
新しい音声合成LSIのデータシート
 Make: Tokyo Meeting 07 で先行販売予定の新しい音声合成LSIの仕様を公開しました。
興味をお持ちの方は、覗いてみてください。
そのページ下部にデータシートのリンクもあります。

音声合成LSI    ATP3010F4
| AquesTalk pico LSI | 00:31 | - | - |
AquesTalk pico LSIの紹介動画
 AquesTalk pico LSI "ATP3010F4"の紹介ビデオ(その1)です。

最も簡単な実装として、Arduino UNO 基板を利用した方法です。
このLSIの仕様は、近いうちに公開します。
ちなみに、Make: Tokyo Meeting 07では、このLSIを展示・即売します。



| AquesTalk pico LSI | 17:05 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
Arduino Uno
Arduino Uno (JUGEMレビュー »)

AquesTalk pico LSIの評価ボードとして最適
RECOMMEND
Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus) (JUGEMレビュー »)

これと AquesTalk pi で簡単にテキスト音声合成!
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND