🎥

Raspberry Pi 5でTFT液晶を動かしてみた

2024/06/14に公開

はじめに

2024年初頭にRaspberry Pi 5が日本市場で販売されるようになりました。
前モデルのRaspberry Pi 4 Model Bから約5年ぶりの新作となります。
https://www.raspberrypi.com/products/raspberry-pi-5/
※Raspberry Pi 5はKSYやスイッチサイエンスなどから購入することができます。
https://raspberry-pi.ksyic.com/main/index/pdp.id/1016/pdp.open/1016
https://www.switch-science.com/products/9250

念願のRaspberry Pi 5を手に入れたのでRaspberry Piを手に入れたら実施したいと前々から考えていた、「音声入力orテキスト入力を行ったらEdge側でOpenAIのAPIなどを呼び出して、生成された画像やテキストをEdge側で画面や音声として出力する」を試してみようと思います。

本記事では最初の段階として「Raspberry Pi 5とTFT液晶を繋いで、画像や文字を表示する」を試してみます。

準備したもの

実装

SPIを有効化

SPI制御を行うにあたって、Raspberry PiでSPIを使えるようにしておきます。
スタートメニューから「設定」>「Raspberry Piの設定」>「インターフェイス」タブを開いてSPIのボタンをONにして再起動しSPIを有効化、もしくはターミナルを開いてsudo raspi-configを叩いて「3.Interface Options」>「P5 I2C」> 「はい」 > 「了解」 > 「Finish」を選択かつ再起動してSPIを有効化しておきます。
https://qiita.com/airpocket/items/c0bb5bfdcc5a2c4ec19b

Raspberry PiとTFT液晶をケーブルで繋げる

Raspberry PiとTFT液晶をケーブルで繋げていきます。こちらの記事に書かれているように、Raspberry Pi 5のピン番号やGPIOの配置は4から特に変更されていません。
TFT液晶のデータシートを参考に、Raspberry PiとTFT液晶をケーブルで繋げていきます。

私の方では以下のように取り付けました。

Raspberry Piのピン番号 (GPIO) TFT液晶のピンラベル 備考
17 (3V3 power) VCC
9 (Ground) GND
3 (GPIO 2 (SDA)) CS
16 (GPIO 23) RESET
18 (GPIO 24) DC
19 (GPIO 10 (MOSI)) SDI (MOSI)
23 (GPIO 11 (SCLK)) SCK
1 (3V3 power) LED TFT液晶のLEDを常時点灯させておくため
今回は3Vに繋げています
21 (GPIO 9 (MISO)) SDO (MISO)

※今回はタッチ機能を使わないため、"T_XXX"系は接続しませんでした。

TFT液晶にテキストを表示させるためのコードを作る

スクリプトを書く前に、仮想環境を作成します。

python -m venv .venv

仮想環境を有効化します。

source .venv/bin/activate

スクリプトを動かすために必要なパッケージをインストールします。

sudo apt install python3-rpi.gpio python3-spidev python3-pip python3-pil python3-numpy
pip install adafruit-circuitpython-rgb-display

ゆるふわ技術ブログ様のRaspberry Piに7ドルの2.4インチQVGA液晶ディスプレイをつなぐという記事を参考に、TFT液晶にテキストを表示させるスクリプトを書きました。

lcd_demo_text.py
from adafruit_rgb_display.ili9341 import ILI9341

from busio import SPI
from digitalio import DigitalInOut
import board

from PIL import Image, ImageDraw, ImageFont

# ピンの構成
cs_pin = DigitalInOut(board.D2)
dc_pin = DigitalInOut(board.D24)
rst_pin = DigitalInOut(board.D23)

# SPIバスを設定
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# ILI9341ディスプレイのインスタンスを作成
disp = ILI9341(
    spi,
    cs=cs_pin, dc=dc_pin, rst=rst_pin,
    width=240, height=320,
    rotation=90,
    baudrate=24000000
)

# イメージサイズを定義
IMAGE_SIZE = (disp.height, disp.width)

# フォントを定義
FONT_NOTO = ImageFont.truetype("NotoSansCJK-Regular.ttc", 18)

# 色を定義
COLOR_WHITE = (255, 255, 255)

# 黒背景を作成
image = Image.new("RGB", IMAGE_SIZE, (0, 0, 0))

# テキストを描画
draw = ImageDraw.Draw(image)
text = """\
こんにちは
私はRaspberry Piです!
"""
for i, line in enumerate(text.split("\n")):
    draw.text((0, 24*i), line, font=FONT_NOTO, fill=COLOR_WHITE)

# ディスプレイに表示
disp.image(image)

※ピン構成は今回の私の環境で設定したものに合わせており、液晶とRaspberry Pi間で接続した内容によって変わります。

こちらのスクリプトを実行します。

python lcd_demo_text.py

実行すると以下のよう液晶に指定したテキストが表示されます。

最後に

今回は、発売されたRaspberry Pi 5とTFT液晶を繋いで、Raspberry Piで設定したテキストをTFT液晶に表示してみました。

次回はOpenAIのAPIで生成されたテキストをTFT液晶に表示してみようと思います。
また、Raspberry Pi AI Kitも6月に日本で発売開始したため、入手し次第本体と接続して何ができるかも後々検証したいと思います。

参考

GitHub - adafruit/Adafruit_CircuitPython_RGB_Display: Drivers for RGB displays for Adafruit CircuitPython.
Raspberry Piに7ドルの2.4インチQVGA液晶ディスプレイをつなぐ - みかんのゆるふわ技術ブログ
Raspberry Pi 4BでI2C、SPIを使用する際の覚書 #RaspberryPi4 - Qiita
GPIO番号に互換性がない? 「Raspberry Pi 5」と前モデルを比較してみた | 日経クロステック(xTECH)

ヘッドウォータース

Discussion