AtomS3という優れもの
 昨年末に発売されたM5AtomS3だが、すぐに売り切れてなかなか手に入らなかった。3月になってうまい具合にゲットできたのでしばらくこれで遊ぶ(^^)/


R6.8.14 BME280も装着する

 バッテリーを背負ってみると奥行きが長くなった。バッテリー収納だけならまあま短いのだが、こうなるとBME280も背負いたい...(^^;) ということでやってみるとこんな感じだ。


R6.8.2 小型バッテリー到着

 ようやく小型のバッテリーが届いた(^^)/ 100mAhと少ない容量だが仕方ない(^^;) サイズはギリギリ納まるようだ。

 起こしてみた。(゜.゜)声が小さい...まあ、良しとしよう(^^;)

 MAX98357はゲインを色々変えられるようで、デフォルトでは9dB。これが 3dB 〜 15dB の間で調整できるようなのですが、変化が良く分かりませんでした、以前やったことあるけど...やり方悪かったのかも(^^;) ただ、最大出力3Wもありますから、小さいスピーカーでは焼けてしまう可能性もありますね、恐らく。以前のAtomEchoのスピーカのように(^^;) だから、本体を小さくしようとしてスピーカを小型化、音も大きくなんてことは避けた方がいいかも。

 左上で使っているのはSPK2に入っていたものだったかな? これでは音が小さいので、下側にあるスピーカを使います。左のは購入品でなかなかパワフルです。右二つは不要になったノートパソコンから外したもの。これもいい音質・音量です。


R6.6.24 紆余曲折後

 第2作目の計画。前作はスピーカ部分、マイク部分等と後付けで作ったためにまとまりがなかったし作りにくかった(^^;) 2作目は、NewEchoBaseのように最初からまとめて作成し、そのまま9ピンでAtomS3とスタックする(^^)/ つもり... 部品は揃ってる。計画図は下記のとおり。

 壊れてしまったAtomを固定台に使って半田付け。これ便利。マイク基板とアンプ基板が1mmほど重なるな(^^;) やすりで削ってしまえばよかった。次回はそうする。白いコードはG8につないだBTN用。このアンプ基板が使えるかが不明(^^;) 何度も半田付け繰り返したので...結果としては使えた。かなり頑丈なんだな。

 このように配線した基板を、BTN・スイッチを固定したケースに入れる。そのケースにさらにバッテリーが納まるようにして、AtomS3にスタックする。

 配線後、15mm幅のケースに入れてみた。固定はグルーガンで接着。やっぱり作ったからにはすぐ試したい(^^;) ということで、やってみたら声が少々小さいけど完動しました(^^)/


R6.6.20 小型のマイクモジュールを購入

 わしし さんに教えて頂いたマイクモジュールを秋月電子通商で購入。届いたので先ずM5Stackで実験。田中正幸さんの「M5Stack PDMマイクユニット」記事中のサンプルだと動作するが、スタックチャンのこれまでのスケッチでは上手く動作しなかった。しかし、M5AtomS3を使ってみたら動作した。良く分からないが、まあいいか(^^;) 


R6.6.11 AtomS3でスタックチャン

 リポバッテリーのいいサイズ物が見つかった、この時点では、まだ買ってないけど(^^;) これだと、AtomS3後方3cm程度に納まりそうだ。小型のスイッチも必要だな。問題は、PDMマイク基板の大きさと凹凸の程度だ。横から見た計画図を描いてみた。

 スピーカHAT2を分解する。何回も経験しているので、我ながら上手くいったと自負している(^^;) L字ピンを外して3V・0・25・26・GNDをきれいにする。取り敢えず 0・25・26に3本のピンヘッダを付ける。AtomS3に差し込むとAtomS3の面内には納まった(^^) PDMマイクは明日到着なので今日はここまで。スライドスイッチもあった(^^)

 下のようにAtomS3へのセットを行う。LRCLK→G5、DIN→G6、BCLK→G7に接続し、3V同士は長いピンを曲げて差し込めるようにした。GNDはAtomS3の反対側のGNDピンへ配線。

 注文していたPDMマイクが届いたので、早速分解して基板を取り出し、ピンをセットしたがこれはまずかった。最初にGroveポートでテストするべきだったし、配線を間違えていた(^^;) 結局下の通りで動作した。

 スケッチでは、 setup 内に以下の通りに記述したら動作した。

{
auto mic_cfg = M5.Mic.config();
mic_cfg.sample_rate = 16000;
mic_cfg.pin_ws = 1;
mic_cfg.pin_data_in = 2
M5.Mic.config(mic_cfg);
}
//M5.Mic.begin(); beginしたらダメ

 AtomS3のGroveポートを使う場合は上記の通り。私のピン配置では、wsにはG39を、dataにはG38を使用している。また、M5.Mic.begin()を宣言したら駄目のようだ。マイクとスピーカは同時には使えないからだろう。両者の交代は元々のスケッチがやってくれているようだ(^^;)

