从 Raspberry Pi 5 中的 Docker 容器控制 GPIO

问题描述 投票:0回答:1

我正在尝试使用

gpiozero
来控制 Raspberry Pi 5 上容器中的 GPIO。 我的简单 LED 闪烁应用程序是

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

虽然它在主机上运行良好,但我无法让它在 Docker 容器中运行。当我使用以下命令创建容器时:

docker run  --privileged --device /dev/gpiochip4 -v /dev:/dev -v /sys:/sys blinker:latest

我收到错误

Unable to load any default pin factory!

这是整个错误跟踪:

/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from lgpio: module 'lgpio' has no attribute 'SET_BIAS_DISABLE'
  warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from rpigpio: No module named 'RPi'
  warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from pigpio: failed to connect to localhost:8888
  warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from native: unable to determine gpio base
  warnings.warn(
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)

Did you start the pigpio daemon? E.g. sudo pigpiod

Did you specify the correct Pi host/port in the environment
variables PIGPIO_ADDR/PIGPIO_PORT?
E.g. export PIGPIO_ADDR=soft, export PIGPIO_PORT=8888

Did you specify the correct Pi host/port in the
pigpio.pi() function? E.g. pigpio.pi('soft', 8888)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Traceback (most recent call last):
  File "//blink.py", line 5, in <module>
    led = LED(17)
          ^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 108, in __call__
    self = super().__call__(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gpiozero/output_devices.py", line 192, in __init__
    super().__init__(pin, active_high=active_high,
  File "/usr/local/lib/python3.11/site-packages/gpiozero/output_devices.py", line 74, in __init__
    super().__init__(pin, pin_factory=pin_factory)
  File "/usr/local/lib/python3.11/site-packages/gpiozero/mixins.py", line 75, in __init__
    super().__init__(*args, **kwargs)
  File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 544, in __init__
    super().__init__(pin_factory=pin_factory)
  File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 245, in __init__
    Device.ensure_pin_factory()
  File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 270, in ensure_pin_factory
    Device.pin_factory = Device._default_pin_factory()
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 302, in _default_pin_factory
    raise BadPinFactory('Unable to load any default pin factory!')
gpiozero.exc.BadPinFactory: Unable to load any default pin factory!

为了创建图像,我使用了以下 Dockerfile:

FROM python:3.11
COPY blink.py ./
RUN pip install lgpio pigpio gpio gpiozero
CMD ["python", "blink.py"]

此外,我尝试公开端口 8888,并尝试公开

/dev
文件夹下的不同卷。我验证了守护进程正在使用
sudo pigpiod
sudo systemctl enable pigpiod
运行。

docker raspberry-pi gpio gpiozero
1个回答
0
投票

我在 GitHub 的存储库中找到了解决方法PY_LGPI。您可以按如下方式更新 Dockerfile:

FROM python:3.11

COPY blink.py ./

RUN pip install lgpio pigpio gpio gpiozero

RUN wget https://github.com/Gadgetoid/PY_LGPIO/releases/download/0.2.2.0/lgpio-0.2.2.0.tar.gz
RUN pip install lgpio-0.2.2.0.tar.gz

CMD ["python", "blink.py"]

然后,您可以使用以下命令运行 Docker 容器:

docker run --privileged blinker:latest

这应该可以解决您面临的问题。

© www.soinside.com 2019 - 2024. All rights reserved.