Управление двумя шаговыми двигателями с помощью джойстика на базе Arduino UNO.

Один из подписчиков решил сделать привод для телескопа, и попросил меня помочь с написанием скетча.

Раз уж скетч написан, то будет не лишним рассказать что для этого понадобится, и предоставить схему для сборки устройства.

Так выглядит устройство для управление двумя шаговыми двигателями с помощью джойстика на базе Arduino UNO.

как собрать электронную часть для управления шаговыми двигателями с помощью джойстика на базе Arduino UNO

Для его сборки понадобится:

Плата Arduino UNO, модуль двух осевой джойстик, два униполярных шаговых двигателя 28BYJ-48 5V, два драйвера на базе микросхемы ULN2003 и соединительные провода.

список материалов Arduino UNO модуль двух осевой джойстик два униполярных шаговых двигателя 28BYJ-48 5V

Загрузите на плату Arduino UNO этот скетч.

В скетче есть 4 настройки!

Переменная t12 отвечает за скорость вращения первого шагового двигателя при первоначальном отведении джойстика.

Переменная t11 отвечает за скорость вращения первого шагового двигателя при отведении джойстика в крайнее положение.

Переменная t22 отвечает за скорость вращения второго шагового двигателя при первоначальном отведении джойстика.

Переменная t21 отвечает за скорость вращения второго шагового двигателя при отведении джойстика в крайнее положение.

Чем больше значение этих переменных тем медленнее скорость вращения шагового двигателя!


//Начало скетча


int i1 = 0;
int i2 = 0;
int t = 0;

int t12 = 14; //НАСТРОЙКА!!!//
int t11 = 4;  //НАСТРОЙКА!!!//
int t22 = 14; //НАСТРОЙКА!!!//
int t21 = 4;  //НАСТРОЙКА!!!//

void setup() {
  //4,5,6,7 контакты для 1 двигателя
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  //12,13,10,11 контакты для 2 двигателя
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void prodlit11() { //функция для продления цикла
  if (analogRead (A0) < (520)) {
    i1++;
  }
  if (analogRead (A0) > (521) && analogRead (A0) < (999)) {
    i1--;
    t = t12;
  }
  if (analogRead (A0) > (1000)) {
    i1--;
    t = t11;
  }
}

void prodlit12() { //функция для продления цикла
  if (analogRead (A0) > (490)) {
    i1++;
  }
  if (analogRead (A0) > (51) && analogRead (A0) < (489)) {
    i1--;
    t = 12;
  }
  if (analogRead (A0) < (50)) {
    i1--;
    t = t11;
  }
}

void prodlit21() { //функция для продления цикла
  if (analogRead (A1) < (520)) {
    i2++;
  }
  if (analogRead (A1) > (521) && analogRead (A1) < (999)) {
    i2--;
    t = t22;
  }
  if (analogRead (A1) > (1000)) {
    i2--;
    t = t21;
  }
}

void prodlit22() { //функция для продления цикла
  if (analogRead (A1) > (490)) {
    i2++;
  }
  if (analogRead (A1) > (51) && analogRead (A1) < (489)) {
    i2--;
    t = t22;
  }
  if (analogRead (A1) < (50)) {
    i2--;
    t = t21;
  }
}

void stopPins() {
  digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW);
  digitalWrite(7, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW);
  digitalWrite(12, LOW); digitalWrite(13, LOW); delay(100);
}

void loop() {
  if (analogRead (A0) > (521)) {
    t = t12;
    while (i1 < 1) { //цикл для вращения мотора 1 вправо
      digitalWrite(7, HIGH); digitalWrite(5, LOW); delay(t);
      digitalWrite(6, HIGH); digitalWrite(4, LOW); delay(t);
      digitalWrite(5, HIGH); digitalWrite(7, LOW); delay(t);
      digitalWrite(4, HIGH); digitalWrite(6, LOW); delay(t - 2);
      i1++; prodlit11();
    } i1 = 0; stopPins();
  }
  
  if (analogRead (A0) < (489)) {
    t = t12;
    while (i1 < 1) { //цикл для вращения мотора 1 влево
      digitalWrite(4, HIGH); digitalWrite(6, LOW); delay(t);
      digitalWrite(5, HIGH); digitalWrite(7, LOW); delay(t);
      digitalWrite(6, HIGH); digitalWrite(4, LOW); delay(t);
      digitalWrite(7, HIGH); digitalWrite(5, LOW); delay(t - 2);
      i1++; prodlit12();
    } i1 = 0; stopPins();
  }
  
  if (analogRead (A1) > (521)) {
    t = t22;
    while (i2 < 1) { //цикл для вращения мотора 2 вправо
      digitalWrite(13, HIGH); digitalWrite(11, LOW); delay(t);
      digitalWrite(12, HIGH); digitalWrite(10, LOW); delay(t);
      digitalWrite(11, HIGH); digitalWrite(13, LOW); delay(t);
      digitalWrite(10, HIGH); digitalWrite(12, LOW); delay(t - 2);
      i2++; prodlit21();
    } i2 = 0; stopPins();
  }
  
  if (analogRead (A1) < (489)) {
    t = t22;
    while (i2 < 1) { //цикл для вращения мотора 2 влево
      digitalWrite(10, HIGH); digitalWrite(12, LOW); delay(t);
      digitalWrite(11, HIGH); digitalWrite(13, LOW); delay(t);
      digitalWrite(12, HIGH); digitalWrite(10, LOW); delay(t);
      digitalWrite(13, HIGH); digitalWrite(11, LOW); delay(t - 2);
      i2++; prodlit22();
    } i2 = 0; stopPins();
  }
}


//Конец скетча


После настройки и загрузки скетча соберите все согласно этой схемы.

Проверьте! И если все верно, то можете подключить устройство к блоку питания, павербанку или USB компьютера.

Так как устройство в режиме вращения вала шагового двигателя потребляет около 350 миллиампер, то источник питания должен быть минимум на 500 миллиампер.

схема для управления шаговыми двигателями с помощью джойстика на базе Arduino UNO

Чтобы инвертировать направление вращения вала шагового двигателя:

Поменяйте местами контакты 5, 6 или 4, 7 для 1 шагового двигателя.

Поменяйте местами контакты 11, 12 или 10, 13 для 2 шагового двигателя.

Чтобы поменять местами оси X, Y поменяйте местами контакты A0, A1.


Видео версия проекта "Управление двумя шаговыми двигателями с помощью джойстика на базе Arduino UNO."


Управление двумя шаговыми двигателями с помощью джойстика на базе Arduino UNO