Moddable SDKのターゲットデバイスにATOMS3を追加してみた

# はじめに

2022年12月23日にATOMS3が(日本で)発売になり、入手することができたので、Moddable SDKのターゲットデバイスに追加する過程をメモに残します。(2022年12月27日に入手)

https://docs.m5stack.com/en/core/AtomS3

以前、M5StickC Plusを追加したことがあったので、おおよその見当はついていましたが、いくつかハマりどころがありました。

https://qiita.com/kitazaki/items/0b774e6779defd550c6a

# 開発環境の構築

こちらの記事を参考に、サンプルコードが動作することを確認しました。
M5AtomS3ではなく、M5Unifiedで動作を確認しました。

https://lang-ship.com/blog/work/m5stack-atoms3/

https://github.com/m5stack/M5AtomS3

https://github.com/m5stack/M5Unified

https://twitter.com/Zakkiea/status/1608404755365396481

# 液晶ディスプレイ(液晶ドライバ)

ATOMS3のMCUはESP32-S3で、扱うのは初めてでしたが、Moddable SDKのターゲットデバイスにESP32-S3-DevKitC、Adafruit QT Py ESP32-S3、Adafruit ESP32-S3 TFT Featherが登録されていましたので、参考にしました。

https://github.com/Moddable-OpenSource/moddable/tree/public/build/devices/esp32/targets

液晶ディスプレイはGC9107で、こちらも扱うのは初めてでしたが、事前にデータシートにアクセスできたのと、ST7789互換という情報をいただいたので、あまり心配していませんでしたが、結果的に動かすまで一苦労ありました。

https://github.com/Xinyuan-LilyGO/T-QT/blob/main/doc/GC9107%20DataSheet%20V1.2.pdf

https://twitter.com/Zakkiea/status/1606305731661430785

https://twitter.com/stc1988/status/1606398296255496192

## 仕様調査

ST7789のinitコードでは動作しなかったので、サンプルコードが動作したM5Unifiedのinitコードを確認しました。
実際にはM5GFXの中でinitコードを確認することができます。

https://github.com/m5stack/M5GFX/blob/master/src/lgfx/v1/panel/Panel_GC9A01.hpp

そのままのinitコードでは、最初、動かなかったので、同じ液晶ディスプレイを使用しているLILYGO T-QTのinitコードを確認しました。

https://github.com/Xinyuan-LilyGO/T-QT/blob/main/example/lcd/lcd_driver.cpp#L109

initコードは似ていますが、部分的に異なっています。また、データシートに記載されていないコマンドコードもあり、解釈が難航しました。(コマンドコードの意味が判明していないものが残りました)
結果的にInter register enable 1 (FEh)、Inter register enable 2 (EFh)のコマンドコードを送るタイミングを調整(遅延の時間を変更)して、動くようになりました。

https://twitter.com/Zakkiea/status/1608666558343286784

表示位置のズレは(行方向の)オフセット値を調整し、回転操作(ローテーション)も問題ないことを確認しました。

https://twitter.com/Zakkiea/status/1608671181594558466

## 表示色(色味)のズレ

動作テストも終盤になり、(Node-RED MCU Dashboardの)表示色がおかしいことに気づきました。

https://twitter.com/Zakkiea/status/1609172583441928200

(M5Stack FIREは色味が異なっていますが、正面から見ると正常で、見る角度によって色味が変わっています。)

![IMG_3305.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a9e4943a-82f8-fe5a-3bdd-1801219d2558.jpeg)

色指定の順番(RGB、BGR)と色の反転(DISPLAY Inversion)を疑い、データシートを参考にして、initコードを変更したところ、問題を解消できました。

- M5GFXのinitコード → 色指定をRGB→BGR、DISPLAY InversionをON→OFFへ変更
- LILYGO T-QTのinitコード → DISPLAY InversionをON→OFFへ変更

https://twitter.com/Zakkiea/status/1609223189393199105

GC9107の設定を追加し、パラメータシート(比較表)を更新しました。

https://docs.google.com/spreadsheets/d/18JTX6W-u1tB2hhPPjuPoj_gWdk9RbC4BrG5XwN69Fkw/edit#gid=0

# 6軸IMU (MPU6886)

最初、M5Atom Matrixと同じ設定をしたところ、Y軸の向きが反転していると指摘をいただきました。

https://twitter.com/Zakkiea/status/1608704329439121413

M5StickC Plusで液晶ディスプレイ表示を見ながら動作を確認しました。

https://twitter.com/Zakkiea/status/1608777708955389952

setup-target.jsの中でX軸、Y軸、Z軸の向きと値を入れ替えて問題を解消できました。

https://twitter.com/Zakkiea/status/1608734719629484034

ついでに、ボタンが1つしかないので、ボタンを押す度にAccelとGyroの表示を切り替えるサンプルコードを作成しました。

https://twitter.com/Zakkiea/status/1608967566005014528

# さいごに

一通りテストで問題が出なくなったので、プルリク(PR)を送りました！

- Moddable SDKのサンプルコード(piu/balls、piu/images)
- Node-RED MCUフロー(コアノード、ネットワーク接続)、Sensorノード(I2Cでdefault(GroveポートにM5 ENV Ⅲ Unit)、internal(MPU6886))、rpi-gpioノード(ボタン)、Dashboardノード(ボタン、テキスト、ゲージ)

![IMG_3316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4a00fba7-3b35-08a9-891f-327e90f8289d.jpeg)

https://twitter.com/Zakkiea/status/1609247649181634561