見出し画像

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順に変更され、描画が元に戻りました。

もとの色相に戻った

この記事が気に入ったらサポートをしてみませんか?