#!/usr/bin/env python
# coding: utf-8
# オリジナルの作成: 2014/03/29
# # 05-声を出してみる
#
# ## 音声合成モジュール
# 秋月から販売されている
# [音声合成モジュールATP3011F4-PU](http://akizukidenshi.com/catalog/g/gI-05665/)
# をATMegaボードに差して、動作を確認してみました。
#
#
#
# ちょっと乱暴ですが、圧電スピーカを以下の様に接続しました。
#
# - GND: 黒線
# - D6: 赤線
#
# Arduino IDEを起動し、シリアルモニターを起動します。 改行の設定を「CRおよびLF」にし、ボーレートは9600 baudとします。
#
# 最初に、?を入力して音声合成モジュールにボーレートを調整させます。
#
# この時">>"と返ってきます。
#
# 次に発生させたい言葉をローマ字で入力します。
#
# ```Console
# ohayou
# ```
#
# と入力すると、それっぽくスピーカら音声が出力され、シリアルモニターには、 "*>"と返ってきます。
#
#
#
# ## 音声合成モジュールの使い方
# 音声合成モジュールの使い方は、
# [音声合成LSI(ATP3011F4-PU)を使ってみます](http://www.geocities.jp/zattouka/GarageHouse/micon/TalkIC/ATP3011.htm)
# に詳しく紹介されています。
#
# 音声合成モジュールのピン配置を上記サイトの図を引用して説明します。
#
#
# ### 動作モード
# 音声合成モジュールには、4つの動作モードがあります。モードの設定は、PMOD0, PMOD1で行います。 未接続の場合には、セーフモードになっているみたいです。
#
# | 動作モード | 意味 | PMOD0 | PMOD1|
# |:------------|:------|:---------:|:--------:|
# | コマンド入力モード | 外部シリアルインタフェースを使ってメッセージを出力する | 1 | 1|
# | セーフモード | 内部設定に関わらず、UART(9600bau)またはI2Cでのシリアル通信を使用する | 0 | 1 |
# | スタンドアロンモード | PC0~PC3で指定されたプリセットメッセージを出力する | 1 | 0 |
# | デモモード | プリセットメッセージを繰り返し出力する | 0 | 0 |
#
# 上記サイトのブレッドボードの配線を参考にデモモードを試してみました。
#
#
#
# ## シリアル通信の指定
# シリアル通信には、UART(9600bau)、I2C, SPIを使用できます。使用するシリアル通信は、SMOD0, SMOD1で設定します。 未接続の場合には、UARTが選択されるみたいです。
#
# | 通信モード | SMOD0 | SMOD1 |
# |:------------|:----------:|:---------:|
# | UART | 1 | 1 |
# | I2C | 0 | 1 |
# | SPI(mode3) | 1 | 0 |
# | SPI(mode0) | 0 | 0 |
# ## 秋月のATMegaボードを使う
# 初心者にお薦めなのが、秋月のATMegaボードを使う方法です。ブレッドボードで何本も結線すると間違いも多くなります。
#
# 今回使用する部品は、以下の7点です。
# [1](#Ref_1)
#
#
#
# | 部品名 | 型名 | 値段 |
# |:--------|:------|------:|
# | 音声合成LSI | ATP3011F1-PU(ゆっくりな女声) | 850円 |
# | ATMEGA168/328用マイコンボード(I/Oボード) | AE-ATmega328 | 150円|
# | 丸ピンICソケット(28P) | 2227MC-28-03 | 70円 |
# | ピンソケット (6P) | C-03784 | 20円x2 = 40円 |
# | ピンソケット (8P) | C-03784 | 30円x2 = 60円 |
# | プラスチックスペーサー | P-01864 | 100円/2 = 50円 |
# | スピーカー | P-03285 | 100円 |
#
# 組み立てると以下の様になります。
# [2](#Ref_2)
#
#
# ## 音声合成モジュールを載せて動かしてみる
# 音声合成モジュールを載せて、動かしてみます。
#
# シリアルモジュールと使って音声合成モジュールを接続します。
# シリアルモジュールのピンは、右から以下のようになっています。
#
# | ピン番号 | 意味 |
# |:--|:------|
# | 1 | DTR |
# | 2 | RX-I |
# | 3 | TX-O |
# | 4 | VCC |
# | 5 | CTS(GND) |
# | 6 | GND |
#
#
#
# シリアルモジュールとATMegaボードの接続は、以下の様につなぎます。
#
# | シリアルモジュール | ATMegaボード |
# |:----------------------|:-----------------:|
# | GND | J4-GND |
# | VCC | J4-5V |
# | RX-I | J1-1(TX) |
# | TX-O | J1-0(RX) |
#
# スピーカーとの接続は、以下の様にします。
#
# | スピーカーの線色 | 接続先 |
# |:---|:--|
# | 赤 | J1-6 |
# | 黒 | GND |
#
#
# ## 動作確認
# シリアルモニターを9600bauにセットして開きます。以下のように?を入力し、リターンキーを押すと
# が表示されれば接続はOKです。
#
# 入力:
# ```Console
# ?
# ```
# 出力:
# ```Console
# >>
# ```
#
# つぎに好きな言葉をローマ字で入力してみましょう。ohayouと入力すると「おはよう」としゃべります。
#
# 入力:
# ```Console
# ohayou
# ```
# 出力:
# ```Console
# *>
# ```
#
# ## Arduinoとの接続
# Arduinoと接続して、パソコンからローマ字を入力する場合には、音声合成モジュールを以下の様に設定します。
#
# - 動作モード:セーフモード(PMOD0=0, PMOD1=1)
# - 通信モード:UART(SMOD0=1, SMOD1=1)
#
# さらに音声合成モジュールとArduino(Arduinoは単に電源供給とPCとの接続に使う)との接続は、以下の様にします。
#
# | Arduino | 音声合成モジュール |
# |:----------|:-----------------------|
# | 0 Rx | 2 RxD |
# | 1 Tx | 3 TxD |
#
#
# ## 音声メニューに挑戦
# 今度は、Arduinoから音声合成モジュールにじゃべらせてみます。
#
#
#
# Arduinoから音声モジュールにしゃべらせたいローマ字を出力するには、Serial.println関数を使います。 今回は、複数のボタンを使う代わりにつまみの大きな可変抵抗を使います。
#
# ArduinoのA0を可変抵抗の真ん中のピンにセットし、両端をGNDと5Vに接続します。
#
# 音声モジュールとArduinoの接続を先ほどは、逆につなぎ替えます。
#
# | Arduino | 音声合成モジュール |
# |:----------|:-----------------------|
# | 1 Tx | 2 RxD |
# | 0 Rx | 3 TxD |
#
# スケッチは、以下の様にします。
#
# ```C++
# int led = 13;
# int tumami = A0;
# int sentaku = -1;
#
# void setup() {
# Serial.begin(9600);
# pinMode(led, OUTPUT);
# mainMenu();
# }
#
# void mainMenu() {
# Serial.println("meinmenyudesu");
# delay(2000);
# Serial.println("eruediwo tenntousurubaaiha ichiwo");
# delay(4000);
# Serial.println("eruediwo syoutousurubaaiha niwo");
# delay(4000);
# Serial.println("mouichido menyuwo kikubaaiha sya-puwo");
# delay(4000);
# Serial.println("oshitekudasai");
# }
#
# void loop() {
# sentaku = map(analogRead(tumami), 0, 1023, 0, 3);
# switch (sentaku) {
# case 0:
# digitalWrite(led, HIGH);
# break;
# case 1:
# digitalWrite(led, LOW);
# break;
# case 2:
# default:
# mainMenu();
# }
# delay(1000);
# }
# ```
#
# つまみを変えるとLEDを点灯したり、消灯したり、音声メニューをしゃべらせたりできます。
#
# ## ATMegaボードとArduino Pro Miniボードの接続
# ブレッドボードで音声合成モジュールの設定が確認できましたので、 ATMegaボードとArduino Pro Miniボードをつないで、音声メニューを作ってみましょう。
#
# ブレッドボードと音声合成モジュールの接続は、以下の様にします。
#
# - ブレッドボードの結線(両端の赤と青を接続しておく)
#
# | ブレッドボード | 接続先 |
# |:---------------|:---------|
# | ブレッドボード 赤(5V) | Arduino Pro VCC |
# | ブレッドボード 青(GND) | Arduino Pro GND |
# | ブレッドボード 赤(5V) | 可変抵抗-左 |
# | ブレッドボード 青(GND) | 可変抵抗-右 |
# | 可変抵抗-中 | Arduino Pro A0 |
#
# - 音声合成モジュールの結線
#
# | 音声合成モジュール | 接続先 |
# |:-----------------------|:--------|
# | J1-0R | Arduino Pro Mini TxD |
# | J1-1T | Arduino Pro Mini RxD |
# | J1-2(SMOD0) | ブレッドボード 赤(5V) |
# | J1-3(SMOD1) | ブレッドボード 赤(5V) |
# | J1-6 | スピーカ 赤 |
# | J2-8(PMOD0) | ブレッドボード 青(GND) |
# | J2-9(PMOD1) | ブレッドボード 赤(5V) |
# | J4-5V | ブレッドボード 赤(5V) |
# | J4-GND | ブレッドボード 青(GND) |
#
# 接続したら、こんな感じです。これで音声メニューのスケッチを動かしてみて下さい。
#
#
# ## 音声温度計
# 次に、可変抵抗の代わりに温度センサーLM35DZを接続して、温度をしゃべる「音声温度計」を作ってみましょう。
#
# LM35DZのピンを底からみたピンの配置をデータシートから引用します。
#
#
#
# LM35DZのラベルを見て、左のピンが5Vになるようにブレッドボードに差します。
#
#
#
# 以下のスケッチを使ってLM35DZの電圧から温度を読み上げるようにします。
#
# ```C++
# int lm32 = A0;
#
# void setup() {
# Serial.begin(9600);
# Serial.println("onsei ondokeide_su");
# delay(2000);
# }
#
# void loop() {
# float t = (float)analogRead(lm32)/1023*500.0;
# Serial.print("imano onndowa dode_su");
# delay(3000);
# }
# ```
#
# 温度の部分を以下の様にすることで、数字を正しく読み上げます。
#
# ```code
#
# ```
# ## 脚注
#
# - [1] すべて秋月で購入可能
# - [2] 他の部品を追加すると単体で動くArduinoになります
# In[ ]: