N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
給湯器リモコンに音声合成メッセージをつけてみた
「家電を改造しオリジナル音声メッセージをつける」プロジェクト第2弾です。前回は電子レンジでしたが、今回のターゲットは給湯器のリモコンです。"しゃべる給湯器"は最近では珍しくないですが、ウチのは古くてしゃべりません。そこで改造です!
今回は、圧電サウンダの駆動信号を取り出しその鳴動パタンを認識して、パタンに応じて異なる音声メッセージを出力することに加え、給湯器の点火状態を示すLEDの駆動信号を取り出して、燃焼を告げるメッセージも出力します。



■改造
予めブザー音を録音して鳴動パタンを調査したところ、今回用いた機種では以下のパタンとなりました。

Beepパタン

ブザー音を出力する圧電サウンダの回路とLEDを駆動する回路はおよそ以下のようになっています。
今回もそれぞれ5V系で動作しているICの出力から信号を取り出しています。

BEEP回路図

今回も、音声合成部は、試作で作った小型音声合成モジュールにビープパタンを認識するファームを追加することで実現しています。

VoiceModule

これを、基板の空きスペースにスピーカーと共に実装しました。

基板実装1
基板実装2


■電源について
この給湯リモコンは親機からの15Vを78LR05というレギュレーターで5Vを作っています。
このデバイスは5V系の電流が設計以上流れて電源電圧が下がるとマイコンにリセット信号が送られる機能があります。 給湯器ならではのフェイルセーフの設計だと思います。
そのためココは音声合成モジュールの電源容量が足りないので、写真には写っていませんが、3端子レギュレーターを別途使って15V系から音声合成モジュールの電源を作ってます。

■あとがき
給湯器の電源って、ついつい入れっぱなしにしちゃいますよね。
で、ちょっと手を洗うときなど、お湯が出始めないうちに終わってしまう使い方って多いじゃないですか。
そんなちょっとした時間でも給湯器は燃焼するので、まずエコでないし、給湯器の寿命をどんどん縮めてると思うんです。
てなわけで、音声メッセージをつけたら、酷使されてる給湯器の気持ち少しは意識できるかな?ってのが、今回の改造のきっかけでありました。

次なるターゲットは、"ビルトインガスコンロ"。頻繁にピーピーなってるのを何とかしようかと。
でも、ちょっと見た限りでは分解するのが大変そうで、断念の予感も・・・。

なお、市販製品の改造はリスクを伴いますのですべて自己責任です。念のため・・・

■リンク
| 電子工作 | 10:26 | - | - |
電子レンジに音声合成メッセージをつけてみた
ブザー音だけの電子レンジを、音声合成でメッセージ出力するように改造してみました。
圧電サウンダの駆動信号を取り出し、その鳴動パタンを認識して、パタンに応じて異なる音声メッセージを出力しています。




■仕組み
予めレンジを動かしてそのBEEPパタンを調査したところ、今回用いた機種では以下のパタンとなりました。

beep_pattern

ブザー音を出力する圧電サウンダの回路は大体以下のようになっています。
今回はICの出力から信号を取り出すことにしました。

beep_logic

音声合成部は、試作で作った超小型音声合成モジュールにビープパタンを認識するファームを追加することで実現しています。 一般的には、AquesTalk pico 音声合成LSIとコントローラ用のCPUを組み合わせて作ることになるかな。

AquesTalk VoiceModule

このモジュールを電子レンジの基板の空きスペースに実装しました。配線は電源と信号線とスピーカーの計5本のみ。スピーカーを筐体側にしっかりと取り付けて完成!

ne-c236


■あとがき
少し前に「世界最小(?)2.5Wアンプ付音声合成モジュール」というのを試作しました。
しかし、もっと良いアイデアが出てきたため、この企画は中断。
そこで、この余った試作品を有効活用するため電子レンジに応用した次第です。
特に便利になるような実用的な改造ではないですが、遊びに来たお客さんへのちょっとしたネタになれば良いかな。

なお、市販製品の改造はリスクを伴いますのですべて自己責任です。念のため・・・
 
| 電子工作 | 20:12 | - | - |
音声合成LSIのCAD用部品ライブラリ
AquesTalk pico LSIの部品ライブラリを以下に公開します。
回路設計や基板設計にお使いください。

ATP3011とATP3012シリーズそれぞれDIP版とTQFP版の2種類が含まれています。
対応CADは、EAGLEとDesignSpark PCBの2つです。

■対象デバイス型番
ATP3011F4-PU/ATP3011F1-PU/ATP3011M6-PU/ATP3011R4-PU
ATP3012F5-PU/ATP3012F6-PU
ATP3011F4-AU/ATP3011M6-AU/ATP3012F5-AU

■EAGLE用
http://www.cadsoftusa.com/downloads/file/aquest.lbr

■DesignSpark PCB用
http://www.a-quest.com/blog_data/dspcb_aquest.zip

内容に不具合などありましたら、infoaqアットa-quest.com にメールください。

今回Eagle版はCadSoftのサイトにアップロードしてみました。
アップロードしてからライブラリが公開されるまで半日ほどかかり、ちゃんと「ダウンロードできるようになったよ!」ってメールもあって、どうやら手作業でやってるみたいですね。
 
| AquesTalk pico LSI | 18:22 | - | - |
MCP2210 DLL用のheaderとlibファイル
■概要
MCP2210はMicrochipのUSB-SPIブリッジです。
これは、WindowsからはHIDデバイスとして認識され、専用ドライバーが不要で、COMポートの選択もいらないので、使い勝手が良さそうです。
また、Microchipから提供される"MCP2210 DLL"を使えば、HID APIを使わずにSPIを操作する感覚でホストのプログラムが書けます。
しかし、残念なことに"MCP2210 DLL"には、headerとlibファイルが付属していません。そこで、DLLから.h/.libを作成したので公開します。


■ダウンロード
mcp2210dll-hdr-lib.zip
(MCP2210DLL-UM.lib, MCP2210DLL-UM.h, msvcp90.dll, msvcr90.dll)

■備考
  • "MCP2210 DLL"のバージョンは Ver. 1.2.0 (MCP2210DLL_2014-10-29.zip)
  • MCP2210DLL-UM.dllのアーキテクチャはx86(Win32)、呼び出し規約は __stdcall
  • ヘッダファイルは、"Using the Unmanaged DLL.pdf"の関数一覧のテキストから抽出しました。
  • namespaceはすべて省略しました。
  • "Using the Unmanaged DLL.pdf"とMCP2210DLL-UM.dllは、下の2つの関数名が違って定義されています。差異は.defファイルで吸収したので、pdfの関数名で呼び出せます。
    "Using the Unmanaged DLL.pdf"       MCP2210DLL-UM.dll
      GetSpiActiveCsValue                        GetSpiCsActiveValue
      GetSpiIdleCsValue                           GetSpiCsIdleValue
  • C++/CLIの変数型の"String^"を使っている以下の関数は省きました。
        GetSelectedDevInfo     EnterAccessPasswd     SetNewPasswd
  • 実行には、"MCP2210 DLL"付属のmsvcp100.dllとmsvcr100.dllは使わず、msvcp90.dllとmsvcr90.dllが必要です。

■使用例
 
#include "stdafx.h"
#include "MCP2210DLL-UM.h"

const UINT32 MCP2210_VID = 0x04D8;   // VID for Microchip Technology Inc.
const UINT32 MCP2210_PID = 0x00DE;   // PID for MCP2210

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    DllInit(MCP2210_VID,MCP2210_PID);

    // check device connection
    int isConnected = GetConnectionStatus();
    if(isConnected) {
        // GP1->CS    GP0,GP2-GP8->GPIO
        const byte   gpioPinDes[] = {0, 1, 0, 0, 0, 0, 0, 0, 0};
        // GP0->OUT/LOW GP2->OUT/HIGH GP3-GP8->INPUT
        SetAllChipSettings(CURRENT_SETTINGS_ONLY,(byte*)gpioPinDes,
            0xFFFE,0xFFFA,0,0,0);

        // GP0->HIGH GP2->LOW
        SetGpioPinVal(0xFFFB);

        // set sample tx data
        WORD size;    //[byte]
        byte bufTx[64];
        byte bufRx[64];
        size = 16;
        for(i=0;i<size;i++){
            bufTx[i]=(byte)('A'+i);
        }

        // baudRate:1MHz idleCsVal:all-HIGH activeCsVal:onlyGP1-to-LOW SPI:Mode0
        SetAllSpiSettings(CURRENT_SETTINGS_ONLY, 1000000, 0xFFFF, 0xFFFD, 
            0, 0, 0, size, 0);

        // SPI transfer
        TxferSpiData(bufTx, bufRx);

        for(i=0;i<size;i++){
            printf("%x ",bufRx[i]);
        }

        // GP0->LOW GP2->HIGH
        SetGpioPinVal(0xFFFE);

    }

    DllCleanUp();
    return 0;
}



