新製品AquesTalk pico R5と、Raspberry Pi用AquesTalk Piの紹介

AQUEST社の音声合成LSIであるAquesTalkに、新製品「AquesTalk pico R5」が登場するようです。この新製品は小型スピーカに適しているようなので、発売前に現行のAquesTalkについて、書かせていただきます。
近年、バスの車内アナウンスなどで音声合成を耳にすることが増えたと思います。電車などで使われている録音による音声の場合、アナウンスの変更にコストがかかります。音声合成だと停留所が増えたり、停留所の名前が変わっても簡単に変更することが出来ます。
しかし、音声をスムーズに話すには様々なイントネーションの音声の組み合わせを複雑に合成して出力する必要があります。ここで紹介するAqesTalk picoは、簡単なテキスト(ローマ字)入力とアクセント記号などでスムーズな音声合成を行うことができるLSIです。
従来のAquesTalk picoシリーズは、秋月電子通商で販売されており、当方のウェブサイトなどでも利用させていただいています。

新製品「R5」について

今回の新製品はロボット音声の「R」シリーズです。従来の「F4」の「かわいい声」を、より高音にしたような印象を受けました。
当方のサイトでも「F4が小型スピーカ向け」と紹介していましたが、今回の「R5」は、より小型スピーカに向いてそうです。
XBeeを使った「AquesTalk ワイヤレスおしゃべり端末」(当方サイト)

どんな音声が出るのか気になる方は、AQUEST社の下記のデモで確認することが出来ます。

AquesTalk pico LSIの応用例

使い方は、XBeeZBモジュールや、ESPモジュールをシリアルで接続し、読み上げるためのデータをAquesTalkに送信するだけです。

ESP-WROOM-02にAquesTalk pico ATP3012F5を接続し、小型スピーカから音声を出力する実験の様子。

ESPモジュール内のWebサーバにアクセスし、音声データを送信する


中央のLSIはAquesTalkと呼ばれる音声合成LSIです。この写真に写っているものは従来品です。右側の金属部品はWi-Fi内蔵のマイコンESP-WROOM-02です。このESPモジュール用のプログラムも公開しています。
下図は、XBee ZigBeeモジュールに接続した時の様子です。
XBee ZBモジュールに接続した場合の一例。ATP3011シリーズの場合は、外部クロックが不要になる。

Raspberry Piであれば「LSI不要」で音声合成出力が可能

同じような機器をRaspberry Piだけで実現することもできます。AQUEST社からRaspberry Pi上で動作するソフトウェア「AquesTalk Pi」が無料(個人利用の場合)で配布されています。前述のようなLSIなしに、Raspberry Pi上のソフトウェア処理で音声を出力することが出来ます。
Raspberry Pi用のソフトウェア音声合成ソフト AquesTalk Pi
ダウンロード後、以下のコマンドでインストールし、動作確認を行うことが出来ます。ヘッドホン端子から音声が出力されます。
$ tar xzvf aquestalkpi-*.tgz
$ aquestalkpi/AquesTalkPi -f aquestalkpi/test.txt |aplay
$ aquestalkpi/AquesTalkPi "こんにちわ"|aplay
音声出力を切り替えるには、以下のコマンドを実行します。
ヘッドホン出力
$ amixer cset numid=3 1
HDMI音声出力
$ amixer cset numid=3 2
パイプ入力に対応しているので、シリアルなどで受信した音声を出力することが出来ます。
$ echo "こんにちわ"|aquestalkpi/AquesTalkPi -f -|aplay
なお、RaspberryPi用のAquesTalk Piと、LSI版のAquosTalk picoとでは、音声データが異なります。Raspberry Pi用は日本語(漢字あり)で再生しますが、LSI版はローマ字入力です。
by ボクにもわかるRaspberry Pi

IchigoJamを使ったIoT表示装置・遠隔スクリプト実行装置の製作

遠隔からIchigoJam BASICのプログラムを転送することで、プログラムの書き換えが容易なIoT端末を製作することが出来ます。ここでは、その基本となるBASICコマンド発行とプログラム転送の実験を行います。
また、本機には温度や湿度、照度、ドア開閉状態を検出するIoTセンサから得られた情報を、次々に表示する機能も実装しています。(IoTセンサの製作方法についての情報も、近いうちに提供予定。)
本機をテレビに接続して、起動すると、IPアドレスが表示されます。表示されたアドレスへ、インターネットブラウザ(IEにて動作確認)でアクセスし、プログラムを転送、実行したときの一例を下図に示します。

