ココリーネの趣味部屋

千石電商で買った680円の液晶ディスプレイをラズパイで駆動してみた

美少女が小さい画面に映し出されている

ST7735Sと言う1.44インチのTFT液晶

st7735sの商品ページ
千石電商で見つけたこちらのTFT液晶。IPS駆動の液晶が680円は安すぎる!!(米倉涼子)との事で 買ってみたッピ!!
SPI接続なのでラズパイにも楽々接続する事が出来てああ^~イイゾ~これ

ラズパイとの接続

Raspberrypiとの接続には こちら の記事を参考にしたゾ。
ラズパイのピン配置確認用のコマンド

pinout

こちらの表を見ながらラズパイとst7735sを繋いで行きます。 ピン配置
VCCのピンを間違えないように注意してください!

ラズパイ側にライブラリをインストールする

繋いだだけでは動かないので、ラズパイにst7735sを駆動するためのライブラリをインストールするゾ。

sudo apt-get update
sudo apt-get install python3-pip python3-pil python3-numpy libfreetype6-dev libjpeg-dev build-essential libopenjp2-7 libtiff6

下のコマンドでラズパイのSPI通信を設定から有効化してくれよな~頼むよ~

sudo raspi-config

python仮想環境を作ってから、モジュールをインストール

mkdir lcd-project && cd $_
python3 -m venv venv
source venv/bin/activate
pip3 install luma.lcd RPi.GPIO spidev opencv-python-headless

サンプルコード(gemini君に作ってもらった)

gemini君にPythonで液晶を駆動するためのプログラムを書いてもらったのぜ。
少し動きが遅いけどちゃんとディスプレイに動画が表示されました!

import cv2
from PIL import Image
from luma.lcd.device import st7735
from luma.core.interface.serial import spi

# 1. 液晶デバイスの初期化(配線に合わせて調整しろ)
serial = spi(port=0, device=0, gpio_DC=25, gpio_RST=24, baudrate=32000000)
#初期状態だと赤と青の色が入れ替わってしまったので、bgr=Trueオプションを付けると解決した。
device = st7735(serial, width=128, height=128, rotate=0, bgr=True, h_offset=1, v_offset=2)

video_sellection = input("読み込ませたい動画のパスを入力してくれよな~頼むよ~:")

# 2. 動画ファイルの読み込み
video_path = video_sellection
cap = cv2.VideoCapture(video_path)

if not cap.isOpened():
    print("動画が開けないゾ。パスを確認して。")
    exit()

print("再生開始ゾ")

try:
    count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        count += 1
        if count % 2 != 0: continue
        if not ret:
            break

        # 変換処理
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(frame_rgb).resize((128, 128))

        # 液晶に表示
        device.display(img)

except KeyboardInterrupt:
    # Ctrl+C で安全に終了できるようにするんだよ
    print("ユーザーによる中断ゾ")

finally:
    cap.release()
    print("再生終了。お疲れナス!")        

実行結果

色がおかしい液晶画面
なんかディスプレイの色合いがおかしい...と思ったら赤と青色が入れ替わってるジャマイカ...
しかも何か画面の端に空白部分ができている....
Gemini君に尋ねてみたところ、色の並び順を明示的に指定することで解決しますと言われたので コードの中のdevice変数に"bgr=True"オプションを付けたら見事に解決!やりますねぇ
ついでに空白部分も"h_offset=1, v_offset=2"のオプションを付けたら完璧に直ったゾ。

アニメの美少女が液晶に映し出されている 美少女(野獣先輩)が液晶に映し出されている

小さな画面の中に(女の子達が)見える見える....
Pythonで動かすとオーバーヘッドが乗ったり転送にCPUを介すので動画の表示が遅いのはああ逃れられない!!運命だそう、どうしても30fpsの動画をそのまま再生するのは 厳しそうです...Pythonを捨ててC++で書けば希望ありとの事です。有志の方がCで描画プログラムを作ってくれているのでそれを 使うのが一番早そうですね....