M5AtomECHOを使う


R4.5.24 MP3再生

 M5AtomEchoでMP3をSPIFFSに入れて再生しようと思ったら、思いの外エラーが多発して失敗。Arduino1.8.8〜1.8.19で試し、ESP32ボードもバージョンを変え、ESP8266Audioも1.5.0〜1.9.5を試し、M5-ProductExampleCodesを使ってみましたがダメ。

 いろいろ調べてみたけれど、素人の私には難しい。esp32 2.0.0のdriver/i2s.hと、別に読み込むライブラリィのi2s関係のステートメントに一致しないことが原因ではないのかな? i2s_write、i2s_push_sample、i2s_config_tの構造だったり....違うかな? いずれにしても手に負えない

 M5Unifiedを使ってみては? というアドバイスを頂きましたが、私には複雑すぎて、一度には理解できそうにないのでした。

 とりあえずドキュメント_Arduino_librariesの中を全部削除(別のところに保存)して、振出しに戻って、吟味して必要なライブラリィだけを入れていこうかと思ってます。(^^;)

 状況が一転したのが、5/26。母艦PCを別のことで使っていたので、windowsタブレットでやってみようかなと。メモリ2MBの、常用するPCより非力なタブレットですが、不思議なことにコンパイルできました。SPIFFSに入れたmp3も再生できました。一体どういうことなんだろう? arduino1.8.19を使い、ボードはesp32 1.0.6ESP8266Audio 1.1.4という組み合わせでした。情報によると、最近のESP8266Audioは使えなくなったというものがありました。

 そこで、母艦PCのarduino環境で、arduino1.8.19を使い、ボードはesp32 1.0.6にダウン、esp8266audio 1.1.4をlibrariesにコピーしてやると、MP3再生スケッチをコンパイルできました。esp32 2.0.0では不可でした。

 問題はesp8266audio 1.1.4を入手できるかです。


R3.11.7 再度スピーカ交換

 何かのついでにアイテンドーさんからマイクロスピーカを購入していました。昨日、安心してEchoの活用ができるようになったので、スピーカ換装を実施。

 やはり画像黄色の部分、銅箔が無いので(^^;) NS4168の8番ピンにスピーカの+線をつなぎました。スピーカは鳴ったし音もいい(^^) 良かった。

 しばらくの間、EchoにAquesTalk関連のスケッチを書き込もうと思っていたら、どうもエラーが出て書き込めませんでした。原因は私には難しいのですが、ArduinoIDEのボードマネージャーでesp 32 by Espressif Systemsのバージョンを2.0.0にしていたことが原因のようでした。1.0.6に戻してから、たなかまさゆきさんのplatform.local.txt作成を行ってみると、支障なく書き込んでくれました(^^)/ ということをツィートしていたら、2.0.0でも可能なように新たなplatform.local.txtを作成していただいていました。感謝です、確実に書き込んでくれました(^^)/


R3.1.9 氷点下を喋る

 今朝は氷点下だったようで、水道が凍結しました。そこで、Echoに温度を喋らせてみると、どうも0度までしか喋ってくれません。スケッチで確かめてみると、マイナス温度は喋りません。AquesTalkは「−」の符号を発音の際の特別な記号として使い、マイナスと認識していない!

 ならば、BME280から温度を読み込んだ後、零度を基準に場合分けして、マイナスの場合には「hyo-te'nnka」+「絶対値」で喋らせるようにしました。明日の朝が楽しみです、寒いけど(^^;)


R3.1.8 ECHO2台目

 ECHOがロボットの頭脳として占有されているので、もう一台ゲットしました(^^)/

 BME280と連携して、気温・湿度・気圧を音声で聞こうと思って。
 ところが、以前改善したスケッチが見当たらない。PC内に残っていたスケッチは、書き込んでみると妙なことばかり? 無言だったり、リセットが繰り返されたり、ブチッ音が出てしまったりと... そこで、再度理想的なスケッチに挑戦してみました。これがかなり苦戦しましたので、ECHOに限定しての覚書として記録します。

  1. アクエストのAquesTalk ESP32をダウンロード
  2. quesTalk ESP32 の中の hello_aquestalk.ino サンプルプログラムをベースにする
  3. BME280を使うために必要なものと stdio.h をincludeする
  4. char koe[64];を宣言しておく
  5. loop()内で、int temp = bme280.readTemperature();等を得る
  6. sprintf(koe, "kion /<NUMK VAL=%d COUNTER=do MODE=AaH>.",temp);で形式を整える
  7. playAquesTalk(koe);で発声する
 不思議なことに気圧の場合はエラーで声が出なくなったので、
  1. playAquesTalk("kiatsu ");
  2. sprintf(koe, "<NUMK VAL=%d>.",pressure);
  3. playAquesTalk(koe);
  4. playAquesTalk("hekuto/pa'_sukaru");
と4行に分けて記述しました。

 これで、ブチッ音なく綺麗に発声してくれます(^^)


R2.11.12 ECHOに携帯のスピーカー

 スピーカーを交換したはいいけれど、やはり音量が小さすぎるので、どうしようか考えていた。ふと、昔使っていた2つ折りの携帯電話。あれなら小型のスピーカーが入 っているだろう、音量も大きくできるだろうと思って取り掛かってみた。

 確かにもともとのスピーカーと比べても小さい。多少両側を削って本体にはめ込んだ。

 ところが、何遍もとっかえひっかえしていたために、とうとう+側の基板の銅箔がはがれた(^^;) 少し塗装を削って道を見つけ出し、無理やりに半田付けした。今のところ声は出ている。

 ただふと思った。ECHOのスピーカー問題が上がったころ、アンプのNS4168の6番ピン(VDD)を持ち上げて3.3Vと配線したという記事があった。ならば、スピーカーもできるのでは?!

 ということで調べたら、このNS4168の5番8番ピンを使ってスピーカーを鳴らしていそうだ。ここに直接スピーカーを付ければ大丈夫ということだろう、と思っている。今の音が鳴らなくなったら、くっつけてみようと思っている。音量ははるかに良くなった。というか、元に戻った感じ。


R2.11.8 ECHOでBME280

 使っていたセンサーがBMP280だったので、湿度が測定できなかった。これから新型コロナやインフルエンザなどの感染症の関係で湿度が重要になると思ったので、マイクロビットで使っていたBME280を流用させてみた。センサーそのものを基板から取り外すと失敗するので(^^;)基板を切り取って整形し、必要なものを取り付けて使うことにした。何度も確認して自信をもって半田付けしたら、何と反転させた! 我ながら恐ろしい! でも、いつものことだけど....(^^;)

 正しく取り付けた図。


 ECHOのFacesとお喋りに進展。M5AtomロボットでGPIOピンを使い尽くした、と思っていたけれどI2Cはアドレスさえ異なれば並列でいくつでも接続できるのでした。そこでECHOでテスト。OLEDにFacesを表示して、照度・近接一体型センサモジュールで感知したら、表情変えて、「近い!」と喋るかな?とやってみたら、喋りました(^^)/

 このセンサモジュールを2足歩行ロボットの胸につけて、ESP32_Faces表示のOLEDと並列接続、障害物に近づいたら方向を変えるという計画。さて、センシング・Faces・サーボモーターの3者のタイミングに解決つけられるスケッチを私に書けるかな?


R2.11.4 ECHOのスピーカー交換

 注文していたマイクロスピーカーが今日届いていた。早速、ECHOを開腹した。中央にあるスピーカーがへたってしまったスピーカー。下の丸いものが新品のスピーカー2個。直径10mm。直列にしても1個だけでも音量はさほど変わらなかったので、1個だけを半田付けして手術を終了。

 以前より音量は小さくなってしまったけれど、音質は回復しました。

 動画をここで見ることができます。


 スピーカーが直ったので、ESP32_Facesで表情を変えながら喋ることに挑戦しました。ESP32_Facesのスケッチの中にAquesTalkで喋る部分を追加すればいいので楽勝! と思っていましたが、やってみたら喋る間はECHOは固まってました(^^;) これはバックグラウンドで喋ってもらわないとな! と、以前見た「AquesTalk-ESPを簡単に使うクラス」という記事を思い出しました。AquesTalkTTSを使うを使うのでした。

 実は、ECHOで最初に喋らせたのはこのAquesTalkTTSを使う方法。以前に書いた10/20の記事。下の方にありますが... そうすると、バックグラウンドで喋ってくれます。目もぱちくりします。しかも、今回はどういうわけか発音前のバチッという音がありません(^^)/ その音を消す方法もどこかにあったけれど、私の力では無理な内容だったので諦めていたのですが そして、音質もAquesTalkTTS.cppファイルの中で、SAMPLING_FREQ を 12000Hz(私の環境と好みの場合) gainを0.4(新しいスピーカーの場合)にすると、満足な結果となりました。ここで見ることができます。ビデオでは、gainが0.8です。少々ビビります。


