2023年6月19日月曜日

Raspberry PiからpythonでSPI接続のLCDを利用


背景

Raspberry PiにSPIで接続したLCDをx-windowでデスクトップとして利用するのではなくArduinoのようにプログラムで出力したかったので、調べて実現しました。

接続方法やプログラムの書き方を自分用の備忘録として記事にします。

末尾の参考でも紹介しますが、この記事は下記3つの記事を主に参考にして書いているので、下記の記事を。


使ったもの

  • LCD 320x240
    ILI9341が使われているものを利用しました。
    2.4インチ版、2.8インチ版、3.2インチ版があります。
    spi tft液晶画面
    この記事では3.2インチ版を利用しました。
  • Raspberry Pi + Raspberry Pi OS
    重たい処理はしないので、どのPiでも動くと思います。
  • ジャンパワイヤ メスメス
    を使いました。

接続

この図のためにこの記事を書いたと言えるLCD向けのピンの一覧図です。
Gで始まるGPIOピンはプログラムでピンを割り当てるので、入れ替えたり他のGPIOを利用したりできます。


メスメスジャンパワイヤでPiとLCDを繋ぐとこうなりました。


Raspberry PiのSPIを有効化

下記のコマンドを実行します。
再起動は不要です。
sudo raspi-config nonint do_spi 0

関連プログラムをインストール

aptとpipでライブラリをインストールします。
sudo apt install -y python3-rpi.gpio python3-spidev python3-pip python3-pil python3-numpy fonts-noto-cjk
pip3 install adafruit-circuitpython-rgb-display

緑の背景に文字を表示するプログラムを実行

PILで緑色の背景に「こんにちはworld」という文字を含んだ画像データを作成し、それをLCDに表示します。

show-text.py
from adafruit_rgb_display.rgb import color565
from adafruit_rgb_display.ili9341 import ILI9341

from PIL import Image, ImageDraw, ImageFont

from busio import SPI
from digitalio import DigitalInOut, Direction
import board

# Pin Configuration
cs_pin = DigitalInOut(board.D8)
dc_pin = DigitalInOut(board.D25)
rst_pin = DigitalInOut(board.D24)
led_pin = DigitalInOut(board.D23)

# Trun on LED
led_pin.direction = Direction.OUTPUT
led_pin.value = True

# Set up SPI bus
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Create the ILI9341 display:
display = ILI9341(
spi,
cs=cs_pin, dc=dc_pin, rst=rst_pin,
width=240, height=320,
rotation=90,
baudrate=24000000
)

# Define colors and font
COLOR_GREEN = (0, 206, 69)
COLOR_BLACK = (0, 0, 0)
FONT_NOTO_18 = ImageFont.truetype("NotoSansCJK-Regular.ttc", 18)

# Draw image
image = Image.new("RGB", (display.height, display.width), COLOR_GREEN)
draw = ImageDraw.Draw(image)
draw.text((0, 0), "こんにちはworld", font=FONT_NOTO_18, fill=COLOR_BLACK)

# Show image on display
display.image(image)

実行します
python3 show-text.py

期待通り描画できました。


おわり

Raspberry PiにSPI通信で動かすLCDを繋ぎ、pythonで画像を作って描画できました。
どこに何の線を繋ぐのか把握するのが億劫だったので、配線に必要な情報を図にまとめて思い返しやすくしたのがこの記事の成果です。


参考

この記事を書く参考にしたブログ記事です。
画像の表示などもされているので、参考になると思います。
Raspberry Piに7ドルの2.4インチQVGA液晶ディスプレイをつなぐ
Raspberry Pi で小型LCDを動かす

LCDのライブラリを公開しているAdafruitのLCD解説記事です。
Adafruit 3.5" 320x480 Color TFT Touchscreen Breakout

0 件のコメント :