некоректно работает программа управления двигателями
- Войдите на сайт для отправки комментариев
Втр, 23/02/2021 - 13:24
Всем доброго времени суток.
Пытаемся с сыном разобраться с программой управления моторчиками.
Часть программки из примера амперки, она работает без нареканий.
Еще одна часть селектор скоростей светодиоды зажигает индицируя изменение передачи,
а вот моторчики скорость не меняют и программа работает только в самом нижнем switch..case/
вращая моторы на максимальной скорости.
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
int pins[] = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
int j;
int p;
char incoming_symbol; // переменная для данных Bluetooth
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT); //первая передача
pinMode(12, OUTPUT); //вторая передача
pinMode(11, OUTPUT); //третья передача
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
// Настраиваем все пины управление моторами в режим выхода
for (int i = 0; i < 4; i++) {
pinMode(pins[i], OUTPUT);
}
}
void loop()
{
if (Serial.available() > 0) { // если порт доступен
incoming_symbol = Serial.read(); // считываем с порта данные
if (incoming_symbol == '1') {
digitalWrite(13, HIGH); //зажигаем светодиод индицирующий первую передачу
digitalWrite(12, LOW);
digitalWrite(11, LOW);
switch(incoming_symbol) {
case '0': // если приходит "0" стоп
motorsDrive(0, 0); //оба мотора стоп
break;
case '6': // если приходит "6" движимся в право
motorsDrive(85, 0); // правый вперед
delay(100);
break;
case '8': // если приходит "8" движимся в лево
motorsDrive(0, 85); // левый вперед
delay(100);
break;
case '5': // если приходит "5" то движимся вперед
motorsDrive(85, 85); // оба вперед
delay(100);
break;
case '7': // если приходит "7" движимся назад
motorsDrive(-85, -85); // левый вперед
delay(100);
break;
}
}
if (incoming_symbol == '2') {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);//зажигаем светодиод индицирующий вторую передачу
digitalWrite(11, LOW);
switch(incoming_symbol) {
case '0': // если приходит "0" стоп
motorsDrive(0, 0); //оба мотора стоп
break;
case '6': // если приходит "6" движимся в право
motorsDrive(170, 0); // правый вперед
delay(100);
break;
case '8': // если приходит "8" движимся в лево
motorsDrive(0, 170); // левый вперед
delay(100);
break;
case '5': // если приходит "5" то движимся вперед
motorsDrive(170, 170); // оба вперед
delay(100);
break;
case '7': // если приходит "7" движимся назад
motorsDrive(-170, -170); // левый вперед
delay(100);
break;
}
}
if (incoming_symbol == '3') {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);//зажигаем светодиод индицирующий третью передачу
}
switch(incoming_symbol) {
case '0': // если приходит "0" стоп
motorsDrive(0, 0); //оба мотора стоп
break;
case '6': // если приходит "6" движимся в право
motorsDrive(255, 0); // правый вперед
delay(100);
break;
case '8': // если приходит "8" движимся в лево
motorsDrive(0, 255); // левый вперед
delay(100);
break;
case '5': // если приходит "5" то движимся вперед
motorsDrive(255, 255); // оба вперед
delay(100);
Serial.println(255);
break;
case '7': // если приходит "7" движимся назад
motorsDrive(-255, -255); // левый вперед
delay(100);
break;
}
}
}
// Функция управления моторами
void motorsDrive(int M1Speed, int M2Speed) {
if (M1Speed > 0) {
digitalWrite(pinM1Direction, HIGH);
} else {
digitalWrite(pinM1Direction, LOW);
}
if (M2Speed > 0) {
digitalWrite(pinM2Direction, HIGH);
} else {
digitalWrite(pinM2Direction, LOW);
}
analogWrite(pinM1Speed, abs(M1Speed));
analogWrite(pinM2Speed, abs(M2Speed));
}
вставьте код по правилам форума, иначе никто с вами и разговаривать не будет.
Да, и приведите схему подключения.
Если вы определили, что incoming_symbol == '2', то какой смысл делать проверку case ?
а для случая if (incoming_symbol == '3') скобки расставлены по другому и последующий case действительно может выполниться.
Если вы определили, что incoming_symbol == '2', то какой смысл делать проверку case ?
а для случая if (incoming_symbol == '3') скобки расставлены по другому и последующий case действительно может выполниться.
смысл что в каждом case меняется скорость вращения. числа в скобках после motorsDrive ( , )
скобки убрал, теперь моторчики вообще перестали вращаться ((
Смысл в том, что в вашем случае, после удачного сравнения переменной с '2', она не может волшебным образом стать '3', '8' или '15'.
В начале скеч был такой, все работало. Решили сделать изменение скорости наподобие кпп в автомобиле. Отправляешь с телефона цифру 1 и моторчики вращаются со скоростью в 3 раза медленнее. Индикатор изменения скорости три светодиодика, подключенные к выводам 13 12 11. так вот светодиоды корректно работают, а моторы либо не работают совсем, либо только на максимуме!
Тогда, если втупую делать, то motorsDrive(85, 0); и тп нужно заменить на motorsDrive(speedLeft, speedRight); , затем в switch накидать case '1' и др, где менять уже переменные speedLeft, speedRight. Тогда при каждом изменении направления будет подставляться ранее установленная скорость.
Но, по хорошему, конечно весь блок надо переписать, чтобы скорости сразу применялись и направление не терялось.
Был и такой вариант, но когда в функции motorsDrive ( j, p ) вместо чисел подставляешь переменные то эта функция перестает работать. Мы так и не смогли определить почему, хотя вот такая конструкция в примере от "амперки" работает.
Был и такой вариант, но когда в функции motorsDrive ( j, p ) вместо чисел подставляешь переменные то эта функция перестает работать. Мы так и не смогли определить почему, хотя такая конструкция в примере от "амперки" работает.
очевидно потому что код у Амперки грамотный, а у вас - не очень.
Выкладывайте свой код, где проявляется эта проблема
Здравствуйте. Подскажите пожалуйста сюда можно подключить радиоаппаратура? Например Flysky и управлять 2_я двигателями?
Здравствуйте. Подскажите пожалуйста сюда можно подключить радиоаппаратура? Например Flysky и управлять 2_я двигателями?
можно! Даже код готовый есть, аж на три канала )))
а как все это подлючить? можете помогать?
а как все это подлючить? можете помогать?
проводами естественно, там же всё подписано, а скетч он немаленький, 800 строк