基于树莓派GPIO触发Arduino中断实现程序循环启停方案咨询
用树莓派GPIO控制Arduino程序循环启停的中断实现方案
嘿,这个思路挺靠谱的——用树莓派GPIO触发Arduino外部中断来控制循环启停,既能保证响应速度,又不会占用Arduino太多资源。我帮你把代码补全并拆解一下关键细节:
完整的Arduino代码
volatile bool start = false; // 启动中断服务程序 void startLoop() { start = true; } // 停止中断服务程序 void stopLoop() { start = false; } void setup() { Serial.begin(9600); // 可选,用于调试输出 // 配置引脚为上拉输入 pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); // 绑定中断:引脚2触发启动,引脚3触发停止,上升沿触发 attachInterrupt(digitalPinToInterrupt(2), startLoop, RISING); attachInterrupt(digitalPinToInterrupt(3), stopLoop, RISING); } void loop() { if (start) { // 这里替换成你需要循环执行的业务代码 Serial.println("循环正在运行..."); delay(1000); // 示例延迟,实际根据需求调整 } else { // 停止状态的处理逻辑,可选 Serial.println("循环已停止"); delay(2000); } }
关键细节解释
volatile关键字的作用:volatile bool start = false;必须加这个关键字,因为start变量会在中断服务程序(ISR)中被修改。它告诉编译器不要对这个变量做缓存优化,确保每次读取都是内存中的最新值,避免出现逻辑错误。- 上拉输入的配置:用
INPUT_PULLUP而不是普通INPUT,这样Arduino引脚默认是高电平,树莓派不需要额外拉电阻,只要输出低电平保持常态,需要触发时输出高电平(上升沿)就能触发中断,电路更简洁。 - 中断触发条件:选择
RISING(电平从低到高跳变)作为触发条件,这样树莓派只需要给对应引脚一个短暂的高电平脉冲就能触发启停,不需要持续保持电平状态。
树莓派侧的控制示例(Python)
树莓派这边只需要简单控制GPIO引脚输出电平跳变就行,用RPi.GPIO库的示例代码:
import RPi.GPIO as GPIO import time # 配置引脚 START_PIN = 17 # 对应连接到Arduino的引脚2 STOP_PIN = 18 # 对应连接到Arduino的引脚3 GPIO.setmode(GPIO.BCM) GPIO.setup(START_PIN, GPIO.OUT) GPIO.setup(STOP_PIN, GPIO.OUT) # 默认输出低电平 GPIO.output(START_PIN, GPIO.LOW) GPIO.output(STOP_PIN, GPIO.LOW) try: # 模拟启动操作:输出高电平100ms后恢复低电平 print("启动Arduino循环") GPIO.output(START_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(START_PIN, GPIO.LOW) time.sleep(5) # 让循环运行5秒 # 模拟停止操作 print("停止Arduino循环") GPIO.output(STOP_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(STOP_PIN, GPIO.LOW) finally: GPIO.cleanup()
注意事项
- 中断服务程序(ISR)必须极度简洁:不能在ISR里用
delay()、Serial.print()这类阻塞或耗时的操作,你现在的代码只修改标志位,完全符合要求。 - 树莓派和Arduino必须共地:把两者的GND引脚连在一起,否则电平信号会不稳定,导致中断触发异常。
- 电平兼容性:树莓派输出3.3V,Arduino的5V系统可以识别3.3V为高电平,不需要额外的电平转换模块,直接连接即可。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