ブレッドボード上にIchigoJamのファームウェアを書き込んだマイコンと、Wi-FiモジュールESP-WROOM-02を実装。ワイヤレスによる遠隔制御で、ビデオ出力からテレビへ情報表示したり、表示用のプログラムの転送を行うことが可能。


また、「コンニチワ!」といったメッセージも表示します。カタカナ文字の転送は、文字コードなどの都合で、意外と面倒です。現時点では、カタカナについては、コマンド送信時とUDPパケット受信時のみに対応しています。現状、プログラム転送時は英数字のみの対応です。
本プログラムでは、BASICのダイレクトモード(コマンドを即実行)については、「HTTP GET」を使用します。実行結果は、最上列(「起動しました」と表示されている部分)に表示されます。
LED 1、LED 0、BEEP、?ANA()、?VER()のボタンを押すか、そのすぐ下にある入力フィールドにコマンドを入力し、「送信」を押してみてください。IchigoJamへ命令が送られ、その結果がブラウザに転送されてきます。

パソコンなどのブラウザからESPモジュールへアクセスし、IchigoJamを遠隔制御する。「起動しました」の部分に応答結果が表示される。


プログラム転送には「HTTP POST」を使用します。プログラムを入力し、「送信」を押すとIchigoJam側に転送されます。1024バイトのプログラム転送についても動作確認済みですが、どんなプログラムでも転送できるとは限りません。余裕をもって転送できるとは言い難いです。
現時点では、転送後、プログラムを再編集して送信する機能がありません。編集機能を実装予定でしたが、(今回の実装方法では)文字コードをリアルタイムで解析して応答する必要があり、処理速度が間に合わず、保留中です。私の頭が古いので、1990年代の伝統的な通信方法しか用いていないのも苦戦している理由の一つです。
ハードウェアは、ブレッドボードを使って製作しました。左下の黄色の端子がビデオ出力です。キーボードが不要になるので、これだけの回路で、IchigoJamの全機能を使用することができます。
ブレッドボードでの製作例。この製作に大きく寄与しているIchigoJamのファームウェアは、個人利用の範囲であれば、無料でダウンロードすることが可能。
ESPモジュール側のスケッチは下記からダウンロード可能(開発途中版)

IoTセンサから受信したときの様子。現在、室温30℃、湿度87%、IoTセンサの電池電圧4.487V。


この夏はIoTの話題で、ますます熱くなりそうです。IoTセンサで測った情報を、小型モニターで常時監視できるシステムも活躍しそうです。
引き続き、関連した情報をFacebook、Twitterなどで配信予定ですので、興味のある方は、ぜひ再訪問していただけるよう、お願いいたします。
by ボクにもわかるIchigoJam用マイコンボード
Facebook

IchigoJam+MixJuice で I2C->HD44780液晶に文字を表示する

久しぶりに「ボクニモワカル for Mix Juice」を更新しました。
IchigoJamのI2C端子へ I2C->HD44780コンバータ基板つきの液晶を接続し、ボクニモワカル for Mix Juiceのメニュー 8 ⇒ 6にアクセスすると、以下を自動で実行し、液晶に文字を表示します。
以下が自動実行される
  1. 液晶に文字を表示するドライバ・プログラムをダウンロード
  2. メッセージを取得
  3. ドライバ実行
  4. 液晶に文字を表示
  5. メニューへ戻る

詳細

これを実験するには、以下ブログを参照していただく必要があります。
ボクにもわかる for Mix Juice
I2C接続の20桁x4行の液晶にIchigoJamを接続する
なんとなく理解したら、液晶をIchigoJamへ接続し、以下を実行してください。
IchigoJam + MixJuiceで以下を実行
?"MJ GET bokunimowakaru.github.io/MJ/"
メニューが表示されたら
8⏎
6⏎
しばらく待つと、液晶にメッセージが表示されると思います。

自動でダウンロードされる液晶ドライバ

