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