Баги при радиоуправлении двигателями постоянного тока

Ilia L.
Offline
Зарегистрирован: 20.05.2017

Здравствуйте!
Нужна помощь!
Пытаюсь осуществить радиоуправление четырьмя двигателями постоянного тока, подключенными к ресиверу Ардуино Уно через 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");}
    }
}

 

mag155
Offline
Зарегистрирован: 21.12.2017

В коде трансмитера 34, строка зачем задержка ? Убирите ее.

mag155
Offline
Зарегистрирован: 21.12.2017

Ресивера.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Думаете он 9ть месяцев ждал ответа? :)

Ilia L.
Offline
Зарегистрирован: 20.05.2017

Всё заработало, когда подключил аккумуляторную батарею, вместо обычной кроны. Я знал, что мне рано или поздно помогут!))