Шаговые двигатели с каждым годом приобретают все большую популярность в мире электроники поскольку именно они обеспечивают превосходную точность позиционирования различных механизмов. В этой статье мы рассмотрим подключение одного из самых распространенных шаговых двигателей 28-BYJ48 к плате Arduino при помощи модуля ULN2003 и управление им с помощью потенциометра.
В нашей предыдущей статье про подключение шагового двигателя к плате Arduino мы управляли углом его поворота из она монитора последовательной связи, в этом же проекте мы будем управлять поворотом шагового двигателя вращая ручку потенциометра. Если мы будем вращать ручку потенциометра по часовой стрелке, то и шаговый двигатель будет поворачиваться по часовой стрелке, а если мы ручку потенциометра будем поворачивать против часовой стрелки – то и шаговый двигатель будет вращаться против часовой стрелки.
Общие принципы работы шаговых двигателей
Внешний вид шагового двигателя 28-BYJ48 (купить на AliExpress) представлен на следующем рисунке:
Первый вопрос, который напрашивается при взгляде на этот рисунок – почему в отличие от обычного двигателя из этого шагового двигателя выходят 5 проводов различных цветов? Чтобы понять это давайте сначала разберемся с принципами работы шагового двигателя.
Начнем с того, что шаговые двигатели не вращаются, а “шагают”, поэтому они и называются шаговыми двигателями. То есть в один момент времени они будут передвигаться только на один шаг. Чтобы добиться этого в устройстве шаговых двигателей присутствует несколько катушек и на эти катушки нужно подавать питание в определенной последовательности чтобы двигатель вращался (шагал). При подаче питания на каждую катушку двигатель делает один шаг, при последовательной подаче питания на катушки двигатель будет совершать непрерывные шаги, то есть вращаться. Давайте более подробно рассмотрим катушки, присутствующие внутри шагового двигателя.
Как можно видеть из рисунка, двигатель имеет однополярную катушку с 5 выводами. Но фактически это 4 катушки, на которые нужно подавать питание в определенной последовательности. На красные провода необходимо подать +5V, на остальные 4 провода необходимо подать землю чтобы запустить в работу соответствующую катушку. Мы будем использовать плату Arduino чтобы подавать питание на эти катушки в определенной последовательности и тем самым заставлять двигатель вращаться. Более подробно ознакомиться с принципами работы шаговых двигателей можно в статье про подключение шагового двигателя к микроконтроллеру AVR.
Так почему же этот двигатель называется 28-BYJ48? Честно говоря, мы не знаем точного ответа на этот вопрос. Некоторые наиболее важные технические характеристики этого шагового двигателя приведены на следующем рисунке.
На первый взгляд от такого количества характеристик может закружиться голова, но давайте попробуем выделить из них самые важные, те, которые нам понадобятся для дальнейшей работы. Во-первых, мы знаем, что это шаговый двигатель 5V, поэтому необходимо подавать на красный провод 5V. Также мы знаем что это четырехфазный шаговый двигатель поскольку в нем четыре катушки. Передаточное число этого двигателя — 1: 64. Это означает, что вал, который вы видите снаружи, сделает одно полное вращение в том случае, когда двигатель внутри сделает 64 оборота. Это происходит благодаря шестерням, которые включены между двигателем и выходным валом. Эти шестерни помогают в увеличении крутящего момента.
Еще одним важным показателем, который нам следует знать, является угол шага: 5.625°/64. Это значит что когда двигатель сделает последовательность в 8 шагов он будет поворачиваться на 5.625° при каждом шаге и за один полный оборот он сделает 64 шага (5.625*64=360).
Расчет шагов на оборот для шагового двигателя
Важно знать, как рассчитать количество шагов за один оборот для вашего шагового двигателя, потому что только тогда вы можете эффективно его запрограммировать.
В Arduino для управления двигателем мы будем использовать 4-шаговую последовательность, поэтому угол шага будет составлять 11.25°. Поскольку изначально он равен 5.625°(приведен в даташите), то для 8 шаговой последовательности получим 11.25° (5.625*2=11.25).
Справедлива следующая формула:
Количество шагов за оборот = 360 / угол шага.
В нашем случае 360/11.25 = 32 шага за оборот.
Зачем нужен драйвер мотора для управления шаговым двигателем
Большинство шаговых двигателей будут работать только с помощью модуля драйвера мотора. Это связано с тем, что микроконтроллер (в нашем случае плата Arduino) не может обеспечить достаточный ток на своих контактах ввода/вывода для работы двигателя. Поэтому мы будем использовать внешний драйвер мотора для управления нашим шаговым двигателем — модуль ULN2003 (купить на AliExpress). В сети интернет можно найти рейтинги эффективности различных драйверов мотора, но эти рейтинги будут меняться в зависимости от типа используемого шагового двигателя. Основной принцип, которого следует придерживаться при выборе драйвера мотора – он должен обеспечивать достаточный ток для управления шаговым двигателем.
Работа схемы
Схема устройства представлена на следующем рисунке.
Чтобы подавать питание на соответствующие катушки шагового двигателя мы будем использовать цифровые контакты 8, 9, 10 и 11 платы Arduino, к которым подключены соответствующие контакты драйвера двигателей ULN2003. Потенциометр, с помощью которого мы будем управлять вращением шагового двигателя, подключен к аналоговому контакту A0 платы Arduino.
Драйвер мотора запитывается от контакта 5V платы Arduino. Но если вы будете подсоединять какую-нибудь нагрузку к шаговому двигателю, то вам потребуется внешний источник питания для драйвера мотора. Мы в нашем примере эксплуатируем шаговый двигатель без нагрузки, поэтому нам хватило питания от платы Arduino. И не забудьте соединить землю платы Arduino с землей драйвера мотора.
Объяснение программы для платы Arduino
Перед тем как начать писать программу для платы Arduino давайте разберемся что должно происходить внутри этой программы. Как мы уже говорили ранее, мы будем использовать метод 4-шаговой последовательности, то есть нам нужно будет сделать 4 шага чтобы выполнить один полный оборот двигателя.
Номер шага | Контакты, на которое подается питание | Катушки, на которое подается питание |
Шаг 1 | 8 и 9 | A и B |
Шаг 2 | 9 и 10 | B и C |
Шаг 3 | 10 и 11 | C и D |
Шаг 4 | 11 и 8 | D и A |
На драйвере мотора есть 4 светодиода, по свечению которых можно судить о том, на какую катушку подается питание в конкретный момент. Более подробно все эти процессы можно посмотреть в видео, приведенном в конце статьи.
Мы напишем программу, в которой необходимое количество шагов для двигателя мы будем вводить в мониторе последовательного порта (serial monitor) платы Arduino. Полный текст программы приведен в конце статьи, здесь же мы рассмотрим наиболее важные его фрагменты.
Как мы рассчитали ранее, полное число шагов для полного оборота нашего шагового двигателя, равно 32, пропишем это в следующей строчке кода:
#define STEPS 32
Далее мы должны сказать плате Arduino через какие ее контакты мы будем управлять шаговым двигателем (то есть к каким ее контактам подключен драйвер мотора).
Stepper stepper (STEPS, 8, 10, 9, 11);
Примечание: последовательность номеров контактов, указанная в приведенной команде (8,10,9,11) – специально упорядочена таким образом чтобы подавать питание на катушки шагового двигателя в правильном порядке. Если вы измените номера контактов, к которым подключен шаговый двигатель, то вы соответствующим образом должны их упорядочить для подачи в приведенную команду.
Мы будем использовать специальную библиотеку для работы с шаговыми двигателями, поэтому для задания скорости вращения шагового двигателя мы можем использовать команду вида:
stepper.setSpeed(200);
Для двигателя 28-BYJ48 скорость вращения можно установить в диапазоне от 0 до 200.
Теперь, чтобы двигатель сделал один шаг, мы можем использовать следующую команду:
stepper.step(val);
Количество шагов, которое должен сделать двигатель, определяется переменной “val”. Поскольку мы имеем 32 шага (для оборота) и передаточное число 64 мы должны сделать 2048 (32*64=2048) “шагов” в этой команде для совершения одного полного оборота двигателя.
Соответственно, чтобы шаговый двигатель сделал один шаг по часовой стрелке, необходимо использовать команду:
stepper.step(1);
А один шаг против часовой стрелки:
stepper.step(-1);
В нашей программе мы будем считывать значение на аналоговом контакте A0 платы Arduino и сравнивать его с предыдущим значением (Pval). Если оно увеличилось, то мы будем делать 5 шагов двигателем по часовой стрелке, а если уменьшилось – то 5 шагов двигателем против часовой стрелки.
potVal = map(analogRead(A0),0,1024,0,500);
if (potVal>Pval)
stepper.step(5);
if (potVal<Pval)
stepper.step(-5);
Pval = potVal;
Работа проекта
Когда вы сделаете все необходимые соединения в схеме данного проекта у вас должна получиться примерно следующая конструкция:
После этого загрузите программу в плату Arduino и откройте окно монитора последовательной связи (serial monitor). После этого вы можете вращать ручку потенциометра и наблюдать как в соответствии с ее поворотами шаговый двигатель будет вращаться по часовой и против часовой стрелки.
Исходный код программы
Код программы достаточно простой, я надеюсь у вас не вызовет никаких затруднений реализация данного проекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <Stepper.h> // библиотека для работы с шаговым двигателем // измените это число в зависимости от числа шагов в вашем двигателе #define STEPS 32 // create an instance of the stepper class using the steps and pins Stepper stepper(STEPS, 8, 10, 9, 11); int Pval = 0; int potVal = 0; void setup() { Serial.begin(9600); stepper.setSpeed(200); } void loop() { potVal = map(analogRead(A0),0,1024,0,500); if (potVal>Pval) stepper.step(5); if (potVal<Pval) stepper.step(-5); Pval = potVal; Serial.println(Pval); //for debugging } |
здраствуйте,подсажите мы задали скорость 200 для двигателя .Значик с какой скоростью мы бы не крутили потенциометр угла то двигатель все ровно будет крутиться с одной скорость и собьются положения между двигателем и потенциометром?Я использую данный девайс для еонтроля азимута моей антенны .антенна крутиться на разных скоростях и шаговый мотор со стрелкой показывает не правельный градус.Возможно запрограммировать так чтобы скорость двигателя менялась пропорционально скорости потонциометра
Добрый вечер. Конечно можно, просто устанавливайте скорость вращения пропорционально разности potVal и Pval, коэффициент пропорциональности подберете какой вам будет необходим. Либо количество шагов, которые должен совершить двигатель, устанавливайте пропорционально разности potVal и Pval. Я не знаю какой из этих методов вам больше подойдет.
здраствуйте помогите с кодом для ночника с RGB модулем я собрал ночник с канала Радиолюбитель хочу добавит еще 3 режима чтобы 1 плавно переливался с красного на зеленый и на синий 2 режим чтобы все цвета моргали и 3 режим чтобы моргали все остальные цвета
Добрый день. С проектами с чужих сайтов мне достаточно затруднительно будет помочь, к сожалению. Мне же самому нужно время чтобы в них разобраться
Собрал по данной схеме (с такими же двигателем), загрузил скетч. Но угол поворота вала двигателя получился всего ~5 градусов при полном повороте вала потенциометра. Уже всё перепроверил, всё одно...
Ну а попробуйте вместо условий в скетче просто повернуть ось двигателя при помощи команды stepper.step(N), где вместо N вводите разные числа
Попробовал. Ставил 20, 50, 100. Ход увеличился примерно в 2 раза при 50, дальше не растёт. Но при этом вал двигателя стал в состоянии покоя самостоятельно крутиться влево-вправо примерно 5-8 градусов. Монитор при вращении потенциометра меняет значение от 0 до 495.
Ну если константу вводите в качестве числа шагов, то двигатель должен поворачиваться пропорционально значению введенной константы. Странно, что после 50 у вас двигатель дальше не крутится. Может есть в нем какая-нибудь неисправность. Вы работали раньше с какими-нибудь другими шаговыми двигателями? Может быть, у вас есть возможность подключить этот двигатель к какому нибудь другому микроконтроллеру чтобы убедиться в корректности его работы?
Тоже было сомнение в исправности двигателя или иных узлов. Но на других проектах (стандартных в примерах и сторонних) в точно такой же конфигурации подключений всё работает, программа отрабатывается схемой и двигателем полностью, без нареканий.
Перед тем как сюда написать пробовал сам менять некоторые значения в скетче, но без успеха.
Также отмечу, что я только начал заниматься ардуино и потому возможно что то упустил.
Ну если убрать всю логику данного проекта, связанную с условиями в коде программы, и оставить stepper.step(N), то тут я уже не вижу со стороны программы ничего, что могло бы мешать полноценному вращению двигателя.
Здравствуйте! Вы не могли бы мне помочь с кодом? Хочу чтоб под музыку дёргался шаговик,под низкие частоты. И желательно вразноброс... Нужно для диско-шара... Заранее спасибо...
Добрый вечер. Я думаю, тогда вам необходимо объединить данный проект с аппаратной частью этого проекта - то есть вместо потенциометра подключить к аналоговому входу платы Ардуино микрофон и усилитель. Тогда в коде программы вам необходимо будет просто заменить в команде potVal = map(analogRead(A0),0,1024,0,500) контакт A0 на контакт, к которому у вас будет подключен микрофон через усилитель. В первом приближении это должно работать. А потом уже поиграть с задержками и значениями шага двигателя.
Интересует управление шаговым двигателем arduino
Так именно это и описано в данной статье
что за бред у вас написан:"который нам следует знать, является угол шага: 5.625°/64. Это значит что когда двигатель сделает последовательность в 8 шагов он будет поворачиваться на 5.625° при каждом шаге и за один полный оборот он сделает 64 шага (5.625*64=360)."
*/ к чему вот это 5.625°/64 зачем делить величину угла поворота вала на выходе редуктора при совершённом одном обороте мотора на передаточное число самого редуктора???
далее:"В Arduino для управления двигателем мы будем использовать 4-шаговую последовательность, поэтому угол шага будет составлять 11.25°. Поскольку изначально он равен 5.625°(приведен в даташите), то для 8 шаговой последовательности получим 11.25° (5.625*2=11.25).
Справедлива следующая формула:
Количество шагов за оборот = 360 / угол шага.
В нашем случае 360/11.25 = 32 шага за оборот."
*/вы вообще читали то что написали ? 5,625° делится либо на 4 шага, либо на 8 "полушагов", получаем угол поворота выходного вала редуктора за один шаг, приблизительно 1,4 и 0,7 градусов соответственно, другими словами за один оборот вала редуктора надо сделать 256 шагов, или 512 "полушагов"
а что у вас там написано, от куда этот бред ?
Упс, пардонте, так хитро-сплетённо написано что без бутылки не разобраться, пока не увидел в инете его картинку в разобранном виде. Там 8 пар полюсов от каждой из двух катушек, получается 32 шага или 64 "полушага" за один оборот вала двигателя на входе в редуктор
Да, Дмитрий, к сожалению статья оказалась написана немного сложноватым языком, но тем не менее она оказалась достаточно популярной в сети. Наверное, для лучшего понимания в нее стоит добавить картинку этого шагового двигателя в разобранном виде? Не подскажите адрес этой картинки в сети которая вам помогла все окончательно понять?
здравствуйте, очень всё понятно и просто написано сразу всё понял даже без просмотра видео. хотел уточнить если я хочу чтобы двигатель просто крутился в одну сторону то надо написать stepper.step(2048);
Добрый день. При этой команде он просто совершит один полный оборот и остановится. Чтобы он постоянно крутился в одну сторону нужно в бесконечном цикле его крутить. Только зачем вам тогда шаговый двигатель? Купили бы просто обычный двигатель постоянного тока с редуктором
Спасибо. А ещё в чём измеряется скорость (0-200). И зачем делать map(analogRead(A0),0,1024,0,500); ?
Скорость в условных единицах, но я думаю в интернете можно найти как ее перевести в угловую. map(analogRead(A0),0,1024,0,500) - преобразовывает число из диапазона 0-1024 (которое берется с выхода АЦП A0) в число в диапазоне 0-500. То есть если у вас на выходе АЦП будет 1024, то эта функция преобразует его в число 500, а если у вас на выходе АЦП будет 512 - то она преобразует его в число 250.
а зачем?
Чтобы в 2 раза снизить чувствительность АЦП, к которому подключен потенциометр. Таким образом мы будем частично предотвращать ложные "дергания" шагового двигателя из-за тремора (дрожания) нашей руки на ручке потенциометра
Здравствуйте, подскажите как можно добавить в проект дисплей 1602 ?
Добрый день. Проектов, использующих ЖК дисплей 16х2 на нашем сайте, достаточно много. Посмотрите, к примеру, проект ваттметра на Arduino или статью про подключение ЖК дисплея к Arduino. Там главное соединения правильные с ЖК дисплеем сделать, а программа Arduino для работы с ЖК дисплеем очень проста - всего лишь несколько несложных операций.
Проект еще живой?
Как установить движок в режим ожидания, что бы не елозил.
Добрый вечер. Да, конечно живой. Для этого необходимо не подавать никакого напряжения на катушки шагового двигателя. Если вы смотрели представленное в статье видео, то там видно, что если ручку потенциометра не крутить, то ось шагового двигателя стоит на месте. Это обеспечивается за счет того, что мы считываем значение на аналоговом контакте A0 платы Arduino и сравниваем его с предыдущим значением (Pval) - команда на вращение шагового двигателя подается только если эти значения отличаются.