Управление шаговым двигателем с помощью Arduino
В этом посте я постараюсь вкратце рассказать про шаговые электродвигатели, и как с ними можно работать с помощью нашего любимого ардуино.
Многие из вас знакомы с маленькими моторчиками, из которых исходят всего 2 провода, они часто встречаются в детских игрушках, например, в машинках.
Это коллекторные электродвигатели постоянного тока. Они могут напрямую подключатся к источнику питания и будут всегда вращаться с постоянной скоростью, в зависимости от подаваемого напряжения. Если необходимо изменить направление вращения, то на нашем моторе нужно просто поменять местами "+" и "-" и он сразу начнёт крутиться в другую сторону. За счёт их простой конструкции, они имеют небольшую стоимость и простоту в управлении.
Но есть ещё один из распространенных типов двигателей - это шаговые электродвигатели.
Вы могли их встречать, если разбирали CD-DVD привода, жёсткие диски, принтеры или другие электронные устройства, в механической части которых нужно чётко контролировать обороты, перемещения или другие необходимые кинематические движения.
Вот так выглядит шаговый электродвигатель с винтовым валом из оптического привода:
Как видно - здесь уже больше, чем 2 провода и напрямую подключить такой мотор к источнику питания просто так не получиться из-за совсем другой конструкции самого двигателя. Если для нашего первого моторчика достаточно было подать "+" и "-" на соответственные клемы и он начинал вращаться, то для шагового электродвигателя нужно подавать цифровые электронные сигналы управления, которые будут сообщать двигателю на сколько и в какую сторону ему необходимо вращаться. Это возможно осуществить с помощью устройства, которое будет генерировать и отправлять эти сигналы на драйвер, а он, в свою очередь, напрямую управлять обмотками двигателя.
Мы рассмотрим пример, как подключить шаговый электродвигатель к Arduino Mega 2560 - именно оно и будет тем устройством, которое генерирует нужные электронные сигналы управления.
Я взял мотор формата Nema 17 - это гибридный шаговый двигатель, который часто встречается в 3Д принтерах, ЧПУ системах, робототехнике и т.д.
Фото двигателя в разрезе:
Драйвер на микросхеме TB6600 - это довольно неплохой контроллер, который можно использовать с двигателями до 4.5 А, 50 В. Для домашних 3Д принтеров и ЧПУ систем его полностью достаточно.
Чтобы драйвер работал, необходим внешний источник питания с напряжением 8-50 В (рекомендуется 36 В). Именно с него наш двигатель будет получать энергию для своей работы. А логические сигналы Dir - направление вращения и Pulse - сигнал шага, драйвер будет получать от ардуино.
У данного двигателя 4 обмотки: A+, A-, B+, B-, их нужно соединить с соответствующими выходами на плате драйвера.
Для управления шаговым двигателем можно использовать различные библиотеки, которые упрощают жизнь, если необходимо как-то динамически управлять двигателем, например "AccelStepper" и тому подобные. Также есть различные программные комплексы для управления 3Д принтерами или ЧПУ станками.
Мы же рассмотрим простой пример вращения двигателя с постоянной скоростью, который не сложно будет повторить всем желающим. Также, так ещё удобно проверять общее состояние двигателя.
Здесь написан цикл, который беспрерывно будет отправлять логические сигналы к нашему драйверу, а он уже на двигатель.
Примерно так всё работает:
P.S. Сильно в теорию я не вдавался, потому что на это нужен не один пост, да и не всем она понравится :)
Arduino & Pi1.1K постов 18.9K подписчик
Правила сообществаВ нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)
• Рассуждать на темы политики
P.S. Сильно в теорию я не вдавался, потому что на это нужен не один пост, да и не всем она понравится :)
Почему хотя бы не рассказать об отличиях униполярного от биполярного двигателя? Почему не привести схему модуля(хотя бы из даташита на микросхему)?Ладно упущен режим микрошага, но основу то можно было скопипастить написать.Зачем было использовать ардуину? Много нагляднее было бы пару кнопок повесить.
Ребят, вижу тут есть знающие люди.Собираю фотопиццу (мало ли кто знаком), не крутит шаговый двигатель, бывает после танцев с бубном крутит, но очень странно (не по программе).
Драйвер шагового двигателя менял - не помогло
В чем может быть проблема?
Автор показывает, как быстро и равномерно крутится шаговый двигатель. Ясно. Понятно. Тема раскрыта на 10 из 10.
а обязательно покупать эту здоровую мандулу? DRV8825 прекрасно справляется с шаговиками до NEMA17 включительно и стоит в несколько раз дешевле + под них на ардуины есть такиеже дешманские шилды - например ардуино 2560 + шилд + 5 драйверов = 1050рублей на али
а можно статью про то, как с компа управлять этим всем. желательно с кодом.
т.е., допустим, мне надо,чтобы после нажатия кнопки на компе, двигатель совершал серию поворотов. как это программируется?
такое ощущение, что автор и рад бы нам рассказать о шаговиках, но не разбирается в теме абсолютно. вешать NEMA17 на такой монструозный драйвер? перепутать количество обмоток? использовать такой дикий метод управления?
хотя бы схему шаговика в пэинте нарисовали, авось сами разобрались бы, как он работает.
Похоже, этим драйвером мотор от сидюка не запустишь - напряжение слишком высокое. У мотора +5в, а питание драйвера от 8 в начинается.
Вот расскажите мне как вы к этим двигателям приделываете достойно какую нибудь звездочку или сверлышко?
. ну т.е. у меня на одном таком движке было по маркировке до 38V и 3А максимальная подача (оптимальное 12V & 1.5A), где то около 30V&3A подавал. Как бы я не крепил это сверло, болтами, суперклеем, и тем и тем, эпоксидкой также вместе взятой и т.д. и т.п. в т.ч. и резал/сверлил это чертову маленькую ось, чтоб хоть как в неё вцепиться (по сути надо было его в таком режиме использовать весьма недолго, так что должно было быть норм), всё срывало! . если застревало хоть в мало-мальски не протачиваемом проёме, т.к. крутилось бешено, то даже небольшое торможение со временем всё равно давало срыв и приходилось монтажить заново. Да конечно я и искал напряжение оптимальное, но это либо получалось дико долгое сверление, которое добивало, либо срывало.
Вот как вы за такую ось цепляетесь нормально? . такая ж мелкая сволочь.
Rammstein - mutter на шаговых двигателях
Dolphin - Кокон
System of a down - Chop suey (Cover)
Небольшой проект выходного дня
Нужна критика электронщика
Я давеча задумался, есть драйвер uln2003 и шаговики от дисководов, можно ли их задружить? Конечно ясно, что uln2003 подходит только для униполярных движков(или биполярных только без реверса), но если сделать обвес?Взяв за основу полный мост и безжалостно его обрезав, я получил такую вот схемку питания одной обмотки.
Попытаюсь проиллюстрировать режимы работы схемы. Сорри за мелкие буквы.
В итоге хотелось бы услышать, какие в этой схеме есть недочёты? Ну, не считая того, что высокий логический уровень на обоих пинах угробит uln-ку к чертям собачьим. Короче, жду суровой критики :)
Одноступенчатый редуктор с приводом от Шагового Двигателя
В этом посте я хочу рассказать про изготовление при помощи ранее изготовленного мной станка с ЧПУ одноступенчатой прямозубой передачи.
Не так давно мной был спроектирован портальный станок с ЧПУ, про его разработку и постройку на этом ресурсе расположена моя предыдущая статья.
Сразу хочу сказать, что данный проект служит только для получения опыта проектирования простых зубчатых пар и их изготовления для возможного применения в последующих проектах.
Так как на изготовленном станке планировалось обрабатывать не только дерево и пластики, а еще и дюраль, то интересно было сделать зубчатую пару как раз из этого материала.
По наличию у меня были обрезки дюралевого листа толщиной 6мм. В качестве привода я решил использовать Шаговый Двигатель (ШД) 23HS8430, он тоже у меня был в наличие и валялся без дела.
Проектирование началось с моделирования всего механизма в среде Компас 3Д, сразу же возникло несколько ограничений, ввиду малого размера дюралевой заготовки, а это соответственно повлияло на габариты ведомой шестерни, а так же на количество и размер зубьев, так как наименьший диаметр фрезы которая у меня была, составлял всего 2мм, а это значит что наименьший радиус которым я могу описать контур в процессе изготовления 1мм.
Учтя все ограничения, я перевел двигатель в 3Д модель и дальше стал сопрягать с ним остальные детали…
Теперь что касается построения зубчатой пары: в машиностроительной конфигурации Компас 3Д (v13) есть такая утилита как «Расчеты цилиндрической зубчатой передачи внешнего зацепления», в ней производим геометрический расчет, вводя требуемые параметры: число зубьев, модуль и т.д. Углубляться в это не буду, достаточно будет прочитать главу про построение зубчатых передач из курса механики: детали машин.
Использованная мной утилита производит расчет и построение шестерни, также если при расчете возникают ошибки, то она об этом информирует. После расчета выводит отчет со всеми геометрическими размерами. Из него мне потребовалось только межосевое расстояние, так как саму шестерню он прорисовывает автоматически.
Для большего интереса я решил сделать шестерни с разным количеством зубьев и передаточным отношением 2:1.
Исходя из межосевого расстояния, было нарисовано основание. С ним сопрягли двигатель и ось, на которой будет крепиться ведомая шестерня.
После окончания 3Д проектирования, все детали перевел в 2Д вид и сохранил их в векторном формате *.dxf.
Для того чтобы вырезать все детали на станке, я преобразовал векторный формат в G-code через постпроцессор в программе ArtCam. Полученный файл загрузил в станок и после обнуления координат, вырезал все детали.
В ведомую шестерню запрессовал подшипник, он достаточно плотно вошел, так как я занизил отверстие на несколько соток.
Отдельно на токарном станке выточили ось, на которую устанавливается ведомая шестерня.
Дальше все достаточно просто, собрал узел в едино, и осталось только его закрутить.
Но пришлось подождать месяц, так как драйвера для ШД у меня не оказалось, и я заказал драйвер DM542 на Али.
Для того чтобы ШД закрутился на вход драйвера требуется подать частотный сигнал, для этого я на ардуино уно собрал генератор частоты с изменяемой частотой с помощью внешне подключенного энкодера на 24 импульса.
Сразу хочу оговориться, что код для прошивки ардуино нашел на просторах Интернета.
Генератор частоты может: — генерировать меандр на 16 битном таймере. Диапазон частот 1Гц — 8МГц. Регулировка частоты производится энкодером. До частоты 2,8 кГц разрешение 1 герц, на частотах выше таймер аппаратно уже не может поддерживать это разрешение, поэтому более высокие частоты синтезируются, задавая параметром не требуемую частоту, а просто инкременируя регистр сравнения. Получается чем выше частота — тем больше шаг между щелчками энкодера. Вращая энкодер, с не нажатой кнопкой частота меняется на 1Гц; с нажатой кнопкой один шаг — 100Гц. Выше 2,8кГц. вращение энкодера с нажатой кнопкой так — же ускоряет счёт. Программного подавления дребезга контактов энкодера нет, поэтому нужно повесить конденсаторы 0,01..0,1 мкф. относительно земли. На кнопке конденсатор не обязателен. Рассчитанная математически частота выводится в сериал.
/* Генератор 1 Hz..8 MHz. Энкодер подключен к пинам A0 и A1, кнопка
энкодера подключена к A2. Требуется использовать конденсаторы 0,01..0,1uf
относительно земли на каждый из 2х выводов энкодера.
Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro)
pinMode (9,OUTPUT); // выход генератора
pinMode(A0,INPUT); // с рассчетом, что энкодере внешняя подтяжка-
pinMode(A1,INPUT); // -к шине питания. Если нету, то подтянуть программно.
pinMode(A2,INPUT_PULLUP); //кнопка энкодера
PCICR=1<<PCIE1; //разрешить прерывание PCINT
PCMSK1=(1<<PCINT9);// По сигналу на А1 создавать прерывание
TCCR1A=1<<COM1A0; //подключить выход OC1A первого таймера
static boolean gen_mode=0; //флаг режима управления
static uint32_t enc=1; //переменная счёта энкодера
uint32_t divider=1; //переменная коэфф. деления прескалера
byte n=PINC&3; //считать значение энкодера
boolean knopka = PINC&(1<<2); // 0-кнопка нажата, 1-кнопка НЕ нажата.
if (freq<2848) gen_mode=0; //переключение режима управления по частоте
if (freq>=2848) gen_mode=1; //переключение режима управления по OCR
// Если увеличение частоты
else knopka? enc++ : enc+=100; // в нч режиме
// Если уменьшение частоты
divider=1; ocr = (F_CPU / enc /2 /divider) -1;
//запись в регистр прескалера
case 1: TCCR1B=1|(1<<WGM12); break;
case 8: TCCR1B=2|(1<<WGM12); break;
case 64: TCCR1B=3|(1<<WGM12); break;
case 256: TCCR1B=4|(1<<WGM12); break;
case 1024: TCCR1B=5|(1<<WGM12); break; >
freq= (float) F_CPU/2 / (OCR1A+1) /divider;
> //end if !gen_mode
После того как все собрал, подсоединил и залил в Arduino скетч, можно приступать к включению: