Энкодер для шагового двигателя ардуино
Управление биполярным шаговым двигателем при помощи инкрементального (инкрементного) энкодера EC11, Arduino Nano и DRW8825
Для проекта используется:
Плата Arduino Nano, инкрементальный (инкрементный) энкодер EC11, драйвер для шагового двигателя DRV8825, макетная плата, соединительные провода, и биполярный шаговый двигатель Mitsumi.
Для сканирования контактов энкодера можно использовать этот скетч! Загрузите его на плату до подключения энкодера к плате!
//Начало скетча для теста контактов энкодера Копировать этот код
//Конец скетча для теста контактов энкодера
После загрузки скетча для теста контактов энкодера, можно подключать энкодер к плате Arduino Nano, как показано на этой схеме.
Первый вариант кода, который был представлен в видео.
Этот вариант кода, не отключает драйвер шагового двигателя, то есть после завершения вращения продолжается подача питания на шаговый двигатель, таким образом происходит потребление энергии, но зато таким образом, вал шагового двигателя жестко удерживается.
Внимание! Если при удержании вала шаговый двигатель нагревается более чем на 50 градусов, то следует уменьшить подачу тока, немного повернув регулятор на драйвере шагового двигателя, по часовой стрелке (для DRW8825)!
При использовании драйвера шагового двигателя A4988, уменьшение тока происходит при вращении регулятора против часовой стрелки!
//Начало первого варианта кода Копировать этот код
//Конец первого варианта кода
Второй вариант кода.
Этот вариант кода более оптимизированный, но драйвер шагового двигателя отключается через пол секунды после завершения вращения вала. Таким образом отключается подача питания на шаговый двигатель, это снизит расход энергии, но и отключит момент удержания вала.
//Начало второго варианта кода Копировать этот код
//Конец второго варианта кода
После загрузки скетча можно собрать все, как показано на этой схеме.
Digitrode
цифровая электроника вычислительная техника встраиваемые системы
Превращаем шаговый двигатель в энкодер
В электромеханике одним из интересных моментов является то, что обычный двигатель постоянного тока может играть роль также генератора. Вы можете использовать электричество для вращения вала или использовать вращающийся вал для выработки электроэнергии. На основе этого принципа можно сделать немало полезных вещей. И в данном материале мы покажем, как использовать шаговый двигатель в качестве датчика.
Применение шагового мотора в качестве датчика имеет смысл. Если катушки в двигателе могут перемещать вал, то перемещение вала должно вызвать ток в катушках. Однако следует заметить, что при низких скоростях вы можете пропустить импульсы. Опять же, устройство не оптимизировано для этого типа операций.
В схеме используется дифференциальный усилитель на основе двух ОУ для считывания импульсов от катушки. Два операционных усилителя с двух катушек создают квадратурный сигнал, как обычный энкодер.
Когда вал поворачивается в одном направлении, один импульс будет следовать за другим. При вращении в другом направлении последовательность импульсов будет реверсирована.
Для проверки работоспособности концепции можно собрать схему из Arduino, двух двигателей и драйвера A4988.
А можно с одним двигателем и светодиодным кольцом AdaFruit NeoPixel в качестве индикатора, как на видео ниже.
В любом случае считывать импульсы с датчика/двигателя поможет следующий код:
#21. Подключаем к Arduino Шаговый двигатель 28BYJ-48 на драйвере ULN2003
Сегодня в уроке подключим шаговый двигатель 28BYJ-48 к Arduino и научимся вращать вал двигателя в разные стороны и изменять скорость вращения с помощью потенциометра и энкодера KY-040.
Кратко, что такое шаговый двигатель (ШД) — это двигатель, который способен осуществлять вращение на 1 шаг. Шаг — это угол, который обусловлен устройством каждого конкретного шагового двигателя.
Характеристики шагового двигателя 28BYJ-48:
Размера шагового двигателя 28BYJ-48. Необходимы при проектировании деталей для 3D печати.
Вот так выглядит схема шагового двигателя 28BYJ-48
Подавая сигналы в определённом порядке на выводы двигателя, двигатель можно вращать по часовой стрелке.
Для шагового режима.
Для полушагового режима.
Прямое подключение шагового двигателя 28BYJ-48 к Arduino.
В связи с тем, что двигатель 28BYJ-48 работает от 5в и при небольших токах, его можно подключить на прямую к Arduino.
Схема подключения к Arduino UNO будет следующая.
Для вращения ШД достаточно подавать сигналы по схеме, которую мы рассмотрели выше.
Для этого можно сделать массив подачи сигнала на пины микроконтроллера.
И в цикле выполнять каждую строчку массива. Но есть решение с более компактным кодом. Нашел я данный пример на канале Дмитрия Осипова. За что ему отельное спасибо!
Код для вращения в одну и в другую сторону будет вот таким.
ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!
Пример подключения шагового двигателя 28BYJ-48 (5V)с использованием драйвер ULN2003.
Также у Дмитрия Осипова есть код для изменения скорости вращения с помощью потенциометра. Я его немного доработал, сделал обработку нажатия кнопки без задержки в 500 мс. Сейчас двигатель стал вращаться в обратную сторону без видимой задержки.
Для подключения буду использовать модуль SBT0811 на драйвере ULN2003.
Драйвер устроен вот таким образом.
Соответственно, наш код будет работать и с данным драйвером.
Подключим все по схеме и загрузим код в Arduino NANO.
Схема подключения для Arduino UNO будет аналогичной.
Как видим, двигатель без проблем вращается по часовой стрелке и против часовой, при нажатии на кнопку вращается в противоположном направлении. При вращении потенциометра в одну сторону — скорость уменьшается, при вращении в противоположном направлении скорость увеличивается.
ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!
Пример управления шаговым двигателем 28BYJ-48 с помощью Энкодера.
Для уменьшения количества элементов в схеме решил заменить потенциометр и тактовую кнопку на энкодер вращения KY-040. Как подключить энкодер вращения к Arduino рассказывал в предыдущем уроке.
Подключаем шаговый двигатель 28BYJ-48 и энкодер к Arduino по схеме.
Проводим небольшую доработку кода и получим вот такой результат.
Если нажать на энкодер, меняется направление вращения. А при вращении энкодера по часовой стрелке — скорость увеличивается. Если вращать против часовой стрелки — скорость снижается.
ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!
Вы также можете без проблем воспользоваться примером из стандартной библиотеки Stepper, которая позволит сделать тоже самое и при меньшем объёме кода. Но библиотека не даст вам понять, как это все устроено.
А вот сам пример вращения в одну сторону, а затем в другую с использованием библиотеки Stepper.
На основе данного примера можно реализовать управление не только одним шаговым двигателем, а несколькими. Причем, каждый двигатель будет выполнять свои действия не зависимо от других. В планах сделать пару проектов с использованием данного шагового двигателя.
Пишите в комментариях, что бы вы хотели сделать на шаговых двигателях, и какие примеры вас интересуют. Чем больше будет откликов, тем чаше будут выходить проекты и уроки на сайте.
Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.
Всем Пока-Пока.
И до встречи в следующем уроке
Понравилась статья? Поделитесь ею с друзьями:
Плавное управление мотором с Arduino
ОБНОВЛЕНИЯ
- v1.1 – улучшен алгоритм
- v1.2 – совместимость с esp
- v1.3 – небольшие улучшения и фиксы
ТЕОРИЯ
Решил я сделать библиотеку для управления обычным щёточным мотором с энкодером, которая позволила бы управлять им как шаговым (с либой AccelStepper) с поддержкой ускорения и ограничения максимальной скорости. Библиотека полностью наследует все инструменты по работе с мотором из GyverMotor. Основной метод библиотеки tick() принимает текущее положение вала мотора (сигнал с потенциометра или энкодера) и позволяет:
- Сделать полноценный сервопривод из моторчика с редуктором и резистором на валу
- Поддерживать скорость вращения моторчика под переменной нагрузкой (шпиндель станка)
- Из моторчика с энкодером позволяет получить аналог шагового мотора с возможностью повернуть вал на нужное количество оборотов (градусов) с плавным ускорением и ограничением максимальной скорости
БИБЛИОТЕКА
AccelMotor v1.3
Библиотека для расширенного управления и стабилизации мотора с энкодером
- Наследует все фишки из библиотеки GyverMotor (поддержка разных драйверов и режимов)
- Режим поддержания скорости с обратной связью
- Режим поворота на заданный угол с обратной связью
- Настраиваемые коэффициенты PID регулятора
- Ограничение ускорения и скорости
- Библиотека принимает любой тип обратной связи: энкодер, потенциометр, и т.д.
- Поддержка мотор-редукторов, настройка передаточного отношения энкодера
- Регулятор учитывает “мёртвую зону” мотора
- Все функции работают в градусах и “тиках” энкодера
Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)
Энкодер для двигателя на Arduino и PID контроллере
В современных системах автоматики PID контроллеры (регуляторы) являются самым распространенным типов регуляторов, предназначенных для стабилизации выходного процесса каких либо систем (механизмов). PID означает Proportional-Integral-Derivative, что расшифровывается как пропорционально-интегрально-дифференциальный (ПИД). Эти три управляющих механизма скомбинированы таким образом, что сигнал ошибки, формируемый ими, используется в качестве обратной связи для управления конечным приложением (устройством). PID (ПИД) контроллеры применяются во множестве современных устройств: в дронах для стабилизации их полета, в системах автоматической регулировки температуры (например, жала паяльника), для регулировки числа оборотов двигателей и т.д. Без использования PID контроллеров реализация подобных устройств значительно бы усложнилась. Конечно, существуют и другие типы автоматических регуляторов, превосходящие ПИД контроллеры по адаптивности и стабильности, но их реализация и настройка существенно сложнее, а с настройкой ПИД контроллеры с и использованием современных инструментов может справиться даже начинающий радиолюбитель.
В данной статье мы рассмотрим основные принципы работы PID контроллера, рассмотрим его использование для реализации энкодера для двигателя и проблемы, которые возникают при этом. В завершение мы реализуем PID алгоритм управления двигателем с помощью платы Arduino. Ранее на нашем сайте мы использовали PID контроллер на основе Arduino для создания самобалансирующегося робота.
Основные принципы работы PID контроллера (регулятора)
Как мы уже выяснили, PID (ПИД) состоит из таких понятий как пропорциональный, интегральный, дифференциальный. Допустим, нам необходимо создать машину которая бы останавливалась бы строго в заданном месте. Без использования PID контроллера реализовать такой алгоритм действия машины достаточно сложно вследствие наличия у любого движущегося тела момента инерции.
Более подробно о том, что такое PID контроллер (регулятор) и как он работает, вы можете прочитать в Википедии. Но как применить принципы работы PID контроллера в микроконтроллере? Этой информации в Википедии уже нет.
Основные принципы работы PID контроллера показаны на следующей картинке. Рассмотрим кратко основные составляющие этого процесса.
PID контроллер получил такое название из-за принципов обработки сигналов ошибки, которые возникают в управляемом им процессе. На представленном рисунке вы можете увидеть, в пропорциональной части регулятора ошибка (сигнал ошибки) умножается на константу Kp. В интегральной части ошибка умножается на константу Ki и затем интегрируется, а в дифференциальной части ошибка умножается на константу Kd, а затем дифференцируется. После всего этого все эти три значения суммируются чтобы сформировать выходное значение регулятора. В PID контроллере параметры Kp, Kd и Ki называются коэффициентами усиления. Также они называются P, I и D параметрами регулятора. Эти коэффициенты настраиваются индивидуально, чтобы обеспечить выполнение заданного набора требований к системе, например, насколько чувствительной или устойчивой она должна быть. Рассмотрим каждый из этих параметров более подробно.
P-параметр (пропорциональный)
Допустим, ошибка в системе изменяется во времени, как показано красной линией на представленном рисунке. В пропорциональном контроллере эта ошибка умножается на коэффициент усиления Kp. То есть если ошибка большая, то и значение ошибки на выходе контроллера будет большим, если ошибка равна 0, то и на выходе будет 0, если ошибка отрицательная – на выходе также будет отрицательное значение.
I-параметр (интегральный)
В интегральном контроллере происходит суммирование всех значений ошибки, при этом полученная сумма умножается на константу Ki. В подобном контроллере легко видеть, что результатом интегрирования является область лежащая под кривой: на представленном рисунке эта кривая показана синим цветом для положительной области и желтым цветом для отрицательной области. В сложных системах интегральный контроллер используется для устранения постоянной ошибки, возникающей при работе системы. При этом неважно насколько мала величина ошибки, все равно суммирование достаточно большого их числа обеспечит достаточное значение на выходе контроллера. На представленном рисунке эта ошибка показана зеленым цветом.
D-параметр (дифференциальный)
Дифференциальный контроллер показывает скорость изменения ошибки. Когда изменение величины ошибки происходит достаточно медленно (как на представленном рисунке), мы в качестве стартовой позиции (то есть кривой, аппроксимирующей это изменение) можем использовать синусоиду. При этом на выходе дифференциального контроллера будет маленькая величина – зеленая линия на представленном рисунке. И чем быстрее будет изменяться ошибка, тем больше будет становиться значение на выходе контроллера.
Значение на выходе PID контроллера является суммой с выхода трех рассмотренных контроллеров. Но необязательно чтобы всегда работали эти три контроллера, при желании любой из этих контроллеров можно выключить из работы, просто приравняв нулю коэффициент усиления в его ветви. К примеру, если мы установим D-параметр в ноль, то мы получим PI контроллер, а если мы установим I-параметр в ноль, то мы получим PD контроллер.
Что такое двигатель с энкодером и как он работает
Двигатель с энкодером (encoder motor) — это электродвигатель постоянного тока (со щетками), к которому прикреплен энкодер. Ранее на нашем сайте мы уже рассматривали подключение инкрементального энкодера к плате Arduino, можете прочитать эту статью если есть желание.
В двигателе с энкодером инкрементальный энкодер закрепляется на электродвигатель постоянного тока и обеспечивает обратную связь в этой связке при помощи отслеживания скорости или положения оси двигателя. На рынке сейчас доступно много типов двигателей, также существуют различные типы энкодеров: инкрементальные, абсолютные, оптические, магнитные и т.д. Для различных типов двигателей доступны различные применения. Кроме двигателей постоянного тока существуют еще серводвигатели, шаговые двигатели и т.п. На представленном рисунке показан электродвигатель типа N20 с энкодером магнитного типа, который уменьшает выходные обороты двигателя (RPM) до 15 с помощью прикрепленной коробки передач. Также на рисунке вы можете видеть два закрепленных датчика Холла, с помощью которых можно определять направление вращения двигателя – с помощью микроконтроллера мы можем делать это достаточно просто.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- N20 Encode Motor (двигатель N20 с энкодером) (купить на AliExpress).
- Регуляторы напряжения BD139 (2 шт.) и BD140 (2 шт.) (купить на AliExpress).
- Транзистор BC548 – 2 шт. (купить на AliExpress).
- Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
- Резистор 100 Ом – 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
- Источник питания.
Внешний вид необходимых для проекта компонентов показан на следующем рисунке.
Схема проекта
Схема энкодера для двигателя на Arduino и PID контроллере представлена на следующем рисунке.
Принцип работы схемы достаточно прост. Двигатель N20 с экнкодером имеет 6 контактов, контакты M1, M2 используются для подачи питания на двигатель (он у нас очень маленький, работающий от 3.3V). Контакты VCC и GND используются для питания цепи энкодера. Для питания энкодера необходимо подавать напряжение +5V, иначе цепь энкодера не будет корректно работать. Контакты PIN_A и PIN_B двигателя непосредственно подключены к энкодеру. Измеряя состояние этих контактов, мы легко можем определить число оборотов двигателя в минуту (RPM). Наш двигатель N20 имеет 15RPM и передаточное число 1:2098, что означает, что ось двигателя должна совершить 2098 оборотов для того чтобы вспомогательный вал (на выходе коробки передач) совершил один оборот. Контакты PIN_A и PIN_B двигателя подключены к контактам 9 и 10 платы Arduino – они оба имеют возможность формирования ШИМ (широтно-импульсная модуляция) сигналов. Эти контакты должны обязательно иметь возможность формирования ШИМ сигналов, иначе код программы работать не будет. PID контроллер управляет двигателем при помощи ШИМ.
Также наша схема содержит драйвер двигателя в виде H-моста. Драйвер двигателя у нас имеет такую схему, что с помощью него мы можем управлять двигателем с использованием всего 2-х контактов платы Arduino. Также он защищает двигатель от ложных срабатываний.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Комментарии к коду программы также переведены в конце статьи, в этом разделе я их оставил без перевода.
Сначала мы должны скачать и установить библиотеку PID контроллера для Arduino по следующей ссылке:
Далее в коде программы мы должны подключить заголовочные файлы всех используемых библиотек – мы в нашем проекте используем только библиотеку управления PID контроллером. Затем мы укажем все используемые контакты.