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);
}
}
@Ethan J, 👍2
Обсуждение1 ответ
Из вашего кода я бы сказал, что проблема заключается в вашей функции цикла. Функции motorMoveForward()
и motorMoveSide()
выполняются очень быстро. Но для того, чтобы действительно двигать ваши моторы, нужно некоторое время, прежде чем вы измените направление движения. В настоящее время двигатели быстро переключаются между движением вперед и вбок. Поскольку в вашей функции motorMoveSide()
вы меняете направление только для одного из двигателей, этому двигателю будет предложено двигаться вперед и назад. Это приводит к тому, что двигатель движется медленно или вообще не движется. Вы просто не можете двигаться вперед и в сторону одновременно.
Если вы просто хотите контролировать движение вашего робота с помощью RC, возможно, будет лучше использовать один канал только для значения скорости (например, 0 --> стоп, 255 --> полная мощность) и один для направления (например, 0 --> полная мощность влево, 127 --> только вперед, 255 --> полная мощность справа). Обычный радиоуправляемый автомобиль работает точно так же. Или вы можете взять один канал для одного двигателя (и отобразить скорость и направление конкретного двигателя, как вы сделали с обоими двигателями). Какой путь выбрать, зависит также от вашего пульта дистанционного управления (например, как лучше управлять им с помощью пульта дистанционного управления).
- Как правильно запустить 4 двигателя постоянного тока с помощью Arduino?
- Можно ли объединить модуль Bluetooth h HC-05 и уменьшенную плату Arduino ATtiny45/85 для управления двигателем, светодиодами или другими компонентами?
- Моторный щит L293D
- Почему четыре мотор-редуктора вращаются с разной скоростью при подключении к двум драйверам двигателей L293D, управляемым Arduino.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
Посмотрите множество ответов, которые объясняют, насколько ужасен 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