Motor Shield
Хотите подключить мотор к Arduino или Iskra JS?! К сожалению микроконтроллер установленный на управляющих платформах не сможет без посторонней помощи управлять большой нагрузкой. Motor Shield поможет микроконтроллеру управлять коллекторными моторами и шаговыми двигателями.
Motor Shield — это плата расширения, предназначенная для двухканального управления скоростью и направлением вращения коллекторных двигателей постоянного тока, напряжением 5–24 В и максимальным током до двух ампер на канал.
Плата расширения также сможет управлять одним биполярным шаговым двигателем.
Видеообзор
Подключение и настройка
- Установите Motor Shield сверху на управляющую платформу, например Arduino Uno или Iskra JS.
- Убедитесь в наличии и правильности соединения джамперов на плате Motor Shield:
H1
с4
пином;E1
с5
пином.E2
с6
пином;H2
с7
пином.
Примеры работы для Arduino
Управление коллекторными двигателями
Подключите два коллекторных мотора к клеммникам M1
и M2
соответственно.
Схема устройства
Код программы
Для начала покрутим каждый мотор в одну, а затем другую сторону.
- dc_motors.ino
// подключите один мотор к клемме: M1+ и M1- // а второй к клемме: M2+ и M2- // Motor shield использует четыре контакта 4, 5, 6, 7 для управления моторами // 4 и 7 — для направления, 5 и 6 — для скорости #define SPEED_1 5 #define DIR_1 4 #define SPEED_2 6 #define DIR_2 7 void setup() { // настраиваем выводы платы 4, 5, 6, 7 на вывод сигналов for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } } void loop() { // устанавливаем направление мотора «M1» в одну сторону digitalWrite(DIR_1, LOW); // включаем мотор на максимальной скорости analogWrite(SPEED_1, 255); // ждём одну секунду delay(1000); // устанавливаем направление мотора «M1» в другую сторону digitalWrite(DIR_1, HIGH); // ждём одну секунду delay(1000); // выключаем первый мотор analogWrite(SPEED_1, 0); // устанавливаем направление мотора «M2» в одну сторону digitalWrite(DIR_2, LOW); // включаем второй мотор на максимальной скорости analogWrite(SPEED_2, 255); // ждём одну секунду delay(1000); // устанавливаем направление мотора «M2» в другую сторону digitalWrite(DIR_2, HIGH); // ждём одну секунду delay(1000); // выключаем второй мотор analogWrite(SPEED_2, 0); // ждём одну секунду delay(1000); }
Код программы
Усложним задачу. Будем плавно увеличивать скорость первого мотора до максимальной скорости, а потом понижать до полного выключения. Аналогично проделываем со вторым мотором.
- dc_motors_pwm.ino
// подключите один мотор к клемме: M1+ и M1- // а второй к клемме: M2+ и M2- // Motor shield использует четыре контакта 4, 5, 6, 7 для управления моторами // 4 и 7 — для направления, 5 и 6 — для скорости #define SPEED_1 5 #define DIR_1 4 #define SPEED_2 6 #define DIR_2 7 void setup() { // настраиваем выводы платы 4, 5, 6, 7 на вывод сигналов for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } } void loop() { // устанавливаем направление мотора «M1» в одну сторону digitalWrite(DIR_1, LOW); // медленно разгоняем мотор for (int i = 0; i <= 255; i++) { analogWrite(SPEED_1, i); Serial.println(i); delay(20); } // устанавливаем направление мотора «M1» в другую сторону digitalWrite(DIR_1, HIGH); // медленно тормозим мотор for (int i = 255; i >= 0; i--) { analogWrite(SPEED_1, i); Serial.println(i); delay(20); } // устанавливаем направление мотора «M2» в одну сторону digitalWrite(DIR_2, LOW); // медленно разгоняем мотор for (int i = 0; i <= 255; i++) { analogWrite(SPEED_2, i); delay(20); } // устанавливаем направление мотора «M2» в другую сторону digitalWrite(DIR_2, HIGH); // медленно тормозим мотор for (int i = 255; i > 0; i--) { analogWrite(SPEED_2, i); delay(20); } }
Управление биполярным шаговым двигателем
Драйвер моторов может на себя также взять управления шаговым двигателем. В качестве примера подключим шаговый двигатель 42STH47-0406A.
Схема устройства
Управление без библиотек
Motor Shield поддерживает три режима управления биполярным шаговым двигателем:
- Однофазный полношаговый «wave drive mode»
- Двухфазный полношаговый «full step mode»
- Полушаговый «half step mode»
Код программы
Протестируем по очереди три режима управления.
- step-motor-switch-mode.ino
// пины для управления Motor Shield #define E1 5 #define E2 6 #define H1 4 #define H2 7 // три режима управления шаговым мотором // однофазный режим #define WAVE_DRIVE 0 // двухфазный режим #define FULL_STEP 1 // полушаговый режим #define HALF_STEP 2 // задержка между переключением обмоток // определяет скорость вращения int delayTime = 10; unsigned long startTime; // функция выставляет значение на пинах void doStep(bool E1State, bool H1State, bool E2State, bool H2State) { digitalWrite(E1, E1State); digitalWrite(H1, H1State); digitalWrite(E2, E2State); digitalWrite(H2, H2State); delay(delayTime); } // определяем комбинации управляющих импульсов в зависимости от режима void rotate(byte rotateMode) { switch (rotateMode) { case WAVE_DRIVE: doStep(1, 1, 0, 0); doStep(0, 0, 1, 1); doStep(1, 0, 0, 0); doStep(0, 0, 1, 0); break; case FULL_STEP: doStep(1, 1, 1, 1); doStep(1, 0, 1, 1); doStep(1, 0, 1, 0); doStep(1, 1, 1, 0); break; case HALF_STEP: doStep(1, 1, 0, 0); doStep(1, 1, 1, 1); doStep(0, 0, 1, 1); doStep(1, 0, 1, 1); doStep(1, 0, 0, 0); doStep(1, 0, 1, 0); doStep(0, 0, 1, 0); doStep(1, 1, 1, 0); break; } } void setup() { // настраиваем ножки на выход for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } // запоминаем текущее время startTime = millis(); } void loop() { // узнаём время прошедшее с начала работы в миллисекундах // и переводим его в секунды unsigned long loopTime = (millis() - startTime) / 1000; // меняем режим каждую секунду rotate(loopTime % 3); }
Скорость вращения шагового двигателя очень сильно влияет на развиваемый мотором момент. Убедитесь сами. Запустите этот же пример с разными значениями delayTime
.
Обратите внимание, что двигатель в однофазном полношаговом режиме позволяет развить гораздо меньший момент, чем в двухфазном полношаговом режиме.
Управление через готовую библиотеку
Для лёгкого и быстрого управления шаговым двигателем мы написали библиотеку AmperkaStepper. Она скрывает в себе все тонкости работы с мотором и предоставляет удобные методы.
Пример работы в различных режимах
- step-motor-test.ino
// библиотека для работы с шаговым двигателем #include <AmperkaStepper.h> // создаём объект для работы с шаговым двигателем // передаём фикированое количество шагов за полный оборот // смотреть в характеристиках двигателя AmperkaStepper motor(200); // при использовании Motor Shield на нестандартных пинах // необходимо педедавать управляющие пины // Например, для пинов 8, 9, 10, 11 // AmperkaStepper motor(200, 8, 9, 10, 11); void setup() { // устанавливаем скорость вращения 30 оборотов в минуту. motor.setSpeed(30); } void loop() { // 180° по часовой стрелке в двуфазном режиме motor.step(100, FULL_STEP); delay(1000); // 180° против часовой стрелки в однофазном режиме motor.step(-100, WAVE_DRIVE); delay(1000); // 180° по часовой стрелке в полушаговом режиме motor.step(200, HALF_STEP); delay(1000); // 180° против часовой стрелки в двуфазном режиме // этот режим используется по умолчанию, если не передан // второй аргумент motor.step(-100); delay(1000); }
Пример работы для Espruino
Управление коллекторными двигателями
Подключите два коллекторных мотора к клеммникам M1
и M2
соответственно.
Схема устройства
Код программы
Для начала покрутим каждый мотор в одну, а затем другую сторону.
- dc_motors.js
// подключаем библиотеку «motor» var Motor = require('@amperka/motor'); // подключаем первый мотор канала M1 на Motor Shield var motorOne = Motor.connect(Motor.MotorShield.M1); // подключаем второй мотор канала M2 на Motor Shield var motorTwo = Motor.connect(Motor.MotorShield.M2); // Альтернативный способ подключения с указанием пинов // var myMotor = Motor.connect({phasePin: P4, pwmPin: P5, freq: 100}); // интеварал времени var time = 1000; // счётчик var state = 0; // каждую секунду меняем режим работы setInterval(() => { // останавливаем моторы motorOne.write(0); motorTwo.write(0); state++; if (state === 1) { motorOne.write(1); } else if (state === 2) { motorOne.write(-1); } else if (state === 3) { motorTwo.write(1); } else if (state === 4) { motorTwo.write(-1); } else { state = 0; } }, time);
Код программы
Усложним задачу. Будем плавно увеличивать скорость первого мотора до максимальной скорости, а потом понижать до полного выключения. Аналогично проделываем со вторым мотором.
- dc_motors_pwm.js
// подключаем библиотеку «motor» var Motor = require('@amperka/motor'); // подключаем первый мотор канала M1 на Motor Shield var motorOne = Motor.connect(Motor.MotorShield.M1); // подключаем второй мотор канала M2 на Motor Shield var motorTwo = Motor.connect(Motor.MotorShield.M2); // создаём объект анимация // для плавного изменения параметров вращения мотора var animMotor = require('@amperka/animation').create({ // начальное значение // при «0» мотор стоит from: 0, // конечное значение // при «1» мотор вращается с максимальной скоростью в одну сторону to: 1, // продолжительность полного перехода // за 5 секунд мотор пройдёт диапазон значений от нуля до единицы duration: 5, // шаг обновления: каждые 20 мс updateInterval: 0.02 }).queue({ // после завершения перехода, выполняем ещё одну операцию // начальное значение // при «-1» мотор вращается с максимальной скоростью в обратную сторону from: -1, // конечное значение // при «0» мотор стоит to: 0, // продолжительность полного перехода // за 5 секунд мотор пройдёт диапазон значений от минус единицы до нуля duration: 5 }); // номер мотора var motorNum = motorOne; // время вращения работы мотора var time = 10000; // обработчик анимации animMotor.on('update', function(val) { motorNum.write(val); }); // функция работы первого мотора var startMotorOne = () => { motorNum = motorOne; animMotor.play(); setTimeout(() => { startMotorTwo(); }, time); }; // функция работы второго мотора var startMotorTwo = () => { motorNum = motorTwo; animMotor.play(); setTimeout(() => { startMotorOne(); }, time); }; // запускаем функцию работы первого мотора startMotorOne();
Элементы платы
Драйвер двигателей
Сердце и мускулы платы — микросхема двухканального H-моста L298P.
Термин «H-мост» появился благодаря графическому изображению схемы, напоминающему букву «Н». H-мост состоит из четырёх ключей. В зависимости от текущего состояние переключателей возможно разное состояние мотора.
S1 | S2 | S3 | S4 | Результат |
---|---|---|---|---|
1 | 0 | 0 | 1 | Мотор крутится вправо |
0 | 1 | 1 | 0 | Мотор крутится влево |
0 | 0 | 0 | 0 | Свободное вращение мотора |
0 | 1 | 0 | 1 | Мотор тормозит |
1 | 0 | 1 | 0 | Мотор тормозит |
1 | 1 | 0 | 0 | Короткое замыкание источника питания |
0 | 0 | 1 | 1 | Короткое замыкание источника питания |
Ключи меняем на транзисторы для регулировки скорости мотора с помощью ШИМ-сигнала.
H-мост с силовыми ключами — основная начинка микросхемы L298P для управления скоростью и направлением двигателей.
Питание
На плате расширения Motor Shield два контура питания.
- Силовой контур — напряжение для питания моторов от силовой части микросхемы H-моста L298P. При отсутствии питания на силовом контуре, светодиод
PWR
не горит. - Цифровой контур — для питания вспомогательной цифровой логики управления микросхемой L298P и светодиодов индикации. Цифровое питание поступает на плату расширения от пина
5V
управляющей платы. Если по какой-то причине напряжения на этом пине не оказалось, светодиоды индикации гореть не будут.
Если отсутствует хотя бы один из контуров питания — Motor Shield работать не будет.
Силовое питание подключается через клеммник PWR
. Диапазон входного напряжения:
- 5–24 В при снятом джампере
PWR JOIN
- 5–12 В при установленном джампере
PWR JOIN
При подключении питания соблюдайте полярность. Неправильное подключение может привести к непредсказуемому поведению или выходу из строя платы или источника питания.
Джампер объединения питания
Motor Shield использует два контура питания: силовое и цифровое. По умолчанию для питания всей конструкции необходимо два источника напряжения:
- Питания для силовой части через клеммник
PWR
- Питания для цифровой части с пина
5V
управляющей платформы.
При установки джампера в положение PWR JOIN
, происходит объединение контакта Vin
управляющей платформы и положительного контакта клеммника PWR
. Режим объединённого питания позволяет запитывать управляющую платформу и силовую часть драйвера от одного источника питания.
При объединённом режиме напряжение может быть подано двумя способами:
- на клеммник
PWR
драйвера моторов - на внешний разъём питания управляющей платы
При работе двигателей по цепи питания может проходить очень большой ток, на который цепь Vin
управляющей платформы не рассчитана. Поэтому выбор для питания клеммника PWR
предпочтительнее.
В режиме совместного питания управляющей платформы и Motor Shield, используйте входное напряжение в диапазоне 7–12 вольт. Напряжение более 12 вольт убьёт управляющую платформу. Если вы хотите работать с Motor Shield в диапазоне 5–24 вольта, используйте два отдельных источника питания.
Источник питания должен быть способен обеспечить стабильное напряжение при резких скачках нагрузки. Даже кратковременная просадка напряжения может привести к перезагрузке управляющей платформы. В итоге программа начнётся сначала и поведения двигателей будет неадекватным.
При объединённом питании используйте литий-ионные и никель-металлгидридные аккумуляторы. Если вы используете другие источники питания, лучше воспользуйтесь раздельной схемой питания управляющей платформы и Motor Shield.
Нагрузка
Нагрузка разделена на два независимых канала. К каждому каналу можно подключить один коллекторный мотор. Первый канал на плате обозначен шёлком M1
, второй канал — M2
.
Обозначения «+» и «−» показывают воображаемые начало и конец обмотки. Если подключить два коллекторных двигателя, чтобы их одноимённые контакты щёточного узла соответствовали одному и тому же обозначению на плате, то при подаче на Motor Shield одинаковых управляющих импульсов, моторы будут вращаться в одну и ту же сторону.
Светодиодная индикация
Имя светодиода | Назначение |
---|---|
PWR | Индикация состояния силового питания. Есть питание — светодиод горит, нет питания — не горит. |
H1 | Индикация состояния направления первого канала M1 . При высоком логическом уровне светится зелёным светом, при низком — красным. |
H2 | Индикация состояния направления второго канала M2 . При высоком логическом уровне светится зелёным светом, при низком — красным. |
E1 | Индикация скорости первого канала M1 . Яркость светодиода пропорциональна скорости вращения двигателя. |
E2 | Индикация скорости второго канала M2 . Яркость светодиода пропорциональна скорости вращения двигателя. |
Пины управления скоростью вращения двигателей
Для запуска двигателя на первом или втором канале установите высокий уровень на пинах скорости E1
или E2
соответственно. Для остановки моторов установите на соответствующих пинах низкий уровень.
Управление скоростью происходит при помощи ШИМ, за счёт быстрого включения и выключения нагрузки.
Пины управления направлением вращения двигателей
Пины направления H1
или H2
отвечают за направление вращения двигателей. Смена направления вращения коллекторных двигателей достигается за счёт изменения полярности приложенного к ним напряжения.
- Если выставить на пин направления высокий уровень, то полярность напряжения на клеммниках нагрузки будет соответствовать обозначению «+» и «-» на плате.
- При подаче на пин низкого уровня, напряжение на клеммнике изменится на противоположное.
Контакты выбора управляющих пинов
По умолчанию Motor Shield для управления скоростью и направлением вращения моторов использует пины управляющей платы:
Назначение | Канал 1 | Канал 2 |
---|---|---|
Скорость | 5 | 6 |
Направление | 4 | 7 |
Если в вашем устройстве эти пины уже заняты, например используются для управления Relay Shield), вы можете использовать другой свободный пин.
Контакты отвечающие за направления — H1
и H2
можно заменять на любые другие. А вот контакты управляющие скоростью моторов — E1
и E2
, можно перебрасывать только на пины с поддержкой ШИМ.
Для переброски пинов снимите джампер напротив занятого пина и припаяйте проводок между луженым отверстием рядом со снятым джампером и луженым отверстием напротив нужного пина. На этой картинке мы перекинули:
- управляющие пины первого канала
H1
иE1
: с4
и5
пина — на2
и3
пин соответственно; - управляющие пины второго канала
H2
иE2
: с7
и6
— на8
и9
пин соответственно.
Принципиальная и монтажная схемы
Характеристики
- Драйвер моторов: L298P
- Количество подключаемых моторов: 2
- Напряжение логической части: 3,3—5 В
- Напряжение силовой части:
- 5—12 c PWR JOIN
- 5—24 без PWR JOIN
- Продолжительный ток нагрузки на канал: до 2 A
- Пиковый ток нагрузки на канал: до 3 А в течении 100 мкс
Для достижения максимума используйте дополнительное охлаждение для микросхемы L298P.