Андрей Смирнов
Время чтения: ~26 мин.
Просмотров: 78

Управление шаговым двигателем с помощью драйвера двигателей Motor Shield L293D

СОДЕРЖАНИЕ ►

Сегодня мы разберем весьма полезное расширение для платы Arduino UNO — Motor Control Shield L293D, рассмотрим схему подключения к данному шилду сервомоторов, шаговых двигателей и моторов постоянного тока. Также вы можете ознакомиться с командами, используемых в библиотеке AFMotor.h, и попробовать различные скетчи для управления шаговыми двигателями и моторами постоянного тока на Ардуино.

Motor Shield L293D: схема, характеристики

Микроконтроллер Ардуино позволяет любому начинающему радиолюбителю изготавливать сложные автоматизированные устройства и проекты. Использование Motor Shield может стать полезным дополнением во в многих проектах на Arduino, так как позволяет подключить сразу 2 сервопривода, 2 шаговых двигателя и до 4 двигателей постоянного тока (с реверсом направления вращения ротора).

motor-drive-shield.jpg
Схема и подключение Motor Control Shield for Arduino

Характеристики Мотор Шилд L293D

При подключении серводвигателей и моторов к Ардуино используются различные порты, к которым нельзя подключать другую периферию. Так, для серво используются цифровые порты 9 и 10, для шаговых двигателей и моторов используются порты с 3 по 8 и 12. Если вы желаете еще что-то подключить, то используйте 0 и 1 порт, 2 и 13, а также аналоговые входы (порты A0-A5 можно использовать как цифровые выходы).

Как подключить Motor Shield к Ардуино

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • Motor Shield L293D;
  • сервомотор;
  • двигатели постоянного тока;
  • шаговый двигатель;
  • провода «папа-мама», «папа-папа».

К Ардуино шилд подключается очень просто — он устанавливается на плату UNO прямо сверху. Обратите внимание, что без подключения внешнего источника питания к Motor Shield, логика и двигатели будут работать от 5 Вольт, что не всегда бывает достаточно. Поэтому скорость вращения моторов постоянного тока при подключении платы Ардуино от компьютера и блока питания будет значительно отличаться.

motor-shield-l239d.jpg
Мотор Шилд Ардуино схема подключения

Обратите внимание, что даже если вы задали одинаковую скорость вращения в скетче, моторы в реальности могут вращаться с разной скоростью — на это оказывает влияние скорость самого двигателя, качество изготовления редуктора и колес. После подключения двигателей, как на схеме выше, загрузите следующий скетч (скачать библиотеку AFMotor и скетч можно здесь) для тестирования работы шилда:

Скетч для Motor Shield L293D Ардуино и моторов

#include// подключаем библиотеку для шилдаAF_DCMotor motor1(1); // подключаем мотор к клеммникам M1AF_DCMotor motor2(2); // подключаем мотор к клеммникам M2voidsetup() {    motor1.setSpeed(255); // задаем максимальную скорость мотора    motor1.run(RELEASE);   // останавливаем мотор    motor2.setSpeed(255); // задаем максимальную скорость мотора    motor2.run(RELEASE);   // останавливаем мотор  }    voidloop() {    motor1.run(FORWARD);  // задаем движение вперед    motor2.run(FORWARD);  // задаем движение вперед    motor1.setSpeed(255);   // задаем скорость движения    motor2.setSpeed(255);   // задаем скорость движенияdelay(2000);          // указываем время движения      motor1.run(RELEASE);  // останавливаем мотор M1    motor2.run(RELEASE);  // останавливаем мотор M2      motor1.run(BACKWARD); // задаем движение назад    motor2.run(BACKWARD); // задаем движение назад    motor1.setSpeed(255);   // задаем скорость движения    motor2.setSpeed(255);   // задаем скорость движенияdelay(2000);          // указываем время движения      motor1.run(RELEASE);  // останавливаем мотор M1    motor2.run(RELEASE);  // останавливаем мотор M2  }

Пояснения к коду:

  1. Для каждого мотора следует присваивать свое имя AF_DCMotor motor1(1);
  2. Максимальная скорость вращения motor1.setSpeed(255) равна 255;
  3. Без команды motor1.run(RELEASE) мотор продолжит вращаться.

Скетч для подключение серво и шаговых двигателей

Для управления сервоприводами используется стандартная библиотека Servo.h, сами сервоприводы подключаются к цифровым выходам 9 и 10 через штырьки на краю платы. К шилду можно подключить только два сервопривода и два шаговых двигателя. Первый шаговый двигатель подключается к клеммам M1 и M2, а второй к клеммам M3 и M4. Схема подключения двигателей к Motor Shield L293D изображена далее.

motor-shield-stepper.jpg
Подключение шаговых двигателей к Motor Shield L293D

После подключения Stepper Motor к шилду загрузите в плату следующий скетч:

#include// подключаем библиотеку для шилдаint i; // вводим переменную// подключаем шаговый двигатель к порту 1 - M1, M2  // 48 - количество шагов для полного оборотаAF_Stepper stepper(48, 1);    voidsetup() {  }    voidloop() {        // делаем 48 шагов в одном направлении, DOUBLE - тип шагаfor (i = 0; i <= 48; i++) {      stepper.step(1, FORWARD, DOUBLE);      delay(30);    }        // делаем 48 шагов в обратном направлении (BACKWARD)for (i = 48; i >= 0; i--) {      stepper.step(1, BACKWARD, DOUBLE);      delay(30);    }      }

Motor Shield

декабря 28, 2014 Arduino Андрей Антонов  Печать

Adafruit Motor Shield или же его клон, который я и использую — Freeduino Motor Shield v.2.0 представляют собой модуль, обеспечивающий функциональность для использования двигателей постоянного тока, сервомоторов и шаговых двигателей совместно с Arduino.

Чем же интересен этот шилд?

  • Содержит 4 H-моста: шилд основан на микросхемах L293D, которые обеспечивают ток до 0.6 А (допустимое пиковое значение — 1.2 А) и имеют встроенную тепловую защиту от обратного пробоя диодов. Возможно использование моторов с напряжением питания от 4.5 до 25 В.
  • Возможно подключение до 4 двунаправленных моторов постоянного тока с заданием скорости с 8-битным разрешением для каждого.
  • Возможно подключение до 2 шаговых однообмоточных, двухобмоточных или же с переключением обмоток двигателей (уни- или биполярных).
  • Подтягивающие резисторы, не дающие двигателям включаться при подаче питания.
  • Большие клеммные колодки для подключения моторов и питания.
  • Отдельная кнопка Reset для сброса Arduino.
  • Двухконтактный разъем для подключения внешнего источника питания и джампер для выбора источника питания.
  • Совместимость с Arduino UNO, Mega, Diecimilia и Duemilanove.
  • Простая в использовании программная библиотека.

Freeduino Motor Shield с подключенными четырьмя двигателями постоянного тока и двумя сервами

Аналогичный шилд (только более дешевый) можно купить, например, здесь

Принципиальная схема Adafruit Motor Shield

Используемые пины Arduino

Следующие выводы задействуются, если указано, что используются шаговые двигатели или же моторы постоянного тока:

  • D11: DC мотор №1 / шаговый двигатель №1 (активация/управление скоростью)
  • D3: DC мотор №2 / шаговый двигатель №1 (активация/управление скоростью)
  • D5: DC мотор №3 / шаговый двигатель №2 (активация/управление скоростью)
  • D6: DC мотор №4 / шаговый двигатель №1 (активация/управление скоростью)

Следующие выводы используются только при использовании шаговых или двигателей постоянного тока:

  • D4, D7, D8, D12: используются для управления моторами через синхронный сдвиговый регистр с регистром данных 74HC595.

Следующие выводы используются только при подключенных сервоприводах:

  • D9: Управление сервой №1
  • D10: Управление сервой №1

