Драйвер шагового двигателя и двигателя постоянного тока L298N и Arduino
Модуль L298N H-bridge можно использовать для двигателей, напряжение питания которых находится в диапазоне от 5 до 35 вольт.
Кроме того, на многих подобных платах есть встроенный 5В регулятор, который дает возможность запитывать ваши устройства.
Подключение модуля L298N
Прежде чем перейти к управлению двигателем постоянного тока и шаговым двигателем, разберемся с подключением модуля L298N (даташит, техническая информация от производителя).
Ссылки для заказа необходимого оборудования из Китая

Ниже приведены разъяснения к рисунку.
- Для двигателя постоянного тока 1 “+” или для шагового двигателя A+
- Для двигателя постоянного тока 1 “-” или для шагового двигателя A-
- Коннектор на 12 вольт. Снимите его, если используете напряжение питания больше 12 вольт.
- Питания вашего двигателя обеспечивается с этого выхода. Максимальное напряжение питания постоянным током 35 вольт. Если напряжение больше 12 вольт, разомкните контакты на 3 коннекторе.
- GND - земля.
- Питание 5 вольт, если коннектор на 12 вольт замкнут. Идеально для питания Arduino и т.п.
- Коннектор для двигателя постоянного тока 1. Можно подключить к ШИМ-выходу для управления скоростью двигателя постоянного тока.
- IN1.
- IN2.
- IN3.
- IN4.
- Коннектор для двигателя постоянного тока 2. В случае использования шагового двигателя, подключать сюда ничего не надо. Можно подключить к ШИМ-выходу для управления скоростью двигателя постоянного тока.
- Двигатель постоянного тока 2 “+” или шаговый двигатель B+.
- Двигатель постоянного тока 2 “-” или шаговый двигатель B-.

L298N, Arduino и двигатель постоянного тока
Данный модуль дает возможность управлять одним или двумя двигателями постоянного тока. Для начала, подключите двигатели к пинам A и B на контроллере L298N.
Если вы используете в проекте несколько двигателей, убедитесь, что у них выдержана одинаковая полярность при подключении. Иначе, при задании движения, например, по часовой стрелке, один из них будет вращаться в противоположном направлении. Поверьте, с точки зрения программирования Arduino это неудобно.
После этого подключите источник питания. Плюс - к четвертому пину на L298N, минус (GND) - к 5 пину. Если ваш источник питания до 12 вольт, коннектор, отмеченный 3 на рисунке выше, можно оставить. При этом будет возможность использовать 5 вольтовый пин 6 с модуля.
Данный пин можно использовать для питания Arduino. При этом не забудьте подключить пин GND с микроконтроллера к 5 пину на L298N для замыкания цепи. Теперь вам понадобится 6 цифровых пинов на Arduino. Причем некоторые пины должны поддерживать ШИМ-модуляцию.
ШИМ-пины обозначены знаком “~” рядом с порядковым номером.
Теперь подключите цифровые пины Arduino к драйверу. В нашем примере два двигателя постоянного тока, так что цифровые пины D9, D8, D7 и D6 будут подключены к пинам IN1, IN2, IN3 и IN4 соответственно. После этого подключите пин D10 к пину 7 на L298N (предварительно убрав коннектор) и D5 к пину 12 (опять таки, убрав коннектор).
Направление вращения ротора двигателя управляется сигналами HIGH или LOW на каждый привод (или канал). Например, для первого мотора, HIGH на IN1 и LOW на IN2 обеспечит вращение в одном направлении, а LOW и HIGH заставит вращаться в противоположную сторону.
При этом двигатели не будут вращаться, пока не будет сигнала HIGH на пине 7 для первого двигателя или на 12 пине для второго. Остановить их вращение можно подачей сигнала LOW на те же указанные выше пины. Для управления скоростью вращения используется ШИМ-сигнал.
Скетч приведенный ниже, отрабатывает в соответствии со схемой подключения, которую мы рассматривали выше. Двигатели постоянного тока и Arduino питаются от внешнего источника питания.
// подключите пины контроллера к цифровым пинам Arduino
// первый двигатель
int enA = 10;
int in1 = 9;
int in2 = 8;
// второй двигатель
int enB = 5;
int in3 = 7;
int in4 = 6;
void setup()
{
// инициализируем все пины для управления двигателями как outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void demoOne()
{
// эта функция обеспечит вращение двигателей в двух направлениях на установленной скорости
// запуск двигателя A
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
// устанавливаем скорость 200 из доступного диапазона 0~255
analogWrite(enA, 200);
// запуск двигателя B
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// устанавливаем скорость 200 из доступного диапазона 0~255
analogWrite(enB, 200);
delay(2000);
// меняем направление вращения двигателей
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// выключаем двигатели
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void demoTwo()
{
// эта функция обеспечивает работу двигателей во всем диапазоне возможных скоростей
// обратите внимание, что максимальная скорость определяется самим двигателем и напряжением питания
// ШИМ-значения генерируются функцией analogWrite()
// и зависят от вашей платы управления
// запускают двигатели
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// ускорение от нуля до максимального значения
for (int i = 0; i < 256; i++)
{
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// торможение от максимального значения к минимальному
for (int i = 255; i >= 0; --i)
{
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// теперь отключаем моторы
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop()
{
demoOne();
delay(1000);
demoTwo();
delay(1000);
}
Пояснения к скетчу для управления двигателями постоянного тока
Итак, что у нас происходит в программе? В теле функции demoOne() мы включаем двигатели и начинаем с ними работать при ШИМ- значении 200.
Через некоторое время двигатели начинают вращаться в противоположном направлении (благодаря смене HIGH и LOW в теле функции digitalWrite()). Для демонстрации возможностей изменения скорости вращения, используем доступный ШИМ-диапазон в теле функции demoTwo(). Сигнал на пине меняется от нуля до 255 и вновь до нуля.
В результате все это может крутиться примерно так:
L298N, Arduino и шаговый двигатель
Для нашего примера мы используем шаговый двигатель Nema 17, у которого четыре кабеля для подключения.

Этот двигатель имеет 200 шагов на оборот и может работать с частотой вращения 60 об/мин. Если вы используете другой шаговый двигатель, уточните шаг его шаг и максимальную частоту вращения. Эти параметры понадобятся вам при программировании Arduino.
Еще один важный момент - определить какие именно кабели соответствуют A+, A-, B+ и B-. В нашем примере соответствующие цвета кабелей: красный, зеленый, желтый и голубой. Переходим к подключению.
Кабели A+, A-, B+ и B- от шагового двигателя подключаем к пинам 1, 2, 13 и 14 соответственно. Контакты на коннекторах 7 и 12 на контроллере L298N оставьте замкнутыми. После этого подключите источник питания к пину 4 (плюс) и 5 (минус) на контроллере.
Опять таки, если источник питания меньше 12 вольт, контакт, отмеченный 3 на рисунке модуля, можно оставить замкнутым. После этого, подключите пины модуля L298N IN1, IN2, IN3 и IN4 к соответствующим цифровым пинам D8, D9, D10 и D11 на Arduino.
Теперь подключаем GND пин с Arduino к пину 5 на контроллере, а 5V к 6 пину на модуле. С управлением шагового двигателя проблем быть не должно благодаря встроенной в Arduino IDE библиотеке Stepper Library.

Для проверки работоспособности просто загрузите скетч stepper_oneRevolution, который входит в состав библиотеки. Данный пример находится в меню
File -> Examples -> Stepper
в Arduino IDE.
Пояснения к скетчу для управления шаговым двигателем
Уточните значение
const int stepsPerRevolution = 200;
в скетче и измените значение 200 на ваше количество шагов за один поворот двигателя вала и скорость вращения в строке
myStepper.setSpeed(60);
Теперь можете сохранить и загрузить скетч, который реализует вращение один оборот вала, а затем в противоположную сторону. Это реализуется с помощью функции
myStepper.step(stepsPerRevolution); // вращение по часовой стрелке
myStepper.step(-stepsPerRevolution); // вращение против часовой стрелки
Долгожданный результат:
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!