TB6612FNG + Arduino: компактный драйвер двух моторов с ШИМ
TB6612FNG это драйвер от Toshiba для двух биполярных двигателей постоянного тока: до 1.2 А непрерывно на канал и до 3.2 А в пике. Корпус MSOP-24, плата 20×20 мм. Главный конкурент L298N выигрывает у него по размеру и по нагреву в несколько раз.
Управление идёт тремя сигналами на мотор: два вывода задают направление, третий это ШИМ и задаёт скорость. Отдельный вывод STBY включает и выключает весь драйвер, и про него забывают чаще всего.
В симуляторе TB6612 как чип не моделируется, но скетч с digitalWrite на AIN1 и AIN2 плюс analogWrite на PWMA проверяется на мотор-виджете. Каркас режимов вперёд, тормоз и назад работает так же, как в настоящем роботе.
Пины и режимы
Выводы на модуле: VM (питание моторов, от 2.5 до 13.5 В), VCC (питание логики, от 2.7 до 5.5 В), GND, пары AIN1 и AIN2 для первого мотора, BIN1 и BIN2 для второго, PWMA и PWMB для скорости, STBY для включения драйвера и выходы AO1, AO2, BO1, BO2 к моторам. Управляющие сигналы Arduino дают на логику, а моторы питаются от отдельного источника.
Режимы задаются уровнями на AIN и BIN. Разные уровни задают направление: AIN1 равен HIGH, а AIN2 равен LOW, даёт вращение в одну сторону, и наоборот даёт вращение в другую. Одинаковые уровни мотор останавливают: при HIGH обмотка замыкается через выходные транзисторы, это короткое торможение, при LOW мотор просто останавливается. Это отличие от L298N важно, потому что многие переносят схему управления без оглядки на datasheet.
Выход STBY активен по низкому уровню: когда на нём LOW, драйвер переходит в режим ожидания, выходы становятся высокоимпедансными, а потребление падает до примерно 1 мкА. Для робота с двумя моторами STBY ставят в HIGH, иначе моторы просто не поедут. Это же удобный способ аварийно остановить машину одной командой в скетче. Робот-машинка на Arduino — в нишевом лендинге.
#define AIN1 7#define AIN2 8#define PWMA 9#define STBY 6void setup() { pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(STBY, OUTPUT); digitalWrite(STBY, HIGH);}void loop() { digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); for (int s = 0; s <= 255; s += 5) { analogWrite(PWMA, s); delay(20); } delay(500); digitalWrite(AIN1, HIGH); digitalWrite(AIN2, HIGH); analogWrite(PWMA, 255); delay(200); digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, 128); delay(1000);}Грабль питания: VM и VCC это разные цепи. VM питает моторы, там нужно 2.5-13.5 В, а VCC питает логику, туда нужно 2.7-5.5 В. Обе цепи должны иметь общую землю, иначе драйвер не поймёт команды Arduino. Конденсатор 10 мкФ на входе VM рядом с платой обязателен: при коммутации мотора в цепи возникают выбросы, и без конденсатора Arduino перезагружается.
Про нагрев стоит считать заранее. Сопротивление открытого канала у TB6612 около 0.5 Ом, поэтому при токе 1.2 А падение напряжения получается примерно 0.6 В и в тепло уходит около 0.7 Вт на канал. Это терпимо для платы с площадками охлаждения, но если мотор работает на пределе, добавьте радиатор или берите мотор с меньшим током. У L298N падение в разы больше, и его плата 43×43 мм греется заметно сильнее.
| Параметр | TB6612FNG | L298N |
|---|---|---|
| Число моторов | 2 | 2 |
| Ток на мотор | 1.2 А (пик 3.2 А) | 2 А (пик 3 А) |
| Падение | 0.5 Ом Rds | 1.8 В |
| Напряжение моторов | 3-15 В | 5-46 В |
| Размер | 20×20 мм | 43×43 мм |
| Нагрев | Слабый | Сильный |
Что сначала не получилось
Первый робот на TB6612 не поехал вообще. Я подал питание на моторы, подключил управление и забыл про вывод STBY: он остался в LOW, потому что я его вообще не подключал, и плата висела в режиме ожидания с потреблением около 1 мкА. Второй раз я перепутал выводы на самом модуле и подключил VM вместо VCC, из-за чего драйвер не запустился вовсе.
Третий затык был в логике направления. Я ориентировался на схему L298N, где одинаковые уровни на входах давали свободный ход, и рассчитывал так повесить мотор при остановке. С TB6612 при одинаковых уровнях обмотка замыкается, и мотор не просто останавливается, а коротко тормозит. На ровной поверхности это даже полезно, но на наклонной плоскости поведение отличается, и я поменял логику на явное торможение через оба входа в HIGH.
Личный опыт: платформа с двумя моторами
Первая платформа на TB6612 была простой тележкой: два мотора от старой машинки, колёса на редукторах, Arduino Uno и аккумулятор 7.4 В. Проверял я направление не на глаз, а логикой в скетче: счётчик шагов на каждом колесе сравнивал между собой после одинакового числа команд, и разница в счётчиках показывала, что один мотор крутится быстрее другого.
Так и выяснилось, что колёса вращаются в разные стороны: на одной стороне я подключил мотор зеркально относительно другой, как и делают в большинстве схем роботов. Пришлось поменять провода AO1 и AO2 у второго мотора. Дальше я добавил в скетч режим разворота в месте: оба мотора вперёд, но один из них переключался на полсекунды в HIGH и HIGH, чтобы затормозить. Так тележка выравнивалась сама, и колёса не уезжали в стороны на плитке.
Порядок сборки на макетке
- Общая шина GND: Arduino, блок питания моторов и плата драйвера
- VCC драйвера на 5 В от Arduino, VM на напряжение моторов от блока питания
- AIN1 на D7, AIN2 на D8, PWMA на D9, STBY на D6
- Мотор подключается к AO1 и AO2, второй к BO1 и BO2
- Конденсатор 10 мкФ параллельно входу VM, плюс к плюсу
- Проверка на столе без колёс: мотор должен крутиться свободно и не греться
Собирать на макетке лучше сначала без моторов: поставьте драйвер, запитайте логику, подайте на AIN1 и AIN2 разные уровни и убедитесь, что на выходах AO1 и AO2 появляется напряжение. Только после этого подключайте моторы. Так вы поймёте, в какой момент схема перестала работать: до или после подключения нагрузки.
Авторская позиция: что взять новичку
Берите TB6612FNG, если напряжение моторов укладывается в 13.5 В. Он меньше, холоднее и проще в пайке, чем L298N, а разница в цене для двух моторов окупается отсутствием лишних граблей с большим падением напряжения. Если моторы на 12 В и выше или ток больше 1.2 А на канал, берите L298N или сразу силовой MOSFET-драйвер. И всегда ставьте конденсатор 10 мкФ на VM и проверяйте разводку: у TB6612 силовые дорожки на плате узкие, и при токе ближе к пику их стоит пролить припоем.