View Categories

Драйвер моторов L9110S

Популярный модуль драйвера для двух моторов. Драйвер работает по классической схеме Н-мост, по два пина управления на каждый мотор - это позволяет подключать к нему как обычные коллекторные моторы с управлением скоростью в обе стороны (2 штуки), так и двухфазные шаговые моторы (1 штуку), а также простую нагрузку типа светодиодных лент.

В наборе GyverKIT START IOT EXTRA
Драйвер мотора

Характеристики:

  • Количество моторов: 2
  • Напряжение логики: 3.. 5V
  • Напряжение мотора: 2.5.. 12V
  • Рабочий ток: 800 мА
  • Пиковый ток: 1.5А

Подключение к Arduino #

  • Для управления выходами достаточно подключить микроконтроллер к GND и управляющим пинам драйвера
  • VCC на плате драйвера идёт на питание мотора, то есть его к МК подключать не нужно (за исключением тех случаев, когда МК и драйвер питаются от одного источника)
  • Управляющие пины драйвера подключаются к любым цифровым пинам МК. Если нужно управление скоростью вращения мотора – один из пары пинов нужно подключать на пин МК с возможностью ШИМ сигнала

В данном модуле пины управления подтянуты к VCC резисторами на 10 кОм, то есть при управлении 12V нагрузкой они окажутся под высоким напряжением. Пины МК защищены от повышенного напряжения, но всё равно не рекомендуется управлять нагрузкой с напряжением выше питания МК. В наборе GyverKIT идут моторы, которые работают от 5V, а также блок питания на 5V

Программирование #

Связанные уроки:

Релейно #

Для управления мотором "релейно" - на максимальной скорости с выбором направления, достаточно подать разные сигналы на пины драйвера: 1 и 0 - в одну сторону, 0 и 1 - в другую, 0 и 0 - остановка:

Стоп Вперёд Назад
IN 1 LOW LOW HIGH
IN 2 LOW HIGH LOW
#define MOTOR_A1 3  // ШИМ
#define MOTOR_A2 5  // ШИМ
#define MOTOR_B1 6  // ШИМ
#define MOTOR_B2 7

void setup() {
    pinMode(MOTOR_A1, OUTPUT);
    pinMode(MOTOR_A2, OUTPUT);
    pinMode(MOTOR_B1, OUTPUT);
    pinMode(MOTOR_B2, OUTPUT);
}
void loop() {
    // мотор 1 - остановка
    digitalWrite(MOTOR_A1, LOW);
    digitalWrite(MOTOR_A2, LOW);
    delay(2000);

    // мотор 1 - в одну сторону
    digitalWrite(MOTOR_A1, HIGH);
    digitalWrite(MOTOR_A2, LOW);
    delay(2000);

    // мотор 1 - в другую сторону
    digitalWrite(MOTOR_A1, LOW);
    digitalWrite(MOTOR_A2, HIGH);
    delay(2000);
}

Плавно #

Для управления скоростью нужно использовать ШИМ, тут есть два варианта:

Один ШИМ #

Только один пин драйвера подключается к ШИМ пину. Для вращения в одну сторону нужно подать LOW на обычный пин и ШИМ на другой, для вращения в другую сторону - HIGH на обычный пин и "обратный" сигнал ШИМ (255 - сигнал) на ШИМ пин. Скорость мотора в обе стороны будет немного отличаться при одинаковых значениях ШИМ.

Стоп Вперёд Назад
IN 1 LOW LOW HIGH
IN 2 LOW 0.. 255 255.. 0
#define MOTOR_A1 3  // ШИМ
#define MOTOR_A2 5  // ШИМ
#define MOTOR_B1 6  // ШИМ
#define MOTOR_B2 7

void setup() {
    pinMode(MOTOR_A1, OUTPUT);
    pinMode(MOTOR_A2, OUTPUT);
    pinMode(MOTOR_B1, OUTPUT);
    pinMode(MOTOR_B2, OUTPUT);
}
void loop() {
    // скорость мотора
    int motorSpeed = 100;

    // остановка
    digitalWrite(MOTOR_B1, LOW);
    digitalWrite(MOTOR_B2, LOW);
    delay(2000);

    // в одну сторону
    digitalWrite(MOTOR_B1, LOW);
    analogWrite(MOTOR_B2, motorSpeed);
    delay(2000);

    // в другую сторону
    digitalWrite(MOTOR_B1, HIGH);
    analogWrite(MOTOR_B2, 255 - motorSpeed);
    delay(2000);
}

