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は結構電気を使うので、バッテリー駆動時の省電力のための設計だと思われます。
続く....