Моторный шилд 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 и как он работает?
Чтобы крутить 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.
Питание и перемычка PWR: три правильные схемы подключения
Двухвинтовой клеммник EXT_PWR на нижнем краю платы — это вход питания моторов; плюс обычно подписан «+M» или «+», минус — «GND». Перемычка PWR рядом с ним соединяет эту линию питания моторов с пином Vin платы Arduino. Когда перемычка установлена, обе платы питаются от одного источника: напряжение, поданное на EXT_PWR, через Vin питает и Arduino, а блок питания, подключённый к гнезду питания (DC) Arduino, питает и моторы. Если перемычку снять, две линии полностью разделяются. Светодиод PWR на плате горит, только когда есть питание моторов; это первое, что стоит проверить, прежде чем разбираться с моторами.
| Схема | Питание Arduino | Питание моторов | Перемычка PWR |
|---|---|---|---|
| Один источник (батарея или блок питания 7–12 V) | От того же источника, через Vin | EXT_PWR или гнездо питания (DC) Arduino | Установлена |
| Arduino от USB, моторы от батарей | Кабель USB | EXT_PWR | Снята |
| Два отдельных источника (самый безопасный вариант) | Гнездо питания (DC) или USB | EXT_PWR | Снята |
В машинках-роботах чаще всего выбирают один источник: батарейный отсек из двух аккумуляторов 18650 подключается к EXT_PWR, перемычка ставится на место, и Arduino, и моторы работают от одной батареи. Это просто, но когда моторы на старте берут большой ток, напряжение батареи может на мгновение просесть, и Arduino перезагрузится. Если такое случается, надёжное решение — снять перемычку и питать Arduino от отдельного источника (пауэрбанк, USB или блок питания на 9 V). При опытах на столе удобнее всего вторая схема: 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
- Открой в Arduino IDE менеджер библиотек: Инструменты › Управлять библиотеками (Tools › Manage Libraries) или Ctrl+Shift+I.
- Введи в строку поиска Adafruit Motor Shield. Появятся два результата: Adafruit Motor Shield library с пометкой «V1 firmware» в описании и Adafruit Motor Shield V2 Library.
- Для шилда L293D установи версию V1. Библиотека V2 предназначена для совсем другой платы, которая работает по I2C и построена на микросхемах TB6612.
- Добавь в начало скетча строку #include <AFMotor.h>.
- При желании открой «Файл › Примеры › Adafruit Motor Shield library › MotorTest» (File › Examples) и проверь плату с мотором на M1.
Первый скетч: DC-мотор вперёд, назад и на разных скоростях
Прикрути два провода мотора к двум крайним винтам клеммника M1, а средний винт GND оставь свободным. Подключи батарейный отсек к EXT_PWR, Arduino — к компьютеру по USB и сними перемычку PWR (вторая схема выше). Если светодиод PWR горит, загрузи код ниже: мотор сначала плавно разгоняется и замедляется, затем две секунды крутится назад и останавливается.
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.
Код четырёхколёсной (4WD) машинки-робота

Любимое применение моторного шилда L293D — четырёхколёсная машинка-робот: у каждого из четырёх моторов свой клеммник, и никакой путаницы с проводами. Руля у таких машинок нет, они поворачивают как танк: если два левых колеса крутятся в одну сторону, а два правых — в другую, машинка разворачивается на месте. Поэтому код управляет моторами не по одному, а двумя группами: левый борт и правый борт. Для управления с телефона подключаем Bluetooth-модуль HC-05 к свободным пинам A0 и A1 через SoftwareSerial; подробно модуль разобран в статье Bluetooth-модуль HC-05.
| Деталь | Подключение |
|---|---|
| Передний левый мотор | M1 |
| Задний левый мотор | M2 |
| Задний правый мотор | M3 |
| Передний правый мотор | M4 |
| HC-05 TXD | A0 (SoftwareSerial RX) |
| HC-05 RXD | A1 через делитель напряжения 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 установлена |
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.
Управление шаговыми двигателями: 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 полных шагов:
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(), пока мотор стоит, отключает обмотки и не даёт им греться, но вал на это время теряет момент удержания.
Подключение сервоприводов: разъёмы 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:
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?

| Характеристика | Моторный шилд L293D | Модуль L298N |
|---|---|---|
| Число моторов | 4 DC или 2 шаговых + 2 сервопривода | 2 DC или 1 шаговый |
| Ток на канал | 0,6 A длительно, 1,2 A в пике | 2 A длительно, 3 A в пике |
| Напряжение моторов | 4,5–25 V | 5–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 Pico | ESP32 |
|---|---|---|---|
| 1 (1,2EN) | Скорость (ШИМ) | GP15 | GPIO 25 |
| 2 (1A) | Направление 1 | GP14 | GPIO 26 |
| 7 (2A) | Направление 2 | GP13 | GPIO 27 |
| 3 и 6 (1Y, 2Y) | Выводы для мотора | К мотору | К мотору |
| 4, 5, 12, 13 | GND (через эти выводы уходит и тепло) | GND | GND |
| 16 (VCC1) | Питание логики, 5 V | VBUS (пин 40) | 5V (VIN) |
| 8 (VCC2) | Питание моторов | Плюс батареи | Плюс батареи |
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-разъёма, выпрями пины и установи шилд заново |
Идеи проектов с моторным шилдом 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
Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

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

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

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

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

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

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

Определение чёрной и белой поверхности с TCRT5000
С маленьким датчиком, который служит глазом роботов, едущих по линии, можно узнать, чёрный пол или белый. TCRT5000 светит на пол невидимым светом и проверяет, сколько его отражается обратно; на белом
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