Два ШИМ #

Оба пина драйвера подключаются к ШИМ пинам. Для вращения в одну сторону нужно подать LOW на один пин и ШИМ с нужным заполнением на другой пин. Скорость мотора будет симметричной при одинаковых значениях ШИМ.

Стоп Вперёд Назад
IN 1 LOW LOW 0.. 255
IN 2 LOW 0.. 255 LOW
#define MOTOR_A1 3  // ШИМ
#define MOTOR_A2 5  // ШИМ
#define MOTOR_B1 6  // ШИМ
#define MOTOR_B2 7

void setup() {
    pinMode(MOTOR_A1, OUTPUT);
    pinMode(MOTOR_A2, OUTPUT);
    pinMode(MOTOR_B1, OUTPUT);
    pinMode(MOTOR_B2, OUTPUT);
}
void loop() {
    // скорость мотора
    int motorSpeed = 100;

    // остановка
    digitalWrite(MOTOR_A1, LOW);
    digitalWrite(MOTOR_A2, LOW);
    delay(2000);

    // в одну сторону
    digitalWrite(MOTOR_A1, LOW);
    analogWrite(MOTOR_A2, motorSpeed);
    delay(2000);

    // в другую сторону
    analogWrite(MOTOR_A1, motorSpeed);
    digitalWrite(MOTOR_A2, LOW);
    delay(2000);
}

Скорость и направление #

Добавим в схему потенциометр для настройки:

Будем задавать потенциометром скорость и направление для первого мотора (вариант с двумя ШИМ):

#define MOTOR_A1 3  // ШИМ
#define MOTOR_A2 5  // ШИМ
#define POT_PIN 0

// функция для запуска мотора
// принимает -255.. 255
void runMotor1(int speed) {
    uint8_t m1 = 0, m2 = 0;
    if (speed > 0) m1 = 0, m2 = speed;
    else if (speed < 0) m1 = -speed, m2 = 0;

    analogWrite(MOTOR_A1, m1);
    analogWrite(MOTOR_A2, m2);
}

void setup() {
}

void loop() {
    // преобразуем 0.. 1023 в -255.. 255
    int motSpeed = map(analogRead(POT_PIN), 0, 1023, -255, 255);
    runMotor1(motSpeed);
    delay(30);
}

Библиотеки #

Для управления мотором можно использовать библиотеку GyverMotor - она поддерживает все типы драйверов и имеет некоторые полезные возможности:

  • Контроль скорости и направления вращения
  • Работа с ШИМ любого разрешения
  • Плавный пуск и изменение скорости
  • Порог минимального ШИМ

Её можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverMotor. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Управление потенциометром
// управление скоростью и направлением мотора потенциометром
#include <GyverMotor2.h>    // вторая версия библиотеки

#define MOTOR_B1 6  // ШИМ
#define MOTOR_B2 7
#define POT_PIN 0

GMotor2<DRIVER2WIRE> motor(MOTOR_B2, MOTOR_B1); // (не ШИМ, ШИМ)

void setup() {
  motor.setMinDuty(30);   // минимальный ШИМ
  //motor.reverse(1);     // реверс
}

void loop() {
  // переводим в диапазон -255.. 255
  int val = analogRead(POT_PIN) / 2 - 512;
  motor.setSpeed(val);
  delay(30);
}
Плавное управление скоростью
// режим плавного управления скоростью
#include <GyverMotor2.h>    // вторая версия библиотеки

#define MOTOR_B1 6  // ШИМ
#define MOTOR_B2 7
#define POT_PIN 0

GMotor2<DRIVER2WIRE> motor(MOTOR_B2, MOTOR_B1); // (не ШИМ, ШИМ)

void setup() {
  motor.smoothMode(1);    // плавный режим
}

void loop() {
  motor.tick();

  // переводим в диапазон -255.. 255
  int val = analogRead(POT_PIN) / 2 - 512;
  motor.setSpeed(val);
}

Дополнительно #

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх