Silly and Quality

ささいなこともていねいに。略してシリクワ。

M5StickCでModdableSDKのアプリをビルドする

ブログを引っ越しました→meganetaaan.jp

TL;DR M5StickCでModdableSDKのアプリをビルドできるように対応しました。公式リポジトリの最新版では私のプルリクエストが取り込まれています。下記のコマンドでM5StickC向けにビルドできます。

$ env ESPBAUD=1500000 DEBUGGER_SPEED=1500000 mcconfig -v -d -m -p esp32/m5stick_c

スイッチサイエンスからM5StickCを購入しました。

www.switch-science.com

M5Stackより小型ながら、カラー液晶や6軸センサを搭載した強力な開発ボードです。

f:id:meganetaaan:20190610013313p:plain
M5StickCとM5Stackの大きさ比較。ちいさい!

これをJavaScriptでESP32のプログラムが書けるModdableSDKに対応させたいと思います。

Moddableでビルド対象のボードを追加するには、 ボードの設定ファイルをSDK内に配置して、ビルドコマンドから指定できるようにします。 今回の場合はM5StickC用のディレクトmoddable/build/devices/esp32/targets/m5stick_cを新たに作り、 そこに2つのファイル(manifest.json、setup-target.js)を作成します。

Adding support to M5StickC on Moddable.

あとはビルドコマンド(mcconfig)のオプションでボードを指定しますが、ここで注意点があります。 アプリの書き込みとデバッガのシリアル接続に使うボーレートが、いずれもM5StickCに搭載のESP32のチップに対応しておらず、 そのままでは書き込み失敗やデバッグログの文字化けが発生してしまいます。 どちらも環境変数から指定できる(変数ESPBAUDDEBUGGER_SPEED)ので、公式ドキュメントを参考に、それぞれ対応する値を設定します。今回は1500Kを指定しました。

Baudrate supported by M5StickC: 1200 ~115200, 250K, 500K, 750K, 1500K

$ cd ~/Projects/moddable/examples/helloworld
$ env ESPBAUD=1500000 DEBUGGER_SPEED=1500000 mcconfig -v -d -m -p esp32/m5stick_c

これでHelloWorldやネットワークのサンプルを動かせました。

f:id:meganetaaan:20190610020330p:plain
M5StickCでModdableのHelloWorldを動かしているようす

ただ一つ問題があって、ディスプレイに何か表示する系のサンプルを動かそうとすると、起動時にGuru mediation errorとなります。 ディスプレイのドライバの初期化に失敗していると思われます。 初期化処理は、M5StickCのArduinoライブラリの該当箇所から移植するとうまく動きそう。 ディスプレイも動かせたら追記します。

2019/6/12追記

エラーの原因はドライバ標準の初期化処理のコマンド内にスラッシュが混入しており(コメントアウトのつもり?)そこでパースに失敗していたからでした。 コメントアウトを外すとエラーは解消しました。

ところがドライバ(ST7735)のデフォルトの初期化処理も、M5StickCのライブラリから移植した初期化処理もうまく動作しません。画面が真っ暗で反応しない状況。

ひとまずmanifest.jsonとsetup-target.jsは本家からforkしたリポジトリのほうにコミットしました。 ディスプレイ以外は動くようになっています。

github.com

ここまできたら横着せず、ドライバのデータシートを見て必要なコマンドを仕立てるだろうか。 こういうときのデバッグとかどうしたらいいんですかね?アドバイスがほしい…

2019/6/16追記

FacebookのM5Stackユーザグループで質問したところ「M5StickCのTFTドライバはソフトウェアSPIを使っている」という情報を入手しました。 念のため公式アカウントに確認しましたが本当のようです。

Moddableのili9341ドライバ(ST7735と互換)のソースにはハードウェアSPIを使う場合の記述しか無いので、 取り急ぎModdable側にissueを立てて対応方法を質問してみました。

github.com

1日経たずに回答が。(週末なのにすみません)

We don't plan to implement software SPI, at least not for hosts that have hardware SPI. It would be very unusual to find a piece of hardware that doesn't work with hardware SPI, but possible. We haven't seen one yet, but maybe this is the first. ;) Still, I wouldn't assume it is impossible to make hardware SPI work.

I'm not sure that is using software spi - however with the esp32 I believe any pins can be mapped via the gpio matrix anyway...

日本語で要約すると

  • ソフトウェアSPIは実装する予定はない
  • ESP32には任意のGPIOをSPIに割り当てられるはずなので、必要な設定をすればハードウェアSPIで駆動できるはず

という感じでした。そうだよねなんでわざわざソフトウェアSPIなんだろうね…と思いつつ、 今一度設定を見直し中です。

2019/6/17追記

ひどい勘違いをしていました。 ディスプレイが映らなかったのは初期化に失敗していたからではなく、単にディスプレイのバックライトが点いていないからでした… M5StickCのバックライトはAxp192という電源管理ICから制御されるようです。 M5StickC ArduinoライブラリのサンプルではこのAxp192もちゃんと初期化されていますが、私のコードでは特になにもしていないので、当然バックライトも付かず。

どうやってこの挙動を確かめたかというと、 一度Arduinoライブラリのサンプルを転送してライトをONにしてから、M5StickCの電源を切らずにModdableのサンプルを転送します。 後者のModdableではAxp192に対しては何もしないので、ライトもONのままです。結果、Moddableがちゃんと動きます。

f:id:meganetaaan:20190618012755p:plain
ballsのデモがM5StickCで動いた!

ということで、Axp192の制御のために最低限のコードを移植するのと、描画がずれるのを直せば移行できそうです。 隙間時間で調べながら進めてもう1週間たってしまいましたが、やっと終わりが見えてきました。

2019/6/21追記

Axp192のドライバと描画のズレを直して、起動からすべて動くようになりました!

https://user-images.githubusercontent.com/1918755/59867878-562d5880-93ca-11e9-8402-398dc6d2eab0.gif

何かが動かなかったときの当たりの付け方やドライバのデバッグ方法など色々勉強になりました。 さっそく本家リポジトリにプルリクエストを出しました 取り込まれるといいな。

なお、まだ6軸センサやマイク、IR、LEDなど対応していない機能もありますが、おいおい追加していきたいと思います。