new
1 CLS:?"LCD":gsb800:end
800 'INI
810 Q=60:gsb990:gsb990:gsb990
820 Q=44:gsb990:gsb990
830 Q=#8C:gsb990:Q=12:gsb990
840 Q=#CC:gsb990:Q=12:gsb990
850 Q=28:gsb990:Q=12:gsb990
860 Q=#6C:gsb990
900 'LCD
910 Z=#900:gsb960:Q=#CC:gsb990
920 Q=12:gsb990:Z=#920:gsb960
950 rtn
960 Q=peek(Z):ifQQ=Q&#F0|13:gsb990elsegoto980
970 Q=peek(Z)<<4|13:gsb990
980 Z=Z+1:ifZ&31=16rtnelsegoto960
990 poke#8ED,#FB&Q:ifi2cw(#27,#8EC,1,#8ED,1)?"E"elsertn

メッセージ表示部のBASICスクリプト

cls:?"I2C HD44780 LCD":?"Driver W.Kunino"
gosub800:?"MJ GET bokunimowakaru.github.io/MJ/800.txt"
by ボクにもわかるIchigoJam用マイコンボード

5分で動作確認。本日発売のRaspberry Pi用 IoT拡張ボードApple Pi

Raspberry Piに、温度・湿度・気圧センサ、赤外線リモコン送信・受信機能、小型液晶表示、ハイレゾオーディオ出力機能、LED、操作ボタン、UART端子(パッド)、I2C端子(パッド)を拡張することが出来る IoT拡張ボード「Apple Pi」が発売されました。この1行で、読みつかれるほど、機能満載のボードです。
今日は、自分の手持ちのドライバで動作する以下の機能の動作確認を行いました。
 ・I2C接続小型液晶
 ・温度・湿度・気圧センサ
 ・赤外線リモコン受信モジュール

 ・赤外線リモコン送信
 ・LED
 ・タクトスイッチ(ボタン)

当ブログでは手軽に動作確認する方法を紹介していますが、適切な使い方ではありません。動作確認が終わったら、トラ技の記事にしたがって適切な使い方をお楽しみください。

I2C接続小型液晶の動作確認

本ブログでは、独自のライブラリを使った動作確認方法について説明します。正式な動かし方は、まだ理解していません。さっと確認したい人向けの情報です。
まず、以下のコマンドを入力して、ソフトをダウンロードし、コンパイルしてください。
$ cd
$ cd RaspberryPi/gpio
$ make
液晶に文字を表示するには、以下のように入力します。「LCD TEST」「Hello./」と表示されます。
$ ./raspi_lcd LCD TEST Hello./

温度・湿度・気圧センサ

次は温度・湿度・気圧センサです。以下のように入力すると、約1秒後に結果が得られます。
$ ./raspi_bme280
38.30 35.66 987.81
左から順に、温度、湿度、気圧です。値が明らかにおかしいですが、動いたことには変わりないので、今日のところは、これで良しとします。

赤外線リモコン受信モジュール

赤外線リモコン受信を行うには、GPIOポート番号を指定する必要があります。Apple Piの赤外線リモコンモジュールはGPIO4に繋がっているので、以下のように入力します。
$ ./raspi_ir_in 4
この状態で、赤外線リモコンから赤外線を送信すると、以下のようなリモコンコードが得られます。
AA 5A 8F 12 16 D1
得られない時は、「Ctrl」+「C」で停止してから、以下のように、1か2を付与します。
$ ./raspi_ir_in 4       Panasonic, SHARP
$ ./raspi_ir_in 4 1             ONKYO, NEC
$ ./raspi_ir_in 4 2             SONY
$ ./raspi_ir_in 4 255          自動選択
ご注意:Raspberry PiのモデルやRaspbianのバージョンによってはWiringPiのインストールが必要です(下記参照)。

赤外線リモコン送信

赤外線リモコンの送信を行うには、LEDを高速に制御する必要があるので、WiringPiのインストールが必要です。
WiringPiのインストール方法
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
Apple Piの赤外線リモコン送信部はGPIO13に繋がっています。「raspi_ir_out 13」に続けて、赤外線方式の番号(0=AEHA、1=NEC、2=SONY SIRC)と、リモコンコードを入力すると、リモコン送信が可能です。
リモコンのコードは前述のraspi_ir_inで取得します。
$ cd ~/RaspberryPi/gpio                         # ディレクトリ変更(gpio以外のフォルダにいた時)
$ ./raspi_ir_in 4                                      # リモコン受信
AA 5A 8F 12 15 E1                                # 受信結果
$ ./raspi_ir_out 13 0 AA 5A 8F 12 15 E1     # リモコン送信
Pin = 33, Port(BCM) = 13 Port(wPi) = 23    # Raspberry Piのピン番号、ポート番号が表示される
mode = 0                                              # リモコン方式 0=AEHA、1=NEC、2=SONY SIRC
data[6] = AA 5A 8F 12 15 E1                   # リモコンコード

LEDの制御(青色LED1=GPIO 5、白色LED2=GPIO 6)

LEDを制御するにはGPIO5と6を設定します。初期状態では、うっすらと点灯しているかもしれませんが、下記のコマンドを使って、1に設定すると明るく点灯し、0で完全に消灯します。
のように、1か2を付与します。

$ ./raspi_gpo 5 1      青色のLED1を点灯する
$ ./raspi_gpo 5 0             青色のLED1を消灯する

$ ./raspi_gpo 6 1      白色のLED2を点灯する
$ ./raspi_gpo 6 0             白色のLED2を消灯する

スイッチ入力(GPIO 22~27)

6つの
クトスイッチは、茶色から順にGPIO22から27へ接続されています。それぞれのスイッチから値を得るには、raspi_gpiコマンドを使用しますが、基板にはプルアップ抵抗が実装されていないので、プロアップ設定で入力する必要があります。一例として、茶色のボタンGPIO22から得るには、
$ ./raspi_gpi 22 PUP
のように「PUP」を付与します。
また、ボタンが押されるまで待ち続ける方法もあります。以下のように、末尾に待ち受ける値を記述してください。

$ ./raspi_gpi 22 PUP LOW
ボタンが押下されるまで待ち続け、ボタンが押下されると、その待ち時間(1/10秒単位)が表示されます。

お買い求めの際のポイント

製造元のBitTradeOneのほか、Yahooショッピング、Amazon、共立電子など、様々なところで売られています。
「Apple Pi」のキーワードで検索してみると良いでしょう。
パーツのみのセット(税別5480円)と、組み立て済のセット(税別6980円)が売られています。
面実装部品や、他ピンコネクタの半田付けの労力を考えつつ、選択すれば良いでしょう。あと、パーツのみのセットには基板が含まれていないので、トラ技の基板を使ってしまいます。一方、組み立て済のセットは、基板上に部品が実装された状態ですので、トラ技の基板を他の用途にとっておくことが出来ます。
写真は完成品です。すべての半田付けが手作業で行われているようです。丁寧に仕上げられていますが、フラックスが飛んでいます。気になる方は、動作確認を行ってから、除去すれば良いでしょう。

Raspberry Pi用 Apple Pi を実用的に活用するためのサンプルスクリプト

実用的なサンプルスクリプトを公開中です。
IPアドレス表示とシャットダウン機能:
遠隔地の高齢者見守りサービス i.MyMimamoriPi システム(トランジスタ技術2016年9月号)

by ボクにもわかるRaspberry Pi

I2C接続の20桁x4行の液晶にIchigoJamを接続する

IchigoJamからI2C接続の20桁x4行キャラクタ液晶へ文字を表示する実験に成功しました。この先も少し道のりがあるのと、私は未だこの液晶を入手していないので、備忘録として記しておきます。
なお、掲載写真は全て、この実験に取り組んでいただいたFacebook IchigoJam-FANグループの松永義幸さん(JR3KQF)によるものです。
写真=Facebook IchigoJam-FANグループの松永さん

I2C-GPIOエキスパンダPCF8574T

この液晶モジュールにはI2Cインタフェースを搭載していません。モジュールの裏側にI2CからGPIO(パラレル)変換のインタフェース基板が搭載されているタイプになります。変換基板にはNXP社のPCF8574Tもしくは互換品が搭載されています。I2Cを8本のGPIOに変換するICです。
さて、こういったI2C液晶モジュールは、通常のI2C液晶と大きく異なる点があります。それは液晶ドライバIC(日立HD44780互換品)とのインタフェースが4ビット接続になっていることです。8本のGPIOのうち4本をデータ用に使用し、残るGPIOのうち3本~4本を、信号制御用に使用しています。
そこで、今回、このような4ビット接続用のI2C液晶を制御してみようと思いました。

