ESP-IDFを使ってみる

M5StickC/M5StickC-Plus


M5シリーズにはいくつかのモデルが有りますが、今回M5StickCを入手しました。
ハードウェアのスペックはこ ちらに公開されていますが、StickCには0.96インチのカラーTFTが内蔵されています。
TFTのディスプレイドライバーはST7735Sです。
Stickと違い前面に大きなボタンが追加されています。
さらに、AXP192によるPower System Managementが追加されています。

AXP192によるPower System Managementが追加されていいるため、単に電源を入れただけでは、
TFTに給電されません。
こ ちらにArduino環境のサンプルコードが公開されていますが、M5.begin()で初期化を行っています。
M5.begin()の内容はこ ちらですが、UARTの初期化を行った後に、AXP.begin()でAXP192の初期化を行い、
その後、Lcd(TFT)の初期化を行っています。

こちらにesp- idf用のSPI TFTライブラリが公開されています。
このライブラリはST7735をサポートしていますが、さすがにAXP192の制御は無いので、
AXP192の制御機能を持つTFTライブラリを新たに作成しました。

AXP192とはi2cで接続されていて、i2cアドレス=0x34、SDA=GPIO21、SCL=GPIO22が使われています。
AXP192のDatasheetはこ ちらに公開されていますが、すべて中国語で書かれているのでさっぱりわかりません。
そこで、こ ちらのArduino用のコードを移植しました。

Arduino環境ではTFTのライブラリとして、こ ちらのTFT_eSPIをオーバライドしています。
TFTの初期化コードは、こ ちらのコードから必要な部分だけを移植しています。

TFTライブラリのソースはこちらで公開して います。
カメラの性能が悪いのできれいに映りませんが、RGBのカラーバーです。




StickCは80x160ドットの解像度を持っていますが、内部的には106x161ドット(あるいはそれ以上)のGRAMを持っていて、
以下の網掛けの部分だけを使っています。
従って、X座標は+26、Y座標は+1する必要が有ります。
X=26 Y=1の座標にデータを書き込むと、左上端のドットが光ります。
このオフセットはライブラリ内で吸収していますので、ライブラリでは0オリジンで座標を指定します。




座標軸の設定はArduino環境(TFT_eSPI)と同じ以下の様に設定しています。
初期化関数の中のMDACTL(Memory Data Access Control)のパラメータを変えれば、座標軸の設定を変更することができます。


このライブラリは簡単なグラフィック機能と、TFTの輝度を変更する機能を持っています。
関数の使い方はソースのmain.cを見ればすぐにわかると思います。






テキストのローテーションと反転に対応しています。




16-bit/pixel(65K color)で表示しています。


複数のフォントを同時に使うことができます。
使用するフォントファイルはFONTX形式のフォントファイルで、こ ちらで公開されているものを利用させていただきました。
こちらはゴシックフォントです。


こちらは明朝フォントです。




2020年にM5StickC-Plusが発表されました。
TFTのドライバーにはST7789V2が搭載され、解像度も135x240と大きくなりました。
SoCにはESP32-PICO-D4が使われています。


こちらもAXP192によるPower System Managementが追加されていいるため、単に電源を入れただけでは、
TFTに給電されません。

TFTライブラリのソースはこちらで 公開して います。



StickC-Plusは135x240ドットの解像度を持っていますが、内部的には187x280ドット(あるいはそれ以上)のGRAMを持っ ていて、
以下の網掛けの部分だけを使っています。
従って、X座標は+52、Y座標は+40する必要が有ります。
X=52 Y=40の座標にデータを書き込むと、左上端のドットが光ります。
このオフセットはライブラリ内で吸収していますので、ライブラリでは0オリジンで座標を指定します。





2024年にM5StickC-Plus2が発表されました。
スクリーンサイズが18.7%拡大されているようですが、パッと見には分かりません。
こちらに 回路図が公開されていますが、ST7789のVLED(バックライト)はSGM2578から供給されているので、
単に電源を入れただけではTFTに給電されません。
SGM2578をEnableにする必要が有ります。
SGM2578のENピンはGPIO27に接続されています。
Arduinoライブラリのソースを見たらGPIO27をPWM制御していましたが、SGM2578のデータシートを見たらActive Highと書いてあったので、
GPIOのON→OFF→ONの単純なリセット動作で動きまし た。
SGM2578のデータシートを見たら超小型スイッチと書いてありました。
TFTは結構電気を使うので、バッテリー駆動時の省電力のための設計だと思われます。


続く....