ラズパイ, raspberrypi, framebuffer, fbi, フレームバッファ
Raspberry Pi に 3.5インチLCD を取り付けた時の実用的な使い方を考えてみます。
(液晶モジュール) Kuman 3.5" Inch 480x320 RGB TFT LCD
3.5インチで解像度:480x320、 ...このスペックで X-Window は実用的ではありません。(笑いは取れますが)
また、SPI接続なので表示は遅いです。
そのため、3.5インチLCDを実用的に使うためにフレームバッファを試しました。
ここに書いてある手順に従ってインストールします。
http://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)
/boot/config.txt で設定します。
dtoverlay=tft35a:rotate=270
270 の箇所を、0, 90,180,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
となっていて、解像度から
と推測出来ます。
ドライバインストール後はLCDがデフォルトコンソールになります。そのため、LCD側は clearコマンドで画面消去出来まが、HDMI側は操作出来ません。 HDMI側を画面クリアする場合は dd コマンドを使用します。
$ dd if=/dev/zero of=/dev/fb0 > /dev/null 2>&1
of に /dev/fb1 を指定するとLCD側もクリア出来ます。
こんなコードになります。
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
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が終了しても画面は消えない)
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に頼らずに画像表示出来ました。
fbiコマンドを使えば、Shellscriptからフレームバッファを使用して画面更新することも出来ます。
例として、画面に現在時刻を表示し一定間隔でに画面更新します。
要は、 Imagemagick で動的に画像生成し、fbiで画面更新 します。
#!/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を実行すると、次のような実行画面になります。
fbiコマンド終了時に画面が元に戻るのが残念ですが、ひとまず、Shellscriptだけで動的に画像表示を切り替えることが出来ました。(C言語とかPython 知らない人でもOKということで)
今回は #1 なので、引き続きフレームバッファネタで引っ張っていく予定です。
ラズパイの3.5インチLCDに画像表示を行います。
jinja2を使って、JSONファイルをImagemagick用データに変換します。
Imagegagick を使って、業務に耐えうるレベルのPDF帳票を作成します。