声明AF_DCMotor后Arduino无法读取蓝牙数据的求助
问题:添加AF_DCMotor声明后蓝牙串口无法正常工作
我仅添加了一行AF_DCMotor motor1(1)的电机声明(程序中未使用该电机),原本能正常接收手机蓝牙数据并在串口监视器显示的Arduino程序就无法正常工作了。以下是正常和异常代码:
正常运行代码
#include <AFMotor.h> #include <SoftwareSerial.h> SoftwareSerial BTSerial(11, 10); // RX | TX void setup() { Serial.begin(9600); BTSerial.begin(9600); } void loop() { if (BTSerial.available()) { char data = BTSerial.read(); Serial.write(data); if (data == '1') { Serial.println("Button 1 pressed"); } } delay(20); }
异常代码(添加电机声明后)
#include <AFMotor.h> #include <SoftwareSerial.h> SoftwareSerial BTSerial(11, 10); // RX | TX AF_DCMotor motor1(1); void setup() { Serial.begin(9600); BTSerial.begin(9600); } void loop() { if (BTSerial.available()) { char data = BTSerial.read(); Serial.write(data); if (data == '1') { Serial.println("Button 1 pressed"); } } delay(20); }
问题原因
AFMotor库在创建AF_DCMotor对象时,会占用Arduino的定时器资源:以Arduino Uno为例,电机1、2使用定时器1,电机3、4使用定时器0。而当前使用的SoftwareSerial在引脚10、11运行时,同样会占用定时器1,两者的资源冲突导致蓝牙串口功能失效。
解决办法
更换SoftwareSerial的引脚
选择与AFMotor定时器不冲突的引脚,比如将蓝牙模块的RX/TX接到Arduino的引脚2和3(这两个引脚使用定时器0,与电机1/2的定时器1无冲突),修改代码中的串口初始化:SoftwareSerial BTSerial(2, 3); // RX | TX改用硬件串口通信
若使用的Arduino有额外硬件串口(如Mega系列),直接用硬件串口连接蓝牙模块,彻底避免定时器冲突。如果是Uno,可将蓝牙模块的TX接Arduino的RX(0)、RX接TX(1),程序中直接使用Serial与蓝牙通信(注意:上传程序时需断开蓝牙模块的连接,否则会干扰程序上传):#include <AFMotor.h> AF_DCMotor motor1(1); void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { char data = Serial.read(); Serial.write(data); if (data == '1') { Serial.println("Button 1 pressed"); } } delay(20); }调整电机编号避免定时器冲突
将电机声明改为使用定时器0的电机3或4,这样就不会和SoftwareSerial占用的定时器1冲突:AF_DCMotor motor1(3); // 使用电机3,对应定时器0
内容的提问来源于stack exchange,提问作者Strelka M
相关产品推荐
相关产品推荐

