Драйвер L298N используется радиолюбителями для многофункционального управления двигателями постоянного тока. Схема модуля, состоящая из двух H-мостов, позволяет подключать к нему один биполярный шаговый двигатель или одновременно два щёточных двигателя постоянного тока. При этом есть возможность изменять скорость и направление вращения моторов. Управление осуществляется путём подачи соответствующих сигналов на командные входы, выполненные в виде штыревых контактов. На рисунке ниже показан внешний вид модуля с кратким описанием всех его составляющих.
 

Внешний вид модуля L298N 

Внешний вид модуля L298N

  • OUT1 и OUT2 – разъёмы для подключения первого щёточного двигателя или  первой обмотки шагового двигателя;
  • OUT3 и OUT4 – разъёмы для подключения второго щёточного двигателя или  второй обмотки шагового двигателя;
  • VSS – вход для питания двигателей (максимальный уровень +35V);
  • GND – общий провод (не забываем соединить с аналогичным входом Arduino!!!);
  • Vs – вход для питания логики +5V. Через него непосредственно запитывается сама микросхема L298N. Есть ещё второй способ питания, при котором 5V для L298N берётся от встроенного в модуль стабилизатора напряжения. В таком случае на разъём подаётся только питание для двигателей (Vss), контакт Vs остаётся не подключенным, а на плате устанавливается перемычка питания от стабилизатора, который ограничит питающее моторы напряжение до приемлемых 5V.
  • IN1, IN2 – контакты управления первым щёточным двигателем или первой обмоткой шагового двигателя.
  • IN3, IN4 – контакты управления вторым щёточным двигателем или второй обмоткой шагового двигателя.
  • ENA, ENB –  контакты для активации/деактивации первого и второго двигателей или соответствующих обмоток ШД. Подача логической единицы на эти контакты разрешает вращение двигателей, а логический ноль – запрещает. Для изменения скорости вращения щёточных моторов на эти контакты подаётся ШИМ-сигнал. Для работы с шаговым двигателям, как правило, на эти контакты ставят перемычки, обеспечивающие постоянную подтяжку к +5V.

Электрическая схема модуля L298N
Электрическая схема модуля L298N

Как видно из вышеприведенной схемы, основным элементом модуля является микросхема L298N, в состав которой входят два полноценных H-моста. Каждый H-мост выполнен в виде сборки из четырёх транзисторных ключей с включённой в центре нагрузкой в виде обмотки двигателя. Такой подход позволяет менять полярность в обмотке и как следствие направление вращения двигателя путём чередования пар открытых и закрытых ключей. 

Транзисторные мосты Н-типа

Транзисторные мосты Н-типа

На рисунке изображены два транзисторных моста Н-типа. В первом случае на вход IN1 подаётся логическая единица, а на вход IN2 – логический ноль. Так как транзисторы в схеме моста имеют разный тип проводимости, то при таком входном сигнале транзисторы Т1 и Т4 останутся в закрытом состоянии, в то время, как через транзисторы Т2 и Т3 потечёт ток. Ввиду того, что единственный путь протекания тока лежит через обмотку двигателя, то последний окажется подключен правой клеммой к плюсу питания, а левой к минусу. Всё это приведёт к вращению мотора в определённом направлении. Абсолютно противоположная картина показана на нижнем рисунке. Здесь IN3 установлен в логический ноль, а IN4 в логическую единицу. Теперь ток течёт в обратном направлении (левая клемма – плюс, правая – минус), заставляя второй двигатель крутиться в противоположную сторону.

Технические характеристики

  • Напряжение питания логики: 5В
  • Потребляемый логикой ток: 36мА
  • Напряжение питания моторов: от 5 до 35В
  • Рабочий ток драйвера: 2А
  • Пиковый ток драйвера 3А
  • Максимальная мощность: 20Вт (при температуре 75оС)
  • Диапазон рабочих температур: -25оС…+135оС
  • Размеры модуля: 43.5 х 43.2 х 29.4мм

Подключение L298N к плате Arduino

Работать с модулем L298N довольно просто и комфортно. Здесь не придётся изучать тонны литературы с описанием замороченных протоколов. Все сводится к простому переключению логических уровней на выводах Arduino плюс к генерации ШИМ, если требуется управлять скоростью вращения.
Так как драйвер способен управлять двумя типами моторов (щёточным или шаговым), то и работа с ним  строится по-разному. Рассмотрим для начала подключение обычных щёточных моторов постоянного тока и управление ими с помощью платы Arduino Nano. На рисунке  показана соответствующая схема подключения.

Схема подключения двух щёточных двигателей постоянного тока

Схема подключения двух щёточных двигателей постоянного тока

Следует обратить внимание, что в схеме предусмотрена возможность управления скоростью вращения, поэтому выводы 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 секунды. Когда разгон вырастает до максимального, моторы начинают вращаться в обратном направлении, постепенно замедляя скорость. На пике сбавления скорости, алгоритм повторяется заново. Как видим, сложного здесь ничего нет. Теперь разберёмся с шаговым двигателем и его подключением к плате Arduino Nano.
 

Схема подключения шагового двигателя к Arduino Nano

Схема подключения шагового двигателя к 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); // Ждём одну секунду
}

Пример использования

Модуль L298N применяется в устройствах, где есть необходимость управления двигателями. Такими устройствами могут быть различного рода ЧПУ, 3D принтеры, роботы, механизмы вендинговых аппаратов и т.п. Для того, чтобы глубже вникнуть в тему работы с драйвером, создадим небольшой проект роботизированной платформы, которая будет передвигаться по командам с любого ИК-пульта дистанционного управления. Робот будет иметь два мотор-редуктора, связанных напрямую с колёсами, а также ИК-приёмник, способный воспринимать команды пульта ДУ. В качестве “мозга” выступит плата Arduino Nano.
 

Электрическая схема робота-машинки

Электрическая схема робота-машинки

Для приёма управляющих сигналов с ИК-пульта, в проекте будет использоваться популярная микросхема 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 кГц)

Следует помнить, что помимо несущей частоты, каждая кнопка пульта дистанционного управления имеет свой уникальный код, который предварительно необходимо считать и вставить в текст основного скетча. В данном проекте будет использоваться всего 4 кнопки: “вперёд”, “назад”, “вправо” и “влево”. Определить коды поможет библиотека IRremote.
Итак, собираем всё по вышеприведенной схеме, устанавливаем библиотеку 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

На этом подготовка к реализации проекта завершена, можно приступать к сборке шасси. Здесь можно дать волю своей фантазии. В нашем случае получилось следующее.
 

Пример реализации шасси для робота

Пример реализации шасси для робота

В пластиковом корпусе удалось разместить все необходимые элементы схемы, а именно: источник питания, Arduino Nano и модуль L298N. ИК-приемник TSOP-1738 был вынесен на верх корпуса, чтобы обеспечить надёжную связь с пультом ДУ. Ведущие колёса с моторами закреплены снизу при помощи двухстороннего скотча. В качестве переднего колеса используется поворотный ролик от кресла.
 

Робот готов к программированию

Робот готов к программированию

Ниже приведён исходный код управления роботом-машинкой с подробными комментариями.

#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();
}
}


Часто задаваемые вопросы

Какое минимальное напряжение можно подавать на вход питания двигателей модуля?

Напряжение питания силовой части не рекомендуется опускать ниже 7В. Согласно документации, оно должно быть выше напряжения логики на 2,5В.
 
Какой ток может обеспечить внутренний стабилизатор 5В?

Внутренний 5-вольтовый стабилизатор модуля может выдать ток до 0.5А.
  
Можно ли управлять выводами ENA и ENB без использования ШИМ?

Можно управлять функцией digitalWrite, но в таком случае регулировка скорости будет невозможна. Управление будет сводиться к двум состояниям: вкл./выкл.
 
Почему двигатель начинает вращаться при ШИМ больше чем 97, а до этого просто стоит на месте? Как сделать так, чтобы скорость могла регулироваться от 0?
Разные двигатели имеют разные технические характеристики и как следствие разную стартовую мощность. Поэтому для каждого конкретного случая будет своё минимальное значение ШИМ, при котором двигатель начнёт вращаться с начальной скоростью. Фактическая регулировка от 0 невозможна, так как двигатель попросту не хватит энергии. В таких случаях очень удобно использовать функцию map(). Например, оформить регулировку от 0 до 100% можно следующим образом:

uint8_t speed = 90; // Скорость двигателя в процентах
speed = map(speed, 96, 255, 0, 100); // Диапазон ШИМ 97-255 преобразуем в проценты 0-100
analogWrite(speed);


   

Рекомендуемые товары

Комментарии 0