L298N, L9110S или TB6612: какой драйвер моторов выбрать?
Сравниваем четыре популярных драйвера моторов: напряжение питания, ток, сколько вольт теряет каждый, число пинов на мотор и способ остановки. Какой подойдёт маленькому роботу с моторами TT и почему.

Фото: Les Pounder · CC BY-SA 2.0
Пин Arduino может безопасно отдать около 20 мА. Мотор-редуктор TT потребляет около 0,3 А во время езды и примерно до 1 А, когда его вал заблокирован. Поэтому между ними стоит драйвер моторов: ток от батареи идёт через драйвер к мотору, а Arduino только говорит драйверу, что делать.
В маленьких роботах чаще всего встречаются четыре драйвера: L298N, L9110S, MX1508 и TB6612FNG (его часто называют просто TB6612). Работу они делают одну и ту же, но по-разному, и эта разница видна в скорости, во времени работы от батареек и в коде.
Внутри каждого драйвера — H-мост
На каждой плате два H-моста, по одному на мотор. H-мост — это четыре электронных ключа (по сути, выключателя) вокруг мотора. На схеме он похож на букву H, а мотор в ней — перекладина посередине. Включена одна пара ключей по диагонали — мотор крутится вперёд. Включена другая пара — назад. Включены оба нижних ключа или оба верхних — выводы мотора соединяются между собой, и вращающийся мотор быстро тормозит. Все четыре выключены — мотор вращается по инерции, пока не остановится.
Драйверы различаются тем, из чего сделаны их ключи и какие пины ими управляют.
Сравниваем четыре драйвера
| Драйвер | Напряжение моторов | Ток на мотор | Падение напряжения внутри | Пинов на мотор | При одинаковых входах |
|---|---|---|---|---|---|
| L298N | 5–35 В | до 2 А (около 1 А без дополнительного охлаждения) | около 1,8–2 В | 3: ENA, IN1, IN2 | тормоз, пока на ENA HIGH |
| L9110S | 2,5–12 В | около 0,8 А | около 1,85 В при 0,75 А | 2 | оба LOW или оба HIGH: остановка |
| MX1508 | 2–9,6 В | около 1,5 А | небольшое | 2 | оба LOW: по инерции; оба HIGH: тормоз |
| TB6612FNG | 4,5–13,5 В | 1,2 А | очень малое | 3: PWMA, AIN1, AIN2, плюс STBY | оба LOW: по инерции; оба HIGH: тормоз |
Мотором B у L298N управляют пины ENB, IN3 и IN4. Если на ENA у L298N подан LOW, мотор свободно вращается по инерции, что бы ни было на IN1 и IN2.
Биполярные транзисторы или MOSFET: куда уходят вольты
В L298N ключами служат биполярные транзисторы. Даже на полностью включённом биполярном транзисторе остаётся около вольта. Ток мотора всегда проходит через два ключа: один со стороны плюса батареи, другой со стороны GND. Вместе они теряют около 1,8–2 В, а с ростом тока — ещё больше.
В робот-машине CoreEngine четыре батарейки AA дают около 6 В. Около 1,8 В остаётся внутри L298N, поэтому моторам достаётся около 4,2 В. Эта потеря превращается в микросхеме в тепло. Вот почему на модуле стоит большой металлический радиатор.
Полевой транзистор (MOSFET) работает иначе. Полностью включённый, он ведёт себя как небольшой резистор, поэтому потеря напряжения — это просто ток × сопротивление. При токах моторов TT это доли вольта. По даташиту TB6612FNG два ключа вместе теряют около 0,15 В при 0,3 А. В MX1508 тоже стоят MOSFET. С такими драйверами моторы получают почти всё напряжение батареи.
Сильнее всего потери заметны при низком напряжении. Два потерянных вольта от источника 12 В — это шестая часть. От четырёх батареек AA — уже треть. Маленькие роботы работают от низкого напряжения, поэтому именно здесь драйвер на MOSFET помогает больше всего. Маленький L9110S тут не поможет: по его даташиту теряется около 1,85 В при 0,75 А.
Драйверы на два пина: одинаковые входы — разный результат
У L9110S и MX1508 нет пина разрешения (enable). У каждого мотора два входа, и эта пара задаёт и направление, и скорость. Чтобы менять скорость, один вход вы держите в постоянном состоянии, а на другой подаёте широтно-импульсную модуляцию (ШИМ).
А вот одинаковые сигналы на обоих входах эти две микросхемы понимают по-разному:
| Входы | MX1508 | L9110S |
|---|---|---|
| оба LOW | выходы отключены: мотор вращается по инерции | оба выхода LOW: мотор останавливается |
| оба HIGH | тормоз | оба выхода LOW: мотор останавливается |
ШИМ включает и выключает вход сотни раз в секунду. Если второй вход держать в LOW, то в каждой паузе между импульсами оба входа оказываются одинаковыми. В эти моменты MX1508 оставляет мотор вращаться по инерции, а L9110S его останавливает. Поэтому одно и то же значение скорости может дать разную скорость, а робот, который с одним драйвером плавно докатывается до остановки, с другим останавливается резко. Код, написанный для одной платы, не обязательно подойдёт для другой. Сверяйтесь с таблицей истинности именно той платы, которую покупаете.
Какой выбрать для маленького робота с моторами TT?
Выбирайте драйвер по току при блокировке вала, а не по току во время езды. Каждый пуск начинается с короткой блокировки, когда ток доходит примерно до 1 А. А если робот упёрся в стену, его моторы так и остаются застопоренными.
- L9110S: маленький и простой. Его 0,8 А хватает для езды, но застопоренный мотор TT может потребовать больше.
- MX1508: маленький и работает от четырёх батареек AA. Его 1,5 А хватает и при блокировке, а теряет он мало. Код управления скоростью для него пишется под два пина.
- TB6612FNG: лучше всех подходит для этой задачи. Теряет очень мало, его 1,2 А хватает при блокировке, а управляется он как L298N: один пин ШИМ и два пина направления на каждый мотор. На его пине STBY должен быть HIGH, иначе выходы останутся выключенными.
- L298N: большой, и моторам достаётся примерно на 1,8 В меньше. Зато он надёжный, распространённый и простой в подключении.
Для нового робота на четырёх батарейках AA драйвер на MOSFET, например TB6612FNG, передаст моторам больше всего напряжения батареи. L298N — беспроигрышный и распространённый вариант, и именно он используется на этом сайте.
Почему в робот-машине CoreEngine стоит L298N
- Он распространённый и надёжный. Он входит во многие наборы робот-машин. До 2 А на канал — это намного больше, чем нужно моторам TT во время езды, а ещё у него есть радиатор и винтовые клеммы.
- Он питает Uno. Его собственный стабилизатор на 5 В подаёт питание на пин 5V платы Uno (около 4,4 В от четырёх батареек AA, и этого достаточно), так что всего робота питает один батарейный отсек.
- Его код легко читать. Скорость задаётся на ENA и ENB, направление — на IN1–IN4.
- Он есть в симуляторе, причём с учётом падения напряжения, так что каждый проект с этого сайта можно сначала проверить там.
Про его пины рассказывает урок Моторы и драйвер L298N, а сам модуль есть в Маркете.
Как потом перейти на другой драйвер
Все скетчи на сайте управляют драйвером через одну небольшую функцию:
// speed from -255 (full backwards) to 255 (full forwards); 0 lets the motor coast
void setMotor(byte enablePin, byte inA, byte inB, int speed) {
speed = constrain(speed, -255, 255);
digitalWrite(inA, speed > 0);
digitalWrite(inB, speed < 0);
analogWrite(enablePin, abs(speed));
}Всё остальное — drive(), конечный автомат, таймеры — только вызывает эту функцию.
Переход на TB6612FNG. PWMA, AIN1 и AIN2 занимают место ENA, IN1 и IN2, а PWMB, BIN1 и BIN2 — место ENB, IN3 и IN4. Моторы подключаются к выходам A и B, выводы правого мотора, как и раньше, меняются местами. STBY и VCC (питание логики) идут на 5V платы Uno, VM — на плюс батареи, а все GND соединяются вместе. setMotor() работает без изменений. Меняются три вещи:
- Моторы получают больше напряжения, поэтому при том же значении скорости робот едет быстрее. Заново подберите длительности, например время поворота в проекте Первый заезд.
- В паузах между импульсами ШИМ TB6612FNG тормозит мотор, а L298N оставляет его вращаться по инерции.
- У него нет стабилизатора на 5 В, поэтому Uno нужно своё питание, например USB-пауэрбанк, подключённый к USB-разъёму платы.
Переход на MX1508 или L9110S. Здесь setMotor() придётся изменить, потому что пина разрешения нет. Каждому мотору нужен сигнал ШИМ на одном из двух входов, поэтому проверьте, какие пины с ШИМ ещё свободны. Стабилизатора на 5 В нет ни на одной из этих плат.
Какой бы драйвер вы ни выбрали, соедините его GND с GND платы Uno: сигналы имеют смысл только относительно общей земли. Что нужно самим моторам, читайте в статье Мотор-редукторы TT: что означают цифры.