Raspberry  Pi で framebuffer で遊ぶ

Elecrow の5インチ液晶。
![IMG_20240708_225324.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/81d07c7e-bb8e-acb4-de55-88c174d7c64f.jpeg)

これにRaspberryPiをつなげて、framebuffer を使って描画してみる。

# 環境

- Raspberry Pi WH 
- Raspberry Pi OS Lite (2024-07-04-raspios-bookworm-armhf-lite.img.xz)
- Elecrow 5 Inch 800x480 TFT Raspberry Pi Touch Display with GPIO Backlight Control


# 下準備

```
$ sudo apt install fbi
$ sudo apt install imagemagick
$ sudo apt install fbcat
```

# 操作

適当に作った heartbeatbg2.png を使って、


```
$ sudo fbi -d /dev/fb0 -a  /home/pi/heartbeatbg2.png 
```
とすると以下のようにエラーが出た。

```
using "Noto Sans Mono-16", pixelsize=16.67 file=/usr/share/fonts/truetype/noto/NotoSansMono-Regular.ttf
ioctl VT_GETSTATE: Inappropriate ioctl for device (not a linux console?)
```

これは ssh で操作していたので、以下のようにターミナルを指定すると問題なく表示された。



```
 $ sudo fbi -T 7 -d /dev/fb0 -a  /home/pi/heartbeatbg2.png 
```
-T 7 の後ろの数字は1とか2とかでも問題ありませんでした。

これはディスプレイに表示したもの。
![IMG_20240708_204628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/36483d00-7b9c-f214-3765-81303968cc0d.jpeg)

HDMIケーブルを5inLCDに繋ぎ変えて表示。


![IMG_20240708_213501.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9c56eb9b-f607-ac14-8ba8-a8d4b4e35650.jpeg)


以下のようにすると framebuffer に表示しているイメージを画像ファイルにキャプチャできる。

```
$ sudo fbgrab -c 1 -d /dev/fb0 -i image.png
```
キャプチャしたもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/777dbf07-9da0-97e1-b817-f04cf94594b4.png)

下に余計な情報がついているのでそれを表示しなくして、時刻のダミー文字列を合成してを表示してみる。



```
$ convert -font /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf -pointsize 130 -fill "#C00000"  -draw "text 520,350'60'" heartbeatbg2.png image2.png ; convert -font /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf -pointsize 45 -fill "#FFAA00" -draw "text 60,450'2024/07/08'" image2.png image3.png ;convert -font /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf -pointsize 160 -fill "#FFFFAA" -draw "text 40,150'22:25:35'" image3.png image4.png ; sudo fbi -T 2 -d /dev/fb0 -noverbose image4.png
```




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/28da6c0e-fbbd-c310-4a48-53781bd8ef56.png)


正しい時刻を取得するようにして、無限ループ。 なお HeartBeat は単にかっこつけるだけのランダム数字。
```

#!/bin/bash
while true
do
  convert -font /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf -pointsize 130 -fill "#C00000"  -draw "text 520,350'$((RANDOM % 50 + 30))'" heartbeatbg2.png image2.png
  convert -font /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf -pointsize 45 -fill "#FFAA00" -draw "text 60,450'`date +"%Y/%m/%d %A"`'" image2.png image3.png
  convert -font /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf -pointsize 160 -fill "#FFFFAA" -draw "text 40,150'`date +"%H:%M:%S"`'" image3.png image4.png
  sudo pkill fbi
  sudo fbi -T 1 -d /dev/fb0 -noverbose image4.png
done

```

:::note
2024/07/10 追記：
 ` sudo pkill fbi` を追加しました。
  

fbi は起動すると終了せずずっとプロセスに残っており、これが無い状態だとしばらくすると fbi プロセスばっかりでシステムがハングしてしまいました。

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5af9cb1b-3f1b-099b-fd5e-1bb5a67da5eb.png)

RaspberryPi WH だとノーウェイトで2秒ぐらいでループ。まあこれでいいかな。

:::note
2024/7/10 追記：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f8b7a56-ac45-ff94-69ef-a66a3a1feaa5.png)
ちらつきが激しかったり、convvert などの負荷が高かったりするので別のやり方で作り直しました。

「RaspberryPi で pygame で x11 を使わず(?) 遊ぶ」
https://qiita.com/nanbuwks/items/96538470dacd3fb217de

:::