系統環境說明
Distributor ID: Debian
Description: Debian GNU/Linux 13 (trixie)
Release: 13
Codename: trixie
Docker版本
Docker version 26.1.5+dfsg1, build a72d7cd
使用的映像檔名稱: python:3.11-slim,使用gpiozero+lgpio控制,版本如下:
gpiozero 2.0.1
lgpio 0.2.2.0
先直接說問題以及解決方法,問題在於在控制最簡單的GPIO輸出時會遇到以下錯誤
Traceback (most recent call last):
File "/app/blink2.py", line 11, in <module>
pi5_factory = LGPIOFactory(chip=0)
^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/gpiozero/pins/lgpio.py", line 67, in __init__
self._handle = lgpio.gpiochip_open(chip)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/lgpio.py", line 645, in gpiochip_open
return _u2i(handle)
^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/lgpio.py", line 458, in _u2i
raise error(error_text(v))
lgpio.error: 'can not open gpiochip'
這個問題很有趣,即使你程式中指定LGPIOFactory(chip=0)它還是會使用/dev/gpiochip4,如果你用docker中的devices對應也會出錯,當然可能是新版的gpiochip4是alias到gpiochip0。
另外經過實測如果設定privileged會出現錯誤,必須將gpiochip4對應到gpiochip0,以下提供我的Docker compose
services:
tflite_dev:
# image: python:3.11-slim
build: .
container_name: tflite_dev
working_dir: /app
command: [ "bash", "-c", "tail -f /dev/null" ]
volumes:
- .:/app
privileged: true
devices:
# - "/dev/gpiochip0:/dev/gpiochip0"
- "/dev/gpiochip0:/dev/gpiochip4"
# - "/dev/gpiomem0:/dev/gpiomem0"
ports:
- "5000:5000"
restart: unless-stopped
如果想要測試連接硬體晶片是否正常,可以使用以下程式
import lgpio
for i in range(0,14):
try:
h = lgpio.gpiochip_open(i)
print(f"gpiochip{i} OK, handle={h}")
lgpio.gpiochip_close(h)
except Exception as e:
print(f"gpiochip{i} FAIL: {e}")