こんな感じ 


R6.6.10 AtomS3でスタックチャン

 スイッチサイエンスさんのM5Stack Japan Creativity Contest 2024に応募した。参加賞としてAtomS3が貰えるらしい(^^) それを期待して、手持ちのAtomS3をスタックチャン化しようと計画。

 AtomS3は画面はあるけれど、スピーカーとマイクはない。しかし、Xでつゆきぱぱさんが作成されているのを知った。ということはできないことではないようだ(^^;) スピーカの方は実績のあるStickC_SPK2を使うことにして、マイクの方はつゆきぱぱのように、PDMマイクを使うらしい。できるかな?


R5.4.15 AtomS3現状

 結局、いろいろやって今は、Radikoに落ち着いています。


R5.4.9 メモリ情報

 AtomS3でESP32S3DevModuleボードを使ってのChatGPTスケッチは77%使うようなので、サーボ関連を装着することに。でもやはりServoEasingでは動作しない。ServoEasingは中身多いし解読不能なので、単純に並列処理で行う。一応ランダムに動く。

 最大2097152バイトのフラッシュメモリのうち、スケッチが1614989バイト(77%)を使っているのに対し、サーボを付加すると、スケッチは1615393バイト(77%)を使っているらしい。僅か404バイトの増加。百分率にすると変化なし。僅かな努力だったんだ。(^^;)


R5.4.7 ChatGPTに挑戦

 M5StackでChatGPTをやったら、それなりにうまくいったので、AtomS3でもやってみようかと。

 M5StackGrayと同じスケッチをM5AtomS3に書き込んでみた。ただ、M5Stack-ATOMS3のボードでは書き込める パーティションスキームがなかった(100%を超える)ので、以前使っていたESP32S3DevModuleボードNoOTA(2MBApp)を選択。動いたけれど、また声が出ない。どこかのファイルでI2Sピンをセットしなければならない。

 残念なことに、M5Unified.cppには、ESP32S3DevModuleボードでのI2Sピン記述がなかった。そこで、M5Unifiedは使うけれど、M5Unifiedのspeakerの部分は諦めて、esp8266のAudioOutputI2Sを使うことに。これは、AtomS3で実績があったライブラリ。で、口パクはなかったけれど、ようやく喋ってくれた。

 いろいろ読んだ結果、void lipSync(void *args)の部分で、*out.getBuffer();をout->getLevel();に変更することで口パクもできた。

 そんなことをツイートしていると、らびやんさんにアドバイスをいただいた。M5.begin後に、スピーカの設定をしてやると可能らしい。そこで、書式が分からないので、あちこち参照して、見様見真似の書式で書いてみたら、M5Unifiedで完結した。声出し口パクOK。感謝です。

こんな感じ 


R5.4.3 新しい顔作成

 オリジナルな顔で大きいものを作成した。背景画として、AtomS3の128×128サイズのjpg顔画像を作ってSPIFFSに入れておく。それをバックにavatorを動かせばいいのだ。

 デフォルトのavatarではなくて、robo8080さんのM5Stack_WebRadio_Avatarで使われている表情とそのスケッチを使う。このケッチ内では、avatorになっていることに注意。

 その顔を色反転させ、目や口の位置を確認して背景となっている顔の画像に重ねる。

こんな感じ 

 同じ手法はM5Stackでも使えるの便利。やっているうちにだんだん慣れてくる。しかし、すぐに忘れる。忘れてもいったんスケッチに仕上げておくと、再度それを参考に新しいスケッチを作ることができるのだ。忘れることを恐れてはならない(^^;)


R5.3.23 VoiceTextは難しい

 私には、AtomS3で滑らかなVoiceTextができそうもない。VoiceTextは能力の高いM5Stackがいいのではないかと思う。M5Unifiedを使えば、だいたいのM5Stack用のスケッチは、Atom3のピンや液晶サイズに合わせてやれば動くから、AquesTalkやRadikoがいいかな。

こんな感じ 

 サーボを使って上下左右の動きをさせたのだけれど、超小型のサーボでホーンをねじ止めするときにシャフトをねじ切りしてしまったようで動かなくなってしまった。それに換えて新しいサーボを使ったけれど、今度はArminJoさんのServoEasingでは動かなくなってしまった。PWM を14bitで使うと動く。私のスケッチがいけないのかな? やはり、皆さんが使う実績のあるサーボがいいと思う、大きいけどね。


