系統環境說明

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}")