H-мост Модуль L298N

300 руб.

2 в наличии

Артикул: 79 Категория:

Описание

Обзор драйвера L298N

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

Рисунок №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.

elektricheskaya-skhema-modulya-L298N.gif
Рисунок №2 – электрическая схема модуля L298N

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

tranzistornye-mosty-N-tipa.gif

Рисунок №3 – транзисторные мосты Н-типа

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


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

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

 


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

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

chema-podklucheniya-l298n.jpg

Рисунок №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.

chema-podklucheniya-SHD.jpg

Рисунок №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); // Ждём одну секунду
 }

Как можно заметить, библиотека сокращает код до минимума, так что разобраться в нём не составит никакого труда даже начинающему программисту.


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

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

chema.jpg

Рисунок №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 кГц);

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

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

robot1.jpg

Рисунок №7 – пример реализации шасси для робота

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

robot 2.jpg

Рисунок №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. Часто задаваемые вопросы

1. Какое минимальное напряжение можно подавать на вход питания двигателей модуля?
Ответ: Напряжение питания силовой части не рекомендуется опускать ниже 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);