ILI9225の罠 - ILI9225Gとは!


ずーっと前に買ってあった2.0"のLCDを使ってみようと思って、早速ESP32と接続してみた!

Amazonで、なんとなく見つけて買っておいたのだ。



ESP32用には、素敵なグラフィックドライバを開発してくれている方がいるので、早速、使わせていただくことに。。。 

その名もLovyanGFX!!

このグラフィックドライバがあれば、ほとんどの液晶用のドライバICチップが動いちゃうすぐれものなのです。

しか〜し!
私が買ったこの液晶は全く反応しませんでした・・・
ドライバICはILI9225と液晶裏の基盤には印刷されています。



もちろん、LovyanGFXにも対応ICとして記載されています。
なのに!!動きません!!

初期不良品かもしれませんが、購入履歴を見たら、もう2年もほったらかしでした!!ので、交換できるはずもなく・・・

そういえば、この液晶2つ買ったのでした! 3.3V専用版 と 5V兼用版 を・・・
ではでは・・・もう一方に繋ぎ変えてみましょう!!


いや〜、反応しません!!!
2つとも初期不良ということは無さそうですが、動かないのではわかりませんな。。。


何か無いかと、調べてみると、ILI9225はとてもマイナーらしく、情報があまりヒットしません。
他のグラフィックドライバも試しましたが、同じく反応なし!!

マイナーなドライバICには注意しましょう!!

でも、2つも買っちゃったのに・・・悔しいです(笑)

調べること小一時間!なんとか、それらしい情報をゲットしました!!


なんと!! ILI9225 には ILI9225なる亜種があるようです!!
やられた〜!罠にハマってました!!


ILI9225は LovyanGFX では対応していません!!

先程のページの nopnop2002さんがドライバを開発してくれているようなので、それを拝見してみます。

私はIDFで開発してないし、開発環境はArduinoに頼っちゃってるので、このままでは使いづらいなぁ・・・

どうしようかと思ったんですが!!
いいことを思いつきました!!

nopnop2002さんによると、ドライバICの初期化コードが ILI9225 と ILI9225G では初期化コードが違うって書いてあったのを思い出しました!!

だったら、LovyanGFX の初期化コードの処理を書き換えれば解決なのでは

というわけで、それらしいコードを探すことに!
LovyanGFX の Examples の HowToUse の 2_user_setting.ino では、使用するドライバICのクラスを指定するのですが、ここの Panel_ILI9225 クラスを探します。

Panel_ILI9225 は実際には構造体で指定されてました。
まあ、Public Classとして使うということでしょう・・・たぶん・・・