R2.11.2 ECHOのFaceとお喋り

 Nochiさんが M5Atom + OLED で ESP32_Faces という可愛い表情を出しているプログラムがあったので、挑戦してみた。

 M5StickC用のスケッチサンプルがあったのだけれど、それをAtomとOLED1306とで表現したということだった。自分でできるかな? と色気を出してやってみた。いいところまではいったのだが、そのうち妙なことをして、おそらくスケッチ内で、必要もないSPI関係を使ったのがECHOのスピーカーGPIO22.23に悪さをしたのではをしたのではなかろうか。妙な臭いがしてきたので慌てて電源オフ。この結果、スピーカがダミ声になってしまった(^^;) 

 そこで断念していたのだけれど、NochiさんがAtomでのスケッチを公開してくれたので、Faceを表示できるようになりました(^^)/

 動画をここで見ることができます。
 折角なので、コンパクトにしてAquesTalkで喋らせようと考えましたが、一筋縄ではいかないようです。

 その動画はこちらです。


R2.10.23 ECHOが綺麗に喋る

 たなかまさゆきさんのLANG-SHIPというHP中の「AquesTalk ESP32をかんたんに使う(ESP32 1.0.4編)」でAquesTalkについて公開されていた新しい記事をもとに、ECHOでの発声音質を格段に上げることができました!

 そして、そのことに関連して、AQUEST社の AquesTalk ESP32 が 2.2.1 (2020/10/22) にバージョンアップされました。

 これまでは、M5StackGRAYでいろいろ悩みました。内部DACの音では満足できないので、外部DACに出したいんだが.....どうにかできましたが.....これなんなくできそうですね(試してはないけど)。

 そのつながりでATOM echoでも喋らせましたが(漢字も使えるバージョンで、TTS.play("kion.",50);を使ってた…)、発音の時に「ビチッ」というノイズが入ってかなり高音で喋りました。聞き取れないことはないけれど聞きにくい(^^;)
 そこで、上記記事中の hello_aquestalk_i2s_M5StackAtomEcho を使ったところ、ノイズもなく、美しい声で喋ってくれました。

 その後、これまで使ってきた「漢字かな交じり文からの音声合成」バージョンでも、速度を遅くして、AquesTalkTTS.cpp内の #define SAMPLING_FREQ で1600を指定してやるとそれなりの音声になりました。しかしながらノイズは出ましたので、これは諦めました。もっとも、ECHOでは漢字は使えないので。ここで聞くことができます。


R2.10.20 ECHOが喋る

 SSD1306とefontを使って日本語表示ができ、BME280のデータもそのフォントで表示ができました。そうなると、折角ECHOはスピーカがあるので、これで喋らせたいと思いました。AquesTalkで喋らせるつもりですが、きっとデータ型のところで悩むんだろうなと。

 そこで、AquesTalkのサンプルプログラムをしっかり読み解くことに(読めるのか?)。

 AquesTalk ESP32をダウンロードすると、その中にSampleTTS.inoがあります。SDカードがないので、取り敢えず漢字文は諦めて(TTS.playK()でなくてTTS.play()にする)アルファベット文章にします。幸いにスケッチの中に日にちを増加しながら読み上げるところがあります。M5.BtnB.wasPressed()ですね。もちろんECHOはボタンが1個なので、M5.Btn.wasPressed()なのですが、大切なのは読み上げるところの下の部分

  1. char koe[64];
  2. sprintf(koe, ”<NUMK VAL=%d COUNTER=nichi>.”,mday);
    ※注意 上の ” と<>は全角にしています!
  3. TTS.play(koe, 100);
 用意すべき配列が書いてある(^^)/ これで型に悩まなくていいね。COUNTERは単位を指定し、mdayのところに必要なデータを数値で入れてやれば、難しいこと考えなくても読んでくれます。私の場合は一応整数値にしてしまいました。小数点があっても、負の数になっても読んでくれるかもしれません。

 声はやけにハイキーな子供っぽい音声ですが、ここで見ることができます。どこかをいじれば落ち着いた声になるかもしれません。


