Баги при радиоуправлении двигателями постоянного тока
- Войдите на сайт для отправки комментариев
Здравствуйте!
Нужна помощь!
Пытаюсь осуществить радиоуправление четырьмя двигателями постоянного тока, подключенными к ресиверу Ардуино Уно через 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ть месяцев ждал ответа? :)
Всё заработало, когда подключил аккумуляторную батарею, вместо обычной кроны. Я знал, что мне рано или поздно помогут!))