中を見ると、Panel_ILI9225.hpp に getInitCommands()というそれらしいメンバ関数を見つけました!
ここに、初期化コードらしきものを発見!
LovyanGFX/src/lgfx/v1/panel/Panel_ILI9225.hpp
static constexpr uint8_t CMD_OUTPUT_CTRL = 0x01; static constexpr uint8_t CMD_ENTRY_MODE = 0x03; static constexpr uint8_t CMD_POWER_CTRL1 = 0x10; static constexpr uint8_t CMD_POWER_CTRL2 = 0x11; static constexpr uint8_t CMD_POWER_CTRL3 = 0x12; static constexpr uint8_t CMD_POWER_CTRL4 = 0x13; static constexpr uint8_t CMD_POWER_CTRL5 = 0x14; static constexpr uint8_t CMD_DISPLAY_CTRL1 = 0x07; const uint8_t* getInitCommands(uint8_t listno) const override { static constexpr uint8_t list0[] = { CMD_POWER_CTRL2 , 2, 0x00, 0x18, CMD_POWER_CTRL3 , 2, 0x61, 0x21, CMD_POWER_CTRL4 , 2, 0x00, 0x6F, CMD_POWER_CTRL5 , 2, 0x49, 0x5F, CMD_POWER_CTRL1 , 2+CMD_INIT_DELAY, 0x08, 0x00, 10, CMD_POWER_CTRL2 , 2, 0x10, 0x3B, CMD_DISPLAY_CTRL1, 2+CMD_INIT_DELAY, 0x00, 0x12, 50, CMD_OUTPUT_CTRL , 2, 0x02, 0x00, 0xFF,0xFF, // end }; ...

データシートを読みこなすのもメンドイので、
nopnop2002さんのドライバのコードから初期化処理を探します・・・
lcdInit()関数がそれでしょう!

見比べてみると、多少の違いはあるものの同じような処理をしてそうです。
esp-idf-ili9340/components/ili9340/ili9340.c
    if (dev->_model == 0x9225) { ESP_LOGI(TAG,"Your TFT is ILI9225"); ESP_LOGI(TAG,"Screen width:%d",width); ESP_LOGI(TAG,"Screen height:%d",height); lcdWriteRegisterByte(dev, 0x10, 0x0000); // Set SAP,DSTB,STB lcdWriteRegisterByte(dev, 0x11, 0x0000); // Set APON,PON,AON,VCI1EN,VC lcdWriteRegisterByte(dev, 0x12, 0x0000); // Set BT,DC1,DC2,DC3 lcdWriteRegisterByte(dev, 0x13, 0x0000); // Set GVDD lcdWriteRegisterByte(dev, 0x14, 0x0000); // Set VCOMH/VCOML voltage delayMS(40); // Power-on sequence lcdWriteRegisterByte(dev, 0x11, 0x0018); // Set APON,PON,AON,VCI1EN,VC lcdWriteRegisterByte(dev, 0x12, 0x6121); // Set BT,DC1,DC2,DC3 lcdWriteRegisterByte(dev, 0x13, 0x006F); // Set GVDD lcdWriteRegisterByte(dev, 0x14, 0x495F); // Set VCOMH/VCOML voltage lcdWriteRegisterByte(dev, 0x10, 0x0800); // Set SAP,DSTB,STB delayMS(10); lcdWriteRegisterByte(dev, 0x11, 0x103B); // Set APON,PON,AON,VCI1EN,VC delayMS(50); lcdWriteRegisterByte(dev, 0x01, 0x011C); // set the display line number and display direction lcdWriteRegisterByte(dev, 0x02, 0x0100); // set 1 line inversion lcdWriteRegisterByte(dev, 0x03, 0x1030); // set GRAM write direction and BGR=1. lcdWriteRegisterByte(dev, 0x07, 0x0000); // Display off lcdWriteRegisterByte(dev, 0x08, 0x0808); // set the back porch and front porch lcdWriteRegisterByte(dev, 0x0B, 0x1100); // set the clocks number per line ...

調べてみるとnopnop2002さんは、modelメンバ値が 0x9225を ILI9225 の処理とし、0x9226 を ILI9225G の処理としているようです。

それを参考に、Panel_ILI9225G.hpp を作ってみました!
Panel_ILI9225.cpp と Panel_ILI9225.hpp をコピって Panel_ILI9225G.cpp と Panel_ILI9225G.hpp にリネームします。
で、構造体名を ILI9225G に変更し、以下のような感じで・・・

ILI9225Gのデータシートを参考に適当なコマンド定数を割り当てました。

一応できましたよ!まあ、キチンとコードを追っていないので、間違っている可能性大ですが(笑)


LovyanGFX/src/lgfx/v1/panel/Panel_ILI9225G.hpp(抜粋)
static constexpr uint8_t CMD_OUTPUT_CTRL = 0x01; static constexpr uint8_t CMD_WAVEFORM_CTRL = 0x02; static constexpr uint8_t CMD_ENTRY_MODE = 0x03; static constexpr uint8_t CMD_OSC_CTRL = 0x0F; static constexpr uint8_t CMD_POWER_CTRL1 = 0x10; static constexpr uint8_t CMD_POWER_CTRL2 = 0x11; static constexpr uint8_t CMD_POWER_CTRL3 = 0x12; static constexpr uint8_t CMD_POWER_CTRL4 = 0x13; static constexpr uint8_t CMD_POWER_CTRL5 = 0x14; static constexpr uint8_t CMD_DISPLAY_CTRL1 = 0x07; const uint8_t* getInitCommands(uint8_t listno) const override { static constexpr uint8_t list0[] = { CMD_OUTPUT_CTRL , 2, 0x02, 0x1C, CMD_WAVEFORM_CTRL, 2, 0x01, 0x00, CMD_POWER_CTRL3 , 2, 0x10, 0x30, CMD_OSC_CTRL , 2+CMD_INIT_DELAY, 0x14, 0x01, 50, CMD_POWER_CTRL1 , 2, 0x08, 0x00, CMD_POWER_CTRL2 , 2+CMD_INIT_DELAY, 0x1F, 0x3F, 50, CMD_POWER_CTRL3 , 2, 0x01, 0x21, CMD_POWER_CTRL4 , 2, 0x00, 0x6F, CMD_POWER_CTRL5 , 2, 0x43, 0x49, CMD_DISPLAY_CTRL1, 2+CMD_INIT_DELAY, 0x10, 0x17, 50, 0xFF,0xFF, // end }; ...

それから、v1_init.hpp で取り込んでいるみたいなので、#include "v1/panel/Panel_ILI9225G.hpp" を追加しておきましょう!!
LovyanGFX/src/lgfx/v1_init.hpp(抜粋)
// LCD / OLED #include "v1/panel/Panel_GC9A01.hpp" #include "v1/panel/Panel_ILI9163.hpp" #include "v1/panel/Panel_ILI9225.hpp" #include "v1/panel/Panel_ILI9225G.hpp" #include "v1/panel/Panel_ILI9341.hpp"

というわけで、実行してみると!!!



見事に!描画されました!!!! パチパチ★

完成版を一応残しておくとしよう → ソース


ほんと、罠だよ!

ILI9225G とか・・・

初期化コードが違うとか・・・

基板に書いてないし・・・



ふんどしの持ち主

コメント

このブログの人気の投稿

Pythonのソースファイルの行番号を取得したい

Raspberry Pi 3 シリアルコンソール&シリアル通信

学習リモコン「リモコソ (RIMOKOSO1)」の設定