M5Core2 突然液晶の色表示がおかしくなった時の対処法。原因解析中!!
更新24/1/12:
どうも、わたしのCore2固有の問題で、液晶のレジスタが壊れたか、なにかが、おかしい感じです。M5Core2,M5Unified,LovyanGFXなどのCore2ドライバーに問題はなさそうなので、提供されているドライバーを改変するのは、あまりやらないほうが無難だと思います。
教えてもらえたコードです。
void invert_setting(bool rev)
{
M5.Display.startWrite();
M5.Display.writeCommand(0xC8);
M5.Display.writeData(0xFF);
M5.Display.writeData(0x93);
M5.Display.writeData(0x42);
M5.Display.writeCommand(0xB6);
M5.Display.writeData(0x0A);
M5.Display.writeData(rev ? 0x80 : 0x00);
M5.Display.writeData(0x1D);
M5.Display.writeData(0x04);
M5.Display.endWrite();
}
void rgb_setting(bool rev)
{
M5.Display.startWrite();
M5.Display.writeCommand(0xC8);
M5.Display.writeData(0xFF);
M5.Display.writeData(0x93);
M5.Display.writeData(0x42);
M5.Display.writeCommand(0xF6);
M5.Display.writeData(rev ? 0x09 : 0x01);
M5.Display.writeData(0x00);
M5.Display.writeData(0x00);
M5.Display.endWrite();
}
元記事に戻ります。
購入して2か月ぐらいたって、いきなり液晶表示がおかしくなりました。
どうやら、色が反転しているらしい。分解も、外部回路接続も一回もしてない。
色指定以外の機能は正常。ジャイロも、シリアルも、タッチパネルも正常。
原因不明。LovyanGFXやM5Unifiedで何度もやりなおして、描画しても治らない。諦めて、もう一台購入した後に、原因がわかりました。
注意!! もとのライブラリーファイルに修正をくわえるので、以降、自己責任でお願いします
かなり苦戦した過程で、修正したので、間違っているかもしれません。
ただ、情報がすくなく、同じ症状になる方もいると思うので、参考にしてくさい。慎重に確認しながら、作業することをお勧めします。
突然、色がおかしくなった原因
試行錯誤の末、どうもSPI送信データのパケットの順番が”RGB”でく、”BGR”になっている。
canvas1.drawRect(0,0,135,20,lcd.color888(255, 0, 0));
を使って描画してみる。255の値を順番に、入れ替えてみると、RGBでなくBGRで描画されていることが判明。これで故障ではなく、Core2液晶の初期設定がおかしいそうだとわかった。
購入してから2か月間は、なんでもなかったので、てっきり故障かとおもいました。
Core2液晶 ili9342の初期設定をいじる
Core2に実際に実装されている液晶はili9342らしいのですが、ライブラリーのファイル名は、ili9341 になっています。ここがちょいまぎらわしいので、注意が必要です。
ili9341データシート Page 127
Memory Access Control (36h)のD3ビットBGR
RGB-BGR Order Color selector switch control
(0=RGB color filter panel, 1=BGR color filter panel)
このレジスタのビット3を0にすることで、BGRからRGBに変更できます。
M5Core2ライブラリーの修正の仕方
フォルダーから、src / utility / ILI9341_Defines.hのファイルを開きます。
70行目は空白になっているので、
#define TFT_RGB_ORDER 1 を追記しました。
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_RGB 0x00
#define TFT_RGB_ORDER 1 //これを自分で追記します。
#ifdef TFT_RGB_ORDER
#if (TFT_RGB_ORDER == 1)
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
// All ILI9341 specific commands some are used by init()
#define ILI9341_NOP 0x00
次に、ファイル scr / utility / ILI9341_INIT.h の中を見ていきます。ここは、コードをみるだけです。
29行目から32行目 MADCTLレジスタの設定がここで設定されています。
writecommand(ILI9341_MADCTL); // Memory Access Control
#ifdef M5STACK
writedata(TFT_MAD_MY | TFT_MAD_MV |
TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode)
#else
writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode)
#endif
先ほどの修正で、TFT_MAD_COLOR_ORDERは、TFT_MAD_RGB(値は0)にしたので、RGB-BGR Orderは RGB に設定されます。
以上で、修正が完了です。
注)setup関数内で、invertDisplay(0 or 1)を使用して、Display Inversionを設定する必要もあるかもしれません。
LovyanGFXライブラリーでの修正の仕方
LovyanGFXフォルダからsrc / lgfx / V1/ panel / Panel_Device.hpp を開きます。
100行目 bool rgb_order = false;をコメントアウトして、新たにtrueで書き足すか、trueに変更します。
/// RGB=true / BGR=false パネルの赤と青が入れ替わってしまう場合 trueに設定;
/// Set the RGB/BGR color order.
//bool rgb_order = false;
bool rgb_order = true;
次に、
static LGFX lcd;でグローバル宣言したLGFXインスタンスを初期化した後に、
main.cpp内のsetup関数で、invertDisplay(1);を実行します。
void setup()
{
M5.begin();
// 最初に初期化関数を呼び出します。
lcd.init();
lcd.invertDisplay(1);
//glcd.invertDisplay(0);
// 回転方向を 0~3 の4方向から設定します。(4~7を使用すると上下反転になります。)
lcd.setRotation(1);
// バックライトの輝度を 0~255 の範囲で設定します。
lcd.setBrightness(128);
以上2つのコード修正で、BRGがRGB順に変更され、描画が元に戻りました。