RDKX3/X5button_led.py代码完整详解适用平台地平线 RDK X3、RDK X5库Hobot.GPIO地平线自研 Python GPIO 库语法高度兼容 RPi.GPIO功能简述读取按键输入同步控制 LED 输出按键电平状态直接映射到 LED按键按下 LED 点亮、松开熄灭。一、硬件接线说明python运行led_pin 31 # BOARD物理引脚31 → LED阳极串220Ω限流电阻 but_pin 37 # BOARD物理引脚37 → 按键一端推荐接线方案LED 回路Pin31 → 220Ω电阻 → LED正极 → GND按键回路上拉推荐方案 A开发板内部上拉按键一端 Pin37另一端接 GND方案 B外部Pin37 外接 10k 上拉电阻到 3.3V按键另一端接 GND⚠️ BOARD 编码 开发板 40Pin 排针丝印物理编号不需要记忆芯片 GPIO 编号新手首选。二、逐段源码解析1. 文件头 导入模块python运行#!/usr/bin/env python3 ################################################################################ # Apache2.0开源协议声明 ################################################################################ import sys import signal import Hobot.GPIO as GPIO import time#!/usr/bin/env python3指定解释器可直接chmod x ./xxx.py直接运行Hobot.GPIO地平线 RDK 平台专用 GPIO 库RDK 系统预装无需手动 pip 安装2. CtrlC 信号捕获函数python运行def signal_handler(signal, frame): sys.exit(0)作用捕获SIGINT键盘 CtrlC 中断信号优雅退出程序。补充真正的资源释放放在finally块信号 handler 只负责退出循环。3. 全局引脚定义python运行led_pin 31 # BOARD 编码 31输出 but_pin 37 # BOARD 编码 37输入 GPIO.setwarnings(False)GPIO.setwarnings(False)关闭警告当引脚已经被其他进程占用时库默认打印警告调试稳定后可以关闭。4. 核心主函数 main ()python运行def main(): prev_value None # 引脚初始化 GPIO.setmode(GPIO.BOARD) # 使用【物理丝印编号模式】 GPIO.setup(led_pin, GPIO.OUT) # 31号设置为输出 GPIO.setup(but_pin, GPIO.IN) # 37号设置为输入 GPIO.output(led_pin, GPIO.LOW) # LED初始状态熄灭 print(Starting demo now! Press CTRLC to exit) try: while True: curr_value GPIO.input(but_pin) # 读取按键当前电平 # 判断电平是否发生跳变按键按下/松开 if curr_value ! prev_value: GPIO.output(led_pin, curr_value) # 按键电平直接输出给LED prev_value curr_value print(Outputting {} to Pin {}.format(curr_value, led_pin)) time.sleep(1) # 循环间隔1秒 finally: GPIO.cleanup() # 【重点】程序退出时释放所有GPIO资源关键逻辑拆解GPIO.setmode(GPIO.BOARD)引脚编号模式一共 4 种BOARD电路板编号模式40Pin 排针物理丝印号推荐此 demo 使用BCM模仿树莓派 BCM 编号SOC芯片内核原始 GPIO 号查阅芯片手册使用CVM连接器信号名称字符串电平跳变检测prev_value保存上一次按键状态只有按键电平发生变化才修改 LED 状态避免重复输出。time.sleep(1)轮询⚠️【缺陷提醒】这种是轮询查询方式最低 1 秒才能识别一次按键动作按键快速按放会丢失事件优化方案使用中断边沿检测GPIO.add_event_detect()后面补充优化代码try ... finally 结构无论程序正常结束、CtrlC 强制退出、异常崩溃finally块一定会执行GPIO.cleanup()把 GPIO 恢复为默认输入状态防止引脚持续输出电平造成硬件隐患。5. 程序入口python运行if __name__ __main__: signal.signal(signal.SIGINT, signal_handler) main()signal.signal(SIGINT, handler)注册 CtrlC 中断回调Python 标准写法防止代码被其他文件 import 时自动执行三、运行操作步骤RDK X5 实测赋予执行权限bash运行chmod x button_led.py必须使用 root 权限操作 GPIO硬件权限限制bash运行sudo python3 button_led.py操作按下按键 → LED 点亮松开按键 → LED 熄灭控制台打印电平变化日志四、原生代码优缺点✅ 优点逻辑极简新手入门容易理解输入输出映射关系 ❌ 缺点轮询延时 1s响应慢快速按键会丢失CPU 持续循环占用资源没有启用内部上下拉电阻浮空输入容易出现电平抖动。五、进阶优化版本中断方式推荐项目使用使用边沿中断不需要 while 轮询实时响应按键节省 CPUpython运行#!/usr/bin/env python3 import sys import signal import Hobot.GPIO as GPIO import time led_pin 31 but_pin 37 GPIO.setwarnings(False) def signal_handler(signal, frame): GPIO.cleanup() sys.exit(0) # 按键中断回调函数 def button_callback(channel): val GPIO.input(but_pin) GPIO.output(led_pin, val) print(fButton state changed: {val}, LED set to {val}) def main(): GPIO.setmode(GPIO.BOARD) GPIO.setup(led_pin, GPIO.OUT) # 启用内部上拉电阻防止浮空抖动 GPIO.setup(but_pin, GPIO.IN, pull_up_downGPIO.PUD_UP) GPIO.output(led_pin, GPIO.LOW) # 注册双边沿中断上升沿下降沿都触发 GPIO.add_event_detect(but_pin, GPIO.BOTH, callbackbutton_callback, bouncetime200) print(Waiting button trigger, CTRLC exit) while True: time.sleep(0.1) if __name__ __main__: signal.signal(signal.SIGINT, signal_handler) main()重点新增特性pull_up_downGPIO.PUD_UP开启芯片内部上拉电阻解决浮空杂波add_event_detect硬件边沿中断bouncetime200消抖防止机械按键抖动多次触发无需高频轮询空闲时 CPU 低负载。六、常见踩坑清单RDK 开发高频问题报错 Permission denied✅ 解决GPIO 操作必须加sudo运行按键没反应电平一直不变检查接线、上下拉配置、确认引脚没有被系统设备树复用串口 / SPI 等功能占用LED 不亮检查 LED 正负极、限流电阻确认输出引脚是 BOARD 编号引脚被占用警告✅ 临时关闭GPIO.setwarnings(False)长期方案确认没有其他程序占用同一引脚