Драйвер моторов с управляющим контроллером, FLASH-I2C
![]() | ![]() |
Общие сведения:
Модуль — Драйвер моторов с управляющим контроллером, I2C-flash — является драйвером коллекторных моторов с управлением по шине I2С.
Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.
Для запуска мотора достаточно передать модулю число, определяющее коэффициент заполнения ШИМ от 0 до ±100%, значение определяет скорость, а знак, направление вращения мотора.
Модуль позволяет блокировать (стопорить) и освобождать вал остановленного (останавливаемого) мотора. В первом случае остановка мотора осуществляется с резким торможением и последующим удержанием вала, а во втором, торможение осуществляется плавно, по инерции, без удержания вала.
Модуль может получать данные с магнитного или оптического энкодера установленного на ротор мотора. В таком случае модулю нужно задать количество магнитов или оптических щелей энкодера. После чего скорость можно задавать не только коэффициентом заполнения ШИМ, но и количеством полных оборотов в минуту. Наличие энкодера позволит не только задавать скорость, но и получать реальную скорость вала и количество совершённых оборотов, даже если он вращается посредством внешних сил. Если на роторе мотора установлен редуктор, то модулю нужно указать его передаточное отношение.
Видео:
Спецификация:
- Напряжение питания логики: 5 В (номинально), или 3,3 В.
- Диапазон напряжений мотора поддерживаемый драйвером: 2,7 В . 12 В.
- Максимальный ток мотора поддерживаемый драйвером: до 3 А (пиковый ток до 4 А).
- Драйвер оснащён защитой от перегрева и перегрузки по току.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: Vcc.
- Уровень логической 1 сигналов с энкодера: Vcc.
- Рабочая температура: от -20 до +70 °С.
- Габариты: 45 х 25 мм.
- Вес: 7 г.
Подключение:
Перед подключением модуля ознакомьтесь с разделом «Смена адреса модуля на шине I2C» в данной статье.
Назначение разъёмов модуля:
Разъем из 4 выводов шины I2C (используется для подключения модуля к Arduino).
- SCL — вход/выход линии тактирования шины I2C.
- SDA — вход/выход линии данных шины I2C.
- 5V — вход питания +5 В (номинально), или 3,3 В.
- GND — общий вывод питания (соединён с выводом питания мотора -VMOT).
Разъем из 2 выводов используется для подключения проводов питания мотора.
- +VMOT — вход питания мотора от +2,7 В до +12 В.
- -VMOT — общий вывод питания (соединён с выводом GND).
Разъем из 6 выводов используется для подключения мотора и энкодера.
- Выходы модуля M, M (Motor) используются для питания мотора.
- Входы модуля S,S (Signal) подключаются к выходам оптопар или датчиков Холла энкодера.
- Выходы модуля G, V (GND, Vcc) используются для питания энкодера.
Если у мотора нет энкодера, то выводы G (GND), V (Vcc), S, S (Signal) не используются.
Энкодер: устройство позволяющее определять наличие и направление поворотов. На моторах, чаще всего, устанавливают оптические или магнитные энкодеры. Оптический энкодер состоит из двух оптопар и щелевого диска. Магнитный энкодер состоит из двух датчиков Холла и магнитного диска. Диск (магнитный или щелевой) устанавливается на валу ротора мотора.
Подключение мотора без энкодера:
- При подключении мотора без энкодера используются только выводы M (Motor).
- Выводы G (GND), V (Vcc), S, S (Signal) остаются не задействованы.
Подключение мотора GM12-N20:
Подключение мотора с энкодером:
- Для подключения мотора используются выводы M.
- Для подключения энкодера используются выводы G (GND), V (Vcc), S, S (Signal).
Подключение мотора GM12-N20:
- Выходы модуля G, V (GND, Vcc) используются для питания энкодера.
- Входы модуля S, S (Signal) подключаются к выходам оптопар или датчиков Холла энкодера.
Подключение модуля к управляющей плате:
Модуль подключается к аппаратной или программной шине I2C Arduino. В комплекте имеется кабель для быстрого и удобного подключения модуля к колодке I2C на Trema Shield. Если на шине I2C уже имеется другое устройство, то для подключения модуля, предлагаем воспользоваться I2C Hub.
Питание:
Входное напряжение питания модуля 5В (номинально), или 3,3 В постоянного тока, подаётся на выводы 5V и GND.
Входное напряжение питания мотора от 2,7В до 12В постоянного тока, подаётся на выводы +VMOT и -VMOT.
Подробнее о модуле:
Модуль построен на базе микроконтроллера STM32F030F4, драйвера DRV8833 и снабжен собственным стабилизатором напряжения. Модуль способен поддерживать заданную скорость и направление вращения вала, сверяясь с показаниями энкодера. На плате модуля имеется красный светодиод информирующий об отличии реальной скорости от заданной.
Модуль без энкодера позволяет:
- Менять свой адрес на шине I2C.
- Управлять внутренней подтяжкой линий шины I2C (по умолчанию включена).
- Указывать борт установки модуля (модуль левого колеса / модуль правого колеса).
- Задавать скорость вращения вала от 0 до ±100%, при этом знак определяет направление.
- Останавливать двигатель и/или указать тип его остановки. Двигатель может быть остановлен двумя способами: отключением мотора (свободный ход) или торможением (стопор).
Заданный тип применяется ко всем последующим остановкам двигателя. - Останавливать двигатель по истечении заданного времени.
- Определять наличие ошибки драйвера (перегрузка по току, перегрев, низкое напряжение).
Модуль с энкодером дополнительно позволяет:
- Указывать передаточное отношение редуктора мотора.
- Указывать количество магнитов или оптических щелей энкодера.
- Задавать скорость вращения вала, указав количество оборотов в минуту или метров в секунду. Во всех случаях можно указывать отрицательные значения для вращения в обратную сторону.
- Получать флаг отличия заданной скорости вращения вала от реальной, а так же указывать процент отклонения при котором будет устанавливаться данный флаг. На плате модуля имеется красный светодиод, который дублирует состояние этого флага.
- Узнавать текущую скорость вращения вала.
Скорость вращения вала определяется по показаниям энкодера, даже если мотор отключён, а вал вращается по средством внешних сил. - Узнавать количество совершённых полных оборотов вала.
Количество оборотов вала определяется по показаниям энкодера, даже если мотор отключён, а вал вращается по средством внешних сил. - Остановить двигатель по истечении заданного количества полных оборотов вала. А зная размеры колеса, можно остановить двигатель по прохождении указанного расстояния.
Специально для работы с модулем — Драйвер моторов с управляющим контроллером, I2C-flash, нами разработана библиотека iarduino_I2C_Motor которая позволяет реализовать все функции модуля.
Подробнее про установку библиотеки читайте в нашей инструкции.
Смена адреса модуля на шине I2C:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09. Если вы планируете подключать более 1 модуля на шину I2C, необходимо изменить адреса модулей таким образом, чтобы каждый из них был уникальным. Более подробно о том, как изменить адрес, а также о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
Настройка модуля:
Настройка модуля заключается в указании параметров энкодера и редуктора.
Настройка модуля на работу мотора без энкодера:
Если драйвер работает с мотором без энкодера, то необходимо сбросить количество магнитов энкодера и указать состояние флагов инверсии вращения. Дополнительно можно указать способ остановки мотора (с освобождением или блокировкой вала).
- Настройку модуля достаточно выполнить один раз в коде функции setup() .
- Функция begin() инициирует работу с модулем.
- Функция setMagnet() позволяет задать количество магнитов или оптических щелей энкодера. Так как данный пример демонстрирует настройку модуля на работу мотора без энкодера, то функция вызывается с параметром 0 — нет магнита или оптических щелей на валу энкодера.
- Функция setInvGear() позволяет настроить инверсии вращения вала.
- Первый параметр функции устанавливается в true если выходной вал редуктора вращается в сторону противоположную вращению ротора мотора.
- Второй параметр функции устанавливается в true если ротор мотора вращается против часовой стрелки, при положительных скоростях.
- Функция setStopNeutral() позволяет определить поведение вала при остановке. Если остановка должна быть плавной, то указывается true , иначе false .
- В коде функции loop() демонстрируется работа модуля.
- Функция setSpeed() задаёт скорость и направление вращения мотора, а функция setStop() останавливает мотор.
- Если модуль настроен правильно, то выходной вал редуктора будет вращаться по часовой стрелке при положительных скоростях.
Настройка модуля на работу мотора с энкодером:
Если драйвер работает с мотором и энкодером, то необходимо указать количество магнитов энкодера, состояние флагов инверсии вращения и передаточное отношение редуктора. Дополнительно можно указать способ остановки мотора (с освобождением или блокировкой вала) и процент отклонения скорости до установки ошибки.
- Настройку модуля достаточно выполнить один раз в коде функции setup() .
- Функция begin() инициирует работу с модулем.
- Функция setMagnet() позволяет задать количество магнитов или оптических щелей энкодера. В данном примере указано 7 магнитов или оптических щелей.
- Функция setInvGear() позволяет настроить инверсии вращения вала.
- Первый параметр функции устанавливается в true если выходной вал редуктора вращается в сторону противоположную вращению ротора мотора.
- Второй параметр функции устанавливается в true если ротор мотора вращается против часовой стрелки, при положительных скоростях.
- Функция setReducer() позволяет указать передаточное отношение редуктора, от 1: 0,01 до 1: 167’772,15 . В данном примере указано 1: 10,0 .
- Функция setStopNeutral() позволяет определить поведение вала при остановке. Если остановка должна быть плавной, то указывается true , иначе false .
- Функция setError() позволяет задать процент максимального отклонения скорости до установки ошибки. В данном примере, если заданная скорость будет отличаться от реальной более чем на 20 %, то установится флаг ошибки, а на плате включится красный светодиод.
- В коде функции loop() демонстрируется работа модуля.
- Функция setSpeed() задаёт скорость и направление вращения мотора, а функция setStop() останавливает мотор.
- Если модуль настроен правильно, то выходной вал редуктора будет вращаться по часовой стрелке при положительных скоростях.
Настройка модуля при помощи регистров:
Карта всех регистров модуля с их подробным описанием доступна на странице Wiki — Мотор-редуктор с управляющим контроллером, I2C-flash — Datasheet.
- В предыдущих разделах модуль был настроен при помощи функций: setMagnet() , setInvGear() , setReducer() и setError() .
- Работа модуля была продемонстрирована функциями setSpeed() и setStop() .
- Функция setMagnet() записывает значение параметра в регистр 0x11 «MAGNET» .
- Функция setInvGear() записывает значение параметров в регистр 0x25 «BITS_2» .
- Функция setReducer() записывает значение параметра в регистры 0x12-14 «REDUCER» .
- Функция setStopNeutral() сохраняет бит поведения вала при остановке в регистр «STOP» .
- Функция setError() записывает значение параметра в регистр 0x0A «MAX_RPM_DEV» .
- Функция setSpeed() записывает значение в регистры «SET_PWM» или «SET_RPM» .
- Функция setStop() устанавливает бит остановки в регистре 0x24 «STOP» или записывает условие остановки в регистры 0x1E-20 «STOP_REV» , или 0x21-23 «STOP_TMR» .
Следующий пример выполняет те же действия, что и пример из раздела «Настройка модуля на работу мотора с энкодером», но без использования библиотеки iarduino_I2C_Motor.
Если для остановки мотора записывать в регистр REG_STP значение 0b00000010 , то мотор будет останавливаться резко, в отличии от плавной остановки записью значения 0b00000011 .
Примеры работы с модулем:
Примеры работы с модулем при помощи библиотеки iarduino_I2C_Motor и описание всех её функций, доступны на странице Wiki — Мотор-редуктор с управляющим контроллером, FLASH-I2C.
Сама библиотека содержит больше примеров, доступных из меню Arduino IDE: Файл / Примеры / iarduino I2C Motor (мотор).
Функции setSpeed() , getSpeed() , setStop() и getSum() , вызванные с параметрами MOT_RPM, MOT_M_S, MOT_MET и MOT_REV поддерживаются только модулем с установленным энкодером.