結 論
xvfbを使って、仮想ディスプレイを作成して起動しましょう!
検証した環境
ラズパイ4Bで確認しました。
$ uname -a
Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
背 景
- ラズパイでGPIOに色んなでデバイスを接続して、ジョイスティックから操作したい
- イベント処理やジョイスティック入力が機能として入っているので、pygameを選定
- ラズパイはディスプレイに接続していない
- デバッグ用にGUIを利用することがあるが、基本的にはディスプレイなしで実行したい
問題点
- pygameの仕様上、ウィンドウにフォーカスが当たっていないと、ジョイスティックの入力が取得できない。
- pygameのイベントの「pygame.JOYBUTTONDOWN」を来ない
- ジョイスティックのボタンを押しながら、get_buttonしても入力が取得できない
- よって、HDMIでディスプレイに接続するか、VNCで入らないと基本的にジョイスティックが使えない
解決方法
- xvfbという、仮想ディスプレイを作成してスクリプトを起動する
- xvfbとは?
- 画面出力を表示せずに、すべてのグラフィック操作を仮想メモリ内で行うプログラム
- X virtual framebufferの略
- ソースはwikipedia
具体的な解決方法
xvfbのインストール
$ sudo apt update
$ sudo apt install xvfb
xvfbでpythonを起動
$ xvfb -a python main.py
おわりに
ラズパイ × pygameはおすすめです!