Arduino(8) Arduino Pro Mini+aitendoの1.8型LCDでブロック崩し

aitendoの1.8インチSPI LCDがPro mini(3.3V/8MHz)で動作するようになったので、先日UNOで作成したブロック崩しを動かしてみました。

基本的には、画面解像度の違いへの対応と、LCD初期化の処理を若干変更するだけて対応できました。

解像度の違いへの対応は、拡大率の変更で行います。
以前使っていた液晶の解像度は240×320ピクセルでしたが、この液晶は解像度が128×160ピクセルです。
ブロック崩しは、論理的な解像度を30×40として作成していますので、座標値を4倍にすればこの液晶にフルスクリーンで表示できます。
(横方向は120ピクセルになるので、8ピクセル余ってしまいますが。)

LCD初期化処理は、Adafruit-TFTLibraryと今回使うAdafruit_ST7735でスケッチ例を見比べて、以下のように修正しました。

・includeするライブラリおよび信号線の定義
(当然ですね。)

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
#define TFT_SCLK 13   // set these to be whatever pins you like!
#define TFT_MOSI 11   // set these to be whatever pins you like!

・初期化シーケンス

void setup(void) {
tft.initR(INITR_GREENTAB);   // initialize a ST7735S chip, green tab
tft.fillScreen(BLACK);

gameStatus = GAME_RESTART;
BallInit(ball);
}

1行目のinitRの引数になっている「INITR_GREENTAB」は、液晶モジュールのバージョンによって、異なる値を与えなければならないようです。

Adafruit_ST7735の現状のヘッダファイルでは、この引数に使える値は「INITR_BLACKTAB」「INITR_GREENTAB」「INITR_REDTAB」の3種類が定義されています。
この値によって、液晶コントローラに送られる初期化コマンド列が変わります。

液晶モジュールの種類をどう見分けるかですが、この「BLACK」「GREEN」「RED」は液晶パネルの保護シールの引き剥がし用の耳(tab)の色なのだそうです。
少し昔のバージョンのAdafruit_ST7735を使ったスケッチ例を見ると、コメントでそのように記載されていました。
以下引用です。

  // Our supplier changed the 1.8" display slightly after Jan 10, 2012
// so that the alignment of the TFT had to be shifted by a few pixels
// this just means the init code is slightly different. Check the
// color of the tab to see which init code to try. If the display is
// cut off or has extra 'random' pixels on the top & left, try the
// other option!
// If you are seeing red and green color inversion, use Black Tab

// If your TFT's plastic wrap has a Black Tab, use the following:
tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
// If your TFT's plastic wrap has a Red Tab, use the following:
//tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
// If your TFT's plastic wrap has a Green Tab, use the following:
//tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

今回使用した液晶はAdafruitの製品ではありませんが、青緑色のプルタブが付いていました。

arduino08-02.jpg

Adafruit製品のLCDモジュールと今回のaitendoのLCDモジュールが同一サプライヤの製品であるかどうかは定かではありません。
ネットの情報では、緑のタブの製品でもINITR_BLACKTABを指定すると正しく動いた、という例もあるようで、結局3種類を試して一番正常なものを選ぶのが良さそうです。

ちなみに私が試したところ、今回のaitendoの液晶モジュールは

・INITR_BLACKTAB・・・画面の下端と右端にランダムな色のノイズピクセルが出る。
上端と左端が2ピクセルほど切れる。
(aitendoの商品ページでもそうなっています)

・INITR_REDTAB・・・画面の下半分が表示されない。

・INITR_GREENTAB・・・ピクセルは表示されるが、色指定がRGBではなくBGRとなる。

となりました。

ピクセルが正常に表示されるのは、INITR_GREENTABですが、赤と青が入れ替わるので、まったく違う色調になってしまいます。

今回のブロック崩しは、もともとカラーを8色しか使っていないので、この問題へはスケッチファイル側で色の定義を変更することで対応しました。
スケッチファイル側を変更したくない場合は、ライブラリのソースコード(Adafruit_ST7735.cpp)を編集することで対応することもできます。
ライブラリの修正部分は別記事で載せておきます。

配線は、下図のようにしました。
コントローラ用の可変抵抗器はA1、圧電ブザーは3番の信号線を使用しています。
液晶への配線は前回と変わっていません。

arduino08-01.png

以上の変更を反映したスケッチファイルと、動作の様子は以下の通りです。

コメント