Arduino (11) TFT Library バグ2015年02月21日

Arduino IDE 1.6.0 にアップグレードしてから、TFT Library のバグらしき現象に遭遇した。
グラフィック LCD (Shield-2) で日本語表示させると、表示が全体的にズレて、左端と下端にゴミが表示されてしまう。

表示ズレ

LCD (TFT) は、ST7735R の INITR_GREENTAB だ。
ライブラリ (arduino-1.6.0/libraries/TFT/src/utility/Adafruit_ST7735.cpp) を調べると、初期化で GREENTAB では row と column の開始位置が補正されている。

// Initialization for ST7735R screens (green or red tabs)
void Adafruit_ST7735::initR(uint8_t options) {
    ...
  if(options == INITR_GREENTAB) {
    commandList(Rcmd2green);
    colstart = 2;  // <-- これ
    rowstart = 1;  // <-- これ
  } else {
    ...
  }
    ...
}

プログラムでは表示を 90 度回転 (setRotation(1)) させているので、その場合 colstart と rowstart の設定が逆になってしまうことが原因らしい。
表示の回転を設定する関数 setRotation() で colstart と rowstart の設定を入れ替えて対応することにした。
arduino-1.6.0/libraries/TFT を sketchbook/libraries にフォルダごとコピーし、こちら (sketchbook/libraries/TFT/src/utility/Adafruit_ST7735.cpp) を修正する (元の環境 arduino-1.6.0/libraries/TFT/src/utility/Adafruit_ST7735.cpp はイジらない)。
修正箇所は、以下の通り (追加 2 箇所)。

void Adafruit_ST7735::setRotation(uint8_t m) {
    ...
  switch (rotation) {
   case 0:
      ...
    break;
   case 1:
    writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB);
    _width  = ST7735_TFTHEIGHT;
    _height = ST7735_TFTWIDTH;
    swap(colstart, rowstart); // <-- 追加
    break;
   case 2:
      ...
    break;
   case 3:
    writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB);
    _width  = ST7735_TFTHEIGHT;
    _height = ST7735_TFTWIDTH;
    swap(colstart, rowstart); // <-- 追加
    break;
  }
}

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://walkingmix.asablo.jp/blog/2015/02/21/7576545/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。