Библиотека AFMotor

Для того, чтобы использовать Motor Shield в своих проектах можно воспользоваться библиотекой AFMotor. Для этого:

  • Скачиваем библиотеку AFMotor с GitHub.
  • Распаковываем полученный ZIP-архив.
  • Переименовываем распакованную папку в AFMotor. Внутри папки должы быть файлы AFMotor.cpp и AFMotor.h и некоторые другие.
  • Перемещаем эту папку в вашу папку с библиотеками Arduino. На Windows папка с библиотеками находится в Мои документы/Arduino/libraries(если вы не меняли пути по умолчанию в Arduino IDE). На Mac OS этот путь по-умолчанию Документы/arduino/libraries. Если это первая библиотека, которую вы устанавливаете, то необходимо будет создать в папке arduino папку libraries. Обратите внимание, что название папки пишется в нижнем регистре.
  • Перезапустите Arduino IDE. Должно появиться подменю ФайлПримерыAFMotor

Питание Motor Shield

Двигатели потребляют много энергии, особенно дешевые, имеющие низкий КПД. Во-первых, нужно выяснить на какое напряжение рассчитан ваш двигатель. Это могут быть совершенно различные величины — 1.5 В, 6-12 В, а может и что-то иное. Контроллеры двигателей на этом модуле рассчитаны для работы в диапазоне 4.5-25 В, и поэтому большинство моторов, рассчитанных на напряжение 1.5-3 В работать не будут!

Во-вторых необходимо выяснить потребляемый вашим двигателем ток. Микросхемы драйверов двигателей, используемые в этом шилде рассчитаны на рабочий ток в 600 мА (1.2 А — допустимое пиковое значение).

Рекомендуется использовать раздельные источники питания для двигателей и цифровых схем, так как, зачастую, проблемы с работой бывают связаны с помехами на линии питания или же из-за недостаточной мощности источника.

Сервоприводы питаются от тех же 5 В, что и Arduino. Это нормально при использовании небольших сервомашинок, если же вы используете что-то помощнее, то нужно перерезать дорожку, по которой подается питание +5 В на разъемах, предназначенных для подключения сервоприводов и подвести сюда отдельно внешнее питание 5-6 В.

Двигатели постоянного тока питаются от мощного источника питания, а не от линии 5 В. На этом шилде есть два варианта откуда мы можем получить требуемое напряжение для питания моторов. Один из них — это разъем питания платы Arduino, второй вариант — двухконтактная клеммная колодка на шилде. На плате Arduino после разъема питания установлен защитный диод, который помогает, если вы случайно перепутаете полярность подключения источника питания. На шилде после разъема EXT_PWR таких защитных диодов нет, поэтому нужно быть внимательным и обращать внимание на полярность при подключении питания к Motor Shield.

Схема внешнего питания Motor Shield

Если в вашем проекте используется один источник питания и для Arduino и для двигателей, то просто подключите его ко входу питания Arduino или же к разъему внешнего питания EXT_PWR на шилде и установить джампер на шилде в положение EXT.

Если элементы питания не смогут обеспечивать постоянную мощность, требуемую вашему проекту, то это может приводить к сбросу микроконтроллера.

Для случая, когда питание для моторов планируется получать от источника питания платы Arduino, перемычку выбора источника питания необходимо установить в положение Ard. После этого, источником питания будет являться вывод VIN платы Arduino.

Если вы хотите запитать Arduino от USB, а моторы от внешнего источника постоянного напряжения:

  • Не устанавливайте джампер на шилде!
  • Подключите USB-кабель к плате Arduino
  • Подключите внешний источник питания к разъему EXT_PWR на Motor Shield

Если вы используете два источника питания для Arduino и для Motor Shield:

  • Не устанавливайте джампер на шилде!
  • Подключите источник питания к плате Arduino
  • Подключите внешний источник питания к разъему EXT_PWR на Motor Shield

