ILI9225の罠 - ILI9225Gとは!
ずーっと前に買ってあった2.0"のLCDを使ってみようと思って、早速ESP32と接続してみた!
Amazonで、なんとなく見つけて買っておいたのだ。
ESP32用には、素敵なグラフィックドライバを開発してくれている方がいるので、早速、使わせていただくことに。。。
その名もLovyanGFX!!
このグラフィックドライバがあれば、ほとんどの液晶用のドライバICチップが動いちゃうすぐれものなのです。
しか〜し!
私が買ったこの液晶は全く反応しませんでした・・・
ドライバICはILI9225と液晶裏の基盤には印刷されています。

もちろん、LovyanGFXにも対応ICとして記載されています。
なのに!!動きません!!
初期不良品かもしれませんが、購入履歴を見たら、もう2年もほったらかしでした!!ので、交換できるはずもなく・・・
そういえば、この液晶2つ買ったのでした! 3.3V専用版 と 5V兼用版 を・・・
ではでは・・・もう一方に繋ぎ変えてみましょう!!
いや〜、反応しません!!!
2つとも初期不良ということは無さそうですが、動かないのではわかりませんな。。。
何か無いかと、調べてみると、ILI9225はとてもマイナーらしく、情報があまりヒットしません。
他のグラフィックドライバも試しましたが、同じく反応なし!!
マイナーなドライバICには注意しましょう!!
でも、2つも買っちゃったのに・・・悔しいです(笑)
調べること小一時間!なんとか、それらしい情報をゲットしました!!
なんと!! ILI9225 には ILI9225G なる亜種があるようです!!
やられた〜!罠にハマってました!!
ILI9225G は 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
};
...
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 とか・・・
初期化コードが違うとか・・・
基板に書いてないし・・・
コメント
コメントを投稿