■LINK

「MCP2210 - USB Bridges」Microchip
「Wintab の開発環境構築」


■注意

Microchipより配布されている"MCP2210 Utility"は、信じられないことですが、下記のようにビットの並びが項目によって異なります。



Microchipより配布されている"MCP2210 SPI Terminal"の、GPIO/Chip-Select/DedicatedFuncのセレクタはFakeです。ソースコード見たら、デバイス側へはすべてChip-Selectで送られてます。


 
| その他 | 10:41 | - | - |
音声合成LSIで「オリジナルの音声時計」を作ろう!- その4 カスタマイズ編
前回、基本スケッチでハードウェアとソフトウェアの動作確認を行いました。あとは、オリジナル音声時計にするためのカスタマイズ・改良を行って完成です。

■スケッチをカスタマイズしよう
ソフト的なカスタマイズは、前の記事で使用した基本スケッチ(YukkuriClock2.ino)をベースに、このファイルを編集して行います。

基本スケッチでのメモリ容量は、チップの容量のROM:19%、RAM:23%でしたので、まだまだカスタマイズ・機能拡張の余地がありますね。ただ、注意すべき点は、メッセージの音声記号列をRAMに配置してしまうとあっという間にRAMが足りなくなりますので、文字列はROMに配置されるようメッセージのPSTR指定は必須です(ヒントは PROGMEM/ハーバードアーキテクチャー)

スケッチをカスタマイズしたら、ATmega328PをArduino Unoに挿して、以下の操作でカスタマイズしたスケッチを書き込めばOKです。
  1.     メニュー:ツール > ボード > Arduino Uno
  2.     メニュー:ファイル > マイコンボードに書き込む

以下に、具体的なスケッチの変更方法を示します。

・記念日と、そのメッセージを変更するには
基本スケッチでは2月11日と3月14日にメッセージを発声するようにしていますので、月日とメッセージを任意に書き換えます。 記念日は、ソースコードを並べればいくつでも増やせます。

なお、dayLast変数に発声日を保存することで、その日の最初に一回だけ発声するようにしています。
// 記念日のメッセージ発声
void MessageKinenbi(const AQ_DATE_TIME &dt)
{
  static uint8_t dayLast = 0;   // 同日の発声は1回のみにするため、発声日を保存
  if (dt.d != dayLast) {
    // 誕生日
    if (dt.m == 2 && dt.d == 11) {      // 2月11日
      TalkP(PSTR("otannjo-'bi,omedetoo'")); //「お誕生日おめでとう」
    }
    // 結婚記念日
    else if (dt.m == 3 && dt.d == 14) { // 3月14日
      TalkP(PSTR("kyo'-wa kekkonnkinenn'bi")); //「今日は、結婚記念日」
    }
    // ... 必要に応じて追加
    dayLast = dt.d;
  }
}
yukkuriclock2.ino:MessageKinenbi()

メッセージは、音声記号列で指定します。ローマ字のようですが、少しでも間違っているとエラーになり発声しませんので、別途、アクエストのサイトのデモページで確認することをおすすめします。このサイトでは漢字テキストから音声記号列を生成できますし・・・。また、「AquesTalk pico LSI」ATP3011XXのデータシートにこの音声記号の仕様があるので、一度目を通しておくとよいでしょう。

・曜日毎のメッセージを変更するには
MessageWeek()関数で、曜日毎のメッセージを記述しています。ここでも、その日に一度だけ発声するようにしています。 先の記念日と違う部分は、発声時間を限定している点です。基本スケッチではゴミ収集のメッセージなので夜は発声させません。 このような条件もメッセージに合わせて自由にカスタマイズできます。
// 曜日ごとのメッセージ発声
// ゴミ収集日のメッセージ発声
#define STR_WEEK_FUTSU  "kyo'-wa moyasu/gominohi."
#define STR_WEEK_PURA   "kyo'-wa purasuchi'kkuto shige'nngominohi."
#define STR_WEEK_PET    "kyo'-wa pettobo'toruno/gominohi."
void MessageWeek(const AQ_DATE_TIME &dt)
{
  static uint8_t dayLastWeek = 0;   // 同日の発声は1回のみにするため、発声日を保存
  if (6 <= dt.hh && dt.hh <= 9) {   // 6時から9時に限り
    if (dayLastWeek != dt.d) {
      if (dt.w == 2 || dt.w == 6) { // TUE/SAT
        TalkP(PSTR(STR_WEEK_FUTSU));
      }
      else if (dt.w == 3) { // WED
        TalkP(PSTR(STR_WEEK_PURA));
      }
      else if (dt.w == 5) { // FRI
        TalkP(PSTR(STR_WEEK_PET));
      }
      dayLastWeek = dt.d;
    }
  }
}
yukkuriclock2.ino:MessageWeek()