Вне зависимости от того используются ли в вашем проекте двигатели постоянного тока или шаговые моторы, светодиодный индикатор на шилде сигнализирует о достаточном уровне питающего напряжения.  

Использование сервомашинок

Хоббийные сервомашинки являются самым простым способом начать разбираться с управлением двигателями. Они имеют трехконтактый разъем, включающий сигнальную линию, питание +5 В и землю. Motor Shield просто выводит 16-битные ШИМ-выводы Arduino на отдельные разъемы для подключения сервомашинок. Нужно учитывать, что сервомоторы могут потреблять много энергии, поэтому, как уже отмечалось, возможно потребуется подведение отдельной линии питания 5 В.

Подключение сервомашинки к Motor Shield

Преимуществом использования встроенных ШИМ-выводов Arduino является то, что это достаточно точно и работает в фоновом режиме. Можно использовать встроенную бибиотеку Servo.

Использование двигателей постоянного тока

Motor Shield может управлять до 4-х двигателей постоянного тока в обоих направлениях вращения. Скорость вращения можно варьировать с шагом порядка 0.5% (256 значений) используя функцию ШИМ.

Еще раз обратим внимание на рабочий ток в 600 мА, который может обеспечить H-мост этого шилда. Такое значение тока означает использование достаточно небольших двигателей. Внимательно изучайте характеристики используемых вами моторов. Значительное превышение тока через H-мост может приводить к его чрезмерному нагреву и, как следствие — к выходу его из строя.

Двигатель постоянного тока подключается, используя два провода к парным контактам, обозначенным на шилде как M1, M2, M3, M4.

Подключение двигателя постоянного тока к Motor Shield

При написании скетча следуйте следующему алгоритму:

  1. Подключите библиотеку AFMotor, используя команду препроцессора #include
  2. Создайте объект AF_DCMotor, используя AF_DCMotor (номер двигателя, частота) для установки H-моста и сдвигового регистра. Экземпляры класса должны иметь уникальные имена для каждого двигателя. Конструктор класса принимает два аргумента.

    Первый аргумент номер двигателя — номер порта, к которому подключен мотор. Данный парметр может принимать значения 1, 2, 3, 4.

    Второй аргумент частота — это частота ШИМ. Для двигателей 1 и 2 этот аргумент может принимать значения MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, или MOTOR12_1KHZ. Работа на больших частотах сопровождается меньшим гулом, но может приводить к снижению крутящего момента для некоторых моторов. К тому же, на частоте 1 кГц будет использовано меньше энергии. Двигатели 3 и 4 работают только на частоте 1 кГц и игнорируют данный параметр. Если этот параметр не задан, по умолчанию используется частота 1 кГц.

  3. Необходимо задать скорость двигателя, используя setSpeed (скорость), где параметр скорость лежит в диапазоне от 0 (двигатель остановлен) до 255 (максимальная скорость). Скорость можно устанавливать в любой момент. Скорость реакции двигателя является нелинейной и, поэтому, реальное число оборотов в секунду не обязательно будет пропорционально заданному значению.
  4. Для запуска двигателя используйте run (направление), где параметр направление может принимать значения FORWARD, BACKWARD или RELEASE. Последнее значение отключает питание двигателя и эквивалентно команде setSpeed (0). Конечно же, Arduino не знает крутится ваш двигатель «вперед» или «назад», так что если вы захотите изменить направление вращения просто поменяйте местами два провода, идущих от двигателя к Motor Shield.

Пример кода, реализующий управление двигателем постоянного тока:

123456789101112131415161718192021222324252627 #include AF_DCMotormotor2(2,MOTOR12_64KHZ);// создаем объект motor №2, ШИМ 64 кГцvoidsetup(){Serial.begin(9600);// устанавливаем скоросьб передачи по посл. порту 9600 бодSerial.println(«Тест двигателя»);motor.setSpeed(200);// устанавливаем скорость вращения 200/255}voidloop(){Serial.print(«вперед»);motor.run(FORWARD);// вращение впередdelay(1000);Serial.print(«назад»);motor.run(BACKWARD);// в другую сторонуdelay(1000);Serial.print(«стоп»);motor.run(RELEASE);// останавливаем вращениеdelay(1000);}

