Содержание
Делаем Fischertechnik-совместимый модуль управления шаговым мотором на основе драйвера A4988 (DRV8825) / Хабр
Уже давно я припас все детали, перечисленные ниже, и осталось собрать все вместе и получить модуль управления мотором для удобной установки на конструктор. Конечно, сначала мы подключили катушки шагового мотора с помощью простого H-bridge и оценили, почему так делать не стоит. Далее мотор был подключен с помощью драйвера и разница оказалась более чем наглядной.
2 вывода питания с коннекторами Фишертехник, 4 вывода для подключения мотора и 5 выводов для подключения микроконтроллера (step, dir, enable). Отверстия в крышке пропилены с помощью Dremel, равно как и проточено отверстие в шестеренке под вал мотора — предупреждаю, пластик Фишертехника, хоть он и гибкий, обрабатывается не проще металла!
Введение
Нам захотелось сделать стандартный блок Фишертехник, который быстро и удобно устанавливается на любую модель и позволяет управлять шаговым мотором Nema 14, закрепленном в стандартном креплении Фишертехник. При этом, обеспечить «правильное» управление мотором (с ограничением рабочего тока) и тихое и быстрое его вращение. Соответственно, мы попробовали разные способы управления мотором и убедились, что специализированный драйвер представляет собой оптимальное решение.
Двумя катушками шагового мотора Nema можно управлять как двумя обычными моторами с помощью PWM (широтно-импульсной модуляции) и H-bridge, выбрав подходящее значение питающего напряжения так, чтобы не слишком превышать допустимый ток, и переключая их по очереди. Для управления двигателями у нас есть как копеечная микросхема SN754410NE Quadruple Half-H Driver так и плата расширения Kitronik Compact All-In-One Robotics Board for BBC micro:bit, преимущество платы расширения в том, что она включает в себя I2C расширитель портов на 16 выходов с подключенными H-bridge на 4 мотора и коннекторами для 8 сервоприводов и блоки для управления в среде разработки MakeCode, а также обеспечивает питание вставленного микроконтроллера Microbit от питающего напряжения до 10. 8 В.
Детали и инструменты
Из каталога Фишертехник потребовались следующие детали:
- Корпус для батарейки 9В
- Крышка для корпуса
- Держатель шагового двигателя
- Шестерня-адаптер Z10 m1,5 для мотора
С Aliexpress были заказаны:
- Nema 14 мотор Hanpose. Замечу, что моторы данного формфактора и с таким же валом на Амазоне и в других каталогах представлены от этого же производителя. Есть еще аналогичные моторы с круглым валом — но его придется пилить дремелем, чтобы насадить шестерню Фишертехник (или ставить муфту, что вовсе не всегда удобно).
- A4988 DRV8825 Stepper Motor Driver. Обратите здесь внимание на подробное описание драйвера по ссылке. Сейчас этот лот недоступен, но полно аналогичных.
- Резисторы набором, включая номинал 4.7 кОм (подключен для подтяжки входа Enable драйвера мотора к питанию микроконтроллера).
- Конденсаторы электролитические набором, включая номинал 47 мкф (подключен к цепи питания драйвера мотора согласно схеме).
- SN754410NE Quadruple Half-H Driver — ссылку на лот не сохранил, так что смотрите ссылку на даташит, микросхема популярная и копеечная, меньше чем по 5 штук в продаже не встречал. Использована для «неправильного» подключения шагового мотора без использования платы расширения Kitronik (см. ниже), чтобы продемонстрировать детям, как сделать все то же самое намного дешевле, но с меньшим удобством.
- Какая-то плата расширения для Micro:Bit с выведенными пинами микроконтроллера и напряжением питания 5 В. Использована только для первой фотографии в статье, чтобы продемонстрировать — модуль работает напрямую с микроконтроллером без использования каких-либо функций плат расширения.
С британского сайта компании Pimoroni приехали:
- Подходящая по размеру макетная плата Pico Proto. Легко заменяется макетной платой, обрезанной до нужного размера.
- Kitronik Compact Motor Driver Board for the BBC micro:bit — нужна только для «неправильного» подключения мотора для сравнительного теста. Можно заменить микросхемой Half-H Driver (см. выше).
Все это спаяно паяльной станцией QUECOO с жалом T12 при температуре 330°C бессвинцовым припоем 0.8 мм. Кстати, припой японский HIROSAKI M705 с 3% серебра — выбран как самый доступный 🙂 В Таиланде оказалось сложно найти бессвинцовый припой в розницу (оптом — пожалуйста, большой выбор), да еще и малого диаметра. Припой хороший и, по ощущениям, более текучий, чем припой без серебра Pimoroni Lead Free Solder, но в целом, большой разницы мы не заметили. Для развлечений с детьми свинцовый припой не рассматриваю в принципе, впрочем, мы не испытываем каких-либо затруднений при пайке бессвинцовым — в том числе, компонентов поверхностного монтажа.
Простой и неправильный способ управления шаговым мотором
Поскольку наш мотор по спецификации на 1.2 А и сопротивлением обмотки 4 Ом, рабочее напряжение для него должно быть примерно 3.5 В (4 Ом*1.2 А/2/0.7 = 3.4 В). С учетом падения напряжения на источнике и проводах можно воспользоваться и аккумулятором на 5 В, при этом замеренный ток батареи составляет 1. 8 А. При этом мотор ощутимо греется — примерно до 60°C на 60 оборотах, шумит, и вращается достаточно медленно (плата расширения использует PWM 50 Гц для управления моторами и сервоприводами). В целом, пользоваться можно, если нам достаточно повернуть вал на заданное число оборотов и потом обесточить обмотки (при этом вал начнет свободно вращаться без удержания положения).
Практически такой метод хоть и работает, но плохо — мотор стартует рывком, буквально разламывая собранную с ним модель, шумит и греется, притом быстро разряжая аккумулятор. При длительной работе возможно «спалить» мотор из-за превышения допустимого тока, хотя, скорее, при таком токе потребления раньше батарея разрядится.
Использование драйвера шагового мотора A4988 (DRV8825)
Драйвер осуществляет управление мотором посредством контроля тока через обмотки, что гарантирует сохранность двигателя (соответствие спецификации по допустимому току) и позволяет подавать на двигатель высокое напряжение до 35 В (обеспечивая более быстрое перемещение вала за счет быстрого нарастания тока до предельного). Такой контроль можно реализовать и непосредственно на микроконтроллере, используя аналоговые входы и вычисление управляющего сигнала с синусоидальной огибающей, хотя для практического использования это не очень удобно (потребуются лишняя «обвязка» и занятые входы).
Указанные драйверы шагового мотора требуют питающее напряжение не ниже 8 В, а плата расширения позволяет подключать питающее напряжение в широком диапазоне, включая стандартные 5 В и 9 В от батареи Фишертехник. Для универсальности мы добавили преобразователь напряжения на 12 В для питания мотора, так что полученный модуль работает и от USB блоков питания и от батарей Фишертехник, притом обеспечивая достаточно быстрый поворот мотора.
Микрошаги нам пока не нужны, так что соответствующие входы драйвера не подключены, что обеспечивает работу в так называемом режиме полного шага.
Подробнее смотрите A4988 Stepper Motor Driver Carrier
Для управления драйвером достаточно двух пинов Step и Dir (шаг и направление), при этом их необходимо «подтянуть» к «земле» (нулю) для исключения самопроизвольного подергивания двигателя при включении или перезагрузке управляющего микроконтроллера из-за «наводок». Номинал подтягивающих резисторов зависит от длины проводов и их расположения, например, 4.7 кОм нам обычно достаточно (хотя для длинных проводов в несколько метров могут понадобиться подтягивающие резисторы в 1 кОм и даже менее), а 10 кОм порой приводят к нестабильной работе. Впрочем, мы не стали подключать эти резисторы и воспользовались другим методом.
Пин драйвера Enable не является обязательным к использованию и позволяет заблокировать драйвер и обесточить мотор ценой потери удерживающего момента на нем. По умолчанию этот пин уже «подтянут» к нулю. Поскольку мы хотели иметь возможность отключать мотор для экономии батареи, то решили добавить подтягивающий резистор 4.7 кОм к питанию микроконтроллера. Так мы получили выключенный по умолчанию драйвер и двигатель, для включения нужно подать ноль (низкий логический уровень) на пин Enable. При таком подключении можно обойтись без «подтяжки» пинов Step и Dir, управляя ими программно с микроконтроллера.
Для настройки тока драйвера можно настроить максимальный ток одной из обмоток как половину максимального тока мотора поделенную на 0. 7 (поскольку квадрат суммарного тока равен сумме квадратов токов двух обмоток) или использовать формулу зависимости выходного тока от напряжения на потенциометре (если нам известен номинал тококонтролирующего резистора на плате драйвера) или просто измерять потребляемый от батареи ток (внимание — ток на обмотках мотора не равен току от батареи, зато мощность двигателя почти равна потребляемой мощности).
Как результат, с драйвером мы получили втрое меньшее потребление тока батареи 0.6 А при мягком старте и бесшумной работе двигателя и намного более быстром его вращении. Двигатель теперь практически не греется, хотя, разумеется, продолжает потреблять указанный ток даже при остановке (так уж устроен шаговый двигатель). Наличие выведенного пина Enable позволяет выключать двигатель на то время, когда не требуется удержание вала (например, для перемещения конвейера в удержании позиции нет необходимости).
Подключение и управление модулем
Сделанный согласно вышеизложенному модуль со снятой крышкой выглядит так:
Провод питания проведен через весь модуль, чтобы избежать открывания крышки при рывках питающего провода. Радиаторы на преобразователь напряжения и драйвер мотора не нужны, поскольку они ощутимо не нагреваются, работая примерно на треть допустимой мощности.
Типовый Nema двигатель обеспечивает 200 RPM (оборотов в минуту) при 200 шагах на оборот, что соответствует 1.5 миллисекунды на шаг. Для управления можно использовать PWM с соответствующим периодом или просто переключать логические уровни с нужной задержкой. Притом драйвер управляется возрастающим фронтом на входе Step, а по спецификации, высокий логический уровень достаточно подать на 1 микросекунду. Таким образом, управление модулем осуществляется очень просто. Пример кода в среде MakeCode для вращения по часовой стрелке и против нее (направление зависит от подключения мотора к модулю — если перевернуть коннектор мотора, направление инвертируется):
Заключение
Сегодня мы дополнили конструктор Фишертехник полезным модулем и в процессе обсудили с детьми много всего интересного и полезного. Дальше было бы интересно подготовить печатную плату и заказать ее, к примеру, на JLCPCB, благо доставка из Гонконга в Таиланд стоит недорого. Аналогично, можно заказать и 3D печать — было бы удобнее напечатать подходящую крышку модуля, вместо того, чтобы резать оригинальную дремелем.
Еще у нас лежит блок управления панелями адресных светодиодов на микроконтроллере Raspberry Pi Pico в точно такой же коробочке Фишертехник, который мы делали на Новый год — радуга для подсветки комнаты, расположенная за телевизором. Pico хорош в том числе и тем, что легко помещается в такой корпус, даже вместе с макетной платой Pico Proto. Если доберусь, напишу и об этой самоделке, детям она очень нравится 🙂
Также смотрите
- Геопространственный анализ, геофизика, геология, физика, математика, вычислительные методы, Фишертехник на Хабре
- Geophysics and geospatial analysis on LinkedIn
- Геологические модели и код на GitHub
- YouTube канал с геологическими моделями
- Геологические модели в виртуальной/дополненной реальности (VR/AR)
A4988 Шаговый двигатель RaspberryPi — Что я сломал — Программирование и веб-разработка
Мы используем шаговый двигатель 42shd0034-20B Geetech, снятый с 3D-принтера:
Мы будем управлять им с помощью контроллера шагового двигателя A4988. Вы можете купить пять таких упаковок менее чем за 2 доллара в Интернете — определенно стоит иметь при себе несколько дополнений:
. =0J450
На следующей диаграмме показано, что мы будем делать:
После того, как все будет подключено, в конечном итоге это будет выглядеть примерно так:
Для начала подключите штифты степпинга и направления. Я использовал GPIO16 для степпинга и GPIO21 для направления:
Каждый раз, когда для GPIO16 установлено значение HIGH, шаговый двигатель будет делать один шаг. Когда контакт направления ВЫСОКИЙ, шаговый двигатель будет вращаться по часовой стрелке, когда он НИЗКИЙ, против часовой стрелки.
Если вы не используете функцию сна, соедините контакты RESET и SLP вместе, а затем подключите их напрямую к 3,3 В:
Использование отдельного провода источника питания 12В к контактам GND и VMOT. Вы также должны поместить конденсатор между этими контактами как можно ближе к плате. Как правило, самая длинная сторона является положительной. Вам также необходимо подключить внешний GND к GND Raspberry Pi:
. Подключите четыре контакта шагового двигателя:
. но я предоставил класс ниже, чтобы помочь вам начать работу:
# Система импортирует
import RPi.GPIO as GPIO
from time import sleep
class StepperHandler():
__CLOCKWISE = 1
__ANTI_CLOCKWISE = 0
def __init__(self, stepPin, directionPin, задержка = 0,208 , stepsPerRevolution=200):
# Настройка экземпляра лей = задержка
self.RevolutionSteps = stepsPerRevolution
self.CurrentDirection = self.COLCKWISE
self.CurrentStep = 0
# Настройка выводов gpio
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(self.StepPin , GPIO.OUT)
GPIO.setup(self.DirectionPin, GPIO.OUT)
def Step(self, stepsToTake, direction = __CLOCKWISE):
print(«Step Pin: » + str(self.StepPin) + » Пин направления: » + str(self.DirectionPin) + » Задержка: » + str(self. Delay))
print(«Выполнение » + str(stepsToTake) + «steps.»)
# Установить направление
GPIO.output(self.DirectionPin, direction)
# Выполнить запрошенное количество шагов
для x в диапазоне(stepsToTake) :
print(«Шаг» + str(x))
GPIO.output(self.StepPin, GPIO.HIGH)
self.CurrentStep += 1
sleep(self.Delay)
GPIO.output(self.StepPin, GPIO .LOW)
sleep(self.Delay)
# Определить выводы
STEP_PIN = 16
DIRECTION_PIN = 21
# Создать новый экземпляр нашего шагового класса (обратите внимание, если вы только начинаете с этим, вы, вероятно, лучше выкл с задержкой ~0,1)
stepperHandler = StepperHandler(STEP_PIN, DIRECTION_PIN, 0.0025)
# Один раз перейти вперед
stepperHandler.Step(200)
# Один раз вернуться назад ПО ЧАСОВОЙ СТРЕЛКЕ)
Нравится:
Нравится Загрузка …
Управление шаговым двигателем с A4988 и Raspberry Pi Pico
Содержание
Обзор
Шаговый двигатель NEMA17 часто используется в робототехнике и 3D-печати, потому что он небольшой, но мощный. Чтобы заставить его работать хорошо, вы должны знать, как его контролировать. В этой статье объясняется, как управлять этим двигателем с помощью A49.88 и Raspberry Pi Pico с MicroPython.
Драйвер A4988 — это устройство, которое помогает двигателю NEMA17 работать по-разному. Raspberry Pi Pico — это небольшая компьютерная плата, которая с помощью кода MicroPython позволяет легко управлять двигателем.
В этом руководстве рассказывается, как соединить эти детали с двигателем NEMA17. Он будет охватывать основы, как их подключать и как кодировать в MicroPython. К концу вы сможете использовать эти детали в различных проектах, таких как робототехника и 3D-печать. Если вам нужно больше мощности, вы можете использовать 9Драйвер 0105 DRV8825 вместо A4988.
Как только вы поймете основы, вы сможете начать создавать и управлять своими собственными проектами с приводом от двигателя на основе модуля шагового привода A4988.
Спецификация
Чтобы следовать руководству по A4988 и Raspberry Pi Pico, вам потребуются определенные компоненты. Все эти предметы можно удобно купить на Amazon. Мы также включили ссылки на покупку для вашего удобства.
С.Н. | Компоненты Наименование | Количество | Ссылки для покупки |
---|---|---|---|
1 | Плата Raspberry Pi Pico | 1 | Amazon | AliExpress |
2 | Драйвер шагового двигателя A4988 | 1 | Amazon | AliExpress |
3. | Шаговый двигатель NEMA17 | 1 | Amazon | AliExpress |
4 | Электролитический конденсатор 10 мкФ | 1 | Amazon | AliExpress |
5 | Электролитический конденсатор 100 мкФ | 1 | Amazon | AliExpress |
6 | 7805 ИС регулятора напряжения | 1 | Amazon | AliExpress |
7 | Адаптер постоянного тока 12 В | 1 | Amazon | AliExpress |
8 | Соединительные перемычки | 20 | Amazon | AliExpress |
9 | Макет | 1 | Amazon | AliExpress |
Модуль драйвера шагового двигателя A4988
A4988, комплексный драйвер микрошагового двигателя, поставляется со встроенным преобразователем, что упрощает его работу. Коммутационная плата производства Allegro оснащена несколькими примечательными функциями, включая регулируемое ограничение тока, защиту от перегрузки по току и перегреву, а также возможность выбора между пятью различными разрешениями микрошагов.
Этот универсальный драйвер работает в широком диапазоне напряжений от 8 В до 35 В. Он может выдавать около 1 А на фазу без необходимости использования радиатора или принудительного воздушного потока. Однако при наличии соответствующих мер по охлаждению его производительность может быть повышена до 2 А на катушку.
Кроме того, этот драйвер компактен, что делает его подходящим для проектов с ограниченным пространством. Он также поддерживает режимы полного, половинного, четвертного, восьмого и шестнадцатого шага, обеспечивая гибкость управления шаговыми двигателями с разным уровнем точности. Это делает A4988 популярный выбор в проектах, связанных с 3D-принтерами, станками с ЧПУ и другими автоматизированными роботизированными системами.
Характеристики
- Макс. Рабочее напряжение: 35 В
- Мин. Рабочее напряжение: 8 В
- Макс. Ток на фазу: 2A
- Микрошаговое разрешение: полный шаг, ½ шага, ¼ шага, 1/8 и 1/16 шага
- Защита от обратного напряжения: Нет
- Размеры: 15,5 × 20,5 мм (0,6″ × 0,8″)
- Защита от короткого замыкания на землю и нагрузки
- Низкий выход RDS(ON)
- Схема отключения при перегреве
Распиновка драйвера двигателя A4988
Драйвер A4988 имеет в общей сложности 16 контактов:
1. Контакты источника питания: контакты заземления. VDD используется для управления внутренней логической схемой, которая может иметь напряжение от 3 В до 5 В, тогда как VMOT обеспечивает питание двигателя, которое может иметь напряжение от 8 В до 35 В.
2. Контакты выбора микрошага: Драйвер A4988 имеет входы трехступенчатого переключателя разрешения, т. е. MS1, MS2 и MS3. Установив соответствующие логические уровни на эти контакты, мы установим двигатели как минимум на одно из пяти шагов разрешения.
3. Управляющие входные контакты: STEP и DIR являются двумя управляющими входными контактами. Вход STEP управляет микрошагами двигателя, тогда как вход DIR управляет направлением вращения двигателя.
4. Контакт управления режимами питания: A4988 имеет три различных входа для управления режимами питания: EN, RST и SLP. Штырь EN является активным низким входом, при нажатии на НИЗКИЙ уровень A4988 драйвер включен. Вывод SLP является активным низким входом. Установка этого штифта на НИЗКИЙ уровень переводит драйвер в спящий режим, сводя к минимуму потребление ресурсов. RST — это активный низкий вход, при установке которого на НИЗКИЙ уровень все входы STEP игнорируются. Он также сбрасывает драйвер, устанавливая внутренний транслятор на начальную ступень двигателя.
5. Выходные контакты: Имеется 4 выходных контакта: 2B, 2A, 1B, 1A. К этим контактам можно подключить любой биполярный шаговый двигатель с напряжением от 8 до 35 В.
Требования к радиатору
Можно безопасно использовать драйвер A4988 без радиатора, если номинальный ток не превышает 1 А. Для достижения более 1 А на катушку требуется радиатор или другой метод охлаждения.
Из-за чрезмерного рассеивания мощности драйвера A4988 происходит повышение температуры, которое может превысить возможности микросхемы, что может привести к ее повреждению.
Настройка ограничения тока
Перед подключением двигателя необходимо настроить ограничение тока драйвера, чтобы ток находился в пределах ограничения двигателя. Мы можем сделать это, отрегулировав опорное напряжение с помощью потенциометра на плате и рассмотрев приведенное ниже уравнение.
Предел тока = VRef x 2,5 |
Например, если шаговый двигатель рассчитан на 350 мА, нам нужно отрегулировать опорное напряжение до 0,14 В. Возьмите маленькую отвертку и регулируйте ограничение тока с помощью потенциометра, пока не достигнете номинального тока.
Шаговый двигатель NEMA17
NEMA 17 представляет собой гибридный шаговый двигатель с углом шага 1,8° (200 шагов/оборот). Термин «NEMA 17» относится к спецификации Национальной ассоциации производителей электрооборудования для шаговых двигателей. В частности, «17» относится к размерам лицевой панели двигателя, которые в данном случае составляют примерно 1,7 дюйма на 1,7 дюйма.
Шаговые двигатели NEMA 17 широко используются в таких устройствах, как 3D-принтеры, станки с ЧПУ и небольшие роботизированные приложения благодаря своим компактным размерам, хорошему крутящему моменту и точному управлению. Обратите внимание, что для правильного управления шаговым двигателем обычно требуется драйвер шагового двигателя, который может точно контролировать ток в обмотках двигателя для перемещения ротора с точными «шагами».
Шаговые двигатели NEMA 17 обычно имеют четыре провода, каждый из которых подключен к одному концу двух отдельных катушек внутри двигателя. Эти четыре провода часто имеют цветовую кодировку, чтобы их было легче идентифицировать. Цветовая кодировка не стандартизирована для всех производителей, но общая схема:
- Черный и зеленый провода: часто соответствуют одной катушке, которую можно назвать катушкой A или фазой 1.
- Красный и синий провода: часто соответствуют другой катушке, которую можно назвать катушкой B или фазой 2.
Взаимодействие шагового двигателя NEMA17 с Raspberry Pi Pico и A4988
Для управления шаговым двигателем NEMA17 с помощью драйвера шагового двигателя A4988 и платы Raspberry Pi Pico соединения очень просты. Мы можем использовать контакты GPIO16 и GPIO17 на плате Raspberry Pi Pico для управления направлением и шагом двигателя. Полная схема подключения приведена ниже.
Для питания подключите контакт VMOT на драйвере A4988 к источнику питания 12 В, а контакт VDD к источнику питания 5 В. Важно установить развязывающий электролитический конденсатор емкостью 100 мкФ на контакты питания двигателя рядом с платой, чтобы стабилизировать питание и снизить уровень шума. Кроме того, для дополнительной стабилизации следует установить электролитический конденсатор емкостью 10 мкФ на вывод питания 5 В.
Затем шаговый двигатель NEMA17 подключается к драйверу A4988 с помощью четырех доступных контактов двигателя, как показано на схеме выше.
Код MicroPython для базового управления шаговым двигателем
Теперь, когда вы подключили драйвер A4988 и установили ограничение по току, пришло время подключить плату Raspberry Pi к компьютеру и загрузить некоторый код. Этот скетч управляет шаговым двигателем NEMA17 в одном направлении.
1 2 3 4 5 6 7 8 9 9 0004 10 11 12 13 14 15 16 17 18 19 90 004 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 3 6 37 38 39 40 | от импорта машины Pin, Таймер import utime
dir_pin = Pin(16, Pin. OUT) step_pin = Pin(17, Pin.OUT) step_per_revolution = 200 900 04 # Инициализация таймера tim = Timer()
def step(t): global step_pin step_pin.value(not step_pin.value())
def rotate_motor(delay): 90 002 # Установить таймер для шага tim.init( freq=1000000//задержка, режим=Timer.PERIODIC, обратный вызов=шаг)
def loop(): пока True: # Установка направления вращения по часовой стрелке dir_pin.value(1) 9 0004 # Медленно вращайте мотор ) tim.deinit() # остановить таймер dir_pin.value(0)
# Быстрый вращение двигателя tim.deinit() # остановить таймер utime.sleep(1)
if __name__ == ‘ __main__’: цикл() |
Объяснение кода
Давайте узнаем о коде MicroPython, используемом для управления шаговым двигателем NEMA17 с использованием драйвера A4988 и Raspberry Pi Pico. Этот скрипт используется для управления шаговым двигателем с помощью MicroPython. Вот разбивка сценария:
из машинного импорта PIN-код, таймер импорт utime |
Модуль machine
содержит классы для обработки аппаратно-зависимых функций, таких как контакты GPIO и таймеры. Модуль utime
предоставляет функции для задач, связанных со временем.
dir_pin = Pin(16, Pin.OUT) step_pin = Pin(17, Pin.OUT) step_per_revolution = 200 |
Эти строки определяют два выходных контакта микроконтроллера. dir_pin
используется для установки направления шагового двигателя, а step_pin
используется для управления шаговым двигателем. steps_per_revolution
— это переменная, определяющая количество шагов, которое двигатель должен сделать для полного оборота.
тим = Таймер() |
Инициализирует объект таймера, tim
, которые будут использоваться для управления скоростью шага.
def step(t): global step_pin step_pin.value(not step_pin.value()) |
Эта функция переключает значение step_pin
, эффективно посылая импульс шаговому двигателю для выполнения шага. Эта функция будет использоваться в качестве обратного вызова для таймера.
по умолчанию rotate_motor (задержка): tim.init(freq=1000000//delay, mode=Timer.PERIODIC, callback=step) |
Эта функция инициализирует таймер с частотой, рассчитанной на основе ввода задержки
, и устанавливает его в ПЕРИОДИЧЕСКИЙ режим, что означает, что он будет запускаться с фиксированными интервалами. Функция step
передается как обратный вызов, поэтому она будет выполняться каждый раз, когда срабатывает таймер.
1 2 3 4 5 6 7 8 9 10 11 12 13 | def loop(): в то время как True: dir_pin.value(1) rotate_motor(2000) utime. sleep_ms(steps_per_revolution) tim.deinit() utime.sleep(1)
dir_pin.value(0) rotate_motor(1000) utime.sleep_ms(steps_per_revolution) tim.deinit() utime.sleep(1) |
Эта функция содержит основной цикл скрипта. Он непрерывно вращает двигатель в одном направлении с более низкой скоростью, а затем в другом направлении с более высокой скоростью. Он делает это, сначала устанавливая штифт направления, а затем запуская вращение двигателя с помощью функции rotate_motor
. Затем он ждет время, равное количеству миллисекунд, которое требуется двигателю для завершения полного оборота, останавливает таймер, ждет еще одну секунду, а затем повторяет процесс в противоположном направлении.
если __name__ == ‘__main__’: loop() |
Это точка входа скрипта. Если скрипт запускается напрямую (не импортируется как модуль), он вызывает функцию цикла
, запуская цикл управления двигателем.
Код MicroPython, эквивалентный библиотеке AccelStepper
В MicroPython нет прямого эквивалента библиотеки AccelStepper . Однако мы можем написать простой класс для имитации некоторых функций AccelStepper. Вот пример:
1 2 3 4 5 6 7 8 9 9 0004 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9 0004 26 27 28 29 30 31 32 33 34 35 36 37 38 39 90 004 40 41 42 43 44 45 46 47 48 49 | from machine import Pin import utime
class Stepper: def __init__(self, step_pin, dir_pin): self . step_pin = Pin(step_pin, Pin.OUT) self.dir_pin = Pin(dir_pin, Pin.OUT) self.position = 0
def set_speed(self, speed): self.delay = 1 / abs(скорость) # задержка в секундах
def set_direction(self, direction): self.dir_pin.value(direction)
def move_to(self, position): self.set_direction(1, если position > self.position, иначе 0) в то время как self.position != position: self.step_pin.value(1) utime.sleep(self.delay) self.step_pin.value(0) self.position += 1, если position > self.position else -1
# Определение контактов step_pin = 17 # Номер GPIO, к которому подключен вывод step dir_pin = 16 # Номер GPIO, к которому подключен вывод dir
# Инициализировать степпер Степпер (step_pin, dir_pin)
def loop(): пока True: # Движение вперед на 2 оборота (400 шагов) со скоростью 200 шагов/сек ) stepper. move_to(400) utime. sleep(1)
# Переместиться назад на 1 оборот (200 шагов) со скоростью 600 шагов/сек 0) utime.sleep(1)
# Перемещение вперед на 3 оборота (600 шагов) со скоростью 400 шагов/сек utime.sleep(3)
if __name__ == ‘__main__ ‘: цикл() |
Этот код обеспечивает некоторые из тех же базовых функций, что и библиотека AccelStepper, но немного упрощен. Он поддерживает только движение с постоянной скоростью и не обеспечивает функции ускорения или замедления. Также обратите внимание на задержку в set_speed
Функция в секундах, поэтому она обратна скорости (шагов в секунду).
Код ускорения и торможения шагового двигателя
Вот как вы можете добиться аналогичной функциональности в MicroPython. Поскольку в MicroPython нет встроенной поддержки ускорения и замедления, нам придется реализовать ее вручную. Логика, стоящая за этим, включает в себя увеличение скорости с течением времени, что означает уменьшение задержки между каждым шагом.
Обратите внимание, что следующий код представляет собой простое представление и может не обеспечивать такую же производительность, как библиотека AccelStepper. Он не реализует правильную кривую ускорения, но постепенно увеличивает и уменьшает скорость двигателя.
1 2 3 4 5 6 7 8 9 9 0004 10 11 12 13 14 15 16 17 18 19 20 21 22 90 002 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from machine import Pin, Timer import utime
class Stepper: def __init__(self, dir_pin, step_pin): self. dir_pin = Pin(dir_pin, Pin.OUT) self.step_pin = Pin(step_pin, Pin.OUT) self.position = 0
def move(я, шаги, задержка, ускорение) : self.dir_pin.value(0 if steps > 0 else 1) steps = abs(steps) для i in range(steps): self.step_pin.value(1) utime.sleep_us (задержка) self.step_pin.value(0) utime.sleep_us(delay) если i < шагов // 2 и задержка > 100: delay -= accel 9000 2 elif i >= шагов // 2 и задержка < 2000: задержка += ускорение self.position += шагов, если шаги > 0 else -steps цикл защиты(): в то время как True: stepper.move(600, 2000, 5) # 2 оборота вперед utime.sleep(1) stepper.mo ve(-600, 2000, 5) # 2 оборота назад utime. sleep(1)
if __name__ == ‘__main__’: loop() |
В этом примере метод move
класса Stepper
принимает три аргумента: шагов
, задержка
и ускорение
. шагов
— количество шагов для перемещения, задержка
— начальная задержка в микросекундах между каждым шагом и ускорение
— величина уменьшения задержки для каждого шага (пока не будет выполнена половина шагов, после что снова увеличивает задержку).
Управление шаговым двигателем NEMA17 с A4988 и потенциометром
Шаговым двигателем NEMA17 с драйвером A4988 и Raspberry Pi Pico также можно управлять с помощью потенциометра. Я использовал потенциометр 10K и подключил его к аналоговому выводу A0 платы Raspberry Pi Pico.
Напряжение, подаваемое на аналоговый вывод ESP8266, может использоваться в качестве опорного напряжения для управления скоростью шагового двигателя. Схема подключения макетной платы приведена ниже.
Скопируйте следующий код в Raspberry Pi Pico и запустите. Вы можете вращать потенциометр для управления скоростью.
1 2 3 4 5 6 7 8 9 9 0004 10 11 12 13 14 15 16 17 18 90 004 19 20 21 22 23 24 25 26 27 28 | from machine import Pin, ADC import utime
# Определить номера контактов step_pin = Pin(17, Pin.OUT) dir_pin = Pin(16, Pin.OUT) pot = ADC(26) # A0 на GP26 на Pico
# Установка направления двигателя _мин, выход_макс): return (value — in_min) * (out_max — out_min) / (in_max — in_min) + out_min
def loop(): в то время как True: # Считайте значение потенциометра и сопоставьте его с желаемым диапазоном custom_delay = pot. read_u16() # прочитать 16-битное значение custom_delay_mapped = map_val(custom_delay, 0, 65535, 300, 4000) # сопоставить 16-битное значение с желаемым диапазоном 02 step_pin.high() utime.sleep_us(int(custom_delay_mapped) ) step_pin.low() utime.sleep_us(int(custom_delay_mapped))
# Запустить цикл loop() 9 0141 |
Обратите внимание, что АЦП Raspberry Pi Pico возвращает 16-битное значение, поэтому мы читаем с read_u16()
и отображение от 0 до 65535 вместо 0 до 1023, как в коде Arduino. Также потенциометр подключен к GP26 (A0) на Pico. Пожалуйста, отрегулируйте номера контактов в соответствии с вашей конкретной аппаратной настройкой.
Заключение
В заключение отметим, что шаговым двигателем NEMA17, широко используемым в робототехнике и 3D-печати, можно эффективно управлять с помощью драйвера A4988 и Raspberry Pi Pico с MicroPython.