ESP8266 NodeMCU с шаговым двигателем (28BYJ-48 и драйвер ULN2003)

В этом руководстве вы узнаете, как управлять шаговым двигателем с помощью платы ESP8266 NodeMCU. Мы будем использовать униполярный шаговый двигатель 28BYJ-48 с драйвером двигателя ULN2003. Мы будем программировать плату ESP8266 с помощью Arduino IDE.

ESP8266 NodeMCU с шаговым двигателем 28BYJ-48 и драйвером ULN2003 Arduino IDE

У нас есть аналогичное руководство для платы ESP32: ESP32 с шаговым двигателем (28BYJ-48 и драйвер ULN2003).

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Знакомство с шаговыми двигателями

Шаговый двигатель — это бесщёточный электродвигатель постоянного тока, который разделяет полный оборот на определённое количество шагов. Он перемещается за один раз на один шаг, и каждый шаг имеет одинаковый размер. Это позволяет нам вращать двигатель на точный угол в точную позицию. Шаговый двигатель может вращаться по часовой стрелке или против часовой стрелки.

На следующем фото показаны два шаговых двигателя 28BYJ-48.

Шаговые двигатели 28BYJ-48

Шаговые двигатели состоят из внутренних катушек, которые заставляют вал двигателя перемещаться пошагово в одном или другом направлении, когда ток подаётся на катушки определённым образом.

Существует два типа шаговых двигателей: униполярные и биполярные шаговые двигатели.

В этой статье мы не будем подробно описывать, как устроены шаговые двигатели и как они работают внутри. Чтобы узнать более подробно, как они работают, и о различиях между каждым типом шагового двигателя, мы рекомендуем прочитать эту статью в блоге DroneBotWorkshop.

Шаговый двигатель 28BYJ-48

Существует несколько шаговых двигателей с различными характеристиками. В этом руководстве будет рассмотрен широко используемый униполярный шаговый двигатель 28BYJ-48 с драйвером двигателя ULN2003.

28BYJ-48 подключённый к модулю драйвера ULN2003

Характеристики шагового двигателя 28BYJ-48

Характеристики шагового двигателя (для более подробной информации обратитесь к даташиту):

  • Номинальное напряжение: 5 В постоянного тока

  • Количество фаз: 4

  • Передаточное число: 1/64

  • Угол шага: 5.625°/64

  • Частота: 100 Гц

Шаговый двигатель 28BYJ-48 имеет в общей сложности четыре катушки. Один конец катушек подключён к 5 В, что соответствует красному проводу двигателя. Другой конец катушек соответствует проводам синего, розового, жёлтого и оранжевого цвета. Подача тока на катушки в логической последовательности заставляет двигатель сделать один шаг в том или ином направлении.

Катушки шагового двигателя 28BYJ-48

Шаговый двигатель 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

Для сопряжения шагового двигателя с платой ESP8266 NodeMCU мы будем использовать драйвер двигателя ULN2003, как показано на рисунке ниже. Шаговый двигатель 28BYJ-48 часто продаётся вместе с драйвером ULN2003.

Плата модуля драйвера ULN2003

Модуль поставляется с разъёмом, который позволяет легко и просто подключить двигатель к модулю. Он имеет четыре входных контакта для управления катушками, которые заставляют шаговый двигатель перемещаться. Четыре светодиода обеспечивают визуальную индикацию состояния катушек.

Обозначения драйвера ULN2003

Имеются контакты для подключения VCC и GND, а также перемычка, которая действует как переключатель ВКЛ/ВЫКЛ для питания шагового двигателя — если вы снимете перемычку, питание не поступает на двигатель. Вы можете использовать эти контакты для подключения физического переключателя.

Распиновка драйвера ULN2003

В следующей таблице показана распиновка модуля:

IN1

Управление двигателем: подключите к цифровому выводу микроконтроллера

IN2

Управление двигателем: подключите к цифровому выводу микроконтроллера

IN3

Управление двигателем: подключите к цифровому выводу микроконтроллера

IN4

Управление двигателем: подключите к цифровому выводу микроконтроллера

VCC

Питание двигателя

GND

Общая земля

Разъём двигателя

Подключите разъём двигателя

Подключение шагового двигателя к плате ESP8266

В этом разделе мы подключим шаговый двигатель к ESP8266 через драйвер ULN2003.

Мы подключим IN1, IN2, IN3 и IN4 к GPIO 5, 4, 14 и 12. Вы можете использовать любые другие подходящие цифровые выводы (ознакомьтесь с нашим справочным руководством по распиновке ESP8266).

Вы можете следовать следующей схеме подключения.

Схема подключения ESP8266 с шаговым двигателем 28BYJ-48 и ULN2003A

Примечание

Вы должны питать драйвер двигателя от внешнего источника питания 5 В.

Драйвер двигателя

ESP8266

IN1

GPIO 5

IN2

GPIO 4

IN3

GPIO 14

IN4

GPIO 12

Установка библиотеки AccelStepper

Существуют различные способы управления шаговыми двигателями с помощью микроконтроллера. Для управления шаговым двигателем с ESP8266 мы будем использовать библиотеку AccelStepper. Эта библиотека позволяет легко перемещать двигатель на определённое количество шагов, задавать его скорость, ускорение и многое другое.

Библиотека имеет отличную документацию, объясняющую, как использовать её методы. Вы можете ознакомиться с ней здесь.

