はじめに
この記事はRaspberry Piで小型LCDを動かすの第2弾です。
Raspberry PiでILI9341というLCDを動かす方法がいくつかあったため、以下の4つの方法についてそれぞれまとめています。
方法1.pythonからSPI接続したディスプレイに表示する
方法2.pythonでフレームバッファに直接書き込み
方法3.fbiを使って静止画を表示
方法4.MPlayerを使って動画を表示
この記事では方法2についてまとめています。
まとめ
フレームバッファに直接書き込めば多少は処理が早くならないかと期待したのですが、前回の処理と比較して大して変化はありませんでした。
python上ではSPI設定やILI9341のライブラリが不要なため、コードはシンプルになりました。
裏ではSPI0のバスを使っているため、他にもSPI接続するデバイスを使いたい場合はSPI1を使った方が良いと思います。(タブン)
使用したLCD
前回と同じくSPI接続タイプのILI9341を使用しました。
よく似たLCDでも、ドライバICが異なるとライブラリが使用できない場合があるため注意が必要です。
Raspberry Pi
Raspberry Pi は4Bで32bit版 Raspberry Pi OS(Bullseye)を使用しました。
64bit版を使いたいところですが、まだ64bit版に対応できていないライブラリも多くあります。使用用途や環境が限定的かつ64bi対応済みならば64bit版でも良いのですが、古くからあるデバイスやアプリを使うときには32bit版、場合によっては最新のBullseyeではなくLegacy版(Buster)の方が良い場合もあります。
今回使用するLCDやドライバ群は比較的昔からあるものなので、32bit版を使用してトラブルを回避します。
接続方法
Raspberry Piとディスプレイの接続は次の通りです。
LCD | Raspberry Pi |
---|---|
SDO/MISO | 21:GPIO9(SPI0 MISO) |
LED | 12:GPIO18 |
SCK | 23:GPIO11(SPI0 SCLK) |
SDI/MOSI | 19:GPIO10(SPI0 MOSI) |
DC/RS | 18:GPIO24 |
RESET | 16:GPIO23 |
CS | 24:GPIO8(SPI0 CS0) |
GND | 9:GND |
VCC | 17:3V3 |
バックライトを点灯させ続けるならLEDは3V3ラインにつなげておいてもOKです。
今回はバックライトのON/OFFも制御したいのでGPIOに接続しています。
前準備
まずはRaspberry Piの設定を行い、必要なモジュールをインストールします。
ライブラリの準備
まずはパッケージを最新状態にしておきます。
sudo apt-get update
sudo apt-get upgrade
続いてopencvとlcdのモジュールをインストールします。
lcdを動かすだけならopencvは不要ですが、今回はUSBカメラ画像を表示する際にopencvを使用します。
2023/1/13現在、pip install opencv-pythonではうまく入らいないのでapt で入れます。
sudo apt-get install python3-opencv
デバイスツリーからILI9341を有効化する
pythonでSPI接続するのではなく、デバイスツリーを書き換えてili9341を有効化します。
sudo nano /boot/config.txt
エディターでconfig.txtを開き、最後に次の一行を追加して保存します。
dtoverlay=rpi-display
保存するにはctrl+x>y>enter
config.txtが編集できたら、rebootしてディスプレイが認識されているか確認します。
lsmodで確認すると、ili9341が認識されています。
$ lsmod | grep ili9341
fb_ili9341 16384 0
fbtft 45056 1 fb_ili9341
lsコマンドで見ると、デバイスツリーにfb1ができています。fb0が通常のディスプレイ用、fb1がili9341のフレームバッファです。
$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0 Jan 13 20:58 /dev/fb0
crw-rw---- 1 root video 29, 1 Jan 13 20:58 /dev/fb1
fbsetコマンドで見ると、320x240サイズで設定されています。
fbset -fb /dev/fb1
mode "320x240"
geometry 320 240 320 240 16
timings 0 0 0 0 0 0 0
nonstd 1
rgba 5/11,6/5,5/0,0/0
endmode
フレームバッファに書き込みする。
USBカメラで取得した画像を直接/dev/fb1に書き込みます。
import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# main roop
while(True):
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGR565)
with open("/dev/fb1", "rb+") as buf:
buf.write(frame)
cap.release()
投稿者の人気記事
-
airpocket
さんが
2023/01/31
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する