You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派5运行Blinkt LED Docker容器时GPIO寄存器映射失败求助

问题描述

我有一个Docker容器,用于在配备Blinkt LED的节点上显示Kubernetes集群的CPU负载,该容器在Raspberry Pi 3B和4上运行正常,但在Raspberry Pi 5启动时出现如下错误:

Traceback (most recent call last):
File "//./cpuload.py", line 33, in <module>
blinkt.show()
File     "/usr/local/lib/python3.9/dist-packages/blinkt.py", line 76, in show
GPIO.setup(DAT, GPIO.OUT)
RuntimeError:  Mmap of GPIO registers failed

以下是在树莓派4上可用的Dockerfile:

FROM balenalib/raspberrypi4-64-debian-node

RUN apt-get update -qy && apt-get install -qy \
    gcc \
    python3-dev \
    pip \
    python3 \
    python3-rpi.gpio

RUN pip install --upgrade pip setuptools
RUN pip install psutil blinkt 

COPY src/ .

CMD [ "python3", "./cpuload.py" ]

cpuload.py的Python代码如下:

#!/usr/bin/env python

import time
import os.path
import signal
from os import path
from sys import exit

def sigterm_handler( _signo, _stak_frame ):
  for x in range(blinkt.NUM_PIXELS):
    blinkt.set_pixel(x, 0, 0, 0)
  sys.exit(0)

signal.signal(signal.SIGTERM, sigterm_handler)

try:
    import psutil
except ImportError:
    exit("This script requires the psutil module\nInstall with: sudo pip install psutil")

try:
  import blinkt
except ImportError:
  exit("This script requires the blinkt module\nInstall with: sudo pip install blinkt")

blinkt.set_clear_on_exit()
blinkt.set_brightness(0.2)

while True:
    for x in range(blinkt.NUM_PIXELS):
        blinkt.set_pixel(x, 0, 0, 0)

    blinkt.show()
    if path.exists("/home/pi/.BLINK"):
        v = psutil.cpu_percent() / 100.0
        if v > 0.11 or (v > 0 and v < 0.11):
            blinkt.set_brightness(0.1)
            blinkt.set_pixel(0, 0, 128, 0)
        if v > 0.22 or (v > 0.11 and v < 0.22):
            blinkt.set_brightness(0.2)
            blinkt.set_pixel(1, 0, 128, 0)
        if v > 0.33 or (v > 0.22 and v < 0.33):
            blinkt.set_brightness(0.3)
            blinkt.set_pixel(2, 0, 128, 0)
        if v > 0.44 or (v > 0.33 and v < 0.44):
            blinkt.set_brightness(0.4)
            blinkt.set_pixel(3, 255, 215, 0)
        if v > 0.55 or (v > 0.44 and v < 0.55):
            blinkt.set_brightness(0.5)
            blinkt.set_pixel(4, 255, 215, 0)
        if v > 0.66 or (v > 0.55 and v < 0.66):
            blinkt.set_brightness(0.6)
            blinkt.set_pixel(5, 255, 215, 0)
        if v > 0.77 or (v > 0.66 and v < 0.77):
            blinkt.set_brightness(0.7)
            blinkt.set_pixel(6, 255, 0, 0)
        if v > 0.88:
            blinkt.set_brightness(0.8)
            blinkt.set_pixel(7, 255, 0, 0)
        blinkt.show()
        time.sleep(0.01)

我了解到树莓派5的GPIO有一些变化,但不确定如何修复,是否需要更换Python GPIO库?


解决方案

核心原因

Raspberry Pi 5采用了新的RP1芯片负责GPIO、SPI等外设,旧的python3-rpi.gpio库不兼容该硬件架构,无法完成GPIO寄存器映射,从而触发Mmap of GPIO registers failed错误。

具体修复步骤

  1. 更换适配RPi5的基础镜像
    将Dockerfile的基础镜像替换为支持Raspberry Pi 5的版本,比如balenalib/raspberrypi5-64-debian-node,确保系统层适配新硬件。

  2. 替换GPIO库
    移除旧的python3-rpi.gpio,改用官方推荐的兼容RP1芯片的python3-lgpio库。

  3. 更新Dockerfile
    修改后的Dockerfile如下:

    FROM balenalib/raspberrypi5-64-debian-node
    
    RUN apt-get update -qy && apt-get install -qy \
        gcc \
        python3-dev \
        pip \
        python3 \
        python3-lgpio
    
    RUN pip install --upgrade pip setuptools
    RUN pip install psutil blinkt 
    
    COPY src/ .
    
    CMD [ "python3", "./cpuload.py" ]
    
  4. 调整代码兼容性

    • Blinkt库默认依赖RPi.GPIO,需要强制它使用lgpio,在代码开头(导入blinkt之前)添加以下代码:
      # 强制blinkt使用lgpio替代RPi.GPIO
      import os
      os.environ['BLINKT_GPIO_LIBRARY'] = 'lgpio'
      
    • 原代码的sigterm_handler函数未导入sys且未执行blinkt.show(),会导致LED无法正常清空,补充修改如下:
      import sys  # 补充导入sys模块
      def sigterm_handler( _signo, _stak_frame ):
        for x in range(blinkt.NUM_PIXELS):
          blinkt.set_pixel(x, 0, 0, 0)
        blinkt.show()  # 确保LED状态被更新
        sys.exit(0)
      
  5. 赋予容器GPIO访问权限
    启动容器时需添加--privileged参数,或者挂载/dev/gpiomem设备,确保容器有权限访问GPIO硬件:

    docker run --privileged your-image-tag
    

验证

重新构建镜像并在Raspberry Pi 5上运行,LED应能正常根据CPU负载显示对应状态。

内容的提问来源于stack exchange,提问作者techguy993

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:24:53