树莓派5使用gpiozero出现KeyError及SOC外设基址错误求助
树莓派5使用gpiozero控制LED报错:Cannot determine SOC peripheral base address
问题场景
我用全新树莓派5测试LED闪烁功能,电路已排除故障,LED连接GPIO17引脚,使用以下Python代码:
from gpiozero import LED from time import sleep led = LED(17) try: while True: led.on() print('...LED ON') sleep(0.5) led.off() print('LED OFF...') sleep(0.5) except KeyboardInterrupt: pass
运行脚本时出现如下错误:
/usr/lib/python3/dist-packages/gpiozero/devices.py:295: PinFactoryFallback: Falling back from lgpio: 'can not open gpiochip' warnings.warn( Traceback (most recent call last): File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 408, in pin pin = self.pins[info] ~~~~~~~~~^^^^^^ KeyError: PinInfo(number=11, name='GPIO17', names=frozenset({'17', 'GPIO17', 17, 'WPI0', 'BOARD11', 'J8:11', 'BCM17'}), pull='', row=6, col=1, interfaces=frozenset({'', 'spi', 'gpio', 'dpi', 'uart'})) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/kevinkrupa13/raphael-kit/python-pi5/1.1.1_BlinkingLed_zero.py", line 6, in <module> led = LED(17) ^^^^^^^ File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 103, in __call__ self = super().__call__(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/gpiozero/output_devices.py", line 192, in __init__ super().__init__(pin, active_high=active_high, File "/usr/lib/python3/dist-packages/gpiozero/output_devices.py", line 74, in __init__ super().__init__(pin, pin_factory=pin_factory) File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 75, in __init__ super().__init__(*args, **kwargs) File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 549, in __init__ pin = self.pin_factory.pin(pin) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 410, in pin pin = self.pin_class(self, info) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/gpiozero/pins/rpigpio.py", line 101, in __init__ GPIO.setup(self._number, GPIO.IN, self.GPIO_PULL_UPS[self._pull]) RuntimeError: Cannot determine SOC peripheral base address
脚本已获取完整权限,求可行解决方案。
解决方案
1. 全量更新系统及GPIO相关库
树莓派5的硬件架构更新后,旧版本的GPIO控制库不支持新的SOC外设基地址,先更新系统和依赖:
sudo apt update && sudo apt full-upgrade -y sudo apt install --reinstall python3-gpiozero python3-lgpio
2. 指定使用lgpio引脚工厂运行脚本
错误提示中提到从lgpio fallback失败,可强制gpiozero使用lgpio库(树莓派5官方推荐的GPIO控制库):
- 方法一:运行脚本时通过环境变量指定
GPIOZERO_PIN_FACTORY=lgpio python3 1.1.1_BlinkingLed_zero.py
- 方法二:在代码中直接指定引脚工厂
修改后的代码如下:
from gpiozero import LED, Device from gpiozero.pins.lgpio import LGPIOFactory from time import sleep # 指定使用lgpio引脚工厂 Device.pin_factory = LGPIOFactory() led = LED(17) try: while True: led.on() print('...LED ON') sleep(0.5) led.off() print('LED OFF...') sleep(0.5) except KeyboardInterrupt: pass
3. 替换为支持树莓派5的RPi.GPIO替代库
旧版RPi.GPIO不兼容树莓派5,可安装新版替代库rpi-lgpio:
pip install rpi-lgpio
安装完成后重新运行原脚本即可。
内容的提问来源于stack exchange,提问作者KevinKrupa
相关产品推荐
相关产品推荐

