AquesTalk pico 日本語音声合成LSI ATP3011/3012 をSPIで使用するためのライブラリです。

Dependents:   DLC_STARTER

Committer:
hmizuno
Date:
Sun May 24 12:07:29 2020 +0000
Revision:
1:f5e4bb173064
Parent:
0:afac3f0b332e
first release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hmizuno 0:afac3f0b332e 1 #include "mbed.h"
hmizuno 0:afac3f0b332e 2 #include "ATP301x_SPI.h"
hmizuno 0:afac3f0b332e 3
hmizuno 0:afac3f0b332e 4 //public function
hmizuno 0:afac3f0b332e 5
hmizuno 0:afac3f0b332e 6 ATP301x_SPI::ATP301x_SPI(PinName mosi, PinName miso, PinName sck, PinName ss):
hmizuno 0:afac3f0b332e 7 _spi(mosi, miso, sck), _ss(ss){
hmizuno 0:afac3f0b332e 8 atp_initialize();
hmizuno 0:afac3f0b332e 9 }
hmizuno 0:afac3f0b332e 10
hmizuno 0:afac3f0b332e 11
hmizuno 0:afac3f0b332e 12 void ATP301x_SPI::stop(){
hmizuno 0:afac3f0b332e 13 char stop1 = '>';
hmizuno 0:afac3f0b332e 14 int rx;
hmizuno 0:afac3f0b332e 15
hmizuno 0:afac3f0b332e 16 //ブレークコマンド $
hmizuno 0:afac3f0b332e 17 rx = _spi.write('$');
hmizuno 0:afac3f0b332e 18 wait_us(SPI_SEND_PERIOD_US);
hmizuno 0:afac3f0b332e 19
hmizuno 0:afac3f0b332e 20 //breakコマンドに対する応答”E255”がバッファに溜まってるのでダミーデータを送って">"が返ってくるまで取出す
hmizuno 0:afac3f0b332e 21 //データシート「ブレークコマンド」参照
hmizuno 0:afac3f0b332e 22 while(rx != (int)stop1){
hmizuno 0:afac3f0b332e 23 rx = _spi.write(0xFF);
hmizuno 0:afac3f0b332e 24 wait_us(SPI_SEND_PERIOD_US);
hmizuno 0:afac3f0b332e 25 }
hmizuno 0:afac3f0b332e 26 }
hmizuno 0:afac3f0b332e 27
hmizuno 0:afac3f0b332e 28
hmizuno 0:afac3f0b332e 29 //ATP301xの音声記号を受け取ってしゃべる
hmizuno 0:afac3f0b332e 30 void ATP301x_SPI::talk(char input[], bool useWait){
hmizuno 0:afac3f0b332e 31 _ss = 0;
hmizuno 0:afac3f0b332e 32
hmizuno 0:afac3f0b332e 33 stop();
hmizuno 0:afac3f0b332e 34
hmizuno 0:afac3f0b332e 35 bool tooLong = false;
hmizuno 0:afac3f0b332e 36 int i = 0;
hmizuno 0:afac3f0b332e 37
hmizuno 0:afac3f0b332e 38 while(input[i] != 0xFF && input[i] != '\0' && input[i] != NULL){
hmizuno 0:afac3f0b332e 39 _spi.write(input[i]);
hmizuno 0:afac3f0b332e 40 wait_us(SPI_SEND_PERIOD_US);
hmizuno 0:afac3f0b332e 41
hmizuno 0:afac3f0b332e 42 //発音記号の終端(ピリオド)を送ったらbreak
hmizuno 0:afac3f0b332e 43 //※while終了条件に組み込むと、Whileの外で.を送ることになりチャイムが鳴らせない
hmizuno 0:afac3f0b332e 44 if(input[i] == '.'){
hmizuno 0:afac3f0b332e 45 break;
hmizuno 0:afac3f0b332e 46 }
hmizuno 0:afac3f0b332e 47
hmizuno 0:afac3f0b332e 48 i++;
hmizuno 0:afac3f0b332e 49
hmizuno 0:afac3f0b332e 50 //ATP301xが受信できる最大文字数を超えたら強制終了
hmizuno 0:afac3f0b332e 51 if(i > ATP_MAX_LEN){
hmizuno 0:afac3f0b332e 52 tooLong = true;
hmizuno 0:afac3f0b332e 53 break;
hmizuno 0:afac3f0b332e 54 }
hmizuno 0:afac3f0b332e 55 }
hmizuno 0:afac3f0b332e 56
hmizuno 0:afac3f0b332e 57 //ATP301xコマンドの終端を示すキャレッジリターンを送信
hmizuno 0:afac3f0b332e 58 _spi.write('\r');
hmizuno 0:afac3f0b332e 59
hmizuno 0:afac3f0b332e 60 if(useWait){
hmizuno 0:afac3f0b332e 61 atp_wait();
hmizuno 0:afac3f0b332e 62 }
hmizuno 0:afac3f0b332e 63
hmizuno 0:afac3f0b332e 64 _ss = 1;
hmizuno 0:afac3f0b332e 65 if(tooLong){
hmizuno 0:afac3f0b332e 66 //音声合成「音声記号が長すぎます。」
hmizuno 0:afac3f0b332e 67 talk("onnse-ki'go-ga/nagasugima'_su.",true);
hmizuno 0:afac3f0b332e 68 }
hmizuno 0:afac3f0b332e 69 }
hmizuno 0:afac3f0b332e 70
hmizuno 0:afac3f0b332e 71 void ATP301x_SPI::chimeJ(bool useWait){
hmizuno 0:afac3f0b332e 72 talk("#J", useWait);
hmizuno 0:afac3f0b332e 73 }
hmizuno 0:afac3f0b332e 74
hmizuno 0:afac3f0b332e 75 void ATP301x_SPI::chimeK(bool useWait){
hmizuno 0:afac3f0b332e 76 talk("#K", useWait);
hmizuno 0:afac3f0b332e 77 }
hmizuno 0:afac3f0b332e 78
hmizuno 0:afac3f0b332e 79 //private functin
hmizuno 0:afac3f0b332e 80
hmizuno 0:afac3f0b332e 81 void ATP301x_SPI::atp_initialize(){
hmizuno 0:afac3f0b332e 82 _spi.format(8,3); //bit, mode
hmizuno 0:afac3f0b332e 83 _spi.frequency(SPI_CLK_HZ);
hmizuno 0:afac3f0b332e 84 }
hmizuno 0:afac3f0b332e 85
hmizuno 0:afac3f0b332e 86 //発音完了まで別の処理をさせたくない場合にwaitでマイコン全体を止める
hmizuno 0:afac3f0b332e 87 //ダミーデータを送信し、Busyである(=発音中)ならばwait()
hmizuno 0:afac3f0b332e 88 //ATP301xに発話完了時のアクションはなく
hmizuno 0:afac3f0b332e 89 //”Ready待ちはポーリングで行う。”とデータシートに記載あり
hmizuno 0:afac3f0b332e 90 //データはシート「SPI通信」参照
hmizuno 0:afac3f0b332e 91 void ATP301x_SPI::atp_wait(){
hmizuno 0:afac3f0b332e 92 //Busy時の返ってくるはずのレスポンス
hmizuno 0:afac3f0b332e 93 char busyRes = '*';
hmizuno 0:afac3f0b332e 94 int rx;
hmizuno 0:afac3f0b332e 95
hmizuno 0:afac3f0b332e 96 //ダミーデータを送信してポーリング
hmizuno 0:afac3f0b332e 97 do{
hmizuno 0:afac3f0b332e 98 wait_ms(POLLING_CYCLE_MS);
hmizuno 0:afac3f0b332e 99 rx = _spi.write(0xFF);
hmizuno 0:afac3f0b332e 100 }while(rx == (int)busyRes);
hmizuno 0:afac3f0b332e 101 }
hmizuno 0:afac3f0b332e 102