R5.3.20 次の目標

 mongontaさんのM5Core2ImageAvatarLiteを実現したいな〜と、girl画像を1枚のbmpにまとめたものをSPIFFSに入れて表示。avatar仕様の動きができたらいいな、ということでこれから挑戦。難しそう...(^^;)

 M5Core2ImageAvatarLiteの必要な画像ファイルをAtomS3用に縮小してSPIFFSに入れ、そのままinoファイルを書き込んでみたら、恐ろしいことにエラー無く書き込めてしまった(^^;) ただ、画面が若干反応したものの表示なし。画面サイズが1/4ほどなので表示しないなとは思ったが...jsonファイルの書き込み形式が違ったか? そもそもM5StackとM5AtomS3の液晶が違うからか?

 とりあえず、たなかまさゆきさんの「M5Stack ATOM EchoにSPIFFSにmp3ファイルを埋め込んで再生する」を参照してAtomS3のSPIFFSにbmpとmp3を入れて再生してみた。jpgはできなかった(^^;)

 こんな感じ


R5.3.17 課題の解決

 音声に反応した口パクと水色の目という2つの課題。

 口パクは、robo8080さんの改善策AudioOutputI2S.cpp3カ所への追加のうち、最後の行。INTERNAL_DACでない私の場合は、その下に入れるのではなく、elseの方に入れるんだった。よく読まなければいけません(^^;)

 もう一個の課題。uint32_t primaryColorとして色を受け取っていましたが、uint16_t primaryColorと16ビットで受け取ってやると、水色の目が白に変わりました(^^)/ M5AtomS3の液晶の色制限かなと。どこかで、18ビットまで...のようなことを見たかも。

 ついでに、黒背景でなく、白背景にしてみました。単純に、定義するPRIMARY_COLORとSECONDARY_COLORを入れ替えだけと思ったが、悪戦苦闘・試行錯誤の結果、目にクマのある疲れ切った顔になった(^^;)

 こんな感じ 


R5.3.15 Radikoを聴きながら

 なかなかうまいこと行かないしコンパイルも長いので、結局とりあえずRadikoプレイヤーにして、放送聞きながらチマチマやることにした。そうすると、デフォルトのavatarではなくて、robo8080さんのM5Stack_WebRadio_Avatarで使われている表情とそのスケッチを使おうと。ただRadikoからの音声getLevelが反映できなかったので、ランダムでの口パク。不思議なことに青色の目となった(^^;)

 こんな感じ 


R5.3.12 組み立て

 aquestalkのライセンスを購入する前に、HOYAさんのVoicetextが使えないかと。そこで、robo8080さんのM5Core2_VoiceText_TTSをM5AtomEcho用にアレンジしたところ声が出ました(^^)/ robo8080さんいつも感謝です。しかし、音が切れる(^^;) こんな感じ 

 自宅のネットワークの遅さかな? と思ったが、別のところでも同じ現象だった。M5Stackではそれなりに途切れはわずかだったのに比べ、AtomEchoやAtomS3では途切れたので、ハード性能が起因かな? と思う。速いネットワークではEchoでも大丈夫かも。


R5.3.11 組み立て

 いよいよ下右の4つを、内部のサーボの動きを邪魔しないように配置を考えて配線・組立する。それが問題だ(^^;) 失敗しないように少しずつ前へ進む。

 一応組みあがって、こんな感じになった。しかし.....スピーカー音がビビりまくり、サーボが動かない(^^;) 色々試した挙句、PWM_level を 12ビットにしたら、サーボは安定して動作した(^^) この間、壊れたサーボを使って、動かずに悩むということもあった(^^;) よくあること。動きは子犬のようで、満足(^^)


R5.3.11 自作顔で

 Avatarの顔をfillEllipseやfillRectやらで描いていたのだけど、赤色が黒になっていた。そこで、robo8080さんのスケッチを参考にあれこれやっていると、何が原因だったのか、何がきっかけだったのか、ようやく色を使えた(^^;)


R5.3.8 AquesTalkで喋る

 昨年、M5AtomでAquesTalkを喋らせていた時の自作モジュールを発見した。SparkFun I2S Audio Breakout - MAX98357Aを使っているらしい。もう忘れていた。(^^;) M5AtomS3とピン配置が違うがどうにかなるだろう(^^)

 こんな感じになった。


R5.3.4 スタックちゃん?

 ミニのサーボがあったので、スタックちゃんもどきを作ろうかと。

 マイクロビットで使っていた、こんな音声合成LSIも発見!(^^)したので、AtomS3と組んでみた。 こんな感じ(音声大きいので注意)


R5.3.3 AtomS3の始まり

 やっぱり最初はavatarかな。液晶画面がついているので。TakaoAkakiさんが公開してくださっているスケッチを利用させていただいた。micは無いんだけど(^^;) 最初、スケッチの書き込みで迷いました。

 ArduinoIDE環境を使っているけれど、ボード選択で M5Stack-ATOMS3 を選びました。AtomS3を入手したときにはあったのかな? 最初のうちは ESP32S3 Dev Module を使っていた覚えがあります。どちらも使えますが、ツールメニューが変わりますね。ちょっと大きなスケッチを描くときの NO OTA が前者では選べません。いずれできるようになるんだろうけど。ポートを選ぶときにも、場合によって出てくる名前が変わることがあります。関係なさそうだけど。初心者は気になる。LOLIN S3 って誰?