N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
音声合成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 | - | - |
音声合成LSIで「オリジナルの音声時計」を作ろう!- その3 ソフト編

前回までに、部品や配線の半田付けで音声時計のハードウェアを組み立てました。今回は、コントローラであるATmega328Pにプログラムを入れ、実際に動作を確認してみます。



■スケッチの書き込み
まずは、ハードウェアの動作テストを兼ねて、下記からダウンロードした基本スケッチで動かしてみます。
Arduino Unoは、ブートローダ&Fuse設定を行ったATmega328Pに差し替えておいてください。
 


ダウンロードしたスケッチ一式を展開後、任意のフォルダに置き、次の手順で、Arduino IDE(Ver.1.6.1)でこれを開いてATmega328Pにスケッチを書き込みます。

  1. メニュー:ファイル > 開く > YukkuriClock2.ino
  2. メニュー:ツール > ボード > Arduino Uno
  3. メニュー:ファイル > マイコンボードに書き込む

書き込み時にエラーが出ないことを確認してください。

■動作確認します!
ATmega328Pを、音声時計の基板に差し替えます。
いよいよ、電池を挿入する、いつもの緊張する瞬間です。

ポン!日時を設定します」と聞こえたら、まずはオッケーです。

もし、なにも聞こえなかったら・・・。

電子工作してればそういうこともある、というか、最初から動く事の方が少なかったり・・・。
ただ、このことで回路のレビューを始めたり、いろいろ調べたりで、一発で動くより結果的にはるかにスキルアップします。 動かなくても、そのチャレンジを楽しみましょう!


■時刻を設定するには
基本スケッチで、日時・時刻を設定する手順は次のとおりです。

・年月日の設定
最初に電源をいれると、「ポン!日時を設定します。まずは何年?2015年」と発声しますので、よければSETボタンを、UPボタンで2016年、2017年と進み、SETボタンで確定します。その後、「次は何月?1月」で同様に月を、「最後に何日?1日」で同様に日にちを設定します。最後に「ポン、よろしければセットボタン、もう一度なら・・・・」と発声しますので、SETボタンを押して確定します。

・時刻の設定
UPボタンを押すと1時間づつ進みますのでこれで時(hour)を設定します。SETボタンを押すと30分を境に繰り下げ、繰上げされます。たとえば、8:55 にSETボタンを押すと9:00になります。分(min)の設定は、正時になった瞬間にSETボタンを押して設定します(笑)

・RTCバックアップについて
本時計は、待機時、電源ラインのコンデンサだけで数分間電源供給が可能です。したがってパネルが上を向く状態で電池交換をすればRTCは狂わず、日時の再設定は不要です。ちなみに、年月日の設定処理は、RTCへの電源供給が止まった後にのみ起動されます。


この後は、いよいよ最終段階。カスタマイズしてオリジナルの音声時計を完成させます。
その4 カスタマイズ編につづく

■LINK

YukkuriClock2 基本スケッチ
http://www.a-quest.com/download/blog/yukkuriclock2.zip

音声合成LSIで「オリジナルの音声時計」を作ろう!


 

| 電子工作 | 22:45 | - | - |
音声合成LSIで「オリジナルの音声時計」を作ろう!- その2 ハードウェア編
前記事では何を作るかで終わってしまいましたが、今回は「オリジナル音声時計」のハードをウェアを組み立てます。

■用意するもの

[パーツ一式]

使用する電子部品は次のとおりです。
基本、秋月電子で入手できます。なお、スピーカーにφ20mmを使うならマルツかAitendoで売ってました。

■パーツリスト
  • IC1    AVRマイコン    ATmega328P-PU
  • IC2    RTCモジュール    AE-RX-8025NR
  • IC3    音声合成LSI    ATP3011F1-PU(他の声種でもOK)
  • Q1    セラロック    muRata 8MHz
  • R1    抵抗    1MΩ
  • R2    抵抗    1KΩ
  • C1    コンデンサ    0.1uF
  • C2    コンデンサ    0.047uF
  • C3    コンデンサ    0.1uF
  • C4    コンデンサ    22uF
  • T1    トランジスタ    2SC1815または同等品
  • S1    振動(傾斜)スイッチ 丸型(AT-407)
  • -    ICソケット 28P 300milタイプ 2個
  • SP    スピーカー  8Ω (LOTTORPで使うならφ20mm)

ほかに、次も必要です。
  • 基板(専用基板またはユニバーサル基板)
  • ケース(IKEAの時計「LOTTORP」¥299で購入。任意のケースでも可
  • プッシュスイッチ 2個 (ケースにあれば不要)
  • 電池ケース 乾電池2本用 (ケースにあれば不要)
  • Arduiino Uno
  • ブレッドボード

Arduiino Uno、ブレッドボードはブートローダーやスケッチの書き込みに使います。

現在のLOTTORPは、基板にスイッチと電池の電極が一体化されサイズも奥行きが8mmほど短くなってます。残念ながら今回作成した専用基板は使えません。今回使用したLOTTORPは2011年のロットでした。パネルのデザインも違うので区別できます。 比較画像 この古いほうもネットではまだ入手できるようです。

■ブートローダーの書き込みとFuse設定
この設定にセラロックを使いますので、半田付けの前にこの作業を行っておきます。

ブートローダーの書き込みは、新品のAtmega328P-PUをArduino Unoで使える(スケッチを書き込める)ようにするための儀式です。Fuseは、クロックソース選択などAtmega328P-PUデバイスの基本動作を規定するもので、デバイスのプログラムとは別の領域に設定を書き込みます。今回は乾電池2本で動かすために、Arduino Unoのデフォルトとは異なる値を設定する必要があります。

1. boards.txt 編集
Fuseの値をカスタマイズする方法はいくつかありますが、今回はArduino IDEの設定ファイルの「boards.txt」を一部追記する方法で行います。boards.txtは、通常、C:¥Program Files¥arduino¥hardware¥arduino¥avr にあります。Arduino Unoのセクション全体をコピーして次のように修正します。(今回使用したArduino IDEのバージョンは 1.6.1)


[boards.txt](一部抜粋)

2. ブレッドボード配線
boot_write_brd
図のように配線します(オレンジの部品は8MHzセラロック)。
(2015/04/27 ピン接続がずれてた間違いを修正)

3. 書き込み
  1. メニュー : ファイル > スケッチの例 > ArduinoISP
  2. メニュー : ファイル > マイコンボードに書き込む
  3. メニュー : ツール > ボード > Yukkuri Clock
  4. メニュー : ツール > 書き込み装置 > Arduino as ISP
  5. メニュー : ツール > ブートローダを書き込む
ステータスが「ブートローダーの書き込みが完了しました」になればOK。
これでスケッチが書き込めるようになります。

Atmega328PにはBODという電源電圧が規定値より下がるとソフトリセットをかけて暴走を防ぐための機能がついています。Arduino Unoは5V動作が前提なので、この電源電圧の規定値ガ2.8Vとなっているため乾電池2本動作で使うには高すぎます。そこで、今回はBODの機能を切るようにFuse設定を行います。


■ハードウェアを組み立てます

・基板の半田付け
RTCモジュールに付属の細ピン接続します。RTCモジュールのジャンパーJ1/J2/J3すべてオープンのままです。
基板にパーツをすべて半田付けします。音声合成LSIとATmega328P-PUは差し替えの可能性があるのでICソケットを使います。
注意点は、セラロックはATmega328P側に取り付けること。また、振動スイッチは、リードを2-3mm浮かせて半田付けして、その後、45度程度RTC側に傾けます。

[基板にパーツを実装したところ]

・プッシュスイッチ/スピーカー/電池ケースの配線
基板の端子INTのS(SET)とG(GND)間と、U(UP)とG(GND)間に2つのプッシュスイッチを配線します。
次に、基板の端子SPにスピーカーを配線します。極性は気にしなくてかまいません。
最後に、基板の端子BATTの+に電池ケースのプラス。もう一方にマイナスを配線します。

・LOTTORPをケースに使う場合(ロット違いに注意:上記「用意するもの」参照
LOTTORPの分解は、前面の薄いパネル(接着されている)をカッター等でゆっくり剥がせば、4本のネジが出てくるので、あとは簡単にバラせます。基板につながっている配線をすべて外し、ネジ止めされている基板も外します。LCDやLEDパネルはあとでスペーサーとして利用するので捨てません。使わないのは元の基板だけです。

ケースと基板の配線は、次のように配線しました。
    スイッチ:赤->GND 黄->SET 茶->UP
    電池:    赤->+  黄->GND

スピーカーは、微妙に収まらなかったのでケースのツメをカットして装着。その後、接着剤で固定します。
また、液晶の電極と基板の間をテープ等で絶縁します。当初、基板のランドが一部重なってLCDの一部が表示されてしまったので・・・。LED端子は未接続です。カットせずに将来のハード改良のためそのまま残します。


[ケースに配線後]

このあとは、ATmega328Pにスケッチを書き込んだ後、ケースを元通りに組めば完成です。
その3 ソフト編につづく

■LINK
音声合成LSIで「オリジナルの音声時計」を作ろう!

■参考
『簡単!ATmega328Pにブートローダを書きこむ(第2弾)』
http://blog-yama.a-quest.com/?eid=970164

 
| 電子工作 | 18:59 | - | - |
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