Главная chevron_right Уроки chevron_right Электроника chevron_right Управление шаговыми двигателями с Arduino: унипольные и биполярные схемы

Управление шаговыми двигателями с Arduino: унипольные и биполярные схемы

Как подключить и управлять унипольными и биполярными шаговыми двигателями через Arduino с примерами кода и схемами.

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

Существует два типа шаговых двигателей: унипольные (Unipolar) и биполярные (Bipolar). Прежде чем собирать схему, важно точно определить, с каким типом вы работаете, — схемы подключения для них принципиально отличаются. Примеры кода ниже подходят для обоих типов. Ориентируйтесь на схемы unipolar и bipolar, чтобы правильно подключить свой мотор.

Управление шаговым двигателем (как унипольным, так и биполярным) осуществляется через цифровые пины 8, 9, 10 и 11. В зависимости от типа мотора между Arduino и обмотками двигателя устанавливается либо U2004 Darlington Array (для унипольного), либо SN754410NE H-Bridge (для биполярного).

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

  • Плата Arduino
  • Шаговый двигатель
  • U2004 Darlington Array (для унипольного шагового двигателя)
  • SN754410ne H-мост (для биполярного шагового двигателя)
  • Источник питания, подходящий для вашего двигателя
  • Соединительные провода
  • Макетная плата (breadboard)

Схемы подключения

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

Важно: обе схемы ниже рассчитаны на четырёхпроводное подключение. Двухпроводные конфигурации с приведённым кодом работать не будут.

Унипольный шаговый двигатель — схема подключения

Unipolar Motor Knob Circuit. Image made using Fritzing. Схема подключения унипольного шагового двигателя с потенциометром (макетная плата). Изображение создано в Fritzing.

Unipolar Motor Knob Schematic. Image made using Fritzing. Принципиальная схема подключения унипольного шагового двигателя с потенциометром. Изображение создано в Fritzing.

Биполярный шаговый двигатель — схема подключения

Bipolar Motor Knob Circuit. Image made using Fritzing. Схема подключения биполярного шагового двигателя с потенциометром (макетная плата). Изображение создано в Fritzing.

Bipolar Motor Knob Schematic. Image made using Fritzing. Принципиальная схема подключения биполярного шагового двигателя с потенциометром. Изображение создано в Fritzing.

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

Ардуино использует встроенную библиотеку Stepper, которая берёт на себя формирование правильной последовательности импульсов для управления катушками. Вам достаточно указать количество шагов на оборот и задать скорость через setSpeed(). Всё остальное библиотека делает сама.

Драйверы — U2004 для унипольных и SN754410 для биполярных — нужны потому, что Arduino не способна напрямую обеспечить ток, достаточный для питания обмоток. Драйвер работает как усилитель: получает слабый управляющий сигнал от Arduino и коммутирует мощный ток от внешнего источника питания.

Примеры программ

MotorKnob

Шаговый двигатель повторяет положение потенциометра (или другого аналогового датчика), подключённого к аналоговому входу A0. Удобный способ проверить точность позиционирования.

#include <Stepper.h>

// измените это значение на количество шагов вашего двигателя
#define STEPS 100

// создаём экземпляр класса stepper, указывая
// количество шагов двигателя и пины, к которым он
// подключён
Stepper stepper(STEPS, 8, 9, 10, 11);

// предыдущее значение с аналогового входа
int previous = 0;

void setup() {
  // устанавливаем скорость двигателя 30 RPM
  stepper.setSpeed(30);
}

void loop() {
  // считываем значение датчика
  int val = analogRead(0);

  // выполняем количество шагов, равное изменению
  // показания датчика
  stepper.step(val - previous);

  // запоминаем предыдущее значение датчика
  previous = val;
}

StepperOneRevolution

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

#include <Stepper.h>

const int stepsPerRevolution = 200;  // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя

// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // устанавливаем скорость 60 rpm:
  myStepper.setSpeed(60);
  // инициализируем последовательный порт:
  Serial.begin(9600);
}

void loop() {
  // один оборот в одном направлении:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // один оборот в обратном направлении:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

StepperOneStepAtATime

Двигатель делает по одному шагу с большим интервалом. Этот пример идеально подходит для отладки: если все четыре провода подключены к правильным пинам, каждый шаг будет в одном направлении. Если мотор «дёргается» или вращается хаотично — значит, провода перепутаны.

#include <Stepper.h>

const int stepsPerRevolution = 200;  // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя

// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // количество шагов, выполненных двигателем

void setup() {
  // инициализируем последовательный порт:
  Serial.begin(9600);
}

void loop() {
  // выполняем один шаг:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(500);
}

StepperSpeedControl

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

#include <Stepper.h>

const int stepsPerRevolution = 200;  // измените это значение в соответствии с количеством шагов на оборот
// для вашего двигателя


// инициализируем библиотеку stepper на пинах 8–11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;  // количество шагов, выполненных двигателем

void setup() {
  // в setup ничего делать не нужно
}

void loop() {
  // считываем значение датчика:
  int sensorReading = analogRead(A0);
  // приводим его к диапазону от 0 до 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // устанавливаем скорость двигателя:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // выполняем 1/100 оборота:
    myStepper.step(stepsPerRevolution / 100);
  }
}

Типичные ошибки и советы по отладке

  • Мотор гудит, но не вращается. Скорее всего, слишком мал ток от внешнего источника питания или неправильно подключены провода обмоток. Проверьте даташит на ваш конкретный двигатель.
  • Мотор вибрирует на месте или делает хаотичные шаги. Провода обмоток перепутаны. Используйте пример StepperOneStepAtATime, чтобы найти правильную последовательность.
  • Arduino перезагружается при запуске мотора. Двигатель потребляет слишком много тока и просаживает питание. Обязательно используйте отдельный источник питания для мотора.
  • Мотор греется даже в покое. Это нормально для шаговых двигателей — ток через обмотки течёт постоянно. Если перегрев критичный, рассмотрите драйверы с функцией отключения тока в покое.
  • Направление вращения противоположно ожидаемому. Поменяйте местами два провода одной из обмоток.