0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Raspberry Pi で framebuffer で遊ぶ」
https://qiita.com/nanbuwks/items/71062ada859846ec89eb
では、 fbi コマンドを使って簡単に framebuffer の描画を行いました。
ちらつきが激しいので、
別のやり方をすることにしました。

今回は python のライブラリ pygame を使ってみます。

環境

  • Raspberry Pi 3B
  • Raspberry Pi OS Lite (2024-07-04-raspios-bookworm-armhf-lite.img.xz)

pygame のインストール

 $ sudo apt install python3-pygame

または、 pip から無理やりシステムにインストール

$ sudo pip3 install --break-system-package pygame

どちらも同じように動作しました。

pip でインストールする場合、RaspberryPi で pip をインストール
https://qiita.com/nanbuwks/items/315f4281cbad51c73510」
のようにして、pip をインストールしておきます。

サンプルプログラム

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'
import pygame
from time import sleep

# os.putenv('SDL_FBDEV', '/dev/fb0')
os.putenv('XDG_RUNTIME_DIR', os.getenv('HOME')+"/.cache/xdgr")
pygame.init()

display = pygame.display.set_mode((800,480))
display.fill((255,0,0))
for i in range(480):
  pygame.draw.line(display, (0, i % 255 , 255), (i, i), (800-i, i), 2)
  pygame.display.update()

# pygame.draw.line(lcd, (30,80,200),[0,270],[0,319],2);
pygame.display.update()
sleep(2)

# os.putenv('SDL_FBDEV', '/dev/fb0')

は、ssh で実行する時に必要かなと思ったのですが、無くても描画できました。

エラーの対処などの Tips

警告を抑制する

<frozen importlib._bootstrap>:241: RuntimeWarning: Your system is neon capable but pygame was not built with support for it. The performance of some of your blits could be adversely affected. Consider enabling compile time detection with environment variables like PYGAME_DETECT_AVX2=1 if you are compiling without cross compilation.

と出てくる。

これは実行時に python3 -W ignore ac.py とすることで表示しなくした。

pygame の Helloメッセージが表示される

pygame 2.6.0 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html

と出てくる。これは

from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'

で抑制しています。

何故か os.putenv では効きませんでした。

MESA--LOADER: failed to open ... エラー

pygame 2.1.2 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
MESA-LOADER: failed to open vc4: /usr/lib/dri/vc4_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open zink: /usr/lib/dri/zink_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open kms_swrast: /usr/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/arm-linux-gnueabihf/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
Traceback (most recent call last):
  File "/home/pi/./pg.py", line 11, in <module>
    lcd = pygame.display.set_mode((480, 320)) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pygame.error: EGL not initialized

以下で対処

$ sudo apt install libgl1-mesa-dri

pygame.error: EGL not initialized

<frozen importlib._bootstrap>:241: RuntimeWarning: Your system is neon capable but pygame was not built with support for it. The performance of some of your blits could be adversely affected. Consider enabling compile time detection with environment variables like PYGAME_DETECT_AVX2=1 if you are compiling without cross compilation.
pygame 2.6.0 (SDL 2.26.5, Python 3.11.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
Traceback (most recent call last):
  File "/home/pi/./pg.py", line 11, in <module>
    lcd = pygame.display.set_mode((480, 320)) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pygame.error: EGL not initialized

以下で対処

$ sudo apt install libegl-dev

error: XDG_RUNTIME_DIR is invalid or not set in the environment.

sudo で実行した時に以下の表示が出ました。エラーが出るだけで実行には問題なかったです。

以下の一文を入れると解消。

os.putenv('XDG_RUNTIME_DIR', os.getenv('HOME')+"/.cache/xdgr")

しかしながら /etc/rc.local に入れて起動するとエラー。

TypeError: expected str, bytes or os.PathLike object, not NoneType

これは /etc/rc.local で起動すると HOME 環境変数が設定されていないことによるようです。

仕方がないので

os.putenv('XDG_RUNTIME_DIR', "/tmp/.cache/xdgr")

としてごまかしています。

kill できない

このプログラムが起動していると、システムシャットダウンが妨げられます。
kill -HUP だと殺せるけど、kill だけだと死なない。
処理途中に以下を入れて対処。

  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?