ホーム > カテゴリ > ロボット・電子工作・マイコン >

音声合成LSIの使い方 - SPI接続編 [Arduino]

テキストを音声に変換する「音声合成LSI」のSPI接続版です。

初めての方は初級編を先にご覧ください。

使用部品・材料

総額で約1,860円です。(Arduino本体の値段を除く)

※初級編と同じ材料です。

部品/材料値段備考
サンハヤト SAD-101 ニューブレッドボード¥500Amazon.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です。

番号名称内容
13SCKSerial ClocK。データ転送の同期の為のマスターからのクロ ック信号。
12MISOMaster In Slave Out。スレーブからマスターへデータを送る。
11MOSIMaster Out Slave In。マスターからスレーブへデータを送る。
(10)SSSlave 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