Баги при радиоуправлении двигателями постоянного тока
- Войдите на сайт для отправки комментариев
Здравствуйте!
Нужна помощь!
Пытаюсь осуществить радиоуправление четырьмя двигателями постоянного тока, подключенными к ресиверу Ардуино Уно через MotorShield (Adafruit). Радиомодули - приемник и передатчик RF 433МГц. Трансмиттер - Ардуино Нано, управляемый через COM порт посредством Serial. Использую библиотеки VirtualWire и AFMotor.
Проблема: при увеличении скорости двигателей выше значения "motor.setSpeed(20);" прием и обработка команд становится нестабильной - не выполняется вовсе, или выполняется через раз. Для отладки приема-передачи сигналов подключил светодиоды, обозначающие отправку и прием сигнала включения каждого двигателя или общего их выключения. При отключенных двигателях, или их скорости, не превышающей значение "20" система работает стабильно.
Вопрос: в чем причина багов в работе схемы: в плохой оптимизации кода (возможно где-то нужно поставить задержку, добавить прерывание, очистить мусорные данные), или в аппаратной части (драйвер двигателя, модули радиопередачи, помехи создаваемые работой самих двигателей)?
(Прошу прощения, если кому-то вопрос покажется глупым, я абсолютный новичек в этой теме и стараюсь изучать всё последовательно, однако данный вопрос поставил меня в тупик)
Код трансмиттера:
#include <VirtualWire.h>
int led_pin1 = 7;
int led_pin2 = 6;
int led_pin3 = 5;
int led_pin4 = 13;
int transmit_pin = 12;
void setup(){
Serial.begin(9600);
vw_set_tx_pin(transmit_pin);
vw_setup(2000);
pinMode(led_pin1, OUTPUT);
pinMode(led_pin2, OUTPUT);
pinMode(led_pin3, OUTPUT);
pinMode(led_pin4, OUTPUT);
}
void loop(){
while(Serial.available() == 0);
int val = Serial.read() - '0';
if (val == 1) {
Serial.println("1drive forward");
const char *msg = "1";
vw_send((uint8_t*)msg, strlen(msg));
vw_wait_tx();
digitalWrite(led_pin1, HIGH);
}else if (val == 2) {
Serial.println("2drive forward");
const char *msg = "2";
vw_send((uint8_t*)msg, strlen(msg));
vw_wait_tx();
digitalWrite(led_pin2, HIGH);
}else if (val == 3) {
Serial.println("3drive forward");
const char *msg = "3";
vw_send((uint8_t*)msg, strlen(msg));
vw_wait_tx();
digitalWrite(led_pin3, HIGH);
}else if (val == 4) {
Serial.println("4drive forward");
const char *msg = "4";
vw_send((uint8_t*)msg, strlen(msg));
vw_wait_tx();
digitalWrite(led_pin4, HIGH);
}else if (val == 5){
Serial.println("STOP");
const char *msg = "5";
vw_send((uint8_t*)msg, strlen(msg));
digitalWrite(led_pin1, LOW);
digitalWrite(led_pin2, LOW);
digitalWrite(led_pin3, LOW);
digitalWrite(led_pin4, LOW);
} else {Serial.print("Invalid");}
}
Код ресивера:
#include <VirtualWire.h>
#include <AFMotor.h>
byte message[VW_MAX_MESSAGE_LEN];
byte messageLength = VW_MAX_MESSAGE_LEN;
int led_pin1 = 15;
int led_pin2 = 16;
int led_pin3 = 17;
int led_pin4 = 18;
int receiver_pin = 14;
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
void setup()
{
Serial.begin(9600);
vw_set_rx_pin(receiver_pin);
vw_setup(2000);
vw_rx_start();
pinMode(led_pin1, OUTPUT);
pinMode(led_pin2, OUTPUT);
pinMode(led_pin3, OUTPUT);
pinMode(led_pin4, OUTPUT);
motor1.setSpeed(10);
motor2.setSpeed(10);
motor3.setSpeed(10);
motor4.setSpeed(10);
}
void loop()
{ delay(500);
if(vw_get_message(message, &messageLength)){
String data = message;
Serial.print(data);
if (data == "1"){
digitalWrite(led_pin1, HIGH);
motor1.run(FORWARD);
} else if (data == "2"){
digitalWrite(led_pin2, HIGH);
motor2.run(FORWARD);
}
else if (data == "3"){
digitalWrite(led_pin3, HIGH);
motor3.run(FORWARD);
}
else if (data == "4"){
Serial.print("4");
digitalWrite(led_pin4, HIGH);
motor4.run(FORWARD);
}
else if (data == "5"){
Serial.print("5");
digitalWrite(led_pin1, LOW);
digitalWrite(led_pin2, LOW);
digitalWrite(led_pin3, LOW);
digitalWrite(led_pin4, LOW);
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
} else {Serial.print("Invalid");}
}
}
В коде трансмитера 34, строка зачем задержка ? Убирите ее.
Ресивера.
Думаете он 9ть месяцев ждал ответа? :)
Всё заработало, когда подключил аккумуляторную батарею, вместо обычной кроны. Я знал, что мне рано или поздно помогут!))