Использование шаговых двигателей

Шаговые двигатели широко используются в проектах, требующих высокой точности, в частности, они используются в робототехнических разработках и станках с ЧПУ. Motor Shield поддерживает до двух шаговых двигателей. Библиотека работает одинаково и с биполярными и с униполярными двигателями.

Униполярный двигатель. Сначала нужно выяснить какие выводы подсоединены к обмотке, а какие являются отводом от середины обмотки. Если у вас в руках мотор, из которого выходят 5 проводов, то один из них является центральным отводом обеих обмоток. Существуют различные способы как определить выводы обмотки. Центральные отводы нужно соединить вместе и подключить их к выводу GND выходного клеммника. Первую обмотку необходимо подключить к одному выходному порту шилда (например, M1 или M3), вторую обмотку — к другому порту (например, M2 или M4).

Биполярный двигатель. Аналогично униполярному двигателю, за исключением того, что нет общего отвода, а следовательно, не нужно ничего подключать к земле.

Подключение биполярного шагового двигателя к Motor Shield

Работа с шаговым мотором не намного сложнее, чем с двигателем постоянного тока.

  1. Подключите библиотеку AFMotor, используя команду препроцессора #include
  2. Создайте объект шагового двигателя, используя AF_Stepper (шаги, двигатель) для установки H-моста и сдвигового регистра конкретного мотора. Параметр шаги определяет количество шагов на оборот для двигателя. Двигатель с 7.5 градусов/шаг имеет 360/7.5= 48 шагов. Атрибут двигатель — это порт, к которому мы подключили мотор. Если используются выводы шилда M1 и M2, то это порт 1. Если же используются выводы M3 и M4, то в качестве параметра двигатель, то это порт 2 и, следовательно, нужно указать 2.
  3. Установите скорость двигателя, используя setSpeed (обороты), где в качестве параметра обороты необходимо указать желаемое число оборотов в минуту (об/мин).
  4. Каждый раз, когда вы хотите, чтобы двигатель вращался, необходимо вызывать процедуру steps (шаги, направление, тип_шага).

    Параметр шаги задает требуемое число шагов

    В качестве параметра направление может выступать FORWARD или BACKWARD.

    Для задания тип_шага используйте значение SINGLE, DOUBLE, INTERLEAVE или MICROSTEP. SINGLE означает возбуждение одной обмотки, DOUBLE означает что две катушки возбуждаются одновременно, что способствует высокому крутящему моменту, INTERLEAVE означает что происходит чередование между единственной катушкой и двумя катушками, что дает более высокое разрешение, но половинную скорость. MICROSTEP — это способ, при котором производится ШИМ для создания сглаженного движения между шагами. Вы можете выбрать любой метод и изменять его «на ходу», чтобы получить минимальную мощность, больший крутящий момент, или большую точность.

  5. По умолчанию, двигатель удерживает свою позицию, после того как к нему перестали обращаться. Если вы хотите разблокировать обмотки, чтобы мотор смог свободно вращаться, необходимо вызвать функцию release (). Эта функция уменьшает нагрев и снижает потребление тока, но двигатель не сопротивляется вращению извне.
  6. Команды перемещения блокируются и будут возвращены завершенные шаги.

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

В классе AF_Stepper имеется функция onestep (направление, тип_шага), которая реализует перемещение на один шаг двигателя. Параметры направление и тип_шага аналогичны таким же в функции step ().

Пример кода для управления шаговым двигателем:

123456789101112131415161718192021222324252627282930 #include AF_Steppermotor(48,2);voidsetup(){Serial.begin(9600);// Скорость передачи по посл. порту 9600 бодSerial.println(«Тест шагового двигателя»);motor.setSpeed(10);// 10 об/минmotor.step(100,FORWARD,SINGLE);motor.release();delay(1000);}voidloop(){motor.step(100,FORWARD,SINGLE);motor.step(100,BACKWARD,SINGLE);motor.step(100,FORWARD,DOUBLE);motor.step(100,BACKWARD,DOUBLE);motor.step(100,FORWARD,INTERLEAVE);motor.step(100,BACKWARD,INTERLEAVE);motor.step(100,FORWARD,MICROSTEP);motor.step(100,BACKWARD,MICROSTEP);}

Если вам требуется больше возможностей для управления шаговым двигателем, то обратите внимание на библиотеку AccelStepper (устанавливается аналогично AFMotor) в которой есть несколько примеров по управлению двумя шаговыми двигателями c различными ускорениями одновременно.

 Как вы оцениваете эту публикацию? (27 голосов, средняя оценка: 4.85 из 5)<meta><meta><meta><meta><meta>< <spa> Loading …


Еще по этой теме

</span> Метки: Arduino, Cервопривод, MotorShield, Мотор, Шилды Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.

7 комментариев к записи “Motor Shield”

  1. Андрей Алексеенко пишет: 31.01.2015 в 09:40

    Кстате, если запаралелить выводы для движка постоянного тока, то можно увеличить допустимую мощность…Если у нас М1 выдает 0,6Ма и М2 0.6Ма то объединив их выводы мы получим 1,2А…

    Но в таком случае нужно указать это в коде ну и желательно давать плавный старт…

    Ответить

    • Андрей Антонов пишет: 31.01.2015 в 09:44

      Спасибо, Андрей. Ценное дополнение.

      Ответить

  2. Александр пишет: 16.09.2015 в 16:32

    Добрый день! не могу разогнать шаговый биполярный от HDD! Помогите чем сможете!

    Ответить

    • Андрей Антонов пишет: 16.09.2015 в 16:57

      Здравствуйте, Александр! Вот еще статейку почитайте Как работают шаговые двигатели

      и еще одну Шаговый двигатель BYJ-48 с драйвером ULN2003 и Arduino UNO

      Ответить

  3. Саша пишет: 29.11.2015 в 22:20

    Если запараллелить все 4 драйвера, то можно получить Н-мост на 1 мотор, способный пропускать до 2.4А?? А как давать плавный старт?

    Ответить

    • Владислав пишет: 10.12.2015 в 19:43

      Верно. Лично пробовал.

      Ответить

  4. Александр пишет: 19.01.2017 в 18:53

    Спасибо вам Андрей Антонов!

    Самая толковая инфа по подключению биполярного двигателя .

    Никогда не имел дело с ардуино , а тут вдруг понадобилась.

    Гуглил,гуглил…все бестолку ни как не удавалось запустить двигатель.

    Попал на эту страничку и через 29 минут уже вертел этот двигатель как хотел!

    В любую сторону .

    Особенно помогла инфа про это :

    «Параметр шаги определяет количество шагов на оборот для двигателя. Двигатель с 7.5 градусов/шаг имеет 360/7.5= 48 шагов

    У меня двигатель оказался 200 шагов с 1,8 градусов

    Спасибо большое!

    Ответить

Оставить комментарий

Щелкните сюда чтобы отменить ответ.

Хотите подключить мотор к Arduino или Iskra JS?! К сожалению микроконтроллер установленный на управляющих платформах не сможет без посторонней помощи управлять большой нагрузкой. Motor Shield поможет микроконтроллеру управлять коллекторными моторами и шаговыми двигателями.

%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield.5.jpg

Motor Shield — это плата расширения, предназначенная для двухканального управления скоростью и направлением вращения коллекторных двигателей постоянного тока, напряжением 5–24 В и максимальным током до двух ампер на канал.

Плата расширения также сможет управлять одним биполярным шаговым двигателем.

Видеообзор

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

  1. Установите Motor Shield сверху на управляющую платформу, например Arduino Uno или Iskra JS. %D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield.4.jpg
  2. Убедитесь в наличии и правильности соединения джамперов на плате Motor Shield:
    • H1 с 4 пином;
    • E1 с 5 пином.
    • E2 с 6 пином;
    • H2 с 7 пином.%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_jumpers.png
  3. Подключите внешнее питание для моторов через клеммник »PWR».

Примеры работы для Arduino

Управление коллекторными двигателями

Подключите два коллекторных мотора к клеммникам M1 и M2 соответственно.

Схема устройства

%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_scheme_dc_motors.png

Код программы

Для начала покрутим каждый мотор в одну, а затем другую сторону.

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,);     // устанавливаем направление мотора «M2» в одну сторону   digitalWrite(DIR_2, LOW);// включаем второй мотор на максимальной скорости   analogWrite(SPEED_2,255);// ждём одну секунду   delay(1000);     // устанавливаем направление мотора «M2» в другую сторону   digitalWrite(DIR_2, HIGH);// ждём одну секунду   delay(1000);     // выключаем второй мотор   analogWrite(SPEED_2,);// ждём одну секунду   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 =; i <=255; i++){     analogWrite(SPEED_1, i);     Serial.println(i);     delay(20);}     // устанавливаем направление мотора «M1» в другую сторону   digitalWrite(DIR_1, HIGH);// медленно тормозим моторfor(int i =255; i >=; i--){     analogWrite(SPEED_1, i);     Serial.println(i);     delay(20);}     // устанавливаем направление мотора «M2» в одну сторону   digitalWrite(DIR_2, LOW);// медленно разгоняем моторfor(int i =; i <=255; i++){     analogWrite(SPEED_2, i);     delay(20);}     // устанавливаем направление мотора «M2» в другую сторону   digitalWrite(DIR_2, HIGH);// медленно тормозим моторfor(int i =255; i >; i--){     analogWrite(SPEED_2, i);     delay(20);}}

Управление биполярным шаговым двигателем

Драйвер моторов может на себя также взять управления шаговым двигателем. В качестве примера подключим шаговый двигатель 42STH47-0406A.

Схема устройства

%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_scheme_stepper.png

Управление без библиотек

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;   unsignedlong 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,,);       doStep(,,1,1);       doStep(1,,,);       doStep(,,1,);break;       case FULL_STEP:       doStep(1,1,1,1);       doStep(1,,1,1);       doStep(1,,1,);       doStep(1,1,1,);break;       case HALF_STEP:       doStep(1,1,,);       doStep(1,1,1,1);       doStep(,,1,1);       doStep(1,,1,1);         doStep(1,,,);       doStep(1,,1,);       doStep(,,1,);       doStep(1,1,1,);break;}}   void setup(){// настраиваем ножки на выходfor(int i =4; i <8; i++){     pinMode(i, OUTPUT);}// запоминаем текущее время   startTime = millis();}   void loop(){// узнаём время прошедшее с начала работы в миллисекундах// и переводим его в секундыunsignedlong loopTime =(millis()- startTime)/1000;// меняем режим каждую секунду   rotate(loopTime %3);}

Скорость вращения шагового двигателя очень сильно влияет на развиваемый мотором момент. Убедитесь сами. Запустите этот же пример с разными значениями delayTime.

Обратите внимание, что двигатель в однофазном полношаговом режиме позволяет развить гораздо меньший момент, чем в двухфазном полношаговом режиме.

Управление через готовую библиотеку

Для лёгкого и быстрого управления шаговым двигателем мы написали библиотеку AmperkaStepper. Она скрывает в себе все тонкости работы с мотором и предоставляет удобные методы.

Пример работы в различных режимах

step-motor-test.ino
// библиотека для работы с шаговым двигателем#include    // создаём объект для работы с шаговым двигателем// передаём фикированое количество шагов за полный оборот// смотреть в характеристиках двигателя 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 соответственно.

Схема устройства

%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_scheme_dc_motors.png

Код программы

Для начала покрутим каждый мотор в одну, а затем другую сторону.

dc_motors.js
// подключаем библиотеку «motor»var Motor = require('@amperka/motor');// подключаем первый мотор канала M1 на Motor Shieldvar motorOne = Motor.connect(Motor.MotorShield.M1);// подключаем второй мотор канала M2 на Motor Shieldvar motorTwo = Motor.connect(Motor.MotorShield.M2);   // Альтернативный способ подключения с указанием пинов// var myMotor = Motor.connect({phasePin: P4, pwmPin: P5, freq: 100});   // интеварал времениvar time =1000;// счётчикvar state =;   // каждую секунду меняем режим работы setInterval(()=>{// останавливаем моторы   motorOne.write();   motorTwo.write();   state++;if(state ===1){     motorOne.write(1);}elseif(state ===2){     motorOne.write(-1);}elseif(state ===3){     motorTwo.write(1);}elseif(state ===4){     motorTwo.write(-1);}else{     state =;}}, time);

Код программы

Усложним задачу. Будем плавно увеличивать скорость первого мотора до максимальной скорости, а потом понижать до полного выключения. Аналогично проделываем со вторым мотором.

dc_motors_pwm.js
// подключаем библиотеку «motor»var Motor = require('@amperka/motor');// подключаем первый мотор канала M1 на Motor Shieldvar motorOne = Motor.connect(Motor.MotorShield.M1);// подключаем второй мотор канала M2 на Motor Shieldvar motorTwo = Motor.connect(Motor.MotorShield.M2);   // создаём объект анимация// для плавного изменения параметров вращения мотораvar animMotor = require('@amperka/animation').create({// начальное значение// при «0» мотор стоит   from:,// конечное значение// при «1» мотор вращается с максимальной скоростью в одну сторону   to:1,// продолжительность полного перехода// за 5 секунд мотор пройдёт диапазон значений от нуля до единицы   duration:5,// шаг обновления: каждые 20 мс   updateInterval:0.02}).queue({// после завершения перехода, выполняем ещё одну операцию// начальное значение// при «-1» мотор вращается с максимальной скоростью в обратную сторону   from:-1,// конечное значение// при «0» мотор стоит   to:,// продолжительность полного перехода// за 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();

Элементы платы

%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_annotation.png

Драйвер двигателей

Сердце и мускулы платы — микросхема двухканального H-моста L298P.

Термин «H-мост» появился благодаря графическому изображению схемы, напоминающему букву «Н». H-мост состоит из четырёх ключей. %D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:h-bridge_scheme.png В зависимости от текущего состояние переключателей возможно разное состояние мотора.

S1 S2 S3 S4 Результат
1 1 Мотор крутится вправо
1 1 Мотор крутится влево
Свободное вращение мотора
1 1 Мотор тормозит
1 1 Мотор тормозит
1 1 Короткое замыкание источника питания
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, можно перебрасывать только на пины с поддержкой ШИМ.

Для переброски пинов снимите джампер напротив занятого пина и припаяйте проводок между луженым отверстием рядом со снятым джампером и луженым отверстием напротив нужного пина. %D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:arduino-motor-shield:arduino-motor-shield_swap_pins.png На этой картинке мы перекинули:

  • управляющие пины первого канала 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.

Ресурсы

  • Motor Shield в магазине.
  • Векторное изображение драйвера моторов
  • Datasheet на микросхему L298P
  • Библиотека для работы с шаговым двигателем при помощи Motor Shield
  • Библиотека для Espruino по работе с коллекторными моторами

Используемые источники:

  • https://xn--18-6kcdusowgbt1a4b.xn--p1ai/%d0%bf%d0%be%d0%b4%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bc%d0%be%d1%82%d0%be%d1%80-%d1%88%d0%b8%d0%bb%d0%b4-%d0%ba-%d0%b0%d1%80%d0%b4%d1%83%d0%b8%d0%bd%d0%be/
  • http://robotosha.ru/arduino/motor-shield.html
  • http://wiki.amperka.ru/продукты:arduino-motor-shield

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации