树莓派GPIO键盘中断后限位开关无响应问题排查
问题描述
在运行Raspbian OS的树莓派4上测试限位开关时,每次通过键盘中断(Ctrl+C)终止脚本后,GPIO引脚便不再响应限位开关。先后尝试引脚16、20、21,初始均能正常检测状态,但中断后再次运行脚本就无法读取输入。
测试代码
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) SWITCH_PIN = 16 DEBOUNCE_TIME_MS = 200 GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) switch_state = GPIO.input(SWITCH_PIN) prev_switch_state = switch_state def button_callback(channel): global switch_state switch_state = GPIO.input(SWITCH_PIN) GPIO.add_event_detect(SWITCH_PIN, GPIO.BOTH, callback=button_callback, bouncetime=DEBOUNCE_TIME_MS) try: while True: if switch_state != prev_switch_state: if switch_state == GPIO.HIGH: print("The limit switch: TOUCHED -> UNTOUCHED") else: print("The limit switch: UNTOUCHED -> TOUCHED") prev_switch_state = switch_state if switch_state == GPIO.HIGH: print("The limit switch: UNTOUCHED") else: print("The limit switch: TOUCHED") except KeyboardInterrupt: GPIO.cleanup()
已执行操作
- 运行
sudo apt update - 因边缘检测问题从旧GPIO包切换为rpi-lgpio包
- 接线:树莓派GND接Jaycar产250V 5A带杆SPDT微动开关NO端,GPIO引脚接COM端
- 脚本原本可正常运行数小时
- 已测试两个限位开关及全新树莓派4
解决办法
优化GPIO清理流程
在键盘中断的处理块中,先移除事件检测再执行引脚清理,避免事件残留导致的引脚锁定:except KeyboardInterrupt: GPIO.remove_event_detect(SWITCH_PIN) GPIO.cleanup()更新rpi-lgpio到最新版本
执行命令修复可能存在的包版本bug:sudo apt update && sudo apt upgrade -y rpi-lgpio简化脚本排除事件检测干扰
使用无事件检测的基础脚本测试引脚功能,确认硬件和引脚本身正常:import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) SWITCH_PIN = 16 GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: current_state = GPIO.input(SWITCH_PIN) print("限位开关:未触发" if current_state == GPIO.HIGH else "限位开关:已触发") time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup()禁用GPIO警告(可选)
在脚本开头添加GPIO.setwarnings(False),避免因引脚状态残留导致的警告干扰:import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # 后续代码不变
内容的提问来源于stack exchange,提问作者user19740140
相关产品推荐
相关产品推荐

