2 Моторное управление роботом с радиоуправляемым радио

Я делаю робота для местного конкурса робототехники. Одна из главных функций, которую мне нужно сделать, - это двигать его вперед, назад, вправо, влево. Совсем как радиоуправляемая машина. Я запрограммировал его на это, но похоже, что двигатели движутся не с одинаковой скоростью. Когда я немного двигаю палкой, начинает двигаться только один мотор, а когда я иду немного дальше, начинается и другой. Я использую L293D и Arduino UNO для управления двигателями 2 12v. Я использую 6-канальный приемник и передатчик для радиоуправления. Я думаю, что это может быть что-то с мотором, но я могу что-то упустить. Надеюсь, кто-нибудь сможет мне помочь. Спасибо!

int motor1_in1 = 3; //H контакты направления моста
int motor1_in2 = 2; // H контакты направления моста
int motor2_in3 = 7; // H контакты направления моста
int motor2_in4 = 6; // H контакты направления моста

//ниже приведены все порты с поддержкой ~ PWM
int motor1_enable1 = 4; // H мостовой двигатель 1 ШИМ-контакт
int motor2_enable1 = 5; //H мостовой двигатель 2 ШИМ-контакт
int rc_channel2 = 10;
int rc_channel4 = 8;

void setup() {
  pinMode(rc_channel2, INPUT);
  pinMode(rc_channel4, INPUT);
  pinMode(motor1_in1, OUTPUT);
  pinMode(motor1_in2, OUTPUT);
  pinMode(motor1_enable1, OUTPUT);

  pinMode(motor2_in3, OUTPUT);
  pinMode(motor2_in4, OUTPUT);
  pinMode(motor2_enable1, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  motorMoveForward();
  motorMoveSide();
  // задержка (100);
}


void motorMoveForward()  {
  int pwm = 0;
  int rc2 = pulseIn(rc_channel2, HIGH, 25000);

  if (rc2 == 0) {
    digitalWrite(motor1_in1, LOW);
    digitalWrite(motor1_in2, LOW);
    digitalWrite(motor2_in3, LOW);
    digitalWrite(motor2_in4, LOW);

    analogWrite(motor1_enable1, 0);
    analogWrite(motor2_enable1, 0);
  }
  else if (rc2 > 1520) { //Назад
    pwm = map(rc2, 1520, 1910, 0, 255); // сопоставьте нашу скорость с диапазоном 0-255
    digitalWrite(motor1_in1, LOW);
    digitalWrite(motor1_in2, HIGH);
    digitalWrite(motor2_in3, HIGH);
    digitalWrite(motor2_in4, LOW);

    analogWrite(motor1_enable1, pwm);
    analogWrite(motor2_enable1, pwm);

    Serial.print(" DOWN    : ");
    Serial.print(pwm);
    Serial.print("\t");
    Serial.print(rc2);

  }
  else if (rc2 < 1480) { //Вперед
    pwm = map(rc2, 1480, 1090, 0, 255); // сопоставьте нашу скорость с диапазоном 0-255
    digitalWrite(motor1_in1, HIGH);
    digitalWrite(motor1_in2, LOW);
    digitalWrite(motor2_in3, LOW);
    digitalWrite(motor2_in4, HIGH);

    analogWrite(motor1_enable1, pwm);
    analogWrite(motor2_enable1, pwm);

    Serial.print(" UP     : ");
    Serial.print(pwm);
    Serial.print("\t");
    Serial.print(rc2);
  }
  else {
    digitalWrite(motor1_in1, LOW);
    digitalWrite(motor1_in2, LOW);
    digitalWrite(motor2_in3, LOW);
    digitalWrite(motor2_in4, LOW);

    analogWrite(motor1_enable1, 0);
    analogWrite(motor2_enable1, 0);

    Serial.print(" CENTER  : ");
    Serial.print(pwm);
    Serial.print("\t");
    Serial.print(rc2);
  }

}




void motorMoveSide()  {
  int pwm1 = 0;
  int rc4 = pulseIn(rc_channel4, HIGH, 25000);

  if (rc4 > 1520) { //ПРАВИЛЬНО
    pwm1 = map(rc4, 1520, 1905, 0, 255); // сопоставьте нашу скорость с диапазоном 0-255
    //digitalWrite(motor1_in1, НИЗКИЙ);
    // digitalWrite(motor1_in2, HIGH);
    digitalWrite(motor2_in3, LOW);
    digitalWrite(motor2_in4, HIGH);

    analogWrite(motor1_enable1, pwm1);
    analogWrite(motor2_enable1, pwm1);

    Serial.print(" RIGHT   : ");
    Serial.print(pwm1);
    Serial.print("\t");
    Serial.println(rc4);

  }
  else if (rc4 < 1480) { //LEFT
    pwm1 = map(rc4, 1480, 1090, 0, 255); // сопоставьте нашу скорость с диапазоном 0-255
    digitalWrite(motor1_in1, HIGH);
    digitalWrite(motor1_in2, LOW);
    //digitalWrite(motor2_in3, HIGH);
    //digitalWrite(motor2_in4, НИЗКИЙ);

    analogWrite(motor1_enable1, pwm1);
    analogWrite(motor2_enable1, pwm1);

    Serial.print(" LEFT    : ");
    Serial.print(pwm1);
    Serial.print("\t");
    Serial.println(rc4);
  }
  else {
    digitalWrite(motor1_in1, LOW);
    digitalWrite(motor1_in2, LOW);
    digitalWrite(motor2_in3, LOW);
    digitalWrite(motor2_in4, LOW);

    analogWrite(motor1_enable1, 0);
    analogWrite(motor2_enable1, 0);

    Serial.print(" CENTER  : ");
    Serial.print(pwm1);
    Serial.print("\t");
    Serial.println(rc4);
  }

}

, 👍2

Обсуждение

Посмотрите множество ответов, которые объясняют, насколько ужасен L293. По сути, это не похоже на работу для Arduino - то, что вам, вероятно, нужно, - это пара небольших ЭСК для хобби., @Chris Stratton

pulseIn () - это исключительно плохой, блокирующий способ считывания RC-сигналов, и он работает очень плохо, в то же время значительно замедляя скорость вашего цикла. Правильное считывание RC-сигналов - очень сложная задача. Вот один пример, который я привел, чтобы показать, как это правильно сделать на одном RC-канале: https://github.com/ElectricRCAircraftGuy/eRCaGuy_TimerCounter/blob/master/examples/read_PWM_pulses_on_ANY_pin_via_pin_change_interrupt/read_PWM_pulses_on_ANY_pin_via_pin_change_interrupt.ino. Сделать это для многих каналов еще сложнее, так как дрожание и время прерывания должны быть сведены к минимуму., @Gabriel Staples


1 ответ


1

Из вашего кода я бы сказал, что проблема заключается в вашей функции цикла. Функции motorMoveForward() и motorMoveSide() выполняются очень быстро. Но для того, чтобы действительно двигать ваши моторы, нужно некоторое время, прежде чем вы измените направление движения. В настоящее время двигатели быстро переключаются между движением вперед и вбок. Поскольку в вашей функции motorMoveSide() вы меняете направление только для одного из двигателей, этому двигателю будет предложено двигаться вперед и назад. Это приводит к тому, что двигатель движется медленно или вообще не движется. Вы просто не можете двигаться вперед и в сторону одновременно.

Если вы просто хотите контролировать движение вашего робота с помощью RC, возможно, будет лучше использовать один канал только для значения скорости (например, 0 --> стоп, 255 --> полная мощность) и один для направления (например, 0 --> полная мощность влево, 127 --> только вперед, 255 --> полная мощность справа). Обычный радиоуправляемый автомобиль работает точно так же. Или вы можете взять один канал для одного двигателя (и отобразить скорость и направление конкретного двигателя, как вы сделали с обоими двигателями). Какой путь выбрать, зависит также от вашего пульта дистанционного управления (например, как лучше управлять им с помощью пульта дистанционного управления).

,