Arduino(9) Adafruit_ST7735ライブラリの修正(aitendoの1.8型LCD用)

arduino08-03.jpg
Adafruit_ST7735ライブラリ+aitendo M-Z18SPI-2Pでgraphicstest。
画面右端と下端にゴミが出ています。Hの字の左端が切れています。

Adafruit_ST7735ライブラリでaitendo M-Z18SPI-2Pを制御すると、画面右端と下端にゴミが残り、画面左端が欠けてしまいます。
初期化時、initRのパラメータにINITR_GREENTABを指定するとこの現象は無くなりますが、その代わり色の配列がRGBではなくBGRになってしまいます。

ST7735ではMADCTLというコマンドが色表現のRGB/BGR指定を担っており、これをINITR_BLACKTABのときだけ違う値に設定しているのが関数initRの中の最後の部分です。

void Adafruit_ST7735::initR(uint8_t options) {
    commonInit(Rcmd1);
    if(options == INITR_GREENTAB) {
        commandList(Rcmd2green);
        colstart = 2;
        rowstart = 1;
    } else if(options == INITR_144GREENTAB) {
        _height = ST7735_TFTHEIGHT_144;
        commandList(Rcmd2green144);
        colstart = 2;
        rowstart = 3;
    } else {
        // colstart, rowstart left at default '0' values                        
        commandList(Rcmd2red);
    }
    commandList(Rcmd3);

      // if black, change MADCTL color filter      
         if (options == INITR_BLACKTAB) {
             writecommand(ST7735_MADCTL);
             writedata(0xC0);
         }

                tabcolor = options;
}

これをINITR_GREENTABでも実行するように変更すれば、色がRGBの並びになります。

ただし、本家のINITR_GREENTABが違う動作になるのも困るので、新しくINITR_BLUETABを定義しました。

まずAdafruit_ST7735.hに以下の定義を追加します。(赤字部分)

// some flags for initR() :(
#define INITR_GREENTAB 0x0
#define INITR_REDTAB   0x1
#define INITR_BLACKTAB   0x2
#define INITR_BLUETAB 0x3

#define INITR_18GREENTAB    INITR_GREENTAB
#define INITR_18REDTAB      INITR_REDTAB
#define INITR_18BLACKTAB    INITR_BLACKTAB
#define INITR_144GREENTAB   0x1

そして、Adafruit_ST7735.cppのinitR関数を修正し、BLUETABではGREENTABの初期化+BLACKTAB用追加コードを実行するようにします。

void Adafruit_ST7735::initR(uint8_t options) {
    commonInit(Rcmd1);
    if((options == INITR_GREENTAB) || (options == \
INITR_BLUETAB)) {
            commandList(Rcmd2green);
            colstart = 2;
            rowstart = 1;
        } else if(options == INITR_144GREENTAB) {
        _height = ST7735_TFTHEIGHT_144;
        commandList(Rcmd2green144);
        colstart = 2;
        rowstart = 3;
    } else {
        // colstart, rowstart left at default '0' values                        
        commandList(Rcmd2red);
    }
    commandList(Rcmd3);

    // if black, change MADCTL color filter                                     
    if ((options == INITR_BLACKTAB)|| (options == \
INITR_BLUETAB)) {
            writecommand(ST7735_MADCTL);
            writedata(0xC0);
        }

    tabcolor = options;
}

これで、ノイズなし、かつ正しい色での表示ができるようになります。
(もちろん、setup()の中でinitRの引数をINITR_BLUETABにする必要があります。)

なお、以下のページにST7735の仕様の解説があり、参考になります。

表示器 (ST7735B 1.8″ TFT SPI)

・修正後のライブラリ+aitendo M-Z18SPI-2Pでgraphicstest

arduino08-04.jpg
ゴミが消え、画面の左端が見えるようになりました。

コメント