Управление шаговым двигателем с помощью датчика вращения
В проекте используется 4 контакта для управления шаговым двигателем и 3 контакта для для датчика вращения.
Контакты 8-11 управляют шаговым двигателем и контакты 2-4 получают информацию от датчика движения.
Подключили питание 5V и GND от UNO к датчику движения и шаговый двигатель подключили от отдельного блока питания так как шаговый двигатель потребляе больше тока чем возможно взять из питания UNO.
В проекте используется библиотека “Stepper” которая включена в софт Arduino.
Используем некоторый переменные для хранения текущей позиции така как необходимо отслеживать положение двигателя для последующего возврата в исходное положение.
![]() |
Схема управления шаговым двигателем с помощью датчика вращения |
Sketch code
#include "Stepper.h"
#define STEPS 32 // Количество шагов для одного оборота внутреннего вала
// 2048 шагов для одного оборота внешнего вала
volatile boolean TurnDetected; // need volatile for Interrupts
volatile boolean rotationdirection; // CW or CCW rotation
const int PinCLK=2; // Генерация прерываний с использованием сигнала CLK
const int PinDT=3; // Чтение сигнала DT
const int PinSW=4; // Чтение переключения кннопки
int RotaryPosition=0; // Начальное положение шагового двигателя
int PrevPosition; // Предыдущее положение поворота Значение для проверки точности
int StepsToTake; // Проверка остановки шагового двигателя
// Правильное подключение шагового двигателя
// In1, In2, In3, In4 in the sequence 1-3-2-4
Stepper small_stepper(STEPS, 8, 10, 9, 11);
// Процедура прерывания выполняется, если CLK переходит из HIGH в LOW
void isr () {
delay(4); // задердка для Debouncing
if (digitalRead(PinCLK))
rotationdirection= digitalRead(PinDT);
else
rotationdirection= !digitalRead(PinDT);
TurnDetected = true;
}
void setup () {
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
pinMode(PinSW,INPUT);
digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
attachInterrupt (0,isr,FALLING); // Прерывание 0 всегда связано с контактом 2 на Arduino UNO
}
void loop () {
small_stepper.setSpeed(600); //Max seems to be 700
if (!(digitalRead(PinSW))) { // Проверка, нажата ли кнопка
if (RotaryPosition == 0) { // Проверка, была ли нажата кнопка
} else {
small_stepper.step(-(RotaryPosition*50));
RotaryPosition=0; // Сброс в позицию ZERO
}
}
// Выполняется, если обнаружено вращение
if (TurnDetected) {
PrevPosition = RotaryPosition; // Сохранить предыдущую позицию в переменной
if (rotationdirection) {
RotaryPosition=RotaryPosition-1;} // decrase Position by 1
else {
RotaryPosition=RotaryPosition+1;} // increase Position by 1
TurnDetected = false; // НЕ повторяйте цикл IF до тех пор, пока не будет обнаружено новое вращение
// Which direction to move Stepper motor
if ((PrevPosition + 1) == RotaryPosition) { // Переместить двигатель CW
StepsToTake=50;
small_stepper.step(StepsToTake);
}
if ((RotaryPosition + 1) == PrevPosition) { // Переместить двигатель CCW
StepsToTake=-50;
small_stepper.step(StepsToTake);
}
}
}
![]() |
![]() |