Проблемы с моторами для ардуино
Почему мои моторы не работают?
Мои настройки следующие:
- arduino mega 2560 -> контроллер двигателя L296N -> двигатели постоянного тока Gikfun 3-6 В.
Для питания двигателей установка выполняется следующим образом:
- arduino mega 2560 5v -> контроллер мотора L296N.
- Аккумулятор 9 В -> понижающий преобразователь LM2596 (7-8 В) -> контроллер двигателя L296N.
У меня две проблемы.
Проблема 1: независимо от кода двигатели работают только на максимальной скорости. Код может быть простым примером кода или моим кодом см. внизу.
Проблема 2. При задании кода, который изменяет скорость, он работает только для одного двигателя, а другой двигатель не будет работать независимо от того, подключен ли первый двигатель или нет. Код примера не будет работать. предоставлен и не будет работать в моем коде см. внизу.
Обратите внимание, что это не простое исправление проводки. Либо код неверен, либо мое оборудование настроено неправильно, либо мое оборудование может работать неправильно. Спасибо, что нашли время оставить отзыв.
// бывший код:
int a = 2;
int b = 3;
int c = 22;
int d = 23;
int e = 24;
int f = 25;
void setup(){
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
void loop() {
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
analogWrite(a, 0);
analogWrite(b, 0);
// бывший код:
for (int i = 0; i > 150; i++){
analogWrite(a, i);
analogWrite(b, i);
delay(1000);
}
for (int i = 150; i <= 0; --i){
analogWrite(a, i);
analogWrite(b, i);
delay(1000);
}
/* мой код. Обратите внимание, что временная функция не завершена.
* Я также исключил 4 мотора для облегчения отладки.
*/
// Двигатель 1
int a = 2;
int a1 = 22;
int a2 = 23;
// Двигатель 2
int b = 3;
int b1 = 24;
int b2 = 25;
// Двигатель 3
int c = 4;
int c1 = 26;
int c2 = 27;
// Мотор 4
int d = 5;
int d1 = 28;
int d2 = 29;
// Мотор 5
int e = 6;
int e1 = 30;
int e2 = 31;
// Мотор 6
int f = 7;
int f1 = 32;
int f2 = 33;
// Останов двигателя
unsigned int i;
int x;
int x1;
int x2;
void setup(){
Serial.begin(9600);
pinMode(a, OUTPUT);
pinMode(a1, OUTPUT);
pinMode(a2, OUTPUT);
pinMode(b, OUTPUT);
pinMode(b1, OUTPUT);
pinMode(b2, OUTPUT);
pinMode(x, OUTPUT);
pinMode(x1, OUTPUT);
pinMode(x2, OUTPUT);
pinMode(x, OUTPUT);
pinMode(x1, OUTPUT);
pinMode(x2, OUTPUT);
pinMode(x, OUTPUT);
pinMode(x1, OUTPUT);
pinMode(x2, OUTPUT);
pinMode(x, OUTPUT);
pinMode(x1, OUTPUT);
pinMode(x2, OUTPUT);
}
void motor1(){
digitalWrite(a1, HIGH);
digitalWrite(a2, LOW);
analogWrite(a, 0);
if (a = 1){
Serial.println(" MotorA not working");
}
delay(1000);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);
delay(250);
digitalWrite(a1, LOW);
digitalWrite(a2, HIGH);
analogWrite(a, 0);
if (a = 1){
Serial.println(" MotorAr not working");
}
delay(1000);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);
delay(250);
}
void motor2(){
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
analogWrite(b, 0);
if (b = 1){
Serial.println(" MotorB not working");
}
delay(1000);
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
delay(250);
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
analogWrite(b, 0);
if (b = 1){
Serial.println(" MotorBr not working");
}
delay(1000);
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
delay(250);
}
void motor3(){
digitalWrite(x1, HIGH);
digitalWrite(x2, LOW);
analogWrite(x, 0);
if (c = 1){
Serial.println(" MotorC not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
digitalWrite(x1, LOW);
digitalWrite(x2, HIGH);
analogWrite(x, 0);
if (c = 1){
Serial.println(" MotorCr not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
}
void motor4(){
digitalWrite(x1, HIGH);
digitalWrite(x2, LOW);
analogWrite(x, 0);
if (d = 1){
Serial.println(" MotorD not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
digitalWrite(x1, LOW);
digitalWrite(x2, HIGH);
analogWrite(x, 0);
if (d = 1){
Serial.println(" MotorDr not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
}
void motor5(){
digitalWrite(x1, HIGH);
digitalWrite(x2, LOW);
analogWrite(x, 0);
if (e = 1){
Serial.println(" MotorE not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
digitalWrite(x1, LOW);
digitalWrite(x2, HIGH);
analogWrite(x, 0);
if (e = 1){
Serial.println(" MotorEr not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
}
void motor6(){
digitalWrite(x1, HIGH);
digitalWrite(x2, LOW);
analogWrite(x, 0);
if (f = 1){
Serial.println(" MotorF not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
digitalWrite(x1, LOW);
digitalWrite(x2, HIGH);
analogWrite(x, 0);
if (f = 1){
Serial.println(" MotorFr not working");
}
delay(1000);
digitalWrite(x1, LOW);
digitalWrite(x2, LOW);
delay(250);
}
void timed(){
analogWrite(a, i);
digitalWrite(a1, HIGH);
digitalWrite(a2, LOW);
analogWrite(b, i);
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
delay(2000);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
analogWrite(b, i);
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
analogWrite(a, i);
digitalWrite(a1, LOW);
digitalWrite(a2, HIGH);
delay(2000);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
}
void loop(){
motor1();
motor2();
motor3();
motor4();
motor5();
motor6();
if (i = 0){
i++;
}
if (i >=100){
--i;
}
timed();
}
@Ghetti, 👍-2
Обсуждение2 ответа
Первая проблема, которую я вижу, это использование delay()
в вашем коде. delay()
блокирует код, поэтому ничего не может произойти, пока ваш Arduino ожидает истечения времени задержки. Код следует переписать, чтобы избежать использования функции задержки.
Следующая проблема — источник питания для вашего проекта. Какую батарею на 9 В вы используете?
Нигде в вашем коде я не вижу использования analogWrite
, который устанавливает "значение" в число больше 0. Значения analogWrite
находятся в диапазоне от 0 до 255: < a href="https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/">analogWrite arduino.cc.
Приведенные вами два примера циклов for
ничего не делают. Вот простой тестовый скетч, чтобы показать вам, что я имею в виду.
// Я тестирую Uno.
byte a = 3;
byte b = 5;
void setup(){
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
Serial.begin(9600);
Serial.println("before the for loop");
// В этом цикле for код не выполняется.
// Этот код ничего не делает и никогда ничего не печатает.
for(int i = 0; i > 150; i++){
analogWrite(a, i);
analogWrite(b, i);
delay(1000);
Serial.println(i);
}
Serial.println("after the for loop");
}
void loop(){}
Я бы порекомендовал вам заставить один мотор работать правильно, а затем начать добавлять еще один мотор, по одному.
Я не могу много сказать о примере кода, который вы упомянули. Опубликованный код примера не завершен, а вторая часть с циклом for явно неверна. Цикл for выглядит так
for(<Variable initialization>; <Condition for running the loop>; <Action done for every loop iteration>)
Таким образом, условие в середине — это условие запуска цикла. Если условие оценивается как false
, цикл больше не будет выполняться. У вас есть линия
for (int i = 0; i > 150; i++)
где i
имеет нулевое значение в начале первой итерации. ноль не больше 150, поэтому условие будет оцениваться как ложное. Таким образом, цикл for никогда не будет выполняться. Аналогичная ситуация со вторым циклом for кода примера. Где ты взял этот код? Думаю, не стоит слишком доверять этому источнику, если он дает вам этот код.
В вашем коде тоже есть ошибки:
Вы неправильно выполняете оператор if для равенства. Если вы хотите проверить равенство, вам нужно использовать двойные знаки равенства. Один знак равенства означает утверждение (поэтому вы фактически меняете переменную, а не проверяете ее значение), которое всегда будет оцениваться как истинное. Вот пример правильного оператора if:
if(i == 0)
Вы делаете что-то вроде
analogWrite(a, 0);
по всему коду. но почти всегда вы делаете
if(a == 1)
сразу после него. Это не имеет значения. Первый параметр
analogWrite()
— это номер вывода, на который вы хотите вывести напряжение ШИМ. Номер контакта является постоянным, почему он должен когда-либо меняться, если вы не подключаете двигатель к другим контактам. Таким образом, приведенный выше оператор if не будет проверять, работает двигатель или нет. Он сравнивает номер контакта с 1, что всегда неверно, поскольку ни один из номеров контактов, которые вы использовали, не равен 1.Опять с линией
analogWrite(a, 0);
В коде вы никогда не указываете второй параметр равным нулю (за исключением функции
timed()
, но я вернусь к этому позже). Таким образом, соответствующий контакт (здесь контакт 2) отключен, он же выдает НИЗКИЙ уровень. С контроллерами H-bridge, такими как L296N, вы используете 2 цифровых контакта для установки направления, а затем обеспечиваете напряжение PWM (в основном на контакте включения) для изменения скорости. Но, как описано, вы никогда не выдаете напряжение ШИМ, поэтому двигатели не могут работать, если вы их правильно подключили.Подключил предыдущее предложение. Ваш код не будет запускать двигатели. Но раз вы написали, что они действительно запускаются, значит, проблема и в железе. Пожалуйста, просмотрите учебные пособия по использованию L296N с Arduino или предоставьте информацию о вашей проводке, отредактировав свой вопрос.
В вашей функции
loop()
есть следующий отрывок:if (i == 0){ i++; } if (i >=100){ --i; }
(Я уже исправил двойные знаки равенства, как описано выше). Если
i
равно нулю,i
будет увеличиваться. Еслиi
больше или равен 100, он будет уменьшаться. Он изменяется только в этой части кода и будет неявно инициализирован нулевым значением при запуске программы. Таким образом, первый оператор if сработает ровно один раз. Тогдаi
не равен нулю, поэтому он не будет увеличиваться или даже изменяться снова. Такжеi
не больше и не равен 100 (это 1), поэтому он никогда не будет уменьшаться. Ваш код устанавливаетi
в 1 один раз и больше никогда не меняет его. Этого не может быть, что вы пытались сделать. Если вам нужна развертка от 0 до 100, а затем от 100 до 0, вам нужна дополнительная переменная для направления. Что-то вроде этого:boolean direction=false; // определяем это в глобальном масштабе ... // следующий код заменит ваш код, связанный с `i`, в вашей функции цикла if(direction){ i++; } else { i--; } if(i==0) direction = true; if(i>=100) direction = false;
В связи с предыдущей проблемой: поскольку
i
всегда остается1
, вы также записываете только рабочий цикл ШИМ 1 из 255 для двигателей a и b внутри функцииtimed()
. Такого небольшого значения, скорее всего, недостаточно даже для того, чтобы сдвинуть ротор двигателей (поскольку двигатели также испытывают трение). Опять же, эти двигатели не должны работать с вашим текущим кодом. Если вы измените код, связанный сi
, как я предложил выше, код должен запускать двигатели с изменяющейся скоростью. Но также обратите внимание, что это все равно будет очень медленным изменением. Полный запуск функцииtimed()
занимает 4 секунды (поскольку две задержки по 2 секунды). При 100 шагах полный размах от 0 до 100 займет 400 с (то есть 6,7 минут) и столько же времени обратно до 0. (И это без учета огромных задержек от предыдущих двигательных функций. С этим вы не будете сможете увидеть изменение, пока не будете ждать его очень долго)Вы писали, что в качестве источника питания используете блочную батарею 9В. Если это блочная батарея на 9 В, то вы должны знать, что эти батареи не предназначены для обеспечения большого тока. Они предназначены для маломощных приложений. Для управления двигателями в течение более длительного времени от батареи или одновременного управления несколькими двигателями следует рассмотреть возможность использования другой батареи (например, нескольких батарей типа АА, соединенных последовательно). Поскольку ваши двигатели в настоящее время работают от него, вам, кажется, это сойдет с рук, и это нормально. Я просто хотел предоставить информацию на случай, если в какой-то момент вы достигнете этого предела.
В целом я могу только согласиться с VE7JRO, что вы должны начать с кода для одного двигателя. Затем, если он работает должным образом, вы можете двигаться дальше и добавить следующий двигатель. Это гарантирует, что вы все сделаете правильно в самом начале процесса и не создадите кучу проблем, с которыми нужно справиться сразу.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Почему Arduino сбрасывается во время управления двигателями?
- Запуск нескольких двигателей одновременно
- Переменная скорость разгона для двигателей, управляемых джойстиком
- Как заставить двигатели постоянного тока работать одновременно?
- Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок
Хотите сузить это до одного конкретного вопроса?, @Chris Combs
@Ghetti - Пожалуйста, отредактируйте свой вопрос и добавьте фактические скетчи, которые вы используете. Изображение или, предпочтительно, «схема подключения» (схема) всей установки также поможет нам помочь вам :), @VE7JRO
@VE7JRO Код не имеет значения. Однако я добавил код, который использовал. Настройка так же проста, как и объясняется. Никакие макеты не мешают, ничего сложного. Все напрямую связано. Так что проводка не проблема. Пожалуйста, пройдите и объясните, что может быть не так., @Ghetti