По многочисленным просьбам подписчиков на моем канале, пришлось сделать димер на базе платы Arduino Nano, и драйвера DRV8825
Для проекта использую:
Плата Arduino Nano, драйвер для шагового двигателя DRV8825, биполярный шаговый двигатель от компании MITSUMI, потенциометр 3,3 килоома (подойдет любой маломощный от 3 до 10 килоома), 2 кнопки, макетная плата, и соединительные провода.
Скетч для первого варианта (с кнопками)
//Начало скетча 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
Схема для первого варианта
Скетч для второго варианта
//Начало скетча 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
Схема второго варианта