Драйвер двигателя L298N
Содержание
Обзор драйвера L298N
Драйвер L298N используется радиолюбителями для многофункционального управления двигателями постоянного тока. Схема модуля, состоящая из двух H-мостов, позволяет подключать к нему один биполярный шаговый двигатель или одновременно два щёточных двигателя постоянного тока. При этом есть возможность изменять скорость и направление вращения моторов. Управление осуществляется путём подачи соответствующих сигналов на командные входы, выполненные в виде штыревых контактов. На рисунке №1 показан внешний вид модуля с кратким описанием всех его составляющих.
Рисунок №1 – внешний вид модуля L298N
- OUT1 и OUT2 – разъёмы для подключения первого щёточного двигателя или первой обмотки шагового двигателя;
- OUT3 и OUT4 – разъёмы для подключения второго щёточного двигателя или второй обмотки шагового двигателя;
- VSS – вход для питания двигателей (максимальный уровень +35V);
- GND – общий провод (не забываем соединить с аналогичным входом Arduino!!!);
- Vs – вход для питания логики +5V. Через него непосредственно запитывается сама микросхема L298N. Есть ещё второй способ питания, при котором 5V для L298N берётся от встроенного в модуль стабилизатора напряжения. В таком случае на разъём подаётся только питание для двигателей (Vss), контакт Vs остаётся не подключенным, а на плате устанавливается перемычка питания от стабилизатора, который ограничит питающее моторы напряжение до приемлемых 5V.
- IN1, IN2 – контакты управления первым щёточным двигателем или первой обмоткой шагового двигателя.
- IN3, IN4 – контакты управления вторым щёточным двигателем или второй обмоткой шагового двигателя.
- ENA, ENB – контакты для активации/деактивации первого и второго двигателей или соответствующих обмоток ШД. Подача логической единицы на эти контакты разрешает вращение двигателей, а логический ноль – запрещает. Для изменения скорости вращения щёточных моторов на эти контакты подаётся ШИМ-сигнал. Для работы с шаговым двигателям, как правило, на эти контакты ставят перемычки, обеспечивающие постоянную подтяжку к +5V.
Рисунок №2 – электрическая схема модуля L298N
Рисунок №3 – транзисторные мосты Н-типа
На рисунке изображены два транзисторных моста Н-типа. В первом случае на вход IN1 подаётся логическая единица, а на вход IN2 – логический ноль. Так как транзисторы в схеме моста имеют разный тип проводимости, то при таком входном сигнале транзисторы Т1 и Т4 останутся в закрытом состоянии, в то время, как через транзисторы Т2 и Т3 потечёт ток. Ввиду того, что единственный путь протекания тока лежит через обмотку двигателя, то последний окажется подключен правой клеммой к плюсу питания, а левой к минусу. Всё это приведёт к вращению мотора в определённом направлении. Абсолютно противоположная картина показана на нижнем рисунке. Здесь IN3 установлен в логический ноль, а IN4 в логическую единицу. Теперь ток течёт в обратном направлении (левая клемма – плюс, правая – минус), заставляя второй двигатель крутиться в противоположную сторону.Где приобрести модули для ардуино? Купить модули Arduino можно в нашем магазине 3DIY.
Технические характеристики
- Напряжение питания логики: 5V;
- Потребляемый логикой ток: 36mA;
- Напряжение питания моторов: от 5V до 35V;
- Рабочий ток драйвера: 2 А;
- Пиковый ток драйвера 3 А;
- Максимальная мощность: 20 Вт (при температуре 75о С);
- Диапазон рабочих температур: -25оС…+135оС;
- Размеры модуля: 43.5 х 43.2 х 29.4 мм;
Подключение L298N к плате Arduino
Работать с модулем L298N довольно просто и комфортно. Здесь не придётся изучать тонны литературы с описанием замороченных протоколов. Все сводится к простому переключению логических уровней на выводах Arduino плюс к генерации ШИМ, если требуется управлять скоростью вращения.Так как драйвер способен управлять двумя типами моторов (щёточным или шаговым), то и работа с ним строится по-разному. Рассмотрим для начала подключение обычных щёточных моторов постоянного тока и управление ими с помощью платы Arduino Nano. На рисунке №4 показана соответствующая схема подключения.
Рисунок №4 – схема подключения двух щёточных двигателей постоянного тока
Следует обратить внимание, что в схеме предусмотрена возможность управления скоростью вращения, поэтому выводы ENA и ENB драйвера подключены к пинам Arduino, способным выдавать ШИМ-сигнал. Arduino питается от отдельного источника 7-12 В. Если напряжение питания моторов лежит в этом же диапазоне, то можно объединить питающие цепи в одну общую. Также необходимо следить за тем, чтобы минусовые провода всех элементов схемы были соединены между собой.Для демонстрации возможностей модуля, напишем скетч, который будет вращать моторы с различной скоростью и периодически менять направления их вращения. Ниже приведена программа с подробными комментариями, которая реализует задуманный алгоритм.
#define PIN_ENA 9 // Вывод управления скоростью вращения мотора №1
#define PIN_ENB 3 // Вывод управления скоростью вращения мотора №2
#define PIN_IN1 7 // Вывод управления направлением вращения мотора №1
#define PIN_IN2 6 // Вывод управления направлением вращения мотора №1
#define PIN_IN3 5 // Вывод управления направлением вращения мотора №2
#define PIN_IN4 4 // Вывод управления направлением вращения мотора №2
uint8_t power = 105; // Значение ШИМ (или скорости вращения)
void setup() {
// Установка всех управляющих пинов в режим выхода
pinMode(PIN_ENA, OUTPUT);
pinMode(PIN_ENB, OUTPUT);
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
// Команда остановки двум моторам
digitalWrite(PIN_IN1, LOW);
digitalWrite(PIN_IN2, LOW);
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN4, LOW);
}
void loop() {
// Вращаем моторы в одну сторону с разной скоростью
while(power < 255) {
analogWrite(PIN_ENA, power); // Устанавливаем скорость 1-го мотора
analogWrite(PIN_ENB, power); // Устанавливаем скорость 2-го мотора
// Задаём направление для 1-го мотора
digitalWrite(PIN_IN1, HIGH);
digitalWrite(PIN_IN2, LOW);
// Задаём направление для 2-го мотора
digitalWrite(PIN_IN3, HIGH);
digitalWrite(PIN_IN4, LOW);
delay(3000); // Пауза 3 секунды
power += 30; // Увеличиваем скорость
}
power = 225;
// Вращаем моторы в другую сторону с разной скоростью
while(power > 105) {
analogWrite(PIN_ENA, power); // Устанавливаем скорость 1-го мотора
analogWrite(PIN_ENB, power); // Устанавливаем скорость 2-го мотора
// Задаём направление для 1-го мотора
digitalWrite(PIN_IN1, LOW);
digitalWrite(PIN_IN2, HIGH);
// Задаём направление для 2-го мотора
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN4, HIGH);
delay(3000); // Пауза 3 секунды
power -= 30; // Уменьшаем скорость
}
power = 105;
}
В самом верху программы задаются макроопределения всех выводов, используемых в проекте. В функции Setup() все выводы Arduino Nano, участвующие в управлении, задаются в качестве выхода. На выводах IN1-IN4 выставляются логические нули, чтобы двигатели гарантированно не вращались в момент старта программы. В главном цикле, программа обеспечивает вращение двигателей в одном направлении, увеличивая их скорость каждые 3 секунды. Когда разгон вырастает до максимального, моторы начинают вращаться в обратном направлении, постепенно замедляя скорость. На пике сбрасывания скорости, алгоритм повторяется заново. Как видим, сложного здесь ничего нет. Теперь разберёмся с шаговым двигателем. На рисунке №5 показана схема его подключения к плате Arduino Nano.
Рисунок №5 - схема подключения шагового двигателя к Arduino Nano
В качестве демонстрационной модели использован популярный шаговый двигатель NEMA17. Он способен вращаться с частотой до 60 оборотов в минуту и имеет разрешающую способность 200 шагов на один оборот. Следует обратить внимание, что выводы ENA и ENB должны быть подтянуты к +5V путём установки перемычек на самом модуле. Таким образом управляющему сигналу будет разрешено проходить на обмотки шагового двигателя. Также, в случае использования двигателя NEMA17, напряжение его питания не должно превышать 12V. Ниже приведён пример кода с комментариями, который заставит двигатель вращаться в разные стороны, меняя своё направление после каждого полного оборота. В программе использована стандартная библиотека Stepper.h, которая значительно упрощает процесс разработки ПО для проектов с шаговыми двигателями.
#include <Stepper.h> // Подключение библиотеки для работы с ШД
#define steps 200 // Количество шагов на один оборот
// Создание экземпляра класса для работы с ШД. казываем кол-во шагов на один оборот
// и пины Arduino, к которым подключены обмотки двигатедя
Stepper myStepper(steps, 7, 6, 5, 4);
void setup() {
myStepper.setSpeed(60); // Устанавливаем скорость вращения об./мин.
}
void loop() {
myStepper.step(steps); // Вращаем двигатель в одну сторону на 200 шагов
delay(1000); // Ждём одну секунду
myStepper.step(-steps); // Вращаем двигатель в обратную сторону на 200 шагов
delay(1000); // Ждём одну секунду
}
Как можно заметить, библиотека сокращает код до минимума, так что разобраться в нём не составит никакого труда даже начинающему программисту. Необходимы датчики Arduino? Ардуино датчики купить можно в нашем магазине с доставкой по всей России.
Пример использования
Модуль L298N применяется в устройствах, где есть необходимость управления двигателями. Такими устройствами могут быть различного рода ЧПУ, 3D принтеры, роботы, механизмы вендинговых аппаратов и т.п. Для того, чтобы глубже вникнуть в тему работы с драйвером, создадим небольшой проект роботизированной платформы, которая будет передвигаться по командам с любого ИК-пульта дистанционного управления. Робот будет иметь два мотор-редуктора, связанных напрямую с колёсами, а также ИК-приёмник, способный воспринимать команды пульта ДУ. В качестве “мозга” выступит плата Arduino Nano. На рисунке №6 показана электрическая схема робота.
Рисунок №6 - электрическая схема робота-машинки
Для приёма управляющих сигналов с ИК-пульта, в проекте будет использоваться популярная микросхема TSOP-1738. Удобство её заключается в том, что она напрямую подключается к плате Arduino и поддерживает большое разнообразие пультов управления. Цифра 38 в конце маркировки означает несущую частоту (кГц), с которой ваш пульт передаёт сигнал. Существует несколько модификаций данной микросхемы на разные несущие частоты. Ниже приведён список возможных вариантов.- TSOP-1730 (30 кГц);
- TSOP-1733 (33 кГц);
- TSOP-1736 (36 кГц);
- TSOP-1737 (37.6 кГц);
- TSOP-1738 (38 кГц);
- TSOP-1740 (40 кГц);
- TSOP-1756 (56 кГц);
Итак, собираем всё по вышеприведенной схеме, устанавливаем библиотеку IRremote, и для начала заливаем в Arduino этот скетч:
#include <IRremote.h>
#define RECV_PIN 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();
}
delay(100);
}
После запуска, в мониторе будут отображаться коды клавиш, нажатые на пульте ДУ. Нам необходимо выбрать 4 кнопки для управления движением робота и выписать их коды для дальнейшего использования в основной программе. У меня получилось следующее: - Кнопка “Вперёд” - 0xB4B4E21D
- Кнопка “Назад” - 0xB4B412ED
- Кнопка “Вправо” - 0xB4B45AA5
- Кнопка “Влево” - 0xB4B49A65
Рисунок №7 - пример реализации шасси для робота
В пластиковом корпусе удалось разместить все необходимые элементы схемы, а именно: источник питания, Arduino Nano и модуль L298N. ИК-приемник TSOP-1738 был вынесен на верх корпуса, чтобы обеспечить надёжную связь с пультом ДУ. Ведущие колёса с моторами закреплены снизу при помощи двухстороннего скотча. В качестве переднего колеса используется поворотный ролик от кресла. На рисунке №8 показан итоговый результат сборки.
Рисунок №8 - робот готов к программированию
Ниже приведён исходный код управления роботом-машинкой с подробными комментариями.
#define PIN_RECV 13 // Вывод, к которому подключен ИК-приёмник
#define PIN_IN1 7 // Вывод управления правого колеса
#define PIN_IN2 6 // Вывод управления правого колеса
#define PIN_IN3 5 // Вывод управления левого колеса
#define PIN_IN4 4 // Вывод управления левого колеса
#define PIN_ENA 9 // Вывод управления скоростью правого колеса
#define PIN_ENB 3 // Вывод управления скоростью левого колеса
#define SPEED 255 // Скорость бобо-машинки (0-255)
// Коды с пульта управления (необходимо вставить свои!!!)
#define BUTTON_FORWARD 0xB4B4E21D // Код кнопки ВПЕРЁД
#define BUTTON_LEFT 0xB4B49A65 // Код кнопки ВЛЕВО
#define BUTTON_RIGHT 0xB4B45AA5 // Код кнопки ВПРАВО
#define BUTTON_BACK 0xB4B412ED // Код кнопки НАЗАД
#include <IRremote.h> // Библиотека для работы с ИК-приёмником
IRrecv irrecv(PIN_RECV); // Создание объекта работы с ИК-приёмником
decode_results results; // Переменная для хранения результата декодирования
void setup() {
irrecv.enableIRIn(); // Инициализация ИК-приёмника
// Настройка на выход всех управляющих пинов Arduino
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
pinMode(PIN_ENA, OUTPUT);
pinMode(PIN_ENB, OUTPUT);
// Остановка моторов
digitalWrite(PIN_IN1, LOW);
digitalWrite(PIN_IN2, LOW);
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN4, LOW);
analogWrite(PIN_ENA, SPEED);
analogWrite(PIN_ENB, SPEED);
}
void loop() {
// Ждём поступления сигнала с пульта ДУ
if (irrecv.decode(&results)) {
// Анализируем полученный результат
switch(results.value) {
case BUTTON_FORWARD: // Движение ВПЕРЁД
digitalWrite(PIN_IN1, HIGH);
digitalWrite(PIN_IN2, LOW);
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN2, HIGH);
break;
case BUTTON_LEFT: // Поворот ВЛЕВО
digitalWrite(PIN_IN1, HIGH);
digitalWrite(PIN_IN2, LOW);
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN2, LOW);
break;
case BUTTON_RIGHT: // Поворот ВПРАВО
digitalWrite(PIN_IN1, LOW);
digitalWrite(PIN_IN2, LOW);
digitalWrite(PIN_IN3, LOW);
digitalWrite(PIN_IN2, HIGH);
break;
case BUTTON_BACK: // Движение НАЗАД
digitalWrite(PIN_IN1, LOW);
digitalWrite(PIN_IN2, HIGH);
digitalWrite(PIN_IN3, HIGH);
digitalWrite(PIN_IN2, LOW);
break;
}
irrecv.resume();
}
}
FAQ. Часто задаваемые вопросы
Ответ: Напряжение питания силовой части не рекомендуется опускать ниже 7В. Согласно документации, оно должно быть выше напряжения логики на 2,5В.
2. Какой ток может обеспечить внутренний стабилизатор 5 В?
Ответ: Внутренний 5-вольтовый стабилизатор модуля может выдать ток до 0.5 А.
3. Можно ли управлять выводами ENA и ENB без использования ШИМ?
Ответ: Можно управлять функцией digitalWrite, но в таком случае регулировка скорости будет невозможна. Управление будет сводиться к двум состояниям: вкл./выкл.
4. Почему двигатель начинает вращаться при ШИМ больше чем 97, а до этого просто стоит на месте? Как сделать так, чтобы скорость могла регулироваться от 0?
Ответ: Разные двигатели имеют разные технические характеристики и как следствие разную стартовую мощность. Поэтому для каждого конкретного случая будет своё минимальное значение ШИМ, при котором двигатель начнёт вращаться с начальной скоростью. Фактическая регулировка от 0 невозможна, так как двигатель попросту не хватит энергии. В таких случаях очень удобно использовать функцию map(). Например, оформить регулировку от 0 до 100% можно следующим образом:
uint8_t speed = 90; // Скорость двигателя в процентах
speed = map(speed, 96, 255, 0, 100); // Диапазон ШИМ 97-255 преобразуем в проценты 0-100
analogWrite(speed);