Регулятор скорости вращения для биполярного шагового двигателя на базе Arduino Nano

По многочисленным просьбам подписчиков на моем канале, пришлось сделать димер на базе платы Arduino Nano, и драйвера DRV8825

регулятор скорости вращения, для униполярного шагового двигателя на базе Arduino Nano

Для проекта использую:

Плата Arduino Nano, драйвер для шагового двигателя DRV8825, биполярный шаговый двигатель от компании MITSUMI, потенциометр 3,3 килоома (подойдет любой маломощный от 3 до 10 килоома), 2 кнопки, макетная плата, и соединительные провода.

регулятор скорости вращения, для униполярного шагового двигателя на базе Arduino Nano

Скетч для первого варианта (с кнопками)


//Начало скетча 1


const int startButton = 8;
const int reversButton = 9;
const int stepPin = 11;
const int enablePin = 12;
const int dirPin = 13;

int i = 0, j = 0, k = 0, l = 0, stepState = 0;
unsigned long previousMillis = 0;
long interval = 0;
long previousMillis2 = 0;
long previousMillis3 = 0;

void setup()
{
  pinMode( startButton, INPUT_PULLUP);
  pinMode( reversButton, INPUT_PULLUP);
  pinMode( stepPin, OUTPUT); digitalWrite( stepPin, LOW);
  pinMode( enablePin, OUTPUT); digitalWrite( enablePin, LOW);
  pinMode( dirPin, OUTPUT); digitalWrite( dirPin, LOW);
}

void loop()
{
  int sensorReading = analogRead(A3);
  interval = map(sensorReading, 0, 1023, 32767, 1000);
  unsigned long currentMillis = micros();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (stepState == LOW) {
      stepState = HIGH;
    } else {
      stepState = LOW;
    }
    digitalWrite( stepPin, stepState);
  } else {
    digitalWrite( stepPin, LOW);
  }
  if (digitalRead( startButton) == LOW) {
    if (millis() - previousMillis2 > 100)
    { previousMillis2 = millis(); i++; if (i == 1) {
        j++;
      } if (j > 1) {
        j = 0;
      }
    }
  } else {
    i = 0;
  }
  if (j == 0) {
    digitalWrite( enablePin, HIGH);
  } else {
    digitalWrite( enablePin, LOW);
  }
  if (digitalRead( reversButton) == LOW) {
    if (millis() - previousMillis3 > 100)
    { previousMillis3 = millis(); l++; if (l == 1) {
        k++;
      } if (k > 1) {
        k = 0;
      }
    }
  } else {
    l = 0;
  }
  if (k == 0) {
    digitalWrite( dirPin, HIGH);
  } else {
    digitalWrite( dirPin, LOW);
  }
}


//Конец скетча 1


Схема для первого варианта

схема регулятор скорости вращения, для униполярного шагового двигателя на базе Arduino Nano

Скетч для второго варианта


//Начало скетча 2


const int stepPin = 11;
const int enablePin = 12;
const int dirPin = 13;

int stepState = 0;
unsigned long previousMillis = 0;
long interval = 0;

void setup()
{
  pinMode( stepPin, OUTPUT); digitalWrite( stepPin, LOW);
  pinMode( enablePin, OUTPUT); digitalWrite( enablePin, LOW);
  pinMode( dirPin, OUTPUT); digitalWrite( dirPin, LOW);
}

void loop()
{
  int sensorReading = analogRead(A3);
  interval = map(sensorReading, 0, 1023, 32767, 1000);
  unsigned long currentMillis = micros();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (stepState == LOW) {
      stepState = HIGH;
    } else {
      stepState = LOW;
    }
    digitalWrite( stepPin, stepState);
  } else {
    digitalWrite( stepPin, LOW);
  }
}


//Конец скетча 2


Доработанный скетч второго варианта


//Начало скетча 3


int max_Speed = 800; /* max_Speed это задержка для максимальной скорости! Если ваш шаговый двигатель пропускает шаги при максимальной скорости, то увеличьте эту задержку, чтобы снизить частоту! */
int min_Speed = 32767; /* min_Speed это задержка для минимальной скорости! Чем меньше это значение тем быстрее вращение на минимальной скорости */

const int stepPin = 11;
const int enablePin = 12;
const int dirPin = 13;

int stepState = 0;
unsigned long previousMillis = 0;
long interval = 0;
float x, x2, x3;

void setup()
{
  pinMode( stepPin, OUTPUT); digitalWrite( stepPin, LOW);
  pinMode( enablePin, OUTPUT); digitalWrite( enablePin, LOW);
  pinMode( dirPin, OUTPUT); digitalWrite( dirPin, LOW);
}

void loop()
{
  int sensorReading = analogRead(A3);
  x = 1023 * sin(PI * sensorReading * 0.00048);
  x2 = 1023 * sin(PI * x * 0.00046);
  x3 = 1023 * sin(PI * x2 * 0.00045);
  interval = map(x3, 0, 1023, min_Speed, max_Speed);
  unsigned long currentMillis = micros();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (stepState == LOW) {
      stepState = HIGH;
    } else {
      stepState = LOW;
    }
    digitalWrite( stepPin, stepState);
  } else {
    digitalWrite( stepPin, LOW);
  }
}


//Конец скетча 3


Схема второго варианта

схема регулятор скорости вращения, для униполярного шагового двигателя на базе Arduino Nano

Видео "Регулятор скорости вращения для биполярного шагового двигателя на базе Arduino Nano"


Регулятор скорости вращения для биполярного шагового двигателя на базе Arduino Nano