КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Драйвер моторов с управляющим контроллером, 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) подключаются к выходам оптопар или датчиков Холла энкодера.
  • Выходы модуля GV (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:

    Подключение мотора 25MM 620RPM:

    • Выходы модуля GV (GND, Vcc) используются для питания энкодера.
    • Входы модуля SS (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 модулей, вы можете прочесть в этой статье.

    Настройка модуля:

    Настройка модуля заключается в указании параметров энкодера и редуктора.

    Настройка модуля на работу мотора без энкодера:

    Если драйвер работает с мотором без энкодера, то необходимо сбросить количество магнитов энкодера и указать состояние флагов инверсии вращения. Дополнительно можно указать способ остановки мотора (с освобождением или блокировкой вала).

    #include <Wire.h>                                 // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Motor.
    #include <iarduino_I2C_Motor.h>                   // Подключаем библиотеку для работы с мотором I2C-flash.
    iarduino_I2C_Motor mot(0x09);                     // Создаём объект mot для работы с функциями и методами библиотеки iarduino_I2C_Motor, указывая адрес модуля на шине I2C.
                                                      // Если объявить объект без указания адреса (iarduino_I2C_Motor mot;), то адрес будет найден автоматически.
    void setup(){                                     //
        mot.begin(&Wire);                             // Инициируем работу с мотором, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
        mot.setMagnet(0);                             // Указываем что энкодер отсутствует.
        mot.setInvGear(false, false);                 // Редуктор НЕ инвертирует направление вращения, ротор мотора вращается НЕ против часовой стрелки.
        mot.setStopNeutral(true);                     // Указываем освободить мотор при его остановке. Ротор остановленного мотора можно вращать.
    }                                                 //
                                                      //
    void loop(){                                      //
        mot.setSpeed( 50, MOT_PWM); delay(5000);      // Запускаем мотор на скорости  50% и ждём 5 секунд.
        mot.setStop();              delay(5000);      // Останавливаем мотор и ждём 5 секунд.
        mot.setSpeed(-50, MOT_PWM); delay(5000);      // Запускаем мотор на скорости -50% и ждём 5 секунд.
        mot.setStop();              delay(5000);      // Останавливаем мотор и ждём 5 секунд.
    }                                                 //
    • Настройку модуля достаточно выполнить один раз в коде функции setup().
    • Функция begin() инициирует работу с модулем.
    • Функция setMagnet() позволяет задать количество магнитов или оптических щелей энкодера. Так как данный пример демонстрирует настройку модуля на работу мотора без энкодера, то функция вызывается с параметром 0 - нет магнита или оптических щелей на валу энкодера.
    • Функция setInvGear() позволяет настроить инверсии вращения вала.
      • Первый параметр функции устанавливается в true если выходной вал редуктора вращается в сторону противоположную вращению ротора мотора.
      • Второй параметр функции устанавливается в true если ротор мотора вращается против часовой стрелки, при положительных скоростях.
    • Функция setStopNeutral() позволяет определить поведение вала при остановке. Если остановка должна быть плавной, то указывается true, иначе false.
    • В коде функции loop() демонстрируется работа модуля.
    • Функция setSpeed() задаёт скорость и направление вращения мотора, а функция setStop()останавливает мотор.
    • Если модуль настроен правильно, то выходной вал редуктора будет вращаться по часовой стрелке при положительных скоростях.

    Настройка модуля на работу мотора с энкодером:

    Если драйвер работает с мотором и энкодером, то необходимо указать количество магнитов энкодера, состояние флагов инверсии вращения и передаточное отношение редуктора. Дополнительно можно указать способ остановки мотора (с освобождением или блокировкой вала) и процент отклонения скорости до установки ошибки.

    #include <Wire.h>                                 // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_Motor.
    #include <iarduino_I2C_Motor.h>                   // Подключаем библиотеку для работы с мотором I2C-flash.
    iarduino_I2C_Motor mot(0x09);                     // Создаём объект mot для работы с функциями и методами библиотеки iarduino_I2C_Motor, указывая адрес модуля на шине I2C.
                                                      // Если объявить объект без указания адреса (iarduino_I2C_Motor mot;), то адрес будет найден автоматически.
    void setup(){                                     //
        mot.begin(&Wire);                             // Инициируем работу с мотором, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
        mot.setMagnet(7);                             // Указываем что энкодер установленный на роторе мотора содержит 7 магнитов или 7 оптических щелей.
        mot.setInvGear(false, false);                 // Редуктор НЕ инвертирует направление вращения, ротор мотора вращается НЕ против часовой стрелки.
        mot.setReducer(10.0);                         // Указываем передаточное отношение редуктора 10.0 = 1:10. Если редуктора нет, то указывается 1.0 = 1:1.
        mot.setStopNeutral(true);                     // Указываем освободить мотор при его остановке. Ротор остановленного мотора можно вращать.
        mot.setError(20);                             // Указываем устанавливать ошибку при отклонении заданной скорости от реальной более чем на 20%.
    }                                                 //
                                                      //
    void loop(){                                      //
        mot.setSpeed( 120, MOT_RPM); delay(5000);     // Запускаем мотор на скорости  120 об/мин и ждём 5 секунд.
        mot.setStop();               delay(5000);     // Останавливаем мотор и ждём 5 секунд.
        mot.setSpeed(-120, MOT_RPM); delay(5000);     // Запускаем мотор на скорости -120 об/мин и ждём 5 секунд.
        mot.setStop();               delay(5000);     // Останавливаем мотор и ждём 5 секунд.
    }                                                 //
    • Настройку модуля достаточно выполнить один раз в коде функции 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.

    #include <Wire.h>                      // Подключаем библиотеку Wire для работы с шиной I2C.
    const int ADDRESS = 0x09;              // Адрес модуля на шине I2C.
    const int REG_DEV = 0x0A;              // Адрес регистра «MAX_RPM_DEV» содержащего максимальный % отклонения скорости.
    const int REG_MAG = 0x11;              // Адрес регистра «MAGNET» содержащего количество магнитов или оптических щелей энкодера.
    const int REG_RED = 0x12;              // Адрес младшего байта регистра «REDUCER» содержащего передаточное отношение редуктора.
    const int REG_RPM = 0x17;              // Адрес младшего байта регистра «SET_RPM» задающего скорость вращения вала через обороты в минуту.
    const int REG_STP = 0x24;              // Адрес регистра «STOP» содержащего биты остановки вала.
    const int REG_BIT = 0x25;              // Адрес регистра «BITS_2» содержащего биты инверсии направления вращения.
                                           //
    void setup(){                          //
        Wire.setClock(100000L);            // Устанавливаем скорость передачи данных по шине I2C.
        Wire.begin();                      // Инициируем работу c шиной I2C в качестве мастера.
    //  setMagnet(7):                      //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_MAG );             // Указываем адрес регистра.
        Wire.write( 7 );                   // Указываем значение для записи в регистр.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(10);                         // Добавляем задержку между пакетами.
    //  setInvGear(false, false):          // 
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_BIT );             // Указываем адрес регистра.
        Wire.write( 0 );                   // Указываем значение для записи в регистр.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(10);                         // Добавляем задержку между пакетами.
    //  setReducer(10.0):                  //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_RED );             // Указываем адрес регистра.
        Wire.write(((uint32_t)10*100)>>0); // Указываем значение для записи в младший байт регистра.
        Wire.write(((uint32_t)10*100)>>8); // Указываем значение для записи в средний байт регистра.
        Wire.write(((uint32_t)10*100)>>16);// Указываем значение для записи в старший байт регистра.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(10);                         // Добавляем задержку между пакетами.
    //  setError(20):                      //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_DEV );             // Указываем адрес регистра.
        Wire.write( 20 );                  // Указываем значение для записи в регистр.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(10);                         // Добавляем задержку между пакетами.
    }                                      //
                                           //
    void loop(){                           //
    //  setSpeed( 120, MOT_RPM):           //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_RPM );             // Указываем адрес регистра.
        Wire.write( (uint8_t)( 120 >> 0)); // Указываем значение для записи в младший байт регистра.
        Wire.write( (uint8_t)( 120 >> 8)); // Указываем значение для записи в старший байт регистра.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(5000);                       // Ждём 5 секунд, для наблюдения за скоростью и направлением.
    //  setStop():                         //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_STP );             // Указываем адрес регистра.
        Wire.write( 0b00000011 );          // Указываем значение для записи в регистр.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(5000);                       // Ждём 5 секунд, для наблюдения за остановкой.
    //  setSpeed(-120, MOT_RPM):           //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_RPM );             // Указываем адрес регистра.
        Wire.write( (uint8_t)(-120 >> 0)); // Указываем значение для записи в младший байт регистра.
        Wire.write( (uint8_t)(-120 >> 8)); // Указываем значение для записи в старший байт регистра.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(5000);                       // Ждём 5 секунд, для наблюдения за скоростью и направлением.
    //  setStop():                         //
        Wire.beginTransmission(ADDRESS);   // Инициируем передачу данных.
        Wire.write( REG_STP );             // Указываем адрес регистра.
        Wire.write( 0b00000011 );          // Указываем значение для записи в регистр.
        Wire.endTransmission();            // Выполняем инициированную ранее передачу данных.
        delay(5000);                       // Ждём 5 секунд, для наблюдения за остановкой.
    }                                      //

    Если для остановки мотора записывать в регистр 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 поддерживаются только модулем с установленным энкодером.

    Ссылки:




    Обсуждение

    Гарантии и возврат Используя сайт Вы соглашаетесь с условями