ラズパイ, raspberrypi, framebuffer, fbi, フレームバッファ

07. ラズパイでフレームバッファ #1

2017/08/08 -- Posted by : bitset

<はじめに>

Raspberry Pi に 3.5インチLCD を取り付けた時の実用的な使い方を考えてみます。


IMG_20170808_192145616-640-min.jpg IMG_20170726_123912171-640-min.jpg

 (液晶モジュール)  Kuman 3.5" Inch 480x320 RGB TFT LCD

3.5インチで解像度:480x320、 ...このスペックで X-Window は実用的ではありません。(笑いは取れますが)
また、SPI接続なので表示は遅いです。
そのため、3.5インチLCDを実用的に使うためにフレームバッファを試しました。

 

<LCDセットアップ>


1. ドライバのインストール

ここに書いてある手順に従ってインストールします。
http://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)
 

2. 画面の向きの調整

/boot/config.txt で設定します。

dtoverlay=tft35a:rotate=270

270 の箇所を、0, 90,180,270 のいずれかを指定し、書き換えたら再起動します。

  • 0, 180 は縦長
  • 90, 270 は横長

になります

ドライバインストール後は3.5インチLCDがデフォルトコンソール画面になりますが、実はHDMI接続の画面も使用可能です。

デバイスを確認すると、

$ ls -l /dev/fb*
crw-rw---- 1 root video 29, 0  8月  5 02:17 /dev/fb0
crw-rw---- 1 root video 29, 1  8月  5 02:17 /dev/fb1

と、2つ見えます。

それぞれを確認すると、

pi@raspberrypi:~$ fbset -fb /dev/fb0

mode "1920x1080"
    geometry 1920 1080 1920 1080 32
    timings 0 0 0 0 0 0 0
    rgba 8/16,8/8,8/0,8/24
endmode

pi@raspberrypi:~ $ fbset -fb /dev/fb1

mode "480x320"
    geometry 480 320 480 320 16
    timings 0 0 0 0 0 0 0
    nonstd 1
    rgba 5/11,6/5,5/0,0/0
endmode

となっていて、解像度から

  • /dev/fb0 →  HDMI
  • /dev/fb1 →  3.5inch LCD

と推測出来ます。

 

<画面クリア>


ドライバインストール後はLCDがデフォルトコンソールになります。そのため、LCD側は clearコマンドで画面消去出来まが、HDMI側は操作出来ません。 HDMI側を画面クリアする場合は dd コマンドを使用します。

$ dd if=/dev/zero of=/dev/fb0 > /dev/null 2>&1

of に /dev/fb1 を指定するとLCD側もクリア出来ます。

icon_checked.png Pythonの場合

こんなコードになります。

os.system('dd if=/dev/zero of=/dev/fb0 > /dev/null 2>&1')

Pygameなどのライブラリを使っても出来ますが、こっちのほうが簡単です。
ライブラリへの依存も発生しないのでスクリプトの起動も速くなります。
 

<画像表示>


fbiコマンドを使えば、簡単に画像表示出来ます。

$ fbi -d /dev/fb0 -a --noverbose --noedit {画像ファイル名} > /dev/null 2>&1

IMG_20170725_132624918-640.jpg

ENTERキーを押すと fbiコマンドを終了します。 ただし、このままでは fbiコマンドを終了するとき画面クリアされます。

次のように時間差で fbi に SIGINT を送信すると、画面クリアせずにfbiを終了することが出来ます。

$ (sleep 2; pkill -2 -f fbi) & exec fbi -d /dev/fb0 -a --noverbose --noedit {画像ファイル名} > /dev/null 2>&1

これを利用して、 画面更新することも出来ます。(fbiが終了しても画面は消えない)

icon_checked.png Pythonの場合

os.system('(sleep 1; pkill -2 -f fbi) & exec fbi -d /dev/fb0 -a --noverbose --noedit {0} > /dev/null 2>&1'.format(path_to_imagefile))

Pygameに頼らずに画像表示出来ました。

 

<Shellscriptからフレームバッファ>


fbiコマンドを使えば、Shellscriptからフレームバッファを使用して画面更新することも出来ます。

例として、画面に現在時刻を表示し一定間隔でに画面更新します。

 

サンプル処理フロー

flow.png

  1. date コマンドから時刻文字列を取得し、
  2. convertコマンドで画像生成、
  3. fbiで画面に表示します。

 

要は、 Imagemagick で動的に画像生成し、fbiで画面更新 します。

 

作成したShellscript

#!/bin/bash

clear

while :
do
 convert -size 480 label:`date +"%I:%M:%S"`  output.png
 (sleep 2; pkill -2 -f fbi) & fbi -d /dev/fb1 -a --noverbose --noedit output.png > /dev/null 2>&1
done

このShellscriptを実行すると、次のような実行画面になります。

実行結果

IMG_20170809_245340759-640-min.jpg

fbiコマンド終了時に画面が元に戻るのが残念ですが、ひとまず、Shellscriptだけで動的に画像表示を切り替えることが出来ました。(C言語とかPython 知らない人でもOKということで)

 

<最後に>

今回は #1 なので、引き続きフレームバッファネタで引っ張っていく予定です。

Share:

Most Recent Posts

07. ラズパイでフレームバッファ #1

ラズパイの3.5インチLCDに画像表示を行います。

06. ImageMagick で帳票作成 (データ作成編)

jinja2を使って、JSONファイルをImagemagick用データに変換します。

05. ImageMagick で帳票作成 (実践編)

Imagegagick を使って、業務に耐えうるレベルのPDF帳票を作成します。