airpocket が 2023年01月31日18時23分50秒 に編集
初版
タイトルの変更
Raspberry Pi で小型LCDを動かす その3
タグの変更
RaspberryPi
ILI9341
Python
メイン画像の変更
記事種類の変更
セットアップや使用方法
本文の変更
# はじめに この記事は[Raspberry Piで小型LCDを動かす]()の第3弾です。 Raspberry PiでILI9341というLCDを動かす方法がいくつかあったため、以下の4つの方法についてそれぞれまとめています。 方法1.pythonからSPI接続したディスプレイに表示する 方法2.pythonでフレームバッファに直接書き込み 方法3.fbiを使って静止画を表示 方法4.MPlayerを使って動画を表示 この記事では方法3と4についてまとめています。 # まとめ 今回はデバイスツリー上でILI9341を認識し、アプリを使って静止画や動画を表示させました。 お手軽に使うにはこれもアリかと思います。 ILI9341はサブディスプレイとして使いたいのですが、 # 使用したLCD 今回はよく見かけるSPI接続タイプの小型LCDを使用しました。 よく似たLCDでも、ドライバICが異なるとライブラリが使用できない場合があるため注意が必要です。 今回はドライバにILI9341を使っている2.2inch 320x240サイズのTFT LCDを使用します ライブラリにはadafruitのライブラリを用います。よく使われるドライバに対応しているライブラリですがLCDのインスタンスの読み込みに微妙な違いがある様ですので、他のドライバのLCDを使用する際はご注意ください。 # Raspberry Pi Raspberry Pi は4Bで32bit版 Raspberry Pi OS(Bullseye)を使用しました。 64bit版を使いたいところですが、まだ64bit版に対応できていないライブラリも多くあります。使用用途や環境が限定的かつ64bi対応済みならば64bit版でも良いのですが、古くからあるデバイスやアプリを使うときには32bit版、場合によっては最新のBullseyeではなくLegacy版(Buster)の方が良い場合もあります。 今回使用するLCDやドライバ群は比較的昔からあるものなので、32bit版を使用してトラブルを回避します。 # 接続方法 Raspberry Piとディスプレイの接続は次の通りです。 ### ili9341の場合 |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の設定を行い、必要なモジュールをインストールします。 ## ライブラリの準備 まずはパッケージを最新状態にしておきます。 ```shell sudo apt-get update sudo apt-get upgrade ``` 続いてopencvとlcdのモジュールをインストールします。 lcdを動かすだけならopencvは不要ですが、今回はUSBカメラ画像を表示する際にopencvを使用します。 2023/1/13現在、pip install opencv-pythonではうまく入らいないのでapt で入れます。 ```shell sudo apt-get install python3-opencv ``` ## fbiをインストールする fbiを使うと、ili9341に静止画を表示できます。 ```shell sudo apt-get install fbi ``` ## mplayerをインストールする。 mplayerを使うと、ili9341に動画やカメラ画像を表示できます。 ```shell sudo apt-get install mplayer ``` ## デバイスツリーからili9341を有効化する python内でSPI接続するのではなく、デバイスツリーを書き換えてili9341を有効化します。 ```shell sudo nano /boot/config.txt ``` エディターでconfig.txtを開き、最後に次の一行を追加して保存します。 ``` dtoverlay=rpi-display ``` 保存するにはctrl+x>y>enter config.txtが編集できたら、rebootしてディスプレイが認識されているか確認します。 lsmodで確認すると、ili9341が認識されています。 ```shell $ lsmod | grep ili9341 fb_ili9341 16384 0 fbtft 45056 1 fb_ili9341 ``` lsコマンドで見ると、デバイスツリーにfb1ができています。fb0が通常のディスプレイ用、fb1がili9341のフレームバッファです。 ```shell $ 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サイズで設定されています。 ```shell 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 ``` # ILI9341に静止画を表示する ****.jpgの部分に表示させたいファイルを指定すると静止画が表示されます。 表示している間はraspiが動かないので、リモートログインしている場合は要注意です。(リモートからのコマンドも受け付けなくなります) ```shell sudo fbi -nocomments -noverbose -a -T 1 -d /dev/fb1 ****.jpg ``` # ili9341に動画を表示する ``` sudo mplayer -vo fbdev2:/dev/fb1 -x 320 -y 240 -zoom ****.mp4 ``` #ili9341にUSBカメラ画像を表示する ``` sudo mplayer tv:// -vo fbdev2:/dev/fb1 -x 320 -y 240 -zoom ``` # おまけ LCDに表示した画像を消す際はバッファをNullで塗りつぶしときましょう。 ``` dd if=/dev/zero of=/dev/fb1 > /dev/null 2>&1 ``` mplayerで動画をサイズ修正無しで再生するときは ``` sudo mplayer -vo fbdev2:/dev/fb1 ****.mp4 ``` 無限ループ再生するなら ``` sudo mplayer -vo fbdev2:/dev/fb1 ****.mp4 -loop 0 ```