Raspberry Pi 5でTFT液晶を動かしてみた
はじめに
2024年初頭にRaspberry Pi 5が日本市場で販売されるようになりました。
前モデルのRaspberry Pi 4 Model Bから約5年ぶりの新作となります。
※Raspberry Pi 5はKSYやスイッチサイエンスなどから購入することができます。
念願のRaspberry Pi 5を手に入れたのでRaspberry Piを手に入れたら実施したいと前々から考えていた、「音声入力orテキスト入力を行ったらEdge側でOpenAIのAPIなどを呼び出して、生成された画像やテキストをEdge側で画面や音声として出力する」を試してみようと思います。
本記事では最初の段階として「Raspberry Pi 5とTFT液晶を繋いで、画像や文字を表示する」を試してみます。
準備したもの
- Raspberry Pi 5 8GB
- OS: Raspbian 64bit(検証はできていないですが恐らく32bitでも動くと思います)
- ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807
-
コネクタ付ケーブル 20cm 40P メスメス
- 必要に応じてブレッドボードやオスメスのケーブルを使うのもありだと思います。
実装
SPIを有効化
SPI制御を行うにあたって、Raspberry PiでSPIを使えるようにしておきます。
スタートメニューから「設定」>「Raspberry Piの設定」>「インターフェイス」タブを開いてSPIのボタンをONにして再起動しSPIを有効化、もしくはターミナルを開いてsudo raspi-config
を叩いて「3.Interface Options」>「P5 I2C」> 「はい」 > 「了解」 > 「Finish」を選択かつ再起動してSPIを有効化しておきます。
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液晶にテキストを表示させるスクリプトを書きました。
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