音声合成LSIの使い方 - SPI接続編 [Arduino]
テキストを音声に変換する「音声合成LSI」のSPI接続版です。
初めての方は初級編を先にご覧ください。
使用部品・材料
総額で約1,860円です。(Arduino本体の値段を除く)
※初級編と同じ材料です。
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト SAD-101 ニューブレッドボード | ¥500 | Amazon.com |
音声合成LSI ATP3012R5-PU(小型ロボットの音声) | ¥900 | 秋月電子の通販コード(I-11517) |
スピーカー 8Ω8W | ¥100 | 秋月電子の通販コード(P-03285) |
トランジスター2SC1815Y(60V150mA)(10個入テーピング品) | ¥80 | 秋月電子の通販コード(I-04268) |
両端ロングピンヘッダ 1×40 (40P 6.1) | ¥50 | スピーカーの端子接続用。このピンヘッダはサイズ少し大きいのでジャンパーワイヤーで代用した方が良いかもです。 秋月電子の通販コード(C-09056) |
絶縁ラジアルリード型積層セラミックコンデンサー0.1μF50V2.54mm(10個入) | ¥100 | 秋月電子の通販コード(P-00090) |
クリスタル(水晶発振子)16MHz | ¥30 | 秋月電子の通販コード(P-08671) |
絶縁型ラジアルリード型積層セラミックコンデンサー22pF50V±5%2.54mm(10個入) | ¥100 | 秋月電子の通販コード(P-04060) |
カーボン抵抗器 | 数円 | 10kΩ(1個)、1kΩ(1個)を使用。 |
配線図
通信モードを「SPI接続」にする為にSMOD1/SMOD0をLOWにしています。

次は公式データシートより(atp3012_datasheet.pdf)
ピン配置

クロックモード

動作モード

通信モード

回路図

SPI接続用のピン
マスターはArduino。スレーブは音声合成LSIです。
番号 | 名称 | 内容 |
---|---|---|
13 | SCK | Serial ClocK。データ転送の同期の為のマスターからのクロ ック信号。 |
12 | MISO | Master In Slave Out。スレーブからマスターへデータを送る。 |
11 | MOSI | Master Out Slave In。マスターからスレーブへデータを送る。 |
(10) | SS | Slave Select pin。スレーブ選択ピン。10ピン以外でも使用可能です。 SPI接続でデバイス間の通信をする場合は、このピンをLOWにしている間に行います。通信を終了する場合はHIGHにします。 |
このピン番号と名称はArduinoで使用されているものです。デバイスによって異なる場合があります。
スケッチ(プログラム)
システムを起動すると「こんにちは。」「おはよー」「お腹すいたー。」と繰り返し発声します。
#include <SPI.h> // SCK : pin 13 (Serial ClocK) // MISO : pin 12 (Master In Slave Out) // MOSI : pin 11 (Master Out Slave In) // SS : pin 10 (Slave Select pin) // メッセージ配列 String s[] = { "konnitiwa.\r", // こんにちは。 "ohayo-\r", // おはよー "onakasuita-.\r"}; // お腹すいたー。 // メッセージ数 int count = 3; // メッセージのカウンタ用 int index = 0; void setup() { // SPIの初期化 // ※自動的に「SCK、MOSI、SSのピンの動作はOUTPUT」となり「SSはHIGH」となる SPI.begin(); // SPI転送モード // クロック位相(CPOL) = 0 クロック極性(CPHA) = 0 SPI.setDataMode(SPI_MODE0); // SPI送受信用のビットオーダー(MSBFIRST) SPI.setBitOrder(MSBFIRST); // SPIクロック分周器 1MHz = 16MHz/16 SPI.setClockDivider(SPI_CLOCK_DIV16); } void loop() { // メッセージをデバイスに送信 digitalWrite(SS, LOW); for (int i = 0; i < s[index].length(); i++) { SPI.transfer(s[index][i]); // 次のコマンドは20μs以上あける(仕様) delayMicroseconds(20); } digitalWrite(SS, HIGH); // 次のメッセージを発声できるまでループする while(true){ // デバイスへ1byteのデータを要求する digitalWrite(SS, LOW); uint8_t c = SPI.transfer(0xff); delayMicroseconds(20); digitalWrite(SS, HIGH); // 「>」(次の発声が準備OK)ならばループを抜ける if(c == '>') break; delay(10); } index++; if(count <= index){ index = 0; } delay(1000); }
以上です。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年09月01日
記事NO:02552