Выполните следующие шаги для установки библиотеки в вашей Arduino IDE.

  1. Перейдите в Sketch > Include Library > Manage Libraries…

  2. Найдите «accelstepper».

  3. Установите библиотеку AccelStepper от Mike McCauley. Мы используем версию 1.61.0.

Установка библиотеки AccelStepper в Arduino IDE

Управление шаговым двигателем с ESP8266 — Код

Скопируйте следующий код в вашу Arduino IDE. В этом примере двигатель будет совершать один оборот по часовой стрелке и один оборот против часовой стрелки снова и снова.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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 <AccelStepper.h>

const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution

// ULN2003 Motor Driver Pins
#define IN1 5
#define IN2 4
#define IN3 14
#define IN4 12

// initialize the stepper library
AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN3, IN2, IN4);

void setup() {
  // initialize the serial port
  Serial.begin(115200);

  // set the speed and acceleration
  stepper.setMaxSpeed(500);
  stepper.setAcceleration(100);
  // set target position
  stepper.moveTo(stepsPerRevolution);
}

void loop() {
  // check current stepper motor position to invert direction
  if (stepper.distanceToGo() == 0){
    stepper.moveTo(-stepper.currentPosition());
    Serial.println("Changing direction");
  }
  // move the stepper motor (one step at a time)
  stepper.run();
}

Просмотреть исходный код

Мы адаптировали этот скетч из примеров, предоставляемых библиотекой (File > Examples > AccelStepper > Bounce).

Как работает код

Сначала подключите библиотеку AccelStepper.h.

#include <AccelStepper.h>

Определите количество шагов на оборот вашего шагового двигателя — в нашем случае это 2048:

const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution

Определите входные выводы двигателя. В этом примере мы подключаем к GPIO 5, 4, 14 и 12, но вы можете использовать любые другие подходящие цифровые выводы.

#define IN1 5
#define IN2 4
#define IN3 14
#define IN4 12

Инициализируйте экземпляр библиотеки AccelStepper с именем stepper. Передайте в качестве аргументов: AccelStepper::HALF4WIRE, чтобы указать, что мы управляем шаговым двигателем четырьмя проводами, и входные выводы. В случае шагового двигателя 28BYJ-48 порядок выводов — IN1, IN3, IN2, IN4 — для вашего двигателя он может отличаться.

AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN3, IN2, IN4);

В функции setup() инициализируйте Serial Monitor на скорости 115200 бод.

Serial.begin(115200);

Установите максимальную скорость шагового двигателя с помощью метода setMaxSpeed(). Передайте в качестве аргумента скорость в шагах в секунду.

stepper.setMaxSpeed(500);

Как указано в документации, метод setMaxSpeed() устанавливает максимально допустимую скорость. Функция run() будет ускоряться до скорости, установленной этой функцией.

Установите ускорение с помощью метода setAcceleration(). Передайте в качестве аргумента ускорение в шагах в секунду за секунду.

stepper.setAcceleration(100);

Затем используйте метод moveTo(), чтобы задать целевую позицию. После этого функция run() попытается переместить двигатель (максимум один шаг за вызов) из текущей позиции в целевую позицию, заданную последним вызовом этой функции. Мы устанавливаем целевую позицию 2048 (что является полным оборотом для данного двигателя).

stepper.moveTo(stepsPerRevolution);

В функции loop() мы будем вращать шаговый двигатель по часовой стрелке и против часовой стрелки.

Сначала мы проверяем, достиг ли двигатель уже своей целевой позиции. Для этого мы можем использовать функцию distanceToGo(), которая возвращает количество шагов от текущей позиции до целевой позиции.

Когда двигатель достигает своей целевой позиции, это означает, что функция distanceToGo() вернёт 0, и следующее условие if станет истинным.

if (stepper.distanceToGo() == 0){

Когда двигатель достигает своей целевой позиции, мы устанавливаем новую целевую позицию — такую же, как текущая позиция, но в противоположном направлении.

stepper.moveTo(-stepper.currentPosition());

Наконец, вызовите stepper.run() для перемещения двигателя на один шаг за раз в функции loop().

stepper.run();

Вот объяснение метода run() из документации библиотеки: «Функция run() опрашивает двигатель и делает шаг, если шаг должен быть сделан, реализуя ускорение и замедление для достижения целевой позиции. Вы должны вызывать её как можно чаще, но не реже одного раза за минимальный интервал времени шага, предпочтительно в вашем основном цикле. Обратите внимание, что каждый вызов run() сделает не более одного шага, и только тогда, когда шаг должен быть сделан, на основе текущей скорости и времени с последнего шага».

Демонстрация

Загрузите код на вашу плату. После загрузки двигатель будет совершать один оборот по часовой стрелке и один оборот против часовой стрелки снова и снова. Он начинает вращение на более низкой скорости до достижения желаемой скорости перед достижением целевой позиции.

Вы можете посмотреть короткую видеодемонстрацию:

Заключение

Это руководство представляло собой вводное пособие по работе с шаговыми двигателями и ESP8266. Шаговые двигатели перемещаются на один шаг за раз и позволяют устанавливать вал двигателя под определённым углом.

В будущем руководстве мы покажем вам, как создать веб-сервер для удалённого управления шаговым двигателем с ESP8266. Так что следите за обновлениями.

Мы надеемся, что это руководство оказалось для вас полезным.

Узнайте больше о ESP8266 с помощью наших ресурсов:

Спасибо за чтение.