音声合成LSIの使い方 - I2C接続編 [Arduino]
テキストを音声に変換する「音声合成LSI」のI2C接続版です。
初めての方は初級編を先にご覧ください。
使用部品・材料
総額で約1,860円です。(Arduino本体の値段を除く)
※初級編と比べて4.7kΩの抵抗が2つ増えています。それ以外は同じです。
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト 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個)、4.7kΩ(2個)、1kΩ(1個)を使用。 |
配線図
通信モードを「I2C接続」にする為にSMOD1をHIGH、SMOD0をLOWにしています。I2C接続用のプルアップ抵抗には4.7kΩを使用しています。
次は公式データシートより(atp3012_datasheet.pdf)
ピン配置
クロックモード
動作モード
通信モード
回路図
スケッチ(プログラム)
システムを起動すると「こんにちは。」「おはよー」「お腹すいたー。」と繰り返し発声します。
#include <Wire.h> // デバイスアドレス(スレーブ) uint8_t DEVICE_ADDRESS = 0x2E; // メッセージ配列 String s[] = { "konnitiwa.\r", // こんにちは。 "ohayo-\r", // おはよー "onakasuita-.\r"}; // お腹すいたー。 // メッセージ数 int count = 3; // メッセージのカウンタ用 int index = 0; void setup() { // マスタとしてI2Cバスに接続する Wire.begin(); } void loop() { // メッセージをデバイスに送信 Wire.beginTransmission(DEVICE_ADDRESS); for (int i = 0; i < s[index].length(); i++) { Wire.write(s[index][i]); } Wire.endTransmission(); // 次のメッセージを発声できるまでループする while(true){ // デバイスへ1byteのレジスタデータを要求する Wire.requestFrom(DEVICE_ADDRESS, 1); // 「>」(次の発声が準備OK)ならばループを抜ける while(Wire.available() == 0) {} uint8_t c = Wire.read(); if(c == '>') break; delay(10); } index++; if(count <= index){ index = 0; } delay(1000); }
音声合成LSIには一度に最大128byteまで送信できますが、ArduinoのWireでは一度に送信できるバッファは32byte迄です。33byte以上を送信する場合は
Wire.beginTransmission Wire.write(); Wire.endTransmission
を複数回に分けて実行してください。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年09月01日
記事NO:02551