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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


  1. int i1=0;
  2. int i2=0;
  3. int t=0;
  4. int t12=14;//НАСТРОЙКА!!!//
  5. int t11=4;//НАСТРОЙКА!!!//
  6. int t22=14;//НАСТРОЙКА!!!//
  7. int t21=4;//НАСТРОЙКА!!!//
  8. void setup(){
  9. //4,5,6,7 контакты для 1 двигателя
  10. pinMode(4, OUTPUT);
  11. pinMode(5, OUTPUT);
  12. pinMode(6, OUTPUT);
  13. pinMode(7, OUTPUT);
  14. //12,13,10,11 контакты для 2 двигателя
  15. pinMode(12, OUTPUT);
  16. pinMode(13, OUTPUT);
  17. pinMode(10, OUTPUT);
  18. pinMode(11, OUTPUT);
  19. }
  20. void prodlit11(){ //функция для продления цикла
  21. if (analogRead (A0)<(520)){i1++;}
  22. if (analogRead (A0)>(521)&& analogRead (A0)<(999)){i1--;t=t12;}
  23. if (analogRead (A0)>(1000)){i1--;t=t11;}
  24. }
  25. void prodlit12(){ //функция для продления цикла
  26. if (analogRead (A0)>(490)){i1++;}
  27. if (analogRead (A0)>(51)&& analogRead (A0)<(489)){i1--;t=12;}
  28. if (analogRead (A0)<(50)){i1--;t=t11;}
  29. }
  30. void prodlit21(){ //функция для продления цикла
  31. if (analogRead (A1)<(520)){i2++;}
  32. if (analogRead (A1)>(521)&& analogRead (A1)<(999)){i2--;t=t22;}
  33. if (analogRead (A1)>(1000)){i2--;t=t21;}
  34. }
  35. void prodlit22(){ //функция для продления цикла
  36. if (analogRead (A1)>(490)){i2++;}
  37. if (analogRead (A1)>(51)&& analogRead (A1)<(489)){i2--;t=t22;}
  38. if (analogRead (A1)<(50)){i2--;t=t21;}
  39. }
  40. void stopPins() {digitalWrite(4, LOW);digitalWrite(5, LOW);digitalWrite(6, LOW);
  41. digitalWrite(7, LOW);digitalWrite(10, LOW);digitalWrite(11, LOW);
  42. digitalWrite(12, LOW);digitalWrite(13, LOW);delay(100);}
  43. void loop(){
  44. if (analogRead (A0) > (521)){t=t12;
  45. while (i1<1){ //цикл для вращения мотора 1 вправо
  46. digitalWrite(7, HIGH);digitalWrite(5, LOW);delay(t);
  47. digitalWrite(6, HIGH);digitalWrite(4, LOW);delay(t);
  48. digitalWrite(5, HIGH);digitalWrite(7, LOW);delay(t);
  49. digitalWrite(4, HIGH);digitalWrite(6, LOW);delay(t-2);
  50. i1++;prodlit11();}i1=0;stopPins();
  51. }
  52. if (analogRead (A0) < (489)){t=t12;
  53. while (i1<1){ //цикл для вращения мотора 1 влево
  54. digitalWrite(4, HIGH);digitalWrite(6, LOW);delay(t);
  55. digitalWrite(5, HIGH);digitalWrite(7, LOW);delay(t);
  56. digitalWrite(6, HIGH);digitalWrite(4, LOW);delay(t);
  57. digitalWrite(7, HIGH);digitalWrite(5, LOW);delay(t-2);
  58. i1++;prodlit12();}i1 = 0;stopPins();
  59. }
  60. if (analogRead (A1) > (521)){t=t22;
  61. while (i2<1){ //цикл для вращения мотора 2 вправо
  62. digitalWrite(13, HIGH);digitalWrite(11, LOW);delay(t);
  63. digitalWrite(12, HIGH);digitalWrite(10, LOW);delay(t);
  64. digitalWrite(11, HIGH);digitalWrite(13, LOW);delay(t);
  65. digitalWrite(10, HIGH);digitalWrite(12, LOW);delay(t-2);
  66. i2++;prodlit21();}i2=0;stopPins();
  67. }
  68. if (analogRead (A1) < (489)){t=t22;
  69. while (i2<1){ //цикл для вращения мотора 2 влево
  70. digitalWrite(10, HIGH);digitalWrite(12, LOW);delay(t);
  71. digitalWrite(11, HIGH);digitalWrite(13, LOW);delay(t);
  72. digitalWrite(12, HIGH);digitalWrite(10, LOW);delay(t);
  73. digitalWrite(13, HIGH);digitalWrite(11, LOW);delay(t-2);
  74. i2++;prodlit22();}i2 = 0;stopPins();
  75. }}

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


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

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

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

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

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

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

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

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


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


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