PCF8574TとHD44780の結線方法

私も類似の液晶を注文しましたが、入荷まで2~3週間。まだ入手できていません。そこで、先行してプログラムだけを作成しようと、このI2Cインタフェース基板の回路(PCF8574TとHD44780との接続方法)を調べてみました。すると、結線方法には様々な方法があることがわかり、また、松永さんが購入したものと、私が購入したものでも異なることが分かりました。
結線内容の具体例(PCF8574T -> HD44780)
例①      例②
P0 -> DB4  P0 -> RS
P1 -> DB5  P1 -> R/W
P2 -> DB6  P2 -> E
P3 -> DB7  P3 -> BL
P4 -> E    P4 -> DB4
P5 -> R/W  P5 -> DB5
P6 -> RS   P6 -> DB6
P7 -> BL   P7 -> DB7
例①は、Arduino公式ブログ内で配布されているライブラリに対応した結線例です。例②は、今回、松永さんが購入した液晶に搭載されていたI2Cインタフェース基板の結線例です。同氏に下図の結線図も作成していただきました。下図に数字が書かれているのが液晶(HD44780)側です。なお、バックライト(BL)の接続の有無等もI2Cインタフェース基板によって異なります。

I2Cアドレスの検索

下記はI2Cアドレスの検索ツールです。Read 0コマンドに対して応答があるかどうかを検索するだけのものです。応答しないデバイスもあるかもしれません。
1 CLS:?"I2C Detector by W.Kunino"
10 Q=0:clt
20 for I=8 to 119
30 D=i2cr(I,#8EC,1,#8ED,0)
40 if TICK()>240 ?"ERR":end
50 if D ?"– "; else ? hex$(I,2);" ";
60 if I%8=7 ?
70 next:end
実行例

I2C Detector by W.Kunino
— — — — — — — —
— — — — — — — —
— — — — — — — —
— — — — — — — —
— — — — — — — —
— — — — — — — —
— — — — 3C — 3E —
— — — — — — — —
— — — — — — — —
50 — — — 54 — — —
— — — — — — — —
— — — — — — — —
— — — — — — — —
— — — — — — — —
OK

実験用プログラム

下図は表示を確認するための実験用プログラムです。緑色の部分はデバッグ用橙色の部分は明らかに最適化による効果が見込める部分赤色は省略により高速化が図れるかもしれない部分です。
ほぼこのプログラムだけでIchigoJamのプログラム用メモリを占有してしまうで、実用に向けての改良が必要です。
' P4~P7にDB4~DB5が接続されているタイプ用
' PCF8574T + HD44780 TEST
new
1 CLS:?"LCD TEST":?"W.Kunino"
100 ?"Init"
110 poke#700,#3C:gsb800
120 gsb800
130 gsb800

140 poke#700,#2C:gsb800
150 gsb800
160 poke#700,#8C:gsb800
170 poke#700,
#0C:gsb800
180 poke#700,
#CC:gsb800
190 poke#700,#0C:gsb800
200 poke#700,
#1C:gsb800
210 poke#700,#0C:gsb800
220 poke#700,
#6C:gsb800
300 ?:?"Print"
310 gsb900
399 end
800 'I2C
810 poke#701,(peek(#700) & #FB)
820 ifi2cw(#27,#700,1,#701,1)?"E"

830 ?hex$(peek(#700),2);hex$(peek(#701),2);" ";:wait 5
840 rtn
900 'LCD OUT
910 forZ=#900to#913:gsb960:next
912 poke#700,#CC:gsb800
914 poke#700,#0C:gsb800
920 forZ=#920to#933:gsb960:next
922 poke#700,#9C:gsb800
924 poke#700,#4C:gsb800
930 forZ=#940to#953:gsb960:next
932 poke#700,#DC:gsb800
934 poke#700,#4C:gsb800
940 forZ=#960to#973:gsb960:next
950 rtn
960 ifpeek(Z)poke#700,peek(Z)&#F0+#0D:gsb800
970 ifpeek(Z)poke#700,peek(Z)<<4+#0D:gsb800
980 rtn

容量節約バージョン(512バイト)

変数に保持する方法を用いることでコードを大幅に抑えることも出来ます(Ruria Amanagi さんからのアドバイス)。
a=#93:a=a+#EF&a<<8
OK
?hex$(peek(#8CC),2),hex$(peek(#8CD),2)
93 83
OK
以下に修正版を示します。512バイトまで削減することが出来ました。
2行の液晶サイズに対応しています。930行目と940行目の「'」を消すと4行サイズに対応できます。
また980行目の20は文字数です。16桁の液晶の場合は16に変更することで、若干、早くなります。
I2Cアドレスは990行目です。
new
1 CLS:?"LCD":gsb800:end
800 'INI
810 Q=60:gsb990:gsb990:gsb990
820 Q=44:gsb990:gsb990
830 Q=#8C:gsb990:Q=12:gsb990
840 Q=#CC:gsb990:Q=12:gsb990
850 Q=28:gsb990:Q=12:gsb990
860 Q=#6C:gsb990
900 'LCD
910 Z=#900:gsb960:Q=#CC:gsb990
920 Q=12:gsb990:Z=#920:gsb960
930 'Q=#9C:gsb990:Q=76:gsb990:Z=#940:gsb960
940 'Q=#DC:gsb990:Q=76:gsb990:Z=#960:gsb960

950 rtn
960 Q=peek(Z):ifQQ=Q&#F0|13:gsb990elsegoto980
970 Q=peek(Z)<<4|13:gsb990
980 Z=Z+1:ifZ&31=20rtnelsegoto960
990 poke#8ED,#FB&Q:ifi2cw(#27,#8EC,1,#8ED,1)?"E"elsertn

Amazonで扱われています

ご購入はこちら
または
https://www.amazon.co.jp/dp/B00HTTZO9C/(アフィリエイトタグなし)
なお、販売元のページでは、I2C用のアドレスが0x20であることが書かれていますが、実際には0x27でした。これだけでも、若干の混乱がありました。
一般的にも、初期値に0x27が設定されているものが多いようです。

ご注意

本ブログでの説明の通り、I2Cインタフェース基板の仕様によってプログラムの修正が必要です。上記の商品以外では動作しない場合があるのでご注意ください。
例えば、前述の例①用には以下のように修正すれば動くと思いますが、動作確認は行っておりません。
' P0~P3にDB4~DB5が接続されているタイプ用
' PCF8574T + HD44780 TEST
new
1 CLS:?"LCD TEST":?"W.Kunino"
100 ?"Init"
110 poke#700,#93:gsb800
120 gsb800
130 gsb800
140 poke#700,#92:gsb800
150 gsb800
160 poke#700,#98:gsb800
170 poke#700,#90:gsb800
180 poke#700,#9C:gsb800
190 poke#700,#90:gsb800
200 poke#700,#91:gsb800
210 poke#700,#90:gsb800
220 poke#700,#96:gsb800
300 ?:?"Print"
310 gsb900
399 end
800 'I2C
810 poke#701,(peek(#700) & #EF)
820 ifi2cw(#27,#700,1,#701,1)?"E"
830 ?hex$(peek(#700),2);hex$(peek(#701),2);" ";:wait 5
840 rtn
900 'LCD OUT
910 forZ=#900to#913:gsb960:next
912 poke#700,#9C:gsb800
914 poke#700,#90:gsb800
920 forZ=#920to#933:gsb960:next
922 poke#700,#99:gsb800
924 poke#700,#94:gsb800
930 forZ=#940to#953:gsb960:next
932 poke#700,#9D:gsb800
934 poke#700,#94:gsb800
940 forZ=#960to#973:gsb960:next
950 rtn
960 ifpeek(Z)poke#700,peek(Z)>>4+#D0:gsb800
970 ifpeek(Z)poke#700,peek(Z)&15+#D0:gsb800
980 rtn

by ボクにもわかるIchigoJam用マイコンボード

ボクにもわかる I2C インタフェース方式

以下にI2C温度センサを使ったI2Cインタフェースについての説明ページを作成しました。