mbedでAquestalkを制御

May 28, 2016

最近mbed(HRM1017)を購入しました。BLE付きなので、スマホから無線でデータのやり取りができるものです。まずは、音声合成チップのAquesTalk picoをI2Cインターフェイスでコントロールすることから試してみました。

チップ同士の接続は下記の通り。中央下のライン2本は電源(赤)、GND(青)で、中央上のライン2本はSDA(赤)、SCL(青)です。右端の方にある2つの抵抗は4.7kΩでSCL,SDAのプルアップ抵抗です。一応、AquesTalkにはパスコンをつけてます。

ソースコードはこんな感じ。speakメソッドに”konnichiwa”とか送ればしゃべってくれます。最初、AquesTalkに送るコマンドの最後につける「\r  」のバックスラッシュを円マークで記述(Macなので円マークはバックスラッシュと違うコードになる)していてうまく動かなかったのですが、はまったのはそれくらいであとはI2Cクラスにおまかせしているので、I2Cの信号シーケンスのプログラムは何も書かなくて済みました。mbed、楽ですねえ。

AquesTalkのコントロール用クラスとそれを使ったサンプルメイン関数


#ifndef AT3011_H
#define AT3011_H

#include "mbed.h"

class AT3011
{
public:
AT3011();
~AT3011();

int speak(const char *message);

private:
I2C m_i2c;
int m_addr;

};

#endif

 


#include "AT3011.h"

#define AQTK_I2C_ADDR (0x2E<<1)

AT3011::AT3011() : m_i2c(p22, p20), m_addr(AQTK_I2C_ADDR)
{

}

AT3011::~AT3011()
{

}

int AT3011::speak(const char *message)
{
size_t len = strlen(message) + 1;
char *buf = (char *)malloc(len + 1);
strcpy(buf, message);
buf[len - 1] = '\r';
m_i2c.write(AQTK_I2C_ADDR, buf, len);
free(buf);

return 0;
}


#include "mbed.h"
#include "AT3011/AT3011.h"

AT3011 atp;

int main(void)
{
wait(5.00);
char cmd[] = "konnichiwa";
atp.speak(cmd);
wait(0.07);
}