・アラームを変更するには
RTCにあらかじめ時刻を設定しておくと、その指定時刻に割り込みが発生し、このMessageAlarm()関数が呼ばれます。 設定時刻は、スケッチ先頭部分にある「アラーム起動時刻」で指定しています。
基本スケッチでは、平日に限り「おはよう 朝です」と発声していますが、これも自由に条件とメッセージを書き換えてください。
// アラームのメッセージ発声
void MessageAlarm(const AQ_DATE_TIME &dt)
{
  if (1 <= dt.w && dt.w <= 5) { // 平日のみ
    TalkP(PSTR("ohayo-' a'sade_su."));  // 「おはよう 朝です」
  }
}
yukkuriclock2.ino:MessageAlarm()

RTCのアラームは一度に1つしか設定できませんが、R8025_AlarmSet()関数で動的にアラーム時刻を設定できますので、アラーム割り込み発生ごとに次のアラーム時刻を設定すれば、曜日ごとにアラーム時刻を変えたり、毎時時報を発声するなんてこともできるでしょう。ちなみに、R8025のアラームは、繰り返えさないので毎回セットする必要があります。

・オリジナルの機能を実装するには
メインループ(loop()関数)内に、オリジナルの関数を追加して、たとえば、毎朝ラッキーカラーランダムに発声するなんてことも面白いと思います。

・発話速度を変えるには
AquesTalk.hのSetSpeed()関数を呼び出せば、発話速度を変更することができます。関数の使い方はArduino用音声合成LSIライブラリを参照ください。

・その他
今回は日時設定に2つのスイッチを使ってますが、1つ、あるいは3つでオリジナルのシーケンスで操作してもいいですね。
カスタマイズは、要は日時情報と振動のトリガでどんなメッセージを出力するかということにつきます。
色々なアイデアで、実際に面白いものをいろいろ試していただければ幸いです。

MySleep()関数は割り込みがあるまでスリープします。ここでATmega328Pや音声合成LSIをSleep状態にして待機時の消費電流を1uA以下にしています。割り込み要因は、振動スイッチ/SETボタン/UPボタンの状態変化(立ち上がり立下りの両方)とRTCのアラーム割り込みです。


■ハードウェアのカスタマイズ

音量の調整は
R4の抵抗を変えて音量を調整できます。音が大きいならR4を4.7KΩなどに変えれば小さくなります。ただし、逆に1KΩ以下にしても大きくはなりません。大音量で使うなら別途アンプ回路を実装します。

拡張用のGPIO
拡張用に3本のGPIO(IO9/IO10/IO11)を用意してますので、これを使ってハードウェアの改良ができます。
「LOTTORP」には3色LEDがついてますので、たとえば、割り込みがあったときにピカッと光らせてもよいですね。
また、今回は振動スイッチ(傾斜スイッチ)を使いましたが、圧力センサーをつなげて握ったときに発声させるなどの応用もできそうです。また、感熱センサーをつけて近くに寄ったら発声するのも良さそうですね。消費電流の課題がありますが・・・。

筐体
今回はIKEAの「LOTTORP」に組み込みましたが・・・
折角、通称「ゆっくりチップ」を使ってるので、やっぱりコレに入れたほうがいいのかな ラッキー


以上で「オリジナルの音声時計」の完成です。

■プレゼント
今回の試作で発注したプリント基板のあまりをプレゼントします。
ただし、実際に製作してそのブログ記事を書いてくれることを条件にしたいと思います。
特に内容や期限はありませんので、お気軽に。
ご希望の方は、こちらからどうぞ。先着順、1人1枚限り(ってほどニーズあるのか!?)


■LINK
AquesTalk デモページ
http://www.a-quest.com/demo/index.html

ATP3011XXのデータシート
http://www.a-quest.com/download/manual/atp3011_datasheet.pdf

Arduino用 音声合成LSIライブラリ
http://blog-yama.a-quest.com/?eid=970151

音声合成LSIで「オリジナルの音声時計」を作ろう!
| 電子工作 | 09:49 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND