前回紹介したAliexpressで売られている小さい液晶の使い方、Arduino編です。
改めてどんな液晶か見てみます。
左が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を選ぶのは正直お勧めしません。いろいろ面倒なので…。
他のマイコンはこちらを見てください→Raspberry Pi編 / 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については任意に変更可能です(プログラム側も要変更)。
SDAとSCLについてはArduino Unoの場合はD11とD13で、変更できません。これはD11がSPI通信用のMISOピン、S13がSCKピンを兼ねているためです。Leonardoなどを使う場合はデジタルピンと兼ねていないようなので、基板の端にあるICSPと書いてあるところのMISO/SCKピンを使う必要があります。
また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とかPicoを使った方が楽かもしれません。その場合の手順はこちら。→Raspberry Pi編 / Raspberry Pi Pico編
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() { }
やってみた人がいたら動いたかどうか教えてください……
以上です。
安くて小さい液晶で楽しいディスプレイライフをお過ごしください。