トボリブログ

電子工作初心者が工作したりプログラミングしたりするブログ。

音声合成LSI ATP3012を初心者でも簡単にしゃべらせる方法!

こんにちは!トボリです。

 

電子工作していて、光らせる、動かす、をやっているとその次はあれがやりたくなりませんか?

そう、しゃべらせる!!

ググると、音声合成LSIというのが出てきます。

ただ、調べども調べども初心者にとってはなんだか複雑・・・

そこで、まねするだけで音声合成LSIをすぐ動かせるやり方を書いていこうと思います!

※この記事では、手っ取り早く動かせることを一番大事にしているので、細かいお勉強的部分は「なんとなく分かったような気がする!」と思える程度にふわっと書いていきます。笑

用意するもの

  • Arduino (unoでもnanoでもOK)
  • ブレッドボード
  • 音声合成LSI ATP3012
  • セラミック発振子 16MHz(10MHzでもいいけど、この記事では16HMzのほうをを使います!)
  • スピーカー(私はダイナミックスピーカーというものを使いました!)
  • ジャンパー

※もっとちゃんと理解したいと言う方はデータシートをダウンロードしましょう!

http://akizukidenshi.com/download/ds/a-quest/atp3012_datasheet.pdf

 

※記事の一番下に貼っている『プチモンテ』という技術ブログがものすごく参考になるので、あちらも読んでみてください!

音声合成LSI ATP3012のピンの簡単な説明

LSIの中で、以下の黄色い枠でかこまれているピンを使用します!

ふわっと、どんな役割をするピンかを書きますね。

「ピンの名前見れば分かっちゃうよ!」という方や、「いっこくも早く動かしたいよ~!」という方は飛ばして次へいってくださいね!

 

f:id:toboli:20180411135814p:plain

①RXDとTXD

シリアル通信というものをするために使うピン。

これらを使うときは、

  • LSIRXDピンArduinoTXDピンをつなぐ
  • LSITXDピンArduinoRXDピンをつなぐ

という、逆さまにつなぐのが決まりらしいです。

なぜそんなふうにつなぐのか?それは、他のスーパーエンジニアたちがめっちゃくわしく書いてる記事が他にあるので、それを読もう!(トボリもよく分かっていない)

 

②SMOD

通信モードというのを決めるピン。

UART(ユーアート)I2C(アイスクエアドシー)SPIの3種類から通信モードを選べるらしい。

選べるらしいというか選ばないといけないらしい。

「通信モードってなに?」

トボリにも分かりません。分かっていることは、3つともシリアル通信の一種だということと、どれかを選ばなければいけないということだけ。

 

今回はUARTを使います!

理由は、データシートで一番最初に紹介されていた&これを使ってやってるエンジニアの方の記事を見つけたから!あとI2Cはその読みにくさに腹が立ち、絶対使うもんかと思ったから!

 

③VCCとGND

みんな大好きVCCとGND。

VCCは電源へ、GNDはGNDへ落とせば良し!

 

XTALとCLK16

準備してもらった物の中に、セラミック発振子 16MHzがあったと思います。それ用のピンです。

セラミック発振子は三本足がありますが、外側の2本をXTAL1とXTAL2につなぎます。

どっちにつないでもOK!

真ん中の足はGNDにつなぐよ!

CLK16は、セラミック発振子 16MHzのときはHIGH(ブレッドボードの+)につなぎ、10MHzのときはLOW(ブレッドボードの-)につなぎます!

 

⑤PMOD

動作モードを決めるピン。

LSIでは、デモモードとか通常モードとか選べるんです。

とりあえず今回は、【コマンド入力モード】という基本のモードで動かします!

  • PMOD1はHIGH(ブレッドボードの+)につなぐ
  • PMOD2もHIGH(ブレッドボードの+)につなぐ
<トボリの一言>1=HIGHのこと、0=LOWのことだよ

データシートに「PMOD1は1, PMOD2は0」とか書いてあって、一体これはなんだ?と思ってたんですが、1はHIGH、2はLOWにしてねって意味らしい。

 

⑥AOUT

スピーカーから2本線が出てると思いますが、どっちかをこのピンにつないで、もう片方の足をGNDにつなぐよ!

 

配線のやりかた

そんなわけで、ブレッドボードの上にArduinoLSIをのっけて配線していきます!

この図の様につないでいけばOK!

ちなみに黄色い四角がLSIです。電源につなぐ線はピンク、GNDにつなぐ線はブルー、その他を茶色でかいてます!

f:id:toboli:20180411155455p:plain

  • ここではArduino nanoを使っているのでブレッドボードにのせたけど、unoの人はのせなくて大丈夫!のらないし!笑
  • ブレッドボードがみっちりでセラミック発振子をのせるスペースが無ければ、もう一つブレッドボードを用意してそこに発振子をさして配線しよう~!
  • 図の左端のように、ブレッドボードの両端の+・-をつなぐのを忘れないようにしましょう!
  • 本当はスピーカーのあたりにコンデンサを挟んだりするっぽいんですが、めんどいのでそのままつなぎました。結構うごかしてますが壊れないのでまあこれでも大丈夫だと思います!「そんなの怖い」と思う方はデータシートをみましょう!
<トボリの一言>

上の図ではLSIの2と3ピン(RXDとTXD)をArduinoのデジタル10と11ピンにつないでます。ArduinoにもRXDとTXDあるのになぜ?と思いますよね。

最初RXDとTXDにつないでたんですが、Arduinoにプログラムを書き込むときにエラーが出るんです。どうも書き込むときはRXD・TXDの線を一回抜かないとだめらしく・・・なんかマスターとスレーブがうんたらかんたらという問題が起こるらしく・・・

デジタルピンにつなげば、線の抜き差しとか無しで動くのでこうしました!

 

プログラム

参考サイト(※下にリンクあり)からそのまま・・・というかんじです。

 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
Serial.begin(9600);

// ソフトウェアシリアルの初期化
mySerial.begin(9600);
// 「こんにちは。シリアルモニターで文字を入力します。」と発声する
mySerial.print("konnitiwa.siriaru'mo'nita-de/mo'ziwo nyuuryoku'simasu.");
mySerial.print("\r");
}

void loop() {
char c; String raw = "";

// シリアルモニターから音声合成LSI
while (Serial.available() > 0) {
c = Serial.read();
// LFは無視する(LFがあっても動作はします)
if (c == "\n") break;
mySerial.print(c);
delay(5);
}

// 音声合成LSIからシリアルモニターへ
while (mySerial.available() > 0) {
char c = mySerial.read();
raw += c;
delay(5);
}

if (raw != "") {
if (raw == ">") {
Serial.println("> (この記号は準備OK)");
} else if (raw == "*") {
Serial.println("* (この記号は発声中などBusy)");
} else {
Serial.println(raw);
}
}
}

 

すると、「こんにちは。シリアルモニターで文字を入力します。」としゃべります!


このコードをArduinoに書き込んだら、【ツール】から【シリアルモニター】を開きます。

シリアルモニターの上の細長い場所に

onakasuita-.

と打ち込みます。

Enterを押すと、「おなか空いたー」と言ってくれます!

 

これで自由にしゃべらせることができました!

あとはセンサーを組み合わせたりして、楽しく遊びましょう!

 

すごく参考にさせてもらったサイト

『プチモンテ』という技術ブログを参考にさせていただきました。

こちらを見ながらトボリがひっかかりまくったところをこの記事でまとめています。

www.petitmonte.com