Arduino управление шаговым двигателем из массива с паузами и двунаправленным перемещением

 

 

Схема подключения драйвера A4988 и шагового двигателя от CD-ROM к Ардуино см. здесь >>>>

Внимание! шаговый двигатель от CD-Rom питается от 5В, поэтому дополнительное питание на драйвер A4988 должно быть 5В

 

Программа управления Arduino шаговым двигателем по программе из 2х массивов

******************************************************************

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);
}
 
******************************************************************

You have no rights to post comments