ESP32 с шаговым двигателем (28BYJ-48 и драйвер ULN2003)
В этом руководстве вы узнаете, как управлять шаговым двигателем с помощью ESP32. Мы будем использовать униполярный шаговый двигатель 28BYJ-48 с драйвером двигателя ULN2003. Плата ESP32 будет программироваться с помощью Arduino IDE.
У нас есть аналогичное руководство для платы ESP8266: ESP8266 NodeMCU with Stepper Motor (28BYJ-48 and ULN2003 Motor Driver)
У нас есть руководства по другим двигателям с ESP32:
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
ESP32 (читайте Лучшие платы разработки ESP32)
Источник питания 5В
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Знакомство с шаговыми двигателями
Шаговый двигатель – это бесщёточный электродвигатель постоянного тока, который делит полный оборот на определённое количество шагов. Он перемещается по одному шагу за раз, и каждый шаг имеет одинаковый размер. Это позволяет нам поворачивать двигатель на точный угол в точное положение. Шаговый двигатель может вращаться по часовой стрелке или против часовой стрелки.
На следующей фотографии показаны два шаговых двигателя 28BYJ-48.
Шаговые двигатели состоят из внутренних катушек, которые заставляют вал двигателя перемещаться по шагам в одном или другом направлении, когда ток подаётся на катушки определённым образом.
Существует два типа шаговых двигателей: униполярные и биполярные шаговые двигатели.
В этой статье мы не будем подробно описывать, как устроены шаговые двигатели и как они работают внутри. Чтобы узнать более подробно, как они работают, и различия между каждым типом шаговых двигателей, мы рекомендуем прочитать эту статью в блоге DroneBotWorkshop.
Шаговый двигатель 28BYJ-48
Существует множество шаговых двигателей с различными характеристиками. В этом руководстве будет рассмотрен широко используемый униполярный шаговый двигатель 28BYJ-48 с драйвером двигателя ULN2003.
Характеристики шагового двигателя 28BYJ-48
Характеристики шагового двигателя (для получения более подробной информации обратитесь к техническому описанию):
Номинальное напряжение: 5В DC
Количество фаз: 4
Передаточное число: 1/64
Угол шага: 5.625°/64
Частота: 100Гц
Шаговый двигатель 28BYJ-48 имеет в общей сложности четыре катушки. Один конец катушек подключён к 5В, что соответствует красному проводу двигателя. Другой конец катушек соответствует проводам синего, розового, жёлтого и оранжевого цвета. Подача тока на катушки в логической последовательности заставляет двигатель совершать один шаг в одном или другом направлении.
Шаговый двигатель 28BYJ-48 имеет угол шага 5.625°/64 в полушаговом режиме. Это означает, что двигатель имеет угол шага 5.625° – поэтому ему необходимо 360°/5.625° = 64 шага в полушаговом режиме. В полношаговом режиме: 64/2 = 32 шага для выполнения одного оборота.
Однако выходной вал приводится в движение через передаточное отношение 64:1. Это означает, что вал (видимый снаружи двигателя) совершит один оборот, если двигатель внутри повернётся 64 раза. Это означает, что двигателю потребуется сделать 32 x 64 = 2048 шагов, чтобы вал совершил один полный оборот. Это означает, что вы получите точность 360°/2048 шагов = 0.18°/шаг.
Итак, подводя итог:
Общее количество шагов на оборот = 2048 шагов
Угол шага = 0.18°/шаг
Если вы используете другой шаговый двигатель, пожалуйста, обратитесь к его техническому описанию.
Драйвер двигателя ULN2003
Для подключения шагового двигателя к ESP32 мы будем использовать драйвер двигателя ULN2003, как показано на рисунке ниже. Шаговый двигатель 28BYJ-48 часто продаётся вместе с драйвером ULN2003.
Модуль оснащён разъёмом, который делает подключение двигателя к модулю простым и лёгким. Он имеет четыре входных контакта для управления катушками, которые приводят в движение шаговый двигатель. Четыре светодиода обеспечивают визуальную индикацию состояния катушек.
На модуле есть контакты для подключения VCC и GND, а также перемычка, которая действует как переключатель ВКЛ/ВЫКЛ для питания шагового двигателя – если вы снимете перемычку, питание на двигатель поступать не будет. Вы можете использовать эти контакты для подключения физического переключателя.
Распиновка драйвера ULN2003
В следующей таблице показана распиновка модуля:
IN1 |
Управление двигателем: подключите к цифровому выводу микроконтроллера |
IN2 |
Управление двигателем: подключите к цифровому выводу микроконтроллера |
IN3 |
Управление двигателем: подключите к цифровому выводу микроконтроллера |
IN4 |
Управление двигателем: подключите к цифровому выводу микроконтроллера |
VCC |
Питание двигателя |
GND |
Общая земля |
Разъём двигателя |
Подключите разъём двигателя |
Подключение шагового двигателя к ESP32
В этом разделе мы подключим шаговый двигатель к ESP32 через драйвер ULN2003.
Мы подключим IN1, IN2, IN3 и IN4 к GPIO 19, 18, 5 и 17. Вы можете использовать любые другие подходящие цифровые контакты (ознакомьтесь с нашим справочным руководством по распиновке ESP32).
Вы можете следовать приведённой ниже схеме подключения.
Примечание: вы должны питать драйвер двигателя от внешнего источника питания 5В.
Драйвер двигателя |
ESP32 |
|---|---|
IN1 |
GPIO 19 |
IN2 |
GPIO 18 |
IN3 |
GPIO 5 |
IN4 |
GPIO 17 |
Управление шаговым двигателем с ESP32 – Код
Существует несколько способов управления шаговыми двигателями с помощью микроконтроллера. Мы будем использовать встроенную библиотеку Arduino Stepper.h. Эта библиотека предоставляет простой способ перемещения двигателя на определённое количество шагов.
Скопируйте следующий код в вашу Arduino IDE.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-stepper-motor-28byj-48-uln2003/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
Based on Stepper Motor Control - one revolution by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 2048; // change this to fit the number of steps per revolution
// ULN2003 Motor Driver Pins
#define IN1 19
#define IN2 18
#define IN3 5
#define IN4 17
// initialize the stepper library
Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);
void setup() {
// set the speed at 5 rpm
myStepper.setSpeed(5);
// initialize the serial port
Serial.begin(115200);
}
void loop() {
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Мы адаптировали этот код из примеров, предоставляемых библиотекой Stepper (File > Examples > Stepper > stepper_oneRevolution).
Как работает код
Сначала подключите библиотеку Stepper.h.
#include <Stepper.h>
Определите количество шагов на оборот вашего шагового двигателя – в нашем случае это 2048:
const int stepsPerRevolution = 2048; // change this to fit the number of steps per revolution
Определите входные контакты двигателя. В этом примере мы подключаемся к GPIO 19, 18, 5 и 17, но вы можете использовать любые другие подходящие GPIO.
#define IN1 19
#define IN2 18
#define IN3 5
#define IN4 17
Инициализируйте экземпляр библиотеки stepper с именем myStepper. Передайте в качестве аргументов количество шагов на оборот и входные контакты. В случае шагового двигателя 28BYJ-48 порядок контактов – IN1, IN3, IN2, IN4 – для вашего двигателя он может отличаться.
Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);
В функции setup() установите скорость шагового двигателя с помощью метода setSpeed. Скорость шагового двигателя указывается в оборотах в минуту (rpm).
myStepper.setSpeed(5);
Инициализируйте Serial Monitor на скорости передачи 115200 бод.
Serial.begin(115200);
В функции loop() мы будем вращать шаговый двигатель по часовой стрелке и против часовой стрелки. Вы можете использовать метод step() для объекта myStepper. Передайте в качестве аргумента количество шагов, которые вы хотите сделать. Для полного оборота (вращения) вам нужно 2048 шагов (переменная stepsPerRevolution).
myStepper.step(stepsPerRevolution);
Чтобы повернуть двигатель против часовой стрелки, вам нужно передать количество шагов со знаком минус «–».
myStepper.step(-stepsPerRevolution);
Демонстрация
Загрузите код на вашу плату. После загрузки двигатель будет совершать один оборот по часовой стрелке и один оборот против часовой стрелки снова и снова.
Другие библиотеки
Использование библиотеки Stepper.h – это один из самых простых способов управления шаговым двигателем. Однако если вы хотите получить больше контроля над вашим шаговым двигателем, существуют библиотеки с большим количеством функций, такие как библиотека AccelStepper. Эта библиотека хорошо документирована, все методы описаны очень подробно.
Она предоставляет несколько примеров, совместимых с ESP32. Просто убедитесь, что вы инициализируете объект stepper с правильными контактами:
AccelStepper stepper (AccelStepper::FULL4WIRE, 19, 5, 18, 17);
Эта библиотека позволяет управлять двигателями в неблокирующем режиме и позволяет управлять несколькими двигателями одновременно. Но это тема для другого руководства.
Удалённое управление шаговым двигателем
Узнайте, как удалённо управлять шаговым двигателем с помощью ESP32, используя веб-сервер. Ознакомьтесь со следующими руководствами:
Заключение
Это руководство было введением в работу с шаговыми двигателями и ESP32. Шаговые двигатели перемещаются по одному шагу за раз и позволяют позиционировать вал двигателя под определённым углом.
Один из самых простых способов управления шаговым двигателем – использование встроенной библиотеки Arduino Stepper. Эта библиотека предоставляет простой способ вращения двигателя по часовой стрелке или против часовой стрелки на определённое количество шагов. Если вы хотите больше контроля над вашим шаговым двигателем, мы рекомендуем библиотеку AccelStepper.
Мы надеемся, что это руководство будет вам полезно.
Узнайте больше об ESP32 с нашими ресурсами:
Спасибо за чтение.
Примечание
Источник: ESP32 with Stepper Motor (28BYJ-48 and ULN2003 Motor Driver)