Почему мои двигатели, подключенные к Arduino MEGA, не работают?

Я проверил свой код и загрузил его на плату, и все прошло успешно.

Информация: - Использование платы Arduino Mega 2560 с Adafruit V1 - 3 двигателя постоянного тока 12 вольт - на компьютере HP

Вот мой код:

#include <AFMotor.h>

AF_DCMotor motor(1, MOTOR12_8KHZ);
AF_DCMotor motor2(2, MOTOR12_8KHZ);
AF_DCMotor motor3(2, MOTOR12_1KHZ);

void setup()  {
  Serial.begin(9600);
  Serial.println("Motor Test!");
  motor.setSpeed(20); //установить скорость двигателя
  motor2.setSpeed(20); //установить скорость двигателя
  motor3.setSpeed(25); //установить скорость двигателя
}

void loop() {
  Serial.print("tick");
  motor.run(FORWARD);
  delay(2000);

  Serial.print("tock");
  motor.run(RELEASE);
  delay(5000);

  Serial.print("tack"); //начинается первая песня
  motor.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor.run(RELEASE);
  delay(14000);

  Serial.print("tack"); 
  motor.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); // первая песня заканчивается
  motor.run(RELEASE);
  delay(13000);

  Serial.print("tick");
  motor.run(FORWARD);
  delay(2000);

  Serial.print("tock"); //начинается вторая песня
  motor.run(RELEASE);
  delay(24000);

  Serial.print("tick");
  motor.run(FORWARD);
  delay(2000);

  Serial.print("tock"); //вторая песня заканчивается
  motor.run(RELEASE);
  delay(17000);

   Serial.print("tick");
  motor.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); //начинается третья песня
  motor.run(RELEASE);
  delay(23000);

  Serial.print("tick");
  motor.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); // третья песня заканчивается
  motor.run(RELEASE);
  delay(21000);

  Serial.print("tick");
  motor.run(FORWARD);
  delay(2000);

  Serial.print("tock");
  motor.run(RELEASE);
  delay(5000);

  Serial.print("tick");
  motor.run(FORWARD);
  delay(3000);

  Serial.print("tack"); //начинается четвертая песня
  motor.run(RELEASE);
  delay(5000);

  Serial.print("tack"); 
  motor.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); //четвертая песня заканчивается
  motor.run(RELEASE);
  delay(21000);
   //машущий мотор
  Serial.print("tick"); 
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(5000);

  //Машущий мотор
  Serial.print("tick"); //начинается первая песня
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

   Serial.print("tock");
  motor2.run(FORWARD);
  delay(1000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); // первая песня заканчивается
  motor2.run(RELEASE);
  delay(14000);

  Serial.print("tick"); 
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(5000);

  Serial.print("tack"); // Начинается вторая песня
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

   Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); //вторая песня заканчивается
  motor2.run(RELEASE);
  delay(15000);


  Serial.print("tick"); 
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(5000);

  Serial.print("tack"); // Начинается третья песня
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

   Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tock"); // третья песня заканчивается
  motor2.run(RELEASE);
  delay(14000);

  Serial.print("tick"); //начинается четвертая песня
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(BACKWARD);
  delay(2000);

   Serial.print("tock");
  motor2.run(FORWARD);
  delay(1000);

  Serial.print("tick");
  motor2.run(RELEASE);
  delay(1000);

  Serial.print("tick");
  motor2.run(FORWARD);
  delay(2000);

  Serial.print("tack"); 
  motor2.run(BACKWARD);
  delay(2000);

  Serial.print("tock"); //четвертая песня заканчивается
  motor2.run(RELEASE);
  delay(7000);

  //танцующий мотор
  Serial.print("tock"); //начинается первая песня
  motor3.run(RELEASE);
  delay(11000);

  Serial.print("tick"); 
  motor3.run(FORWARD);
  delay(22000);

  Serial.print("tock"); // первая песня останавливается // вторая песня начинается
  motor3.run(RELEASE);
  delay(16000);

    Serial.print("tick"); //Вторая песня останавливается
  motor3.run(FORWARD);
  delay(28000);

  Serial.print("tock"); // Начинается третья песня
  motor3.run(RELEASE);
  delay(15000);

  Serial.print("tick"); //Третья песня останавливается
  motor3.run(FORWARD);
  delay(33000);

  Serial.print("tock"); //начинается четвертая песня
  motor3.run(RELEASE);
  delay(16000);

  Serial.print("tick"); 
  motor3.run(FORWARD);
  delay(5000);

  Serial.print("tock");
  motor3.run(RELEASE);
  delay(1000);

  Serial.print("tick"); //четвертая песня заканчивается
  motor3.run(FORWARD);
  delay(16000);

  Serial.print("tock");
  motor3.run(RELEASE);
  delay(5000);
}

, 👍0

Обсуждение

Надеюсь, вы не пытаетесь управлять двигателями напрямую с выходных контактов..., @Rohan


1 ответ


4

Поскольку вы не предоставили подробностей, я предполагаю следующее:

  • Вы питаете MEGA через USB или внешний источник питания 5-12 В
  • двигатели питаются от дополнительного внешнего источника питания 12 В с достаточной силой тока.
  • Все кабели проверены и исправны

Похоже на эту схему (без блока питания 12 В, подключенного к моторному щиту) AF_motor_shield_v1 AF_Motor_shield_v2

К вашему коду:

  • Избавьтесь от delay() – они блокируют обработку, и вот что произойдет:

     motor.run(FORWARD);  // => Вы даете команду через lib
     delay(2000); // Вы останавливаете обработку, поэтому двигатель не работает
    

поэтому у вас есть два варианта, для обоих требуется определение переменной timeStamp

  • работа с (блокирующими) циклами while
  • или создание конечного автомата (подробнее см. здесь, в SO)

Поэтому для простоты я буду использовать первый подход

 // Скопируйте эту переменную перед настройкой
 unsigned long timeStamp = 0;
// используем полную настройку
 void setup(){...}
 // Измените ваши функции цикла, как первые три преобразованные строки
 void loop(){
  timeStamp = millis();
  Serial.print("tick");
  while(millis()-timeStamp < 2000){     
     motor.run(FORWARD);
  }   
  timeStamp = millis();   // сбрасывает время на текущее
  Serial.print("tock");
  while(millis()-timeStamp < 5000){     
     motor.run(RELEASE);
  }
  timeStamp = millis();   // сбрасывает время на текущее
  Serial.print("tack"); //начинается первая песня
  while(millis()-timeStamp < 2000){   
     motor.run(BACKWARD);
  }
// .... И ТАК ДАЛЕЕ .....
}

Имейте в виду, что время блокируется, но для последовательной обработки это нормально.

,

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/106646/discussion-on-answer-by-codebreaker007-why-are-my-motors-attached-to-an-arduino) ., @VE7JRO

Дешифровщик, ты более терпелив, чем я., @Duncan C