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