Radiohead RH_ASK.h干扰模拟写入电机

时间:2017-11-09 13:47:14

标签: arduino radio wireless

我们尝试使用RF-433发射器和接收器远程控制elegoo机器人汽车(https://www.elegoo.com/product/elegoo-uno-project-smart-robot-car-kit-v1-0/)。该车有4个直流电机,由L298N控制器控制,电机由2节18650 4200mAh 3.7V锂离子电池供电,也为Arduino Uno供电。当我们试图通过带有PWM而不使用RF-433的PWM控制汽车时,它工作正常,但是当使用RF时 汽车一侧的电机不起作用。我们已将问题缩小到代码的特定部分:

if (!Radio.init()) {
    Serial.println("init failed");
}

当包含此部分时,会出现问题。但当评论出来时,汽车行驶良好。这就是我们认为RH_ASK库和arduino代码之间存在干扰的原因。其余代码就在这里。

#include < RH_ASK.h >
#include < SPI.h > // Not actually used but needed to compile

RH_ASK Radio(2000, 0);

// Pin connections to L298n motor controller
int in1 = 9;
int in2 = 8;
int in3 = 7;
int in4 = 6;

/*define channel enable output pins*/
int ENA = 10;
int ENB = 5;

/*define forward function*/
void _mForward() {
    analogWrite(ENA, 130);
    analogWrite(ENB, 130);
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    Serial.println("Forward");
}

// function to turn right
void _mRight() {
    analogWrite(ENA, 130);
    analogWrite(ENB, 130);
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    Serial.println("Right");
}

// Function to stop the car
void _mFreeze() {
    analogWrite(ENA, LOW);
    analogWrite(ENB, LOW);
}

void setup() {
    Serial.begin(9600); // Debugging only
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    pinMode(ENA, OUTPUT);
    pinMode(ENB, OUTPUT);
    if (!Radio.init()) { // initialize rf communication
        Serial.println("init failed");
    }
}

void loop() {
    _mForward();
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; //Read transmitted message into an array
    uint8_t buflen = sizeof(buf);

    // stop the car if we receive a message
    while (Radio.recv(buf, & buflen)) {
        _mFreeze();
    }
}

另一个程序运行传输并在按下按钮时发送消息。

1 个答案:

答案 0 :(得分:1)

您的问题的答案是计时器。为了生成用于控制电机的PWM信号,Arduino使用了硬件计时器。 Arduino Uno中有3个,每个计时器负责2个PWM输出(总共6个)。这个主题在Arduino网站上有很好的描述:https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

但是,RH_ASK库也使用计时器。来自official documentation

  

RH_ASK驱动程序使用计时器驱动的中断,每个位周期产生8个中断。 RH_ASK在类似Arduino的平台上接管计时器。默认情况下,它将接管计时器1​​。您可以通过启用RH_ASK.cpp顶部附近的定义RH_ASK_ARDUINO_USE_TIMER2来强制其使用计时器2。

如果程序的两个不同部分尝试控制计时器,则会出现问题。计时器1负责在引脚9和10上生成PWM信号。因此,要解决您的问题,可以将ENA引脚连接到任何其他可用的模拟输出引脚(5、6、3、11)。