树莓派4 Ubuntu下GPIO外接面包板按钮无响应问题求助
树莓派GPIO按钮无响应故障排查
核心故障点按出现概率从高到低排列:
- 触发边沿配置与电路逻辑不匹配
你为GPIO16配置了内部上拉输入模式pull_up_down=GPIO.PUD_UP,该模式下引脚默认维持高电平:按钮按下时引脚接GND跳变为低电平,松开时才会回弹到高电平。当前代码监听GPIO.RISING上升沿(低电平变高电平的跳变),仅会在松开按钮的瞬间触发回调,如果你测试时只观察按下瞬间的反应,会误以为按钮完全无响应。
修正方式:如果需要按下按钮触发,将事件检测的边沿参数改为GPIO.FALLING即可。 - GPIO访问权限不足
你使用的是Ubuntu系统,和官方树莓派OS不同,Ubuntu默认不给普通用户开放GPIO中断注册的权限,且RPi.GPIO库遇到权限问题时不会抛出显式报错。你代码中前半段LED闪烁是GPIO输出操作,部分系统版本下非root用户可正常执行,但边沿检测的中断注册会静默失效,表现就是LED闪烁完之后按钮操作完全无反应。
验证方式:运行脚本时加上root权限,执行命令为sudo python3 你的脚本文件名.py。 - 接线逻辑不匹配
使用内部上拉模式时,按钮必须一端接GPIO16、另一端接GND。如果误将按钮另一端接3.3V引脚,引脚电平会始终维持高电平,无论是否按下按钮都不会产生电平跳变,自然无法触发回调。 - 兼容问题排查
如果以上三点都确认没问题,可先注释掉GPIO.add_event_detect中的bouncetime=300参数测试,部分Ubuntu版本对应的RPi.GPIO库版本存在消抖参数兼容bug,会导致回调无法正常触发。
修正后的参考代码:
#This is a node used to control the-------with Raspberry Pi GPIO #import rospy import RPi.GPIO as GPIO import time #from geometry_msgs.msg import Twist #from sensor_msgs.msg import Joy #from std_msgs.msg import Bool GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(20, GPIO.OUT, initial=GPIO.LOW) # 内部上拉输入 GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 开机LED闪烁5次提示 for i in range(5): GPIO.output(20, GPIO.HIGH) time.sleep(.2) GPIO.output(20, GPIO.LOW) time.sleep(.2) led_on=False def switch(ev=None): global led_on led_on = not led_on GPIO.output(20, GPIO.HIGH if led_on else GPIO.LOW) # 改为监听下降沿(按下触发),运行时需加sudo GPIO.add_event_detect(16, GPIO.FALLING, callback=switch, bouncetime=300) while True: time.sleep(1)
内容的提问来源于stack exchange,提问作者mattcrouse
相关产品推荐
相关产品推荐

