Arduino управление шаговым двигателем из массива с паузами и двунаправленным перемещением
- Информация о материале
- Обновлено: 04.04.2023, 13:34
- Опубликовано: 04.04.2023, 13:00
- Автор: DeniS
Схема подключения драйвера A4988 и шагового двигателя от CD-ROM к Ардуино см. здесь >>>>
Внимание! шаговый двигатель от CD-Rom питается от 5В, поэтому дополнительное питание на драйвер A4988 должно быть 5В
Программа управления Arduino шаговым двигателем по программе из 2х массивов
******************************************************************
//Здесь описание к этому скетчу http://www.muuh.ru/shagovye-dvigateli/360-arduino-upravlenie-shagovym-dvigatelem-iz-massiva-s-pauzami-i-dvunapravlennym-peremeshcheniem.html
long tempsV=0 ;
long tempsV2=0 ;
int i1=0;
int b1=0;
int d1=0; //DIR направление шагового двигателя
int d2=0; //модуль из числа оборотов из массива для обратноого вращения
int StepsPerRotate = 20; //характеристика шагового двигателя - кол-во импульсов на 1 оборот
int vMax=5; //скорость вращения двигателя максимальная
//int vMin=5; //скорость вращения двигателя минимальная
byte count1 = 0;
//Программа массив шагового двигателя 1
int16_t path1[] = {-2, 2, -3, 3}; //Массив с количеством оборотов шагового двигателя
int16_t vremya1[] = {500, 500, 500, 500}; //Массив с паузами
void setup() {
Serial.begin(9600);
//Назначение пинов под шаговый двигатель
pinMode(2, OUTPUT); //Подключение шагового двигателя 1 STEP
pinMode(3, OUTPUT); //Подключение шагового двигателя 1 DIR
pinMode(6, OUTPUT); //Подключение шагового двигателя 1 EN Вкл/Выкл
}
//Функция STEP для шагового двигателя 1
int stepsSM1 () {
if ((millis()-tempsV)>=vMax)
{
tempsV=millis();
digitalWrite(2, 1);
i1=i1+1; //инкремент счетчика импульсов
}
if ((millis()-tempsV2)>=vMax*2)
{
tempsV2=millis();
digitalWrite(2, 0);
}
return (i1);
}
void loop()
{
//Выполение программы из массива
// Шаговый двигатель 1
if (path1[count1]<0) d1=1; //если значение в массиве отрицательно то вращение в одну сторону
else {d1=0;}//если значение в массиве положительное то вращение в другую сторону
d2 = abs(path1[count1]);//модуль числа для подставновки в функции
digitalWrite(3, d1);//DIR шагового двигателя 1 CCW
digitalWrite(6, 0);//ВКЛ шаговый двигатель 1
stepsSM1();
b1 = i1/StepsPerRotate; //вычисление кол-ва сделанных оборотов
if (b1==d2) //Если достигнуто предельное кол-во оборотов из массива, пауза из 2го массива
{
digitalWrite(6, 1);//ВЫКЛ шаговый двигатель 1
delay (vremya1[count1]); //Данные из массива время паузы для ШД1
digitalWrite(6,0);//ВКЛ шаговый двигатель 1
i1=0;
if (++count1 >= sizeof(path1) / 2) //Перебирание массива поэлементно
count1 = 0; //Зацикливание выполнения массива
}
Serial.println(i1);
}
******************************************************************