R2.10.17 OLEDディスプレイを使う

  NochiさんがM5ATOMでOLEDを使っていたので、沢山持っていることだし試してみることにしました。最初は簡単そうな128×64の解像度のSSD1306。Nochiさんのサイト「しかるのち」の2020年4月15日の記事を参考にというか、そのままを使わせていただいてやってみました。

 efontを使って日本語表示までできました。そこで、マイクロビットの時に使っていたマイクロビット風基板にssd1306とBME280をセットしたもので、気温と気圧を表示するプログラムに挑戦。悩んだのは、BME280で得た数値データをefontで表示すること。変数の型の変更で悩みました。これはいつも悩むこと。

 結局、このようにしました。

  1. BME280からのfloat型(だったかな?)の数値データを単なる文字列に変換
    String temperature = (float)bme280.readTemperature();
  2. 文字列の文字数(長さ)を調べる
    int t = temperature.length();
  3. データを入れる配列を+1で準備する
    char char_temperature[t + 1];
  4. そこにデータをコピーする
    strcpy(char_temperature, temperature.c_str());
c_str()関数、以前に使ったことがあるけれど、既に忘れていた(^^;) それにしてもコンパイルの時にエラーメッセージを出されてから、初めて悩み考えますね。型変換、もっと簡単にならないものかな?

 できました(^^)/ 次はssd1327という128×128の解像度を持つディスプレイです。これも難問です。Adafruit_SSD1327_masterとU8g2という2つのドライバライブラリをやってみましたが、いまのところ画面表示ができません。ディスプレイが壊れてる? かもしれません、手っ取り早く答えを得ようと思ったら(^^;)


R2.10.13 ソフトウェアシリアル

 M5Stackでソフトウェアシリアルが使えることが分かったのでやってみました。1年前にGPSユニットをGroveAで使おうと思ったけれど、ソフトウェアシリアルのライブラリに出会えなかったので頓挫していました。ArduinoのサイトにEspSoftwareSerialというのがあって、これを使えばいいのでした (^^)/ 大分前からあったようです(^^;)

 AtomのGroveAでソフトウェアシリアルを使ってATP3011に喋らせることをしたいわけです。今はデモモードなので、電源を入れれば書き換えた10個ほどの文章を喋るようにしています。これを任意のタイミングで任意の言葉をしゃべるようにね。

 以前に購入していた2枚くっ付いて140円ほどのステレオアンプを使って、簡便なスピーカを作っておきました。下の写真。右下はM5Stackから取り去ったスピーカ。少々長いので、丸型のものを使いました。

 配線は、下記の通り。以前、マイクロビットで使ったのとは少々違います。4・5・14・15をVCCに接続してコマンド入力モード、UARTモードを指定しています。この指定をしなくてもマイクロビットでは喋ってくれたようですが、違ったかな?

 ATP3011がギリギリ載る基板に配線して試してみましたが、前の晩に動いて喋ってくれたのに、翌日になったらウンともスンとも言わない。よくあることです(^^;) 結局ブレッドボードでやってみて、M5StackでもM5ATOMでも動いて喋ってくれました。基板の方は2か所半田が浮いてました(^^;) 両者ではGroveAのピンナンバー違いますけど。

 しかし、M5ATOMでサーボモーターとソフトウェアシリアルを同時に使ってみると、動かないようです。どこかミスしているのかもしれませんが、追究はしません。このポートは距離センサーのために使うつもりですので。お喋りはデモモードで行きます。

 まあ、今回はソフトウェアシリアルが使えるということで満足しましょうか。