Компоненты · 14 мин чтения

Моторный шилд L293D для Arduino: AFMotor, 4 DC-мотора, шаговые двигатели и сервоприводы

Как пользоваться моторным шилдом L293D: библиотека AFMotor, перемычка PWR, свободные пины, код машинки 4WD, шаговые двигатели, сервоприводы, предел 0,6 A и что делать, если моторы не крутятся.

Моторный шилд L293D — это плата драйвера моторов, которая вставляется прямо сверху на Arduino Uno и позволяет управлять 4 DC-моторами, 2 шаговыми двигателями и 2 сервоприводами с одной платы. Две микросхемы L293D дают моторам нужный ток, меняют направление вращения и задают скорость с помощью ШИМ (PWM), так что всеми моторами четырёхколёсной машинки-робота можно управлять без единого провода-перемычки. Почти все платы на рынке — копии старой разработки Adafruit Motor Shield V1, и программируются они одной и той же библиотекой: AFMotor.

В этом руководстве разберём, что есть на шилде, какие пины Arduino он занимает и какие остаются свободными для датчиков, как работает запутанная перемычка PWR в трёх разных схемах питания, какие команды есть в библиотеке AFMotor, и соберём полный код четырёхколёсной машинки-робота с управлением с телефона. В последних разделах — предел тока 0,6 A, почему греется микросхема, чем шилд отличается от L298N и все известные причины проблемы «моторы не крутятся» в одной таблице.

Моторный шилд L293D, вид сверху: клеммники M1–M4, разъёмы для сервоприводов и перемычка питания
Моторный шилд L293D (разработка Adafruit V1): в центре 74HC595, по бокам от неё микросхемы L293D; слева клеммники M1–M2, справа M3–M4, вверху слева два разъёма для сервоприводов, внизу клеммник внешнего питания и перемычка PWR.

Что такое моторный шилд L293D и как он работает?

Чтобы крутить DC-мотор в обе стороны, нужна схема из четырёх ключей, которая называется H-мост; принцип подробно разобран в статье Управление DC-мотором с L298N. В микросхеме L293D два H-моста, а на шилде две такие микросхемы, так что всего получается четыре канала для моторов. Буква «D» в названии означает, что защитные диоды, гасящие выбросы обратного напряжения при выключении мотора, встроены в микросхему. Кроме того, при перегреве L293D сама отключает свои выходы.

Главная хитрость шилда — сдвиговый регистр 74HC595 в центре. Каждому из четырёх моторов нужны два сигнала направления и один сигнал скорости, а это в сумме 12 пинов Arduino. Шилд передаёт восемь сигналов направления в 74HC595 последовательно и тратит на них всего 4 пина (D4, D7, D8, D12), а для скорости использует 4 ШИМ-пина (D3, D5, D6, D11). Такая схема экономит пины, но у неё есть цена: напрямую через digitalWrite моторами не управлять, нужна библиотека, которая задвигает биты направления в регистр. Эта библиотека и есть AFMotor.

ХарактеристикаЗначение
Микросхемы драйвера2 × L293D (всего 4 H-моста)
Управление направлениемСдвиговый регистр 74HC595 (D4, D7, D8, D12)
Напряжение питания моторов4,5–25 V (клеммник внешнего питания)
Ток на канал0,6 A длительно, 1,2 A в очень коротком пике
Регулировка скорости8-битный ШИМ, setSpeed(0–255)
Какие моторы тянет4 DC-мотора, 2 шаговых или 2 DC + 1 шаговый
Сервоприводы2, питание от линии 5 V платы Arduino (D9 и D10)
ЗащитаВстроенные диоды, отключение при перегреве
Совместимые платыArduino Uno R3 и Mega 2560 (Uno R4 и Leonardo не поддерживаются)

Что есть на плате? Клеммники, разъёмы и перемычка

ЭлементНазначение
Клеммник M1 и M2 (слева)DC-моторы 1 и 2; средний винт GND — для общего провода униполярного шагового двигателя
Клеммник M3 и M4 (справа)DC-моторы 3 и 4 или порт шагового двигателя 2
EXT_PWR (+M и GND)Вход питания моторов: батарейный отсек или блок питания
Перемычка PWRЕсли установлена, соединяет питание моторов с линией Vin платы Arduino
SER1 и SERVO_2Два разъёма для сервоприводов (−, +, S); D10 и D9
Светодиод PWRПоказывает, есть ли питание моторов; если он не горит, моторы не крутятся
Кнопка RESETКопия кнопки сброса Arduino сверху на шилде
Ряд A0–A5Свободные аналоговые пины; на большинстве плат рядом есть ещё ряды +5V и GND

