Aliexpressで買える安くて小さい液晶(ST7789搭載)の使い方(Arduino編)

前回紹介したAliexpressで売られている小さい液晶の使い方、Arduino編です。


0.96/1.14/1.28/1.3/1.54/1.69/1.9/2.0 inch IPS TFT LCD OLED Display Module for ardunio raspberry pi stm

改めてどんな液晶か見てみます。

左が2.0インチ、右が1.54インチです。

↑2.0インチ。解像度は240x320ピクセル。袋に書いてある型番はMSP2008です。

↑1.54インチ。解像度は240x240ピクセル。袋に書いてある型番はMSP1541です。

液晶の種類はIPS液晶です。いずれもST7789というコントローラを搭載、通信方式はSPIです。

Amazonでも似たようなのが1400円くらいで売られてますが、Aliexpressだと600円ほど(2インチの場合)なので激安です。

本記事の対象の液晶モジュールの条件

  • ピンが8本出ているもの(GND、VCC、SCL、SDA、RES、DC、CS、BLK)
  • コントローラーがST7789である
  • SPI通信で制御する

Arduinoで使う

液晶で遊びたいけどどのマイコン使おうかな…っていうときにArduinoを選ぶのは正直お勧めしません。いろいろ面倒なので…。
他のマイコンはこちらを見てください→Arduino編 / Raspberry Pi Pico編(検証中)

家にArduinoしかないとか、もともとArduinoで作ってある作品に液晶画面をつけたいとかいう場合は、以下を参考にしてください。
Arduino Uno R3で試しましたが、R4など他のボードでも同じようにできると思います。

ライブラリを入れる

スケッチ→ライブラリをインクルード→ライブラリを管理…

を選ぶと、ライブラリマネージャが起動します。「st7789」で検索するとこれまたAdafruitのライブラリが出てきます。インストールしましょう。

依存関係がどうのと言われたら「全てをインストール」でOKです。

配線する

Raspberry Piに比べると配線がちょっと面倒です。なんでかというと、Arduinoのデジタルピンは5V、ディスプレイ側は3.3Vなので、変換してやる必要があるためです。
ここでは簡単に抵抗で分圧しました。

抵抗は上段の抵抗:下段の抵抗がだいたい1:2になっていればなんでも大丈夫です。図では100Ω・220Ωにしていますが、手元では120Ω・220Ωで実験しました。
デジタルピンの番号は、DC、RES、CSについては任意に変更可能です(プログラム側も要変更)。その他のピンは変更できません。
またBLK(バックライト)ピンが書いてありませんが、これは通常は接続不要、特に制御したい場合のみ接続するので大丈夫そうです。接続する場合はライブラリ通さずに普通にデジタルピンとしてHIGH/LOWすればON/OFFできます。

ちなみに信号電圧変換にはこういうレベル変換基板を使う手もあります。

ただ意外に配線が面倒だったので今回は使いませんでした。(今回はないですが、機器側から戻ってくる信号もある場合は重宝します)

あとPro MicroやPro Miniの3.3V版など、電圧変換の不要なArduino互換機を使うという手もありますね。

動作テスト

ファイル→スケッチ例→Adafruit ST7735 and ST7789 Library→graphicstest

を押すとサンプルスケッチが開きます。使っている基板に合わせて少しいじる必要があります。コメントを見るとわかりますが、念のためひとつずつ見ていきましょう。

まず下記はコメントアウトします。
63~64行目

// For 1.44" and 1.8" TFT with ST7735 use:
// Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

88~89行目

  // Use this initializer if using a 1.8" TFT screen:
  // tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

次に、以下のコメントを外します。
66-67行目

// For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789:
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

このあとは液晶のサイズにより異なります。2.0インチの場合は下記のコメントを外します。
109-110行目

  // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
  tft.init(240, 320);           // Init ST7789 320x240

1.54インチの場合は下記のコメントを外します。
103-104行目

  // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT:
  tft.init(240, 240);           // Init ST7789 240x240

ピン配置はスケッチのものにそろえたので、ここではいじる必要はありません。

できたら書き込んでみましょう。

けっこう派手なデモが表示されました。成功です!

いま使ったサンプルコードはいろいろやっている&いろんな液晶とマイコンボードの組み合わせに対応させているので長いですが、例えばArduinoで2インチ液晶に四角を表示するだけだったらこんな感じで簡単にできます。

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS        10
#define TFT_RST        9
#define TFT_DC         8

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

void setup(void) {
  tft.init(240, 320);           // Init ST7789 320x240
  tft.fillScreen(ST77XX_BLACK);
  tft.drawRect(95, 135, 50, 50, ST77XX_GREEN);
}

void loop() {
}

こちらもjpgファイルを表示できると便利なのですが、Arduino自体がファイルストレージを持っていないため、単体ではできません。
別途SDカードリーダーモジュール等を導入する必要がありそうです。
手間を考えるとおとなしくRaspberryPiとかを使った方が楽かもしれません。その場合の手順はこちら。

2画面表示する

Raspberry piと同様、2画面同時に扱うこともできそうな気がします。
ためしてないけどこんなかんじでどうでしょう…。(そんな雑なことあるかよ)

つなぎ方

Arduino側ピン名 液晶側ピン 用途
3V3 (液晶1&2)VIN,VCC 電源
D11 (液晶1&2)SDA,SDA SPI信号用
D13 (液晶1&2)SCL,SCK,SCLK SPIクロック
GND (液晶1&2)GND GND
D10 (液晶1)CS 通信先選択
D9 (液晶1)RES,RST リセット
D8 (液晶1)DC データ/コマンド切替
D7 (液晶2)CS 通信先選択
D6 (液晶2)RES,RST リセット
D5 (液晶2)DC データ/コマンド切替

※上から4行目までは分岐させて両方の液晶に接続すること
※全て、上の配線図のように抵抗で分圧すること

スケッチ

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS1        10
#define TFT_RST1        9
#define TFT_DC1         8
#define TFT_CS2         7
#define TFT_RST2        6
#define TFT_DC2         5

Adafruit_ST7789 tft1 = Adafruit_ST7789(TFT_CS1, TFT_DC1, TFT_RST1);
Adafruit_ST7789 tft2 = Adafruit_ST7789(TFT_CS2, TFT_DC2, TFT_RST2);

void setup(void) {
  tft1.init(240, 320);           // Init ST7789 320x240
  tft2.init(240, 320);           // Init ST7789 320x240

  tft1.fillScreen(ST77XX_BLACK);
  tft2.fillScreen(ST77XX_BLACK);
  tft1.drawRect(95, 135, 50, 50, ST77XX_GREEN);
  tft2.drawRect(70, 110, 100, 100, ST77XX_GREEN);
}

void loop() {
}

やってみた人がいたら動いたかどうか教えてください……


以上です。
安くて小さい液晶で楽しいディスプレイライフをお過ごしください。