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

Dependents:   DLC_STARTER

Committer:
hmizuno
Date:
Fri May 22 09:01:32 2020 +0000
Revision:
0:afac3f0b332e
Child:
1:f5e4bb173064
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 printf("%d\r\n",i);
hmizuno 0:afac3f0b332e 61
hmizuno 0:afac3f0b332e 62 if(useWait){
hmizuno 0:afac3f0b332e 63 atp_wait();
hmizuno 0:afac3f0b332e 64 }
hmizuno 0:afac3f0b332e 65
hmizuno 0:afac3f0b332e 66 _ss = 1;
hmizuno 0:afac3f0b332e 67 if(tooLong){
hmizuno 0:afac3f0b332e 68 //音声合成「音声記号が長すぎます。」
hmizuno 0:afac3f0b332e 69 talk("onnse-ki'go-ga/nagasugima'_su.",true);
hmizuno 0:afac3f0b332e 70 }
hmizuno 0:afac3f0b332e 71 }
hmizuno 0:afac3f0b332e 72
hmizuno 0:afac3f0b332e 73 void ATP301x_SPI::chimeJ(bool useWait){
hmizuno 0:afac3f0b332e 74 talk("#J", useWait);
hmizuno 0:afac3f0b332e 75 }
hmizuno 0:afac3f0b332e 76
hmizuno 0:afac3f0b332e 77 void ATP301x_SPI::chimeK(bool useWait){
hmizuno 0:afac3f0b332e 78 talk("#K", useWait);
hmizuno 0:afac3f0b332e 79 }
hmizuno 0:afac3f0b332e 80
hmizuno 0:afac3f0b332e 81 //private functin
hmizuno 0:afac3f0b332e 82
hmizuno 0:afac3f0b332e 83 void ATP301x_SPI::atp_initialize(){
hmizuno 0:afac3f0b332e 84 _spi.format(8,3); //bit, mode
hmizuno 0:afac3f0b332e 85 _spi.frequency(SPI_CLK_HZ);
hmizuno 0:afac3f0b332e 86 }
hmizuno 0:afac3f0b332e 87
hmizuno 0:afac3f0b332e 88 //発音完了まで別の処理をさせたくない場合にwaitでマイコン全体を止める
hmizuno 0:afac3f0b332e 89 //ダミーデータを送信し、Busyである(=発音中)ならばwait()
hmizuno 0:afac3f0b332e 90 //ATP301xに発話完了時のアクションはなく
hmizuno 0:afac3f0b332e 91 //”Ready待ちはポーリングで行う。”とデータシートに記載あり
hmizuno 0:afac3f0b332e 92 //データはシート「SPI通信」参照
hmizuno 0:afac3f0b332e 93 void ATP301x_SPI::atp_wait(){
hmizuno 0:afac3f0b332e 94 //Busy時の返ってくるはずのレスポンス
hmizuno 0:afac3f0b332e 95 char busyRes = '*';
hmizuno 0:afac3f0b332e 96 int rx;
hmizuno 0:afac3f0b332e 97
hmizuno 0:afac3f0b332e 98 //ダミーデータを送信してポーリング
hmizuno 0:afac3f0b332e 99 do{
hmizuno 0:afac3f0b332e 100 wait_ms(POLLING_CYCLE_MS);
hmizuno 0:afac3f0b332e 101 rx = _spi.write(0xFF);
hmizuno 0:afac3f0b332e 102 }while(rx == (int)busyRes);
hmizuno 0:afac3f0b332e 103 }
hmizuno 0:afac3f0b332e 104