Какие пины занимает шилд, а какие остаются свободными?

Пин ArduinoЗадача на шилдеКогда занят?
D3Скорость M2 (ШИМ, Timer2)Когда используется M2 или шаговый двигатель 1
D4Тактовый сигнал 74HC595 (CLK)Когда используется любой DC- или шаговый мотор
D5Скорость M4 (ШИМ, Timer0)Когда используется M4 или шаговый двигатель 2
D6Скорость M3 (ШИМ, Timer0)Когда используется M3 или шаговый двигатель 2
D7Разрешение выхода 74HC595 (EN)Когда используется любой мотор
D8Вход данных 74HC595 (DATA)Когда используется любой мотор
D9Сигнал SERVO_2 (Timer1)Только когда используется этот сервопривод
D10Сигнал SER1 (Timer1)Только когда используется этот сервопривод
D11Скорость M1 (ШИМ, Timer2)Когда используется M1 или шаговый двигатель 1
D12Защёлка 74HC595 (LATCH)Когда используется любой мотор
D0, D1Не используются (последовательная линия USB)Во время загрузки кода и пока открыт монитор порта
D2Не используется; на плате есть маленькая контактная площадка для пайкиНикогда
D13Не используется, но и не выведен сверху на шилдНикогда
A0–A5 (D14–D19)Не используются; выведены рядом вдоль края платыНикогда

Шести свободных аналоговых пинов для датчиков более чем достаточно, ведь A0–A5 на Uno при необходимости работают и как цифровые пины 14–19. Практичная раскладка может быть такой: на A0 и A1 — ультразвуковой датчик расстояния HC-SR04 или Bluetooth-модуль через SoftwareSerial, на A2 и A3 — датчики линии или препятствий, на A4 и A5 — шина I2C (OLED, LCD, MPU6050). Для энкодера колеса или кнопки с attachInterrupt() свободен только D2: второй пин прерывания Uno, D3, — это пин скорости M2. Если сервоприводы не нужны, свободны ещё D9 и D10. Раскладку своей платы можно посмотреть в утилите распиновки, а возможности каждого пина — в статье Распиновка Arduino Uno.

Пока шилд установлен, не используй в коде D3–D8, D11 и D12 ни для чего другого. Если, например, подключить trig от HC-SR04 к D7 или светодиод к D12, данные, идущие в 74HC595, портятся, и моторы случайно меняют направление. Кроме того, сигнал скорости M1 и M2 идёт от Timer2: функция tone() и библиотека IRremote на Uno тоже используют Timer2, поэтому, пока они работают, регулировка скорости M1 и M2 ломается.

Питание и перемычка PWR: три правильные схемы подключения

Двухвинтовой клеммник EXT_PWR на нижнем краю платы — это вход питания моторов; плюс обычно подписан «+M» или «+», минус — «GND». Перемычка PWR рядом с ним соединяет эту линию питания моторов с пином Vin платы Arduino. Когда перемычка установлена, обе платы питаются от одного источника: напряжение, поданное на EXT_PWR, через Vin питает и Arduino, а блок питания, подключённый к гнезду питания (DC) Arduino, питает и моторы. Если перемычку снять, две линии полностью разделяются. Светодиод PWR на плате горит, только когда есть питание моторов; это первое, что стоит проверить, прежде чем разбираться с моторами.

СхемаПитание ArduinoПитание моторовПеремычка PWR
Один источник (батарея или блок питания 7–12 V)От того же источника, через VinEXT_PWR или гнездо питания (DC) ArduinoУстановлена
Arduino от USB, моторы от батарейКабель USBEXT_PWRСнята
Два отдельных источника (самый безопасный вариант)Гнездо питания (DC) или USBEXT_PWRСнята

В машинках-роботах чаще всего выбирают один источник: батарейный отсек из двух аккумуляторов 18650 подключается к EXT_PWR, перемычка ставится на место, и Arduino, и моторы работают от одной батареи. Это просто, но когда моторы на старте берут большой ток, напряжение батареи может на мгновение просесть, и Arduino перезагрузится. Если такое случается, надёжное решение — снять перемычку и питать Arduino от отдельного источника (пауэрбанк, USB или блок питания на 9 V). При опытах на столе удобнее всего вторая схема: Arduino остаётся подключённой к компьютеру, моторы работают от батарей, перемычка снята.

