Популярный модуль драйвера для двух моторов. Драйвер работает по классической схеме Н-мост, по два пина управления на каждый мотор - это позволяет подключать к нему как обычные коллекторные моторы с управлением скоростью в обе стороны (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);
}
Дополнительно #
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками