Motor Shield Plus

Motor Shield Plus — плата расширения для двухканального управления скоростью и направлением вращения коллекторных двигателей постоянного тока. Драйвер сможет управлять двумя моторами с напряжением 8–52 вольта и максимальным током до двух с половиной ампер на канал.

Видеообзор

Подключение и настройка

  1. Установите Motor Shield сверху на управляющую платформу, например Arduino Uno или Iskra JS.
  2. Убедитесь в наличии и правильности соединения джамперов на плате Motor Shield:
    • DIR1 с 4 пином;
    • EN1 с 5 пином.
    • EN2 с 6 пином;
    • DIR2 с 7 пином.
    • M1 с аналоговым пином A1
    • M2 с аналоговым пином A0

Если напряжение внешнего источника питания будет меньше 8 вольт, motor shield не заработает.

Примеры работы для 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-моста на полевых транзисторах L6206Q

Термин «H-мост» появился благодаря графическому изображению схемы, напоминающему букву «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-мост с силовыми ключами — основная начинка микросхемы L6206Q для управления скоростью и направлением двигателей.

Питание

На плате расширения Motor Shield Plus два контура питания.

  • Силовой контур — напряжение для питания моторов от силовой части микросхемы H-моста L6206Q. При отсутствии питания на силовом контуре, светодиод PWR не горит.
  • Цифровой контур — для питания вспомогательной цифровой логики управления микросхемой L6206Q и светодиодов индикации. Цифровое питание поступает на плату расширения от пина 5V управляющей платы. Если по какой-то причине напряжения на этом пине не оказалось, светодиоды индикации EN и DIR гореть не будут.

Если отсутствует хотя бы один из контуров питания — Motor Shield работать не будет.

Силовое питание подключается через клеммник PWR. Диапазон входного напряжения:

  • 8–52 В при снятом джампере PWR JOIN
  • 8–12 В при установленном джампере PWR JOIN

При подключении питания соблюдайте полярность. Неправильное подключение может привести к непредсказуемому поведению или выходу из строя платы или источника питания.

Джампер объединения питания

Motor Shield использует два контура питания: силовое и цифровое. По умолчанию для питания всей конструкции необходимо два источника напряжения:

  • Питания для силовой части через клеммник PWR
  • Питания для цифровой части с пина 5V управляющей платформы.

При установки джампера в положение PWR JOIN, происходит объединение контакта Vin управляющей платформы и положительного контакта клеммника PWR. Режим объединённого питания позволяет запитывать управляющую платформу и силовую часть драйвера от одного источника питания.

При объединённом режиме напряжение может быть подано двумя способами:

  • на клеммник PWR драйвера моторов
  • на внешний разъём питания управляющей платы

При работе двигателей по цепи питания может проходить очень большой ток, на который цепь Vin управляющей платформы не рассчитана. Поэтому выбор для питания клеммника PWR предпочтительнее.

В режиме совместного питания управляющей платформы и Motor Shield Plus, используйте входное напряжение в диапазоне 8–12 вольт. Напряжение более 12 вольт убьёт управляющую платформу. Если вы хотите работать с Motor Shield в диапазоне 8–52 вольта, используйте два отдельных источника питания.

Источник питания должен быть способен обеспечить стабильное напряжение при резких скачках нагрузки. Даже кратковременная просадка напряжения может привести к перезагрузке управляющей платформы. В итоге программа начнётся сначала и поведения двигателей будет неадекватным.

При объединённом питании используйте литий-ионные и никель-металлгидридные аккумуляторы. Если вы используете другие источники питания, лучше воспользуйтесь раздельной схемой питания управляющей платформы и Motor Shield.

Нагрузка

Нагрузка разделена на два независимых канала. К каждому каналу можно подключить один коллекторный мотор. Первый канал на плате обозначен шёлком M1, второй канал — M2.

Обозначения «+» и «−» показывают воображаемые начало и конец обмотки. Если подключить два коллекторных двигателя, чтобы их одноимённые контакты щёточного узла соответствовали одному и тому же обозначению на плате, то при подаче на Motor Shield одинаковых управляющих импульсов, моторы будут вращаться в одну и ту же сторону.

Светодиодная индикация

Имя светодиода Назначение
PWR Индикация состояния силового питания. Есть питание — светодиод горит, нет питания — не горит.
DIR1 Индикация состояния направления первого канала M1. При высоком логическом уровне светится зелёным светом, при низком — красным.
DIR2 Индикация состояния направления второго канала M2. При высоком логическом уровне светится зелёным светом, при низком — красным.
EN1 Индикация скорости первого канала M1. Яркость светодиода пропорциональна скорости вращения двигателя.
EN2 Индикация скорости второго канала M2. Яркость светодиода пропорциональна скорости вращения двигателя.

Пины управления скоростью вращения двигателей

Для запуска двигателя на первом или втором канале установите высокий уровень на пинах скорости EN1 или EN2 соответственно. Для остановки моторов установите на соответствующих пинах низкий уровень.

Управление скоростью происходит при помощи ШИМ, за счёт быстрого включения и выключения нагрузки.

Пины управления направлением вращения двигателей

Пины направления H1 или H2 отвечают за направление вращения двигателей. Смена направления вращения коллекторных двигателей достигается за счёт изменения полярности приложенного к ним напряжения.

  • Если выставить на пин направления высокий уровень, то полярность напряжения на клеммниках нагрузки будет соответствовать обозначению «+» и «-» на плате.
  • При подаче на пин низкого уровня, напряжение на клеммнике изменится на противоположное.

Пины состояния текущего потребления тока

На пинах M1 и M2 присутствует напряжение прямо пропорционально потребляемому току на соответствующем канале.

Контакты выбора управляющих пинов

По умолчанию Motor Shield Plus для управления моторами и передачи данных о потребляемом токе на каждом канале использует пины управляющей платы:

Назначение Канал 1 Канал 2
Скорость EN 5 6
Направление DIR 4 7
Потребляемый ток M A0 A1

Если в вашем устройстве эти пины уже заняты, например используются для управления Relay Shield, вы можете использовать другой свободный пин.

  • Контакты отвечающие за направления — DIR1 и DIR2 можно заменять на любые другие пины.
  • Контакты управляющие скоростью моторов — EN1 и EN2, можно перебрасывать только на пины с поддержкой ШИМ.
  • Контакты передачи данных о потребляемом токе — M1 и M2, можно перебрасывать только на пины с поддержкой АЦП.

Для переброски пинов снимите джампер напротив занятого пина и припаяйте проводок между луженым отверстием рядом со снятым джампером и луженым отверстием напротив нужного пина. На этой картинке мы перекинули:

  • управляющие пины первого канала DIR1 и EN1: с 4 и 5 пина — на 2 и 3 пин соответственно;
  • управляющие пины второго канала DIR2 и EN2: с 7 и 6 — на 8 и 9 пин соответственно.
  • пины передачи данных о текущем потребления тока первого и второго канала M1 и M2: с A0 и A1 — на A2 и A3 пин соответственно.

Принципиальная и монтажная схемы

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

  • Драйвер моторов: L6206Q
  • Количество подключаемых моторов: 2
  • Напряжение логической части: 3,3—5 В
  • Напряжение силовой части:
    • 8—12 c PWR JOIN
    • 8—52 без PWR JOIN
  • Продолжительный ток нагрузки на канал: до 2,5 A
  • Пиковый ток нагрузки на канал: до 5 А в течении 1 мс
  • Измерение потребляемого тока моторов на каждом канале

Ресурсы