Ардуино управление двигателем, как это осуществить, зачем нам нужен контроллер двигателей? Не можем ли мы просто подключить двигатели непосредственно к Arduino или ESP8266, как светодиод или любой другой компонент? К сожалению нет. Выходные порты микроконтроллера не способны выдержать ток, потребляемый большинством электродвигателями. Максимальный ток на выводах большинства микроконтроллеров составляет 40 мА. Маленький желтый электромотор, используемый в вашем роботе, может легко превзойти его, потребляя ток 500 мА и выше.
TB6612FNG можно использовать для привода в действие одного или двух моторов, имеющих диапазон питания по напряжению 2,5 В до 13,5 В, по номинальному постоянному току 1,2 А, и пиковому току 3,2 А (на канал), т. е. это потребляемый ток, когда вы удерживаете кратковременно мотор в неподвижном состоянии, такая ситуация происходить очень часто при движении робота. Микросхема собрана на двух стандартных H-образных мостах на полевых транзисторах, позволяющих не только контролировать направление (против часовой стрелки /по часовой) и скорость вращения моторов, а также тормозить и останавливать их.
Две пары входных сигналов (AIN1, AIN2 и BIN1, BIN2) могут использоваться для управления двумя двигателями в одном из четырех функциональных режимов — CW, CCW, короткое торможение и останов. Два выхода двигателя (A и B) могут управляться отдельно, скорость каждого двигателя регулируется с помощью входного сигнала PWM с частотой до 100 кГц. Чтобы вывести двигатель из режима ожидания, на вывод STBY следует подать высокий логический уровень.
Кроме того необходимо учитывать, какой тип моторов Вы собираетесь использовать, существуют различные типы двигателей (шаговые, постоянного тока, бесщеточные), поэтому необходимо знать, а подойдет ли контроллер к Вашему типу моторов.
Микросхема контроллера двигателя — TOSHIBA TB6612FNG:
БЫСТРЫЙ ПРОСМОТР СПЕЦИФИКАЦИЙ КОНТРОЛЛЕРА ДВИГАТЕЛЯ TB6612FNG
- Два независимых канала двунаправленного управления двигателем
- Диапазон логического напряжения микросхемы 2,7 Вольт — 5,5 Вольт
- Диапазон напряжения питания двигателя 2,5 Вольт — 13,5 Вольт
- Ток выхода — 1 Aмпер непрерывный, максимальный 3 Aмпер на канал. Имеется возможность переводить каналы на двойной выход.
АРДУИНО УПРАВЛЕНИЕ ДВИГАТЕЛЕМ И/ИЛИ ДВИГАТЕЛЯМИ | СХЕМА ПОДКЛЮЧЕНИЯ
Arduino UNO мы приобрели в магазине FYD Open Source Hardware
Контроллер для двух моторов 1А TB6612FNG приобрели там же в FYD Open Source Hardware
Роботележку, вместе с акриловой рамой, двумя моторами с колесами, роликами, корпусом для батарей и дисками для энкодеров
приобретали в магазине IGMOPNRQ module Store
Соединительные провода приобретали в магазине IGMOPNRQ module Store
Конденсаторы 0,1 мкФ — 1,0 мкФ приобрели в магазине Fantasy Electronics CO., Ltd
АРДУИНО УПРАВЛЕНИЕ ДВИГАТЕЛЕМ | ПОДРОБНОЕ ОПИСАНИЕ КОНТРОЛЛЕРА ДВИГАТЕЛЕЙ НА МИКРОСХЕМЕ TB6612FNG
Правая сторона
- VM — плюс аккумуляторной батареи электродвигателей (2,5 В -13,5 В по номинальному постоянному току 1,2 А, и пиковому току 3,2 А)
- VCC — напряжение питания логики от микроконтроллера для питания микросхемы и интерфейса с микроконтроллером (2,7 В — 5,5 В).
- GND — общая земля для напряжения двигателя и логического напряжения (все контакты GND подключены вместе)
- AO1 — Выход на (-) вывод двигателя A .
- AO2 — выход на (+) вывод двигателя A .
- BO2 — выход на (+) вывод двигателя B .
- BO1 — выход на (-) вывод двигателя B .
- GND — минус аккумуляторной батареи электродвигателей.
Левая сторона
- PWMA — вход управлением скоростью вращения электродвигателем A подключается к выходу PWM (ШИМ) микроконтроллера
- AIN2 — вход 2, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера
- AIN1 — вход 1, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера
- STBY — вход ожидания цифровой вывод на микроконтроллере или привязка к VCC
- BIN1 — вход 1, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера
- BIN2 — вход 2, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера
- PWMB — вход управлением скоростью вращения электродвигателем B подключается к выходу PWM (ШИМ) микроконтроллер
- GND — минус питания GND микроконтроллера и управления микросхемы TB6612FNG
Прежде всего, ничего не произойдет, если вывод STBY не имеет высокого уровня (логическая 1). Можно подключить этот вывод к микроконтроллеру и управлять им программно, либо просто выставить на нём логическую единицу подав на него питание с вывода VCC микросхемы TB6612FNG .
Если вы хотите, чтобы двигатель A повернулся по часовой стрелке, установите AIN1 в HIGH, AIN2 — LOW, PWMA — ШИМ
Если вы хотите, чтобы двигатель A повернулся против часовой стрелки, установите AIN1 в LOW, AIN2 — HIGH, PWMA -ШИМ
Если вы не хотите использовать управление скоростью PWM для двигателей, вы можете просто связать контакты PWMA и PWMB с VCC. В случае Arduino это будет эквивалент AnalogWrite (5,255) ;. Также в отношении значений ШИМ — вам необходимо определить минимальный рабочий цикл ШИМ для минимальной скорости, с которой вы можете управлять своими двигателями. Установите значение ШИМ слишком низко, и вы можете поместить двигатель в состояние сваливания, которое будет потреблять слишком много тока. Низкие значения PWM также могут приводить к отрывистому режиму работы.
В моем конкретном случае для минимальной скорости работы моторов было необходимо значение ШИМ равное 35. Это будет функцией вашего источника питания двигателя, размера двигателя и веса вашего робота.
Теперь, когда вы можете контролировать направление и скорость вращения каждого двигателя, вы можете легко управлять своим роботом. На нашем роботе (с двумя приводными колесами и двумя опорными свободно вращающемися колесиками от мебели) вращающийся двигатель A и B в одном направлении с одной и той же скоростью будет приводить к относительно прямому движению в этом направлении. Вращайте двигатели в противоположных направлениях, и вы получите очень быстрый поворот нулевого радиуса. Вы можете экспериментировать с разными значениями для разных типов поворотов.
Из-за сочетания плохого дизайна шасси и дешевых «желтых» китайских двигателей, скорость на каждом двигателе немного отличается. Вы можете компенсировать, изменив рабочий цикл ШИМ для одного из двигателей. Например, вы можете обнаружить, что вам необходимо установить двигатель A на 255 и двигатель B на 249 для движения по прямой линии. Для калибровки может потребоваться небольшое экспериментирование.
Каждый вывод и его функции описаны в таблице ниже.
AIN1 / BIN1 | AIN2 / BIN2 | PWMA / PWMB | A01 / B01 | A02 / B02 | Режимы работы электромоторов |
---|---|---|---|---|---|
HIGH | HIGH | HIGH/LOW | LOW | LOW | Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды) |
LOW | HIGH | HIGH | LOW | HIGH | CCW — Вращение по часовой стрелке |
LOW | HIGH | LOW | LOW | LOW | Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды) |
HIGH | LOW | HIGH | HIGH | LOW | CW — Вращение против часовой стрелке |
HIGH | LOW | LOW | LOW | LOW | Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды) |
LOW | LOW | HIGH | OFF | OFF | Stop — Стоп |
АРДУИНО УПРАВЛЕНИЕ ДВИГАТЕЛЕМ | БИБЛИОТЕКА
В Интернете хватает уже готовых программ (скетчей) для работы Arduino с микросхемой TB6612FNG, но мы не ищем легких путей, нам нужна универсальная программа на все случаи жизни Заодно вспомним как подключается библиотека в нашей незабвенной ArduinoIDE. В процессе решения задачи, выучим язык С++ .
Библиотека — это универсальная программа, уже кем то для нас с Вами написанная, с уже готовыми функциями предназначенными для решения конкретной задачи. Нам остается загрузить библиотеку в ArduinoIDE и указать ей куда мы её загрузили. Ну и конечно, при самостоятельном написании программы (скетча) в самом начале скетча, подключить библиотеку в виде файла с расширением .h , например так: #include <SparkFun_TB6612.h>
- для начала загружаем библиотеку от компании SparkFun Electronics по этой ссылке, или качаем последнюю версию из их же репозитория на GitHub, в любую папку на Вашем компьютере, главное не забыть в какую, в дальнейшем понадобится.
2. Запускаем ArduinoIDE. Жмем: Скетч (1) -> Подключить библиотеку(2) -> Добавить ZIP Библиотеку . . .(3)
3. В левой части (Folders), появившегося окна, ищем ту самую папку в которую мы загрузили библиотеку от компании SparkFun Electronics (см. пункт 1.) . В правой части (Files) находим и подсвечиваем заархивированный (.ZIP) файл: SparkFun_TB6612FNG_ Arduino_ Library_master.zip, нажимаем OK (стрелка 1)
4. В нижней части следующего появившегося окна (черная часть для сообщений), читаем сообщение: Библиотека добавлена. Проверьте меню «Подключить библиотеку»
5. Проверяем меню «Подключить библиотеку». Жмем: Скетч (1) -> Подключить библиотеку(2) — в раскрывшемся длинном списке, почти в самом конце обнаруживаем библиотеку SparkFun TB6612FNG Мотор Driver Library(3).
6. Запускаем пример программы (скетча) от SparkFun TB6612FNG Мотор Driver. Жмем: Файл (1) -> Примеры(2) -> в раскрывшемся длинном списке, почти в самом конце, обнаруживаем библиотеку SparkFun TB6612FNG Мотор Driver Library(3) -> и пример МоторTestRun(4)
7. Получаем пример программы (скетча) от SparkFun МоторTestRun. Она состоит из изменяемых входных данных и функций библиотеки SparkFun_TB6612.h
АРДУИНО УПРАВЛЕНИЕ ДВИГАТЕЛЕМ | ПРОГРАММА (СКЕТЧ)
TestRun.ino TB6612FNG H-Bridge Motor Driver Example code Michelle @ SparkFun Electronics 8/20/16 https://github.com/sparkfun/SparkFun_TB6612FNG_Arduino_Library Программа предназначена для управления 2 моторами, чтобы показать примеры функций в библиотеке. Ваш робот, по заданной программе, выполнит каждое движение в прямом и противоположное направлении, поэтому, если ваши моторы сбалансированы, робот должен оказаться в том же месте, где и начинал движение. Resources: TB6612 SparkFun Library Development environment specifics: Developed on Arduino 1.6.4 Developed with ROB-9457 ******************************************************************************/ // Подключаем библиотеку SparkFun_TB6612.h которая содержит class Motor и все // функции для этого класса #include <SparkFun_TB6612.h> // #define DEFAULTSPEED 255 // Определяем контакты для всех входов/выходов,(не забудьте сравнить номера контактов на схеме и в программе они различаются) // Самое главное, чтобы входы PWMA PWMB на микросхеме TB6612FNG были соединены с выходами ШИМ на стороне Arduino, // обычно кроме номера имеют тильду "~" в своем обозначении. Эти выводы управляют скоростью вращения моторами. #define AIN1 2 #define BIN1 7 #define AIN2 4 #define BIN2 8 #define PWMA 5 #define PWMB 6 #define STBY 9 // Если, после сборки Вашего робота, моторы вращаются не в том направлении, например при выполнении функции forward, чтобы не перепаивать // провода на моторах, проще изменить значения этих констант. Значение констант могут быть 1 или -1. const int offsetA = 1; const int offsetB = 1; // Инициализация моторов. Создаём ОБЪЕКТЫ motor1 и motor2 КЛАССА Motor, прописанного в библиотеке SparkFun_TB6612.h Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY); Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY); void setup() { //Здесь ничего } void loop() { // К объекту motor1 применим метод drive() с аргументами: скорости от -225 до 225 // и продолжительности (этот аргумент не обязателен) вращения в миллисекундах. Отрицательная скорость переключает мотор // на вращение в обратном направлении. // Тормозим функцией brake(). И делаем паузу delay() в 1 секунду. motor1.drive(255,1000); motor1.drive(-255,1000); motor1.brake(); delay(1000); //Аналогичные действия применим к объекту motor2. motor2.drive(255,1000); motor2.drive(-255,1000); motor2.brake(); delay(1000); // Для движения вперед используем функцию forward(), у которой в качестве аргументов два объекта motor1, motor2 // и скорость (аргумент не обязателен). Если для скорости используются отрицательные числа, // то получим движение назад forward(motor1, motor2, 150); delay(1000); // Для движения назад используем функции back(), с аргументами аналогичными функции forward() // если значение скорости отрицательно, то получаем движение назад. back(motor1, motor2, -150); delay(1000); // Использование функции торможения, которая принимает в качестве аргументов два двигателя. // Обратите внимание, что функции не останавливают двигатели сами по себе. brake(motor1, motor2); delay(1000); // Для поворота или разворота на месте классической двухколесной тележки робота, используем функции поворот на лево left() // и поворот на право right(), которые принимают в качестве аргументов два // мотора и скорость. Эти функции заставляют оба двигателя вращаться в разных направлениях со скоростью в 2 раза меньшей указанной в // этих функциях. left(motor1, motor2, 100); delay(1000); right(motor1, motor2, 100); delay(1000); //Use of brake again. brake(motor1, motor2); delay(1000); } Для тех кто хочет подробнее разобраться с примером МоторTestRun прилагаем листинг библиотеки SparkFun_TB6612.h и исходный текст SparkFun_TB6612.cpp
Блок схема подключения с микроконтроллеру и моторам микросхемы — TOSHIBA TB6612FNG:
Все модули
Модуль контроллера моторов от WeMos на микросхеме TB6612FNG с интерфейсом I2C на микроконтроллере STM32
Компания WeMos Electronics в 2014 году предложила простую идею, на основе микроконтроллера ESP8266 от компании Espressif Systems, спроектировала единого размера небольшие совместимые модули как для центрального микроконтроллера так и для различных периферийных устройств сочленяемых в виде этажерки, контакты которой совместимы сквозным соединением. В дальнейшем компания WeMos Electronics выпустила несколько серий модулей, для пользователей отличительными особенностями модулей различных серий является размер модуля, его цвет или как сделано в первой серии для совмещения ножек питания 3,3 Вольта в плате сделан вырез например как на ниже представленном модуле контроллера моторов WeMos на микросхеме TB6612FNG. Чтобы не занимать 7 котактов микроконтроллера ESP8266 для управления микросхемой TB6612FNG на модуле установлен микроконтроллер STM32, который общаясь с модулем ESP8266 через шину I2C используя всего 2 контакта ESP8266, тем самым предоставляя другим модулям свободные контакты основного модуля ESP8266.
Подробнее про это устройство в нашей следующей статье: WEMOS МОДУЛЬ
Все модули WeMos мы приобретали здесь (картинка кликабельна):
А на фото МОДУЛЬ ДРАЙВЕР МОТОРОВ WEMOS с STM микроконтроллером , как им управлять?
Этот модуль форм — фактора от фирмы WEMOS. Он называется: ДРАЙВЕР ДВИГАТЕЛЕЙ. WEMOS D1 MINI I2C DUAL MOTOR DRIVER TB6612FNG (1A) V1.0.0 А микроконтроллер STM32 выполняет роль контроллера управления от основного микроконтроллера через шину I2C схемой TB6612FNG