memorandums

日々のメモです。

Arduino + MICROTALK(ATS001B)

思いつきで子供むけの玩具(身の回りの色を読み取って色の名前を教えてくれる装置)を作ろうとしています。音声合成のためストロベリーリナックスさんから表記の製品を購入しいろいろとテストしているうちにテストモードから抜けられなくなり、連絡したところ交換品を送ってくださいました。感謝、感謝です。恐らく、配線をいじっているうちにショートさせてしまったのかもしれません。ごめんなさい。

Link: 音声合成モジュール メーカー品番:MICROTALK(ATS001B)

で、今日、早速、Arduinoと接続してしゃべらせてみました(ちなみにスピーカーは付属しませんので自分で用意しなければなりません。福岡ですとネットか天神のカホパーツセンターに行って入手しましょう)。以下が接続した写真です。ブレッドボードを使っていますがArduinoの5V電源を2本にわけるために使用しています。他の簡易的な方法でもいいと思います。写真にはカラーセンサーが載っていますが今回のスケッチには関係ありません。

で、意外なことにしゃべらせるまで3,4時間くらいかかりました。。。何とも情けないというか。いろいろと類するエントリーはあるのですがArduinoにこの音声合成モジュールを接続したスケッチが見当たりませんでした。できる人にとっては当たり前過ぎるからなんでしょうね。結局、何が問題だったかと言いますと、この音声合成モジュールはマイコン(ここでいうArduino)とシリアル通信する速度を初期通信('A'を送り'A'を受け取り'U'を送り'U'を受け取る、日本語で書くとそういうシーケンスです)をすることで調整します。そのあとMSGコマンドを音声合成モジュールに送ることでしゃべらせることができます。この初期通信の部分がうまくいかない。。。はまったのは'A'を送っても何も返ってこないところでした。NewSoftSerialなど他のライブラリも使ったりしましたが解決せず。結局、標準のSoftSerialのread()で待ち続けるだけで良かったのでした。動いてしまえばなんてことは無かったのでした。以下がそのスケッチです。ただ、モジュールの電源投入後に初期通信のシーケンスを実行しなければなりませんのでArduinoから電源を供給しているため、モジュールの電源を切り入りしてArduinoのリセットボタンを押すなど。。。ちょっと微妙な操作が必要です。玩具として使うときには電源スイッチを入れた直後にArduinoおよびモジュールに電源が投入されるので初期通信がうまく動作するとは思います。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

void setup() {
  Serial.begin(9600); //デバッグ用
  mySerial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  mySerial.print("A");
  while (mySerial.read() != 'A');
  mySerial.print("U");
  while (mySerial.read() != 'U');
}

void loop() {
  Serial.println("MSGohayou"); //デバッグ用
  mySerial.print("MSGohayou\r");
  delay(5000);
}

ちなみに補足ですが、音声合成モジュールのマニュアルには'A'を送ったあとに'A'が返ってこなければ再度'A'を送れと書かれています。上記のスケッチではそこまでしていません。もし本件にトライされる方はそのあたりをご留意ください。