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

Myps74
Offline
Зарегистрирован: 21.02.2021
Всем доброго времени суток.
Пытаемся с сыном разобраться с программой управления моторчиками.
Часть программки из примера амперки, она работает без нареканий.
Еще одна часть селектор скоростей светодиоды зажигает индицируя изменение передачи,
а вот моторчики скорость не меняют и программа работает только в самом нижнем 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));
}
b707
Offline
Зарегистрирован: 26.05.2017

вставьте код по правилам форума, иначе никто с вами и разговаривать не будет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, и приведите схему подключения.

Upper
Offline
Зарегистрирован: 23.06.2020
       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;   
     
      }     
       }

Если вы определили, что incoming_symbol == '2', то какой смысл делать проверку case ?

а для случая  if (incoming_symbol == '3') скобки расставлены по другому и последующий case действительно может выполниться.

Myps74
Offline
Зарегистрирован: 21.02.2021
// Пины управления скоростью и направлением мотора
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));
}

 

Myps74
Offline
Зарегистрирован: 21.02.2021

Upper пишет:

       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;   
     
      }     
       }

Если вы определили, что incoming_symbol == '2', то какой смысл делать проверку case ?

а для случая  if (incoming_symbol == '3') скобки расставлены по другому и последующий case действительно может выполниться.

 смысл что в каждом case меняется скорость вращения. числа в скобках после motorsDrive (     ,      )

 скобки убрал, теперь моторчики вообще перестали вращаться ((

sadman41
Offline
Зарегистрирован: 19.10.2016

Смысл в том, что в вашем случае, после удачного сравнения переменной с '2', она не может волшебным образом стать '3', '8' или '15'.

Myps74
Offline
Зарегистрирован: 21.02.2021
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
 
int pins[] = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
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(); // считываем с порта данные
      switch(incoming_symbol) {
     // case '0': // если приходит "0" стоп
      //    zero();
      //    break;
      case '6': // если приходит "6" движимся в право
          six();
          break;
      case '8': // если приходит "8" движимся в лево
          eight();
          break;    
      case '5': // если приходит "5" то движимся вперед
          five();
          break;   
      case '7': // если приходит "7" движимся назад
          seven();
          break;   
      }      
  }


}  
void zero()
 {
 motorsDrive(0, 0); //оба мотора стоп
 }

 void six()
  { 
 motorsDrive(255, 0); // правый вперед
 delay(100);
  }

void  eight()
  {
  motorsDrive(0, 255); // левый вперед
  delay(100);
  } 
  
void  five()
  {
  motorsDrive(255, 255);
  delay(100);
  } 
  
  void  seven()
  {
  motorsDrive(-255, -255); // оба назад
  delay(100);
  } 
  
// Функция управления моторами
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));
}

В начале скеч был такой, все работало. Решили сделать изменение скорости наподобие кпп в автомобиле. Отправляешь с телефона цифру 1 и моторчики вращаются со скоростью в 3 раза медленнее. Индикатор изменения скорости три светодиодика, подключенные к выводам 13 12 11. так вот светодиоды корректно работают, а моторы либо не работают совсем, либо только на максимуме!

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда, если втупую делать, то motorsDrive(85, 0); и тп нужно заменить на motorsDrive(speedLeft, speedRight); , затем в switch накидать case '1' и др, где менять уже переменные speedLeft, speedRight. Тогда при каждом изменении направления будет подставляться ранее установленная скорость.

Но, по хорошему, конечно весь блок надо переписать, чтобы скорости сразу применялись и направление не терялось.

Myps74
Offline
Зарегистрирован: 21.02.2021

Был и такой вариант, но когда в функции motorsDrive (  j,  p   ) вместо чисел подставляешь переменные то эта функция перестает работать. Мы так и не смогли определить почему, хотя вот такая конструкция в примере от "амперки" работает.

 // Медленно разгоняем M1 в другую сторону
  for (int i = 0; i <= 255; i++) {
    motorsDrive(-i, 0);
    delay(10);
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

Myps74 пишет:

Был и такой вариант, но когда в функции motorsDrive (  j,  p   ) вместо чисел подставляешь переменные то эта функция перестает работать. Мы так и не смогли определить почему, хотя такая конструкция в примере от "амперки" работает.

очевидно потому что код у Амперки грамотный, а у вас - не очень.

Выкладывайте свой код, где проявляется эта проблема

sahako1
Offline
Зарегистрирован: 24.02.2021

VNH5019Здравствуйте. Подскажите пожалуйста сюда можно подключить радиоаппаратура? Например Flysky и управлять 2_я двигателями?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sahako1 пишет:

Здравствуйте. Подскажите пожалуйста сюда можно подключить радиоаппаратура? Например Flysky и управлять 2_я двигателями?

можно! Даже код готовый есть, аж на три канала )))

sahako1
Offline
Зарегистрирован: 24.02.2021

а как все это подлючить? можете помогать? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sahako1 пишет:

а как все это подлючить? можете помогать? 

проводами естественно, там же всё подписано, а скетч он немаленький, 800 строк