【Raspberry Pi Pico入門 – 応用編】ST7789・IPS液晶モジュール

2025年1月26日Raspberry Pi Pico入門,応用編Arduino,Raspberry Pi Pico

概要

IPS液晶モジュールはバックライトが必要という欠点はありますが、有機ELディスプレイに比べて安価で高画質なものが多いので使い勝手が良いです。今回はST7789というICを使用したIPS液晶モジュールを動作させてみます。

実行環境

IDE:Arduino IDE 2.3.4
MCU:Raspberry Pi Pico

液晶モジュール:ZJY-IPS130-V2.0

Amazon購入ぺーじより引用

回路

以下のように配線します。
SPI0を使用するのでSCL、SDAは以下のピンで、RST(RES)とDCは任意のピンでOKです。

Raspberry Pi Pico液晶モジュール機能
GNDGND電源
3V3_OUTVCC電源
GPIO18(SPI0_SCK)SCLSPIクロック
GPIO19(SPI0_TX)SDASPIデータ
GPIO20RESリセット
GPIO21DCデータ/コマンド切り替え
3V3_OUTBLKバックライト用LED(接続しなくてもよい)

(配線図作成中)

回路図は以下のようになっています。

(回路図作成中)

ライブラリのインストール

ライブラリーマネージャーの検索欄に「ST7789」と入力し、以下のライブラリをインストールしてください。
依存関係のあるライブラリも同時にインストールするか聞かれるので、全てインストールしてください。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。
RSTとDCは回路図で接続したピンに設定してください。

#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>

// GPIO設定
#define TFT_CS -1
#define TFT_RST 21
#define TFT_DC 20

// インスタンス定義、パラメータ設定
SPISettings settings(1000000, MSBFIRST, SPI_MODE3);
Adafruit_ST7789 tft = Adafruit_ST7789(&SPI, TFT_CS, TFT_DC, TFT_RST);

void setup() {
  // IPS液晶の初期化
  tft.init(240, 240, SPI_MODE3);
  delay(100);

  // "Hello World"の表示
  tft.fillScreen(ST77XX_WHITE);   // 背景を白に設定
  tft.setRotation(2);             // 画面を180°回転
  tft.setCursor(20, 100);         // 文字の表示位置を設定
  tft.setTextColor(ST77XX_BLACK); // 文字色を黒に設定
  tft.setTextSize(3);             // 文字サイズを設定
  tft.print("Hello World");       // 文字の表示
}

void loop() {
  delay(1000);
}

動作確認

液晶モジュールに白地に黒字で「Hello World」と表示されれば成功です。

その他の機能

画像を表示する

表示したい画像を↓ここでビットマップデータを格納した配列に変換します。
Canvas size(s): を240×240以下に設定し、Scaling:で縮小方法を設定します。Draw mode: は「Horizontal – 2 bytes per pixel (565)」を選択します。その他はGoogle翻訳で翻訳して好みの設定にします。

プレビューにイメージ通りの画像が表示されたらCode output formatが「Arduino code」になっているのを確認して「Generate Code」ボタンをクリックします。
空欄に配列が表示されるので、「Copy Output」ボタンをクリックしてコピーし、Arduinoのコードに貼り付けます。貼り付けた後に変数名をわかりやすい名前に変更します。

240×240ピクセルのデータだと3600行位になるので、新しいタブで「picture.h」のようにヘッダファイルを新規作成して貼り付けるとコードがスッキリします。

この画像を表示するコードは以下となります。
インクルードを追加し、drawRGBBitmap()で画像を表示します。
引数の最初の2つと最後の2つの数字は表示位置になります。240×240ピクセルより小さい画像を表示したい場合はここを調整して表示位置を指定します。

#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#include "picture.h"  // 画像データ

// GPIO設定
#define TFT_CS -1
#define TFT_RST 21
#define TFT_DC 20

// インスタンス定義、パラメータ設定
SPISettings settings(1000000, MSBFIRST, SPI_MODE3);
Adafruit_ST7789 tft = Adafruit_ST7789(&SPI, TFT_CS, TFT_DC, TFT_RST);

void setup() {
  // IPS液晶の初期化
  tft.init(240, 240, SPI_MODE3);
  delay(100);

  // 画像の表示
  tft.setRotation(2);                               // 画面を180°回転
  tft.drawRGBBitmap(0, 0, test_picture, 240, 240);  // 画像の表示
}

void loop() {
  delay(1000);
}

試しにAIで適当に生成した画像を表示したところ結構綺麗に表示されました。表示の処理は1秒くらいかかったので動画を表示するには改良の必要がありそうです。

↓元画像

↓実際の表示
ちょっと明るすぎるような…?何かしら調整が必要かもです。

上記の画像データがフラッシュメモリをどのくらい占有するか確認したところ、約113kB(Raspberry Pi Picoの容量の約5%)でした。画像が数枚ならこの方法で大丈夫そうです。