У клеммника EXT_PWR нет диода защиты от переполюсовки; если подключить батарею наоборот, шилд мгновенно выйдет из строя, а скорее всего, и Arduino вместе с ним. При установленной перемычке никогда не подключай отдельные источники одновременно к гнезду питания и к EXT_PWR, иначе два источника замкнутся друг на друга. И никогда не подавай питание моторов на пин 5V платы Arduino.

Какую батарею выбрать? В зависимости от тока выходные транзисторы L293D «съедают» примерно 1,5–2,6 V, так что на мотор приходит настолько меньше, чем напряжение батареи. Для жёлтых TT-моторов на 3–6 V из робонаборов идеально подходят два литиевых аккумулятора 18650 (7,4 V номинально, 8,4 V при полном заряде): моторы получают около 5,5–6 V, а при установленной перемычке и стабилизатору Arduino комфортно. Четыре батарейки AA (6 V) оставляют моторам всего около 4 V, и их не хватает, чтобы питать Arduino через Vin. Батарейка-«крона» (PP3) на 9 V не выдаёт больше нескольких сотен миллиампер: моторы либо вообще не крутятся, либо батарейка садится за считаные минуты. Время работы можно оценить с помощью калькулятора времени работы от батареи, а обо всех вариантах питания рассказано в статье Как питать Arduino от батареи.

Установка библиотеки AFMotor

  1. Открой в Arduino IDE менеджер библиотек: Инструменты › Управлять библиотеками (Tools › Manage Libraries) или Ctrl+Shift+I.
  2. Введи в строку поиска Adafruit Motor Shield. Появятся два результата: Adafruit Motor Shield library с пометкой «V1 firmware» в описании и Adafruit Motor Shield V2 Library.
  3. Для шилда L293D установи версию V1. Библиотека V2 предназначена для совсем другой платы, которая работает по I2C и построена на микросхемах TB6612.
  4. Добавь в начало скетча строку #include <AFMotor.h>.
  5. При желании открой «Файл › Примеры › Adafruit Motor Shield library › MotorTest» (File › Examples) и проверь плату с мотором на M1.
Если при компиляции появляется AFMotor.h: No such file or directory (файл не найден), значит, библиотека либо вообще не установлена, либо по ошибке установлена V2: заголовочный файл V2 называется Adafruit_MotorShield.h и с платой L293D не работает. О других проблемах с установкой библиотек — в статье Как установить библиотеку Arduino.

Первый скетч: DC-мотор вперёд, назад и на разных скоростях

Прикрути два провода мотора к двум крайним винтам клеммника M1, а средний винт GND оставь свободным. Подключи батарейный отсек к EXT_PWR, Arduino — к компьютеру по USB и сними перемычку PWR (вторая схема выше). Если светодиод PWR горит, загрузи код ниже: мотор сначала плавно разгоняется и замедляется, затем две секунды крутится назад и останавливается.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
КомандаЧто делает
AF_DCMotor motor(1);Создаёт мотор на клеммнике M1; принимает номер от 1 до 4
AF_DCMotor motor(1, MOTOR12_64KHZ);Дополнительно выбирает частоту ШИМ для M1 и M2
motor.setSpeed(200);Задаёт скорость от 0 до 255 (0 — стоп, 255 — полная скорость)
motor.run(FORWARD);Вращение вперёд
motor.run(BACKWARD);Вращение назад
motor.run(RELEASE);Перестаёт подавать питание на мотор; мотор останавливается
motor.run(BRAKE);Объявлена в библиотеке, но в V1 ничего не делает

Скорость задаётся тем, что питание мотора включается и выключается тысячи раз в секунду; подробности — в статье Что такое ШИМ?. Поскольку M1 и M2 работают от Timer2, их частоту можно выбрать: MOTOR12_64KHZ, MOTOR12_8KHZ (по умолчанию), MOTOR12_2KHZ и MOTOR12_1KHZ. На 64 kHz писк мотора становится неслышным, но L293D на такой частоте греется сильнее. А вот M3 и M4 привязаны к Timer0; этот таймер отвечает ещё и за millis() и delay(), поэтому библиотека не трогает его частоту, и эти два канала всегда работают примерно на 1 kHz.

Самая частая ошибка — забыть setSpeed(). При создании мотора библиотека выставляет скорость 0, так что даже после run(FORWARD) мотор без заданной скорости не сдвинется с места. Кроме того, большинство TT-моторов ниже 80–100 гудят, но не крутятся, поэтому запускай их со значения 100–120 и выше.

Код четырёхколёсной (4WD) машинки-робота

Жёлтый TT DC-мотор с редуктором и колесом
Жёлтый TT-мотор с редуктором из робонаборов: работает от 3–6 V, без нагрузки потребляет около 150 mA, а при заторможенном вале — больше 1 A.

Любимое применение моторного шилда L293D — четырёхколёсная машинка-робот: у каждого из четырёх моторов свой клеммник, и никакой путаницы с проводами. Руля у таких машинок нет, они поворачивают как танк: если два левых колеса крутятся в одну сторону, а два правых — в другую, машинка разворачивается на месте. Поэтому код управляет моторами не по одному, а двумя группами: левый борт и правый борт. Для управления с телефона подключаем Bluetooth-модуль HC-05 к свободным пинам A0 и A1 через SoftwareSerial; подробно модуль разобран в статье Bluetooth-модуль HC-05.

ДетальПодключение
Передний левый моторM1
Задний левый моторM2
Задний правый моторM3
Передний правый моторM4
HC-05 TXDA0 (SoftwareSerial RX)
HC-05 RXDA1 через делитель напряжения 1 kΩ + 2 kΩ (5 V → 3,3 V)
HC-05 VCC и GNDРяд +5V и GND на шилде
2 аккумулятора 18650 (7,4 V)EXT_PWR (+M и GND), перемычка PWR установлена
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-right
45    case 'S': drive(0, 0);                break;   // dur / stop
46    case 'q': speed = 255;                break;   // tam hız / full speed
47    default:
48      if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240);   // hız kademesi / speed step
49  }
50}

Сердце кода — функция drive(left, right): для каждого борта она принимает значение от -255 до 255, где плюс означает вперёд, минус — назад, а ноль — стоп. setSide() задаёт обоим моторам одного борта одинаковые скорость и направление. Команды — это одиночные буквы, которые отправляют приложения вроде «Arduino Bluetooth RC Car» из магазинов приложений: F — вперёд, B — назад, L и R — разворот на месте, G и I — поворот по дуге, S — стоп. Ползунок скорости в приложении отправляет цифру от 0 до 9; код превращает её в значение ШИМ от 90 до 240, и благодаря нижней границе 90 моторы трогаются даже на минимальной настройке. Если какое-то колесо крутится не в ту сторону, код не меняй: поменяй местами два провода этого мотора в клеммнике. Сборка шасси и вариант с двумя моторами — в статье Как сделать машинку-робота на Arduino.

Пин RXD у HC-05 работает от 3,3 V; не подключай к нему сигнал TX Arduino на 5 V, не понизив его делителем напряжения. И ещё: если связь пропадёт, машинка продолжит выполнять последнюю команду; с помощью millis() легко добавить правило безопасности, которое вызывает drive(0, 0), если с последней буквы прошла секунда.

Управление шаговыми двигателями: 28BYJ-48 и NEMA 17

Шилд может управлять двумя шаговыми двигателями одновременно: порт шагового двигателя 1 использует клеммники M1 и M2, а порт 2 — M3 и M4. Биполярный мотор (4 провода, как у NEMA 17) подключается так: одна обмотка на M1, другая на M2. У униполярного мотора (5 или 6 проводов) две обмотки тоже идут на M1 и M2, а общий провод — на винт GND в середине клеммника. Для популярного 28BYJ-48 схема такая: синий и жёлтый провода на M1, розовый и оранжевый на M2, красный общий провод на GND. Как работать с этим мотором через плату ULN2003, рассказано в статье Что такое шаговый двигатель?.

Режим шагаКак работаетКогда использовать
SINGLEОдновременно запитана одна обмоткаМинимальный ток, минимальный момент
DOUBLEЗапитаны сразу две обмоткиМомент выше; самый распространённый выбор
INTERLEAVEЧередует одну и две обмотки (полушаг)Вдвое выше разрешение, плавнее вращение
MICROSTEPТоки обмоток плавно меняются с помощью ШИМ; каждый полный шаг делится на 16Медленное и тихое вращение; момент падает

28BYJ-48 — мотор на 5 V; для этого теста питай моторы от 4 батареек AA (6 V), сними перемычку и запитай Arduino от USB. Из-за редуктора внутри мотора один оборот — это 2048 полных шагов:

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

setSpeed() задаёт число оборотов в минуту; из-за редуктора 28BYJ-48 не крутится быстрее примерно 10–15 об/мин. Важно помнить, что step() блокирующая: пока мотор не выполнит заданные шаги, loop() больше ничего не делает. Если нужно читать датчики или управлять DC-моторами, пока крутится шаговый, используй функцию библиотеки onestep() вместе с библиотекой AccelStepper; именно это показывает пример AFMotor_ConstantSpeed, который идёт вместе с библиотекой. Вызов release(), пока мотор стоит, отключает обмотки и не даёт им греться, но вал на это время теряет момент удержания.

Большинство моторов NEMA 17 потребляют 1,5–2 A на обмотку при сопротивлении обмотки около 1,5–3 Ω. Ограничения тока в L293D нет, поэтому при подключении к 12 V такие моторы во много раз превышают предел канала, и микросхема за считаные секунды отключается сама. С шилдом L293D используй только шаговые двигатели с высоким сопротивлением обмоток, которые при 12 V потребляют меньше 0,4 A; для мощных NEMA 17 правильный выбор — драйвер A4988.

Подключение сервоприводов: разъёмы SER1 и SERVO_2

Два трёхконтактных разъёма в углу шилда предназначены для сервоприводов. По маркировке на плате контакты такие: − (GND), + (5 V) и S (сигнал); коричневый провод сервопривода идёт на −, красный на +, оранжевый на S. По принципиальной схеме платы разъём SER1 подключён к D10, а SERVO_2 — к D9 (в некоторых источниках номера указаны наоборот; если сервопривод не двигается, попробуй в коде другой пин). Сервоприводами управляет стандартная библиотека Servo, а Timer1, который она использует на Uno, не конфликтует с таймерами моторов, так что DC-моторы и сервоприводы работают вместе без проблем.

Сервоприводы питаются не от батареи моторов, а от линии 5 V платы Arduino. Для SG90 это нормально, но крупные сервоприводы вроде MG996R при движении могут потреблять больше 1 A: стабилизатор Arduino греется, напряжение проседает, и плата перезагружается. С крупными сервоприводами вставляй в разъём только сигнальный провод, а + и − сервопривода питай от отдельного источника на 5–6 V и объедини земли. Подробнее — в статьях Сервопривод MG996R с Arduino и Что такое сервопривод?. Код ниже качает сервопривод на SER1 влево-вправо, пока работает мотор на M3:

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Предел тока (0,6 A) и нагрев

Самая важная строка в даташите L293D — 0,6 A длительно и 1,2 A в пике на канал. Пиковое значение относится только к очень коротким импульсам; если мотор секундами тянет 1 A, микросхеме приходится тяжело. Простой расчёт показывает, почему она греется: L293D — драйвер старого типа на биполярных транзисторах, и при 0,6 A на верхнем транзисторе обычно падает 1,4 V, а на нижнем — 1,2 V. Значит, когда мотор потребляет 0,6 A, в микросхеме выделяется 0,6 A × 2,6 V ≈ 1,6 W тепла; два мотора на одной микросхеме дают вдвое больше, около 3 W. Маленький DIP-корпус без радиатора не успевает отводить это тепло, температура быстро растёт, и в итоге тепловая защита отключает выходы. Симптом знакомый: моторы какое-то время работают, останавливаются и снова запускаются, когда микросхема остынет.

Жёлтые TT-моторы без нагрузки потребляют около 150 mA, а при езде по полу — 200–300 mA, это в пределах возможностей шилда. Проблема — в моменты, когда колесо упирается в препятствие или машинка разворачивается на месте: заторможенный TT-мотор может тянуть 1–1,5 A, а в машинке 4WD при развороте на месте напрягаются сразу все четыре мотора. Чтобы узнать реальный ток своего мотора, включи мультиметр последовательно с мотором и измерь ток, на секунду придержав колесо рукой; как это делается, показано в статье Как пользоваться мультиметром. Чтобы шилд не перегревался:

  • Используй плавный старт: не прыгай с 0 сразу на 255; поднимай скорость постепенно за 200–300 мс, и пусковой ток заметно снизится.
  • Не тормози мотор препятствием: в роботах, объезжающих препятствия, останавливай машинку до столкновения; заторможенный мотор выделяет больше всего тепла.
  • Наклей на микросхемы радиаторы: маленькие алюминиевые радиаторы на термоскотче немного снижают температуру L293D.
  • Напаяй вторую L293D: Adafruit тоже упоминает, что для увеличения допустимого тока можно напаять вторую L293D поверх имеющихся микросхем, ножка к ножке; две микросхемы делят ток между собой.
  • Не подавай больше напряжения, чем нужно: 12 V на моторы, рассчитанные на 6 V, увеличивают и ток, и нагрев.
  • Перейди на подходящий драйвер: если мотор постоянно потребляет больше 0,6 A, используй драйвер на L298N или TB6612FNG.

Моторный шилд L293D или L298N?

Двухканальный модуль драйвера моторов L298N
Модуль L298N: два H-моста в одной микросхеме, крупный радиатор и 2 A на канал; подключается проводами, поэтому подходит к любой плате.
ХарактеристикаМоторный шилд L293DМодуль L298N
Число моторов4 DC или 2 шаговых + 2 сервопривода2 DC или 1 шаговый
Ток на канал0,6 A длительно, 1,2 A в пике2 A длительно, 3 A в пике
Напряжение моторов4,5–25 V5–35 V
Падение напряженияОколо 1,5–2,6 VОколо 2–3 V
ПодключениеВставляется на Uno, без проводовПровода-перемычки; пины выбираются произвольно
Занятые пины8 фиксированных пинов + D9 и D10 для сервоприводов6 пинов (ENA, IN1–IN4, ENB)
БиблиотекаНужна AFMotorНе нужна (digitalWrite, analogWrite)
ESP32 и PicoНе подходитРаботает напрямую
Лучше всего дляМашинки 4WD с TT-моторами, учебные наборыБолее мощные моторы, роботы 2WD

Короче говоря, если на Arduino Uno собирается машинка 4WD с TT-моторами, шилд L293D сводит провода к минимуму и держит все четыре мотора на одной плате. Если моторы мощнее, плата — ESP32 или Pico или важно выбирать пины, гибче L298N; подробности — в статье Управление DC-мотором с L298N. А если нужно что-то эффективнее обоих, у TB6612FNG на MOSFET-транзисторах очень маленькое падение напряжения, и батареи живут дольше. Какой тип мотора для какой задачи подходит, сравниваем в статье DC-мотор, сервопривод или шаговый двигатель.

Можно ли использовать шилд с ESP32, Raspberry Pi Pico или Mega?

С Arduino Mega 2560 он работает без проблем: шилд садится на первые цифровые и аналоговые пины Mega, а AFMotor знает таймеры Mega. С Uno R4, Leonardo, ESP32 и Raspberry Pi Pico он не работает, потому что AFMotor пишет напрямую в регистры таймеров ATmega328P и ATmega2560. Если выбрана ESP32, сборка останавливается с ошибкой 'DC_MOTOR_PWM_RATE' was not declared in this scope (константа не объявлена в этой области видимости), а если выбрана Leonardo — с ошибкой #error "This chip is not supported!". Платы ESP32 в форм-факторе Uno (например, ESPDuino-32) физически подходят к шилду, но номера пинов и уровень сигнала 3,3 V у них другие. На таких платах гораздо проще вместо шилда взять L298N, TB6612FNG или одну микросхему L293D. Входы L293D считают HIGH всё, что выше 2,3 V, поэтому она работает с платами на 3,3 V напрямую:

Вывод L293DНазначениеRaspberry Pi PicoESP32
1 (1,2EN)Скорость (ШИМ)GP15GPIO 25
2 (1A)Направление 1GP14GPIO 26
7 (2A)Направление 2GP13GPIO 27
3 и 6 (1Y, 2Y)Выводы для мотораК моторуК мотору
4, 5, 12, 13GND (через эти выводы уходит и тепло)GNDGND
16 (VCC1)Питание логики, 5 VVBUS (пин 40)5V (VIN)
8 (VCC2)Питание моторовПлюс батареиПлюс батареи
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Земли Pico и батареи обязательно нужно соединить. На ESP32 та же логика строится на языке Arduino: направление через digitalWrite, скорость через analogWrite на пинах из таблицы. Если эти платы пока незнакомы, начни со статей Что такое ESP32? и Что такое Raspberry Pi Pico?.

Моторы не крутятся: частые ошибки и решения

СимптомВероятная причинаРешение
Ни один мотор не крутится, светодиод PWR не горитНет питания моторов: на EXT_PWR ничего не подключено или подключён только USBПодключи к EXT_PWR батарею на 6–12 V; пока светодиод не загорится, моторы крутиться не будут
Светодиод горит, код загружен, но мотор не двигаетсяВ коде нет setSpeed() или номер мотора не совпадает с клеммникомДобавь setSpeed(200) в setup(); проверь, что AF_DCMotor(1) соответствует M1
Мотор гудит, но не крутитсяСлишком низкое значение ШИМ или слабая батареяНачинай со значения выше 100; заряди батарею или возьми два аккумулятора 18650
«AFMotor.h: No such file or directory»Библиотека не установлена или вместо неё установлена V2Установи через менеджер библиотек Adafruit Motor Shield library версии V1
«This chip is not supported!» или ошибка «DC_MOTOR_PWM_RATE»В качестве платы выбрана Uno R4, Leonardo или ESP32Выбери Uno или Mega в меню «Инструменты › Плата» (Tools › Board)
Arduino перезагружается при старте моторовПусковой ток роняет напряжение батареи (просадка питания, brownout)Сними перемычку и питай Arduino отдельно; припаяй конденсатор 100 nF параллельно выводам мотора
Мотор какое-то время работает и останавливается, микросхема очень горячаяСработала тепловая защита L293DУменьши нагрузку, используй плавный старт, поставь радиаторы или перейди на L298N
Моторы случайно меняют направлениеD4, D7, D8 или D12 используется в коде для чего-то другогоПеренеси датчики на A0–A5
Скорость M1 и M2 не меняется, а M3 и M4 в порядкеTimer2 занят функцией tone() или библиотекой IRremoteПеренеси эти моторы на M3 и M4 или убери конфликтующий код
Одно колесо крутится назадПровода мотора в клеммнике перепутаныПоменяй местами два провода этого мотора
После установки шилда плата ведёт себя странноUSB-разъём Uno касается паек снизу шилда или погнут пинНаклей изоленту на верх USB-разъёма, выпрями пины и установи шилд заново
Быстрее всего найти проблему, если свести тест к самому простому варианту: отложи весь скетч машинки, подключи один мотор к M1, проверь, что светодиод PWR горит, и загрузи первый скетч выше. Если он работает, проблема в твоём коде, а не в шилде; если нет — начни с питания и библиотеки. Все причины, по которым Arduino постоянно перезагружается, собраны в статье Arduino постоянно перезагружается?.

Идеи проектов с моторным шилдом L293D

  • Машинка 4WD с управлением по Bluetooth: полноприводный робот, которым можно управлять с телефона с помощью кода выше.
  • Робот, объезжающий препятствия: машинка, которая сканирует пространство впереди датчиком HC-SR04 на сервоприводе SER1 и поворачивает туда, где свободнее всего; полное руководство — в статье Робот, объезжающий препятствия, на Arduino.
  • Робот, следующий по линии: едет по чёрной линии на полу с помощью ИК-датчиков на A0–A3; настройка ПИД-регулятора разобрана в статье Робот, следующий по линии, на Arduino.
  • Слайдер для камеры: шаговый двигатель медленно ведёт камеру по рельсу для съёмки таймлапсов.
  • Поворотная головка pan-tilt: подключи два сервопривода к двум разъёмам и наводи камеру или лазер по двум осям; если сервоприводов нужно больше, загляни в статью Робот-манипулятор на Arduino.
  • Автоматическая штора или конвейер: открывай и закрывай штору DC-мотором в зависимости от освещённости или собери маленький ленточный конвейер.

Итог правильной работы с моторным шилдом L293D: установи библиотеку V1, проверь светодиод PWR, поставь перемычку в соответствии со схемой питания, не забывай про setSpeed(), подключай датчики к A0–A5 и держи моторы ниже предела 0,6 A. Если соблюдать эти правила, маленький шилд в одиночку потянет всю «мускулатуру» четырёхмоторного робота. В приложении BlueGrays есть проекты машинки с управлением по Bluetooth, робота, объезжающего препятствия, шагового двигателя и сервопривода — пошагово, со схемами подключения и кодом.

Частые вопросы

Сколько моторов может обслуживать моторный шилд L293D?

Шилд может одновременно управлять 4 DC-моторами, каждым независимо: вперёд, назад и на разных скоростях. Вместо DC-моторов можно подключить 2 шаговых двигателя (пары M1–M2 и M3–M4) или 2 DC-мотора плюс 1 шаговый. Кроме того, есть два разъёма для сервоприводов; сервоприводы управляются с D9 и D10 независимо от моторов.

Зачем нужна перемычка PWR на моторном шилде L293D?

Когда перемычка установлена, питание моторов шилда соединено с линией Vin платы Arduino, и обе платы работают от одного источника. Если Arduino питается от USB, а моторы — от отдельной батареи, перемычку нужно снять. Если при установленной перемычке подключить отдельные источники и к гнезду питания, и к EXT_PWR, два источника замкнутся друг на друга.

Какую батарею использовать с моторным шилдом L293D?

Для машинок-роботов с TT-моторами лучше всего подходят два литиевых аккумулятора 18650 (7,4 V): L293D теряет около 2 V, так что на моторы приходит 5,5–6 V. Четыре батарейки AA оставляют моторам всего около 4 V, а батарейка-«крона» (PP3) на 9 V не даёт тока, достаточного для моторов. При подключении батареи к EXT_PWR следи за полярностью: у клеммника нет защиты от переполюсовки.

Как исправить ошибку «AFMotor.h: No such file or directory»?

Эта ошибка означает, что библиотека AFMotor не установлена. Найди в менеджере библиотек Adafruit Motor Shield и установи Adafruit Motor Shield library, в описании которой указана V1. Библиотека V2 предназначена для другой платы, и файла AFMotor.h в ней нет.

Какой ток выдерживает моторный шилд L293D и почему он греется?

Каждый канал выдаёт 0,6 A длительно и 1,2 A в очень коротких пиках. При 0,6 A на транзисторах L293D падает около 2,6 V, поэтому на каждый мотор выделяется почти 1,5 W тепла; из-за этого микросхема греется и при превышении предела отключается сама. Следи, чтобы моторы не стопорились, а для моторов, которые постоянно потребляют больше 0,6 A, используй более мощный драйвер, например L298N.

Что лучше: моторный шилд L293D или L298N?

Если на Arduino Uno собирается машинка 4WD с TT-моторами, шилд L293D удобнее: он вставляется прямо на плату без проводов и даёт четыре канала для моторов. Если моторы мощнее, используется ESP32 или Pico или хочется выбирать пины по своему усмотрению, лучше подойдёт L298N с 2 A на канал. Оба теряют около 2 V напряжения моторов.

Все проекты
Машинка на L298N с управлением по Bluetooth
#80Продвинутый
Premium

Машинка на L298N с управлением по Bluetooth

Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

5.0(38)
65
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

5.0(38)
49
Работа с шаговым мотором
#67Средний
Premium

Работа с шаговым мотором

Мотор, который поворачивается шаг за шагом ровно настолько, насколько нужно, как стрелка часов. Через плату драйвера Arduino поворачивает маленький шаговый мотор на полный оборот в одну сторону, ждёт

4.5(31)
42
Сервопривод на 360 градусов из шагового мотора
#68Средний
Premium

Сервопривод на 360 градусов из шагового мотора

Научи обычный шаговый мотор вставать на любой нужный угол по всему кругу. Arduino вычисляет, сколько шагов нужно для каждого угла; мотор по очереди поворачивается на 0, 90, 45, 180, 135 и 360 градусов

4.5(22)
32
Работа с сервоприводом
#35Новичок
Premium

Работа с сервоприводом

Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

4.7(48)
67
Управление сервоприводом потенциометром
#36Новичок
Premium

Управление сервоприводом потенциометром

Когда ты поворачиваешь ручку потенциометра, рычаг сервопривода поворачивается вместе с ней: одно крайнее положение ручки — ноль градусов, другое — пол-оборота. Arduino всё время читает положение ручки

4.6(37)
52
Управление светодиодом с телефона по Bluetooth
#34Новичок
Premium

Управление светодиодом с телефона по Bluetooth

Небольшая репетиция того, как включать и выключать свет в комнате с телефона. Bluetooth-модуль передаёт в Arduino буквы, отправленные с телефона; одна буква включает красный светодиод, другая — зелёны

4.8(68)
89
Определение чёрной и белой поверхности с TCRT5000
#78Средний
Premium

Определение чёрной и белой поверхности с TCRT5000

С маленьким датчиком, который служит глазом роботов, едущих по линии, можно узнать, чёрный пол или белый. TCRT5000 светит на пол невидимым светом и проверяет, сколько его отражается обратно; на белом

4.7(40)
49