例によって ebay で300円ぐらいものです。絶対的な解像度はともかく TFT カラー液晶がこの値段だと 16x2 の LCD とかが情報量的にはゴミに思えてきます。(ライブラリサイズとかの兼ね合いもあってそのまま置き換えられるわけではないですが)
購入したものは ST7735 を使っているので、Adafruit-ST7735-Library でだいたい動く雰囲気なのです。以下の2つのライブラリを使える状態にしておく必要があります。
- https://github.com/adafruit/Adafruit-ST7735-Library
- https://github.com/adafruit/Adafruit-GFX-Library
しかし、このモジュールが想定している仕様とは異なる仕様のモジュールのようで、微調整が必要でした。ただし Adafruit-ST7735-Library はクラス構造を private にしているので、残念ながらライブラリ側を無修正のままではどうしようもありませんでした。
最低限の修正に留めるようと、以下のように private を protected にしました。
diff --git a/Adafruit_ST7735.h b/Adafruit_ST7735.h
index 0598720..3b1aa97 100755
--- a/Adafruit_ST7735.h
+++ b/Adafruit_ST7735.h
@@ -152,7 +152,7 @@ class Adafruit_ST7735 : public Adafruit_GFX {
void dummyclock(void);
*/
- private:
+ protected:
uint8_t tabcolor;
void spiwrite(uint8_t),
実際に使う前に public 継承して初期化処理を奪っています。実際のコードでは冒頭の gif のように millis() を連続して表示させています。
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h> /* must modify private to protected */
#include <SPI.h>
class TFTST7735 : public Adafruit_ST7735 {
public:
TFTST7735(int8_t CS, int8_t RS, int8_t RST = -1) :
Adafruit_ST7735(CS, RS, RST)
{
}
void init() {
initR(-1);
_height = 128;
rowstart = 32;
colstart = 0;
}
};
#define TFT_CS 10
#define TFT_RST 9
#define TFT_A0 8
TFTST7735 tft = TFTST7735(TFT_CS, TFT_A0, TFT_RST);
void setup (void) {
tft.init();
tft.fillScreen(ST7735_BLACK);
}
void loop() {
tft.setTextWrap(false);
// font size is 5x7
tft.setCursor(5, 5);
tft.setTextColor(ST7735_RED);
tft.setTextSize(1);
tft.fillRect(5, 5, 128, 7, ST7735_BLACK);
tft.println(millis());
tft.setCursor(5, 20);
tft.setTextColor(ST7735_WHITE);
tft.setTextSize(2);
tft.fillRect(5, 20, 128, 7*2, ST7735_BLACK);
tft.println(millis());
delay(24);
}
所感
128x128 は MCU で扱う解像度としてはかなり広く感じます。文字を dot by dot で表示させると 16x2 などの LCD モジュールと比べてかなり情報量が増えます。カラーなのでさらに情報量が増えます。
描画速度も 16x2 の LCD などよりは早いです。ただしバッファが1つなのであまり書き換えが早いとチラついてしまいます。
デメリットとしては制御コードが複雑になる (フットプリントが増える) ことだと思います。上記のコードはかなりシンプルに見えますがプログラムで23.3%、データで7.7%使っています。ライブラリ側の工夫でもうすこし縮められそうな気はしますが、テキスト表示するならフォントは持たざるを得ないので、16x2 と比べると確実にコード量が増えます。