Управление шаговым двигателем

Программирование

Управление шаговым двигателем с памятью на пять положений.

#include <Stepper_28BYJ.h> // для шагового двигателя

#include <EEPROM.h>

#define STEPS 2300 // количество шагов
Stepper_28BYJ stepper(STEPS,5,4,3,2); //пины подключния
int but0 = 6; // датчик нулевого положения
int but_up = 7; // кнопка ВВЕРХ
int but_down = 8; // кнопка ВНИЗ
int but_mem1 = 9; // кнопка ПАМЯТЬ 1
int but_mem2 = 10; // кнопка ПАМЯТЬ 2
int but_mem3 = 11; // кнопка ПАМЯТЬ 3
int but_mem4 = 12; // кнопка ПАМЯТЬ 4
int but_mem5 = A5; // кнопка ПАМЯТЬ 5
#define led_mem1 A0 // светодиод ПАМЯТЬ 1
#define led_mem2 A1 // светодиод ПАМЯТЬ 2
#define led_mem3 A2 // светодиод ПАМЯТЬ 3
#define led_mem4 A3 // светодиод ПАМЯТЬ 4
#define led_mem5 A4 // светодиод ПАМЯТЬ 5
int CountSteps; // счетчик шагов
int Temp;
long previousMillisBut ; // предыдущее время для кнопки
long currentMillisBut ; // текущее время для кнопки
boolean calOK; // флаг калибровки
boolean setmem1; //флаг нажатия MEM_1
boolean setmem2; //флаг нажатия MEM_2
boolean setmem3; //флаг нажатия MEM_3
boolean setmem4; //флаг нажатия MEM_4
boolean setmem5; //флаг нажатия MEM_5
void setup() {
Serial.begin(9600);// скорость порта 9600
stepper.setSpeed(10);// устанавливаем скорость вращения в об/мин
pinMode(but0, INPUT); // порт на вход
digitalWrite(but0,HIGH);// подтягивающий резистор включить
pinMode(but_up, INPUT);
digitalWrite(but_up,HIGH);
pinMode(but_down, INPUT);
digitalWrite(but_down,HIGH);
pinMode(but_mem1, INPUT);
digitalWrite(but_mem1,HIGH);
pinMode(but_mem2, INPUT);
digitalWrite(but_mem2,HIGH);
pinMode(but_mem3, INPUT);
digitalWrite(but_mem3,HIGH);
pinMode(but_mem4, INPUT);
digitalWrite(but_mem4,HIGH);
pinMode(but_mem5, INPUT);
digitalWrite(but_mem5,HIGH);
pinMode(led_mem1, OUTPUT);// порт на выход
pinMode(led_mem2, OUTPUT);
pinMode(led_mem3, OUTPUT);
pinMode(led_mem4, OUTPUT);
pinMode(led_mem5, OUTPUT);
cal0(); // Установка двигателя в начальное положение
}
void loop() {
// Кнопка UP
if(digitalRead(but_up) == LOW ){ // проверяем нажата ли кнопка
if(CountSteps < STEPS) { // прверяем есть ли еще шаги
stepper.step(1); // если есть то делаем
CountSteps = CountSteps+1; // инкриминируем счетчик шагов
// digitalWrite(led_mem1,LOW); // выключаем светодиод MEM1
//delay(50);
// Serial.print("CountSteps=");Serial.println(CountSteps);
}
else{ // если шагов больше нет
Serial.println("CountSteps=MAX");
digitalWrite(led_mem1,HIGH);
digitalWrite(led_mem2,HIGH);
digitalWrite(led_mem3,HIGH);
digitalWrite(led_mem4,HIGH);
digitalWrite(led_mem5,HIGH);
delay(1000);
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem4,LOW);
digitalWrite(led_mem5,LOW);
}
}
// Кнопка DOWN
if(digitalRead(but_down) == LOW ){ // проверяем нажата ли кнопка
if(CountSteps > 0) { // прверяем есть ли еще шаги
stepper.step(-1); // если есть то делаем
CountSteps = CountSteps-1; // декриминируем счетчик шагов
//digitalWrite(led_mem1,LOW); // выключаем светодиод MEM1
// delay(50);
// Serial.print("CountSteps=");Serial.println(CountSteps);
}
else{ // если шагов больше нет
Serial.println("CountSteps=MIN");
digitalWrite(led_mem1,HIGH);
digitalWrite(led_mem2,HIGH);
digitalWrite(led_mem3,HIGH);
digitalWrite(led_mem4,HIGH);
digitalWrite(led_mem5,HIGH);
delay(1000);
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem4,LOW);
digitalWrite(led_mem5,LOW);
}
}
// кнопка MEM1
if(digitalRead(but_mem1) == LOW ){ // проверяем нажата ли кнопка
if(setmem1==false){ // проверяем флаг (предыдущее состояние
setmem1=true; // если не был установлен то устанавливаем
currentMillisBut = millis(); // текущее время в миллисекундах
previousMillisBut=currentMillisBut ;
}
else{
currentMillisBut = millis();
if (currentMillisBut-previousMillisBut > 2000 ){ // если в течении 2 сек нажата кнопка
previousMillisBut=currentMillisBut ; // начинаем отсчет сначала
EEPROM.put(0,CountSteps); // записываем в память текущее значение
delay(50);
Serial.println("M1 WR");
digitalWrite(led_mem1,HIGH);
delay(500);
digitalWrite(led_mem1,LOW);
}
}
}
if((digitalRead(but_mem1) == HIGH ) and (setmem1==true)) { // если кнопка отпущена и флаг установлен
EEPROM.get(0,Temp); // читаем из памяти EEPROM
delay(20);
Serial.print("M1 ");Serial.println(Temp);
setmem1=false;// сбрасываем флаг
delay(150);
tune();
digitalWrite(led_mem1,HIGH); // включаем светодиод MEM1
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem4,LOW);
digitalWrite(led_mem5,LOW);
Serial.println("M1 OK");
}
// кнопка MEM2
if(digitalRead(but_mem2) == LOW ){ // проверяем нажата ли кнопка
if(setmem2==false){ // проверяем флаг (предыдущее состояние
setmem2=true; // если не был установлен то устанавливаем
currentMillisBut = millis(); // текущее время в миллисекундах
previousMillisBut=currentMillisBut ;
}
else{
currentMillisBut = millis();
if (currentMillisBut-previousMillisBut > 2000 ){ // если в течении 2 сек нажата кнопка
previousMillisBut=currentMillisBut ; // начинаем отсчет сначала
EEPROM.put(10,CountSteps); // записываем в память текущее значение
delay(50);
Serial.println("M2 WR");
digitalWrite(led_mem2,HIGH);
delay(500);
digitalWrite(led_mem2,LOW);
}
}
}
if((digitalRead(but_mem2) == HIGH ) and (setmem2==true)) { // если кнопка отпущена и флаг установлен
EEPROM.get(10,Temp); // читаем из памяти EEPROM
delay(20);
Serial.print("M2 ");Serial.println(Temp);
setmem2=false;// сбрасываем флаг
delay(150);
tune();
digitalWrite(led_mem2,HIGH); // включаем светодиод MEM1
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem4,LOW);
digitalWrite(led_mem5,LOW);
Serial.println("M2 OK");
}
// кнопка MEM3
if(digitalRead(but_mem3) == LOW ){ // проверяем нажата ли кнопка
if(setmem3==false){ // проверяем флаг (предыдущее состояние
setmem3=true; // если не был установлен то устанавливаем
currentMillisBut = millis(); // текущее время в миллисекундах
previousMillisBut=currentMillisBut ;
}
else{
currentMillisBut = millis();
if (currentMillisBut-previousMillisBut > 2000 ){ // если в течении 2 сек нажата кнопка
previousMillisBut=currentMillisBut ; // начинаем отсчет сначала
EEPROM.put(20,CountSteps); // записываем в память текущее значение
delay(50);
Serial.println("M3 WR");
digitalWrite(led_mem3,HIGH);
delay(500);
digitalWrite(led_mem3,LOW);
}
}
}
if((digitalRead(but_mem3) == HIGH ) and (setmem3==true)) { // если кнопка отпущена и флаг установлен
EEPROM.get(20,Temp); // читаем из памяти EEPROM
delay(20);
Serial.print("M3 ");Serial.println(Temp);
setmem3=false;// сбрасываем флаг
delay(150);
tune();
digitalWrite(led_mem3,HIGH); // включаем светодиод MEM1
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem4,LOW);
digitalWrite(led_mem5,LOW);
Serial.println("M3 OK");
}
// кнопка MEM4
if(digitalRead(but_mem4) == LOW ){ // проверяем нажата ли кнопка
if(setmem4==false){ // проверяем флаг (предыдущее состояние
setmem4=true; // если не был установлен то устанавливаем
currentMillisBut = millis(); // текущее время в миллисекундах
previousMillisBut=currentMillisBut ;
}
else{
currentMillisBut = millis();
if (currentMillisBut-previousMillisBut > 2000 ){ // если в течении 2 сек нажата кнопка
previousMillisBut=currentMillisBut ; // начинаем отсчет сначала
EEPROM.put(30,CountSteps); // записываем в память текущее значение
delay(50);
Serial.println("M4 WR");
digitalWrite(led_mem4,HIGH);
delay(500);
digitalWrite(led_mem4,LOW);
}
}
}
if((digitalRead(but_mem4) == HIGH ) and (setmem4==true)) { // если кнопка отпущена и флаг установлен
EEPROM.get(30,Temp); // читаем из памяти EEPROM
delay(20);
Serial.print("M4 ");Serial.println(Temp);
setmem4=false;// сбрасываем флаг
delay(150);
tune();
digitalWrite(led_mem4,HIGH); // включаем светодиод MEM1
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem5,LOW);
Serial.println("M4 OK");
}
// кнопка MEM5
if(digitalRead(but_mem5) == LOW ){ // проверяем нажата ли кнопка
if(setmem5==false){ // проверяем флаг (предыдущее состояние
setmem5=true; // если не был установлен то устанавливаем
currentMillisBut = millis(); // текущее время в миллисекундах
previousMillisBut=currentMillisBut ;
}
else{
currentMillisBut = millis();
if (currentMillisBut-previousMillisBut > 2000 ){ // если в течении 2 сек нажата кнопка
previousMillisBut=currentMillisBut ; // начинаем отсчет сначала
EEPROM.put(40,CountSteps); // записываем в память текущее значение
delay(50);
Serial.println("M5 WR");
digitalWrite(led_mem5,HIGH);
delay(500);
digitalWrite(led_mem5,LOW);
}
}
}
if((digitalRead(but_mem5) == HIGH ) and (setmem5==true)) { // если кнопка отпущена и флаг установлен
EEPROM.get(40,Temp); // читаем из памяти EEPROM
delay(20);
Serial.print("M5 ");Serial.println(Temp);
setmem5=false;// сбрасываем флаг
delay(150);
tune();
digitalWrite(led_mem5,HIGH); // включаем светодиод MEM5
digitalWrite(led_mem1,LOW);
digitalWrite(led_mem2,LOW);
digitalWrite(led_mem3,LOW);
digitalWrite(led_mem4,LOW);
Serial.println("M5 OK");
}
}
void cal0(){ // установка двигателя в начальное положение
Serial.println("Cal"); //
cal_loop:;
if(digitalRead(but0) == LOW ){ // если дошел до 0 (кнопка нажалась)
CountSteps = 0; // сбрасываем счетчик шагов
goto out_cal0; // идем на выход
}
else{ // если не дошел
stepper.step(-1); // делаем шаг назад
goto cal_loop; // и проверяем еще раз
}
out_cal0:
calOK=true; // поднимаем флаг окончания калибровки
Serial.println("Cal_OK"); // радуемся в терминале
}
void tune(){ // Установка двигателя в нужное положение
cal0(); // двигатель в начальное положение
tune_loop:
if(CountSteps<Temp){ // если значение в счетчике меньше чем в Temp
stepper.step(1); // то делаем шаг
CountSteps = CountSteps+1; // инкриминируем счетчик шагов
goto tune_loop; // и проверяем еще раз
}
else{ // если значения равны
Serial.println("Tune Stop"); // радуемся в терминале
}
}
23:29
RSS
Нет комментариев. Ваш будет первым!
Яндекс.Метрика
RCB © 2019