пʼятницю, 1 березня 2024 р.

stepper

 4-фазний кроковий двигун використовується для дискретного (покрокового) обертання валом двигуна будь-якого фізичного тіла. Основний принцип роботи — перетворення електричних імпульсів на дискретні механічні переміщення.

Для використання 4-фазного крокового двигуна спочатку потрібно зібрати на його основі макет, створити програму керування  і братися до роботи. На корпусі двигуна розташовані два монтажні підвісні вушка для фіксації положення.
Керування кроковим двигуном здійснюється за допомогою спеціальних програм, записаних в Arduino контролер або в інший мікропроцесорний пристрій.

4-фазний кроковий двигун має 5- контактний інтерфейс для під'єднання живлення й керівного сигналу. Кожен контакт має колірне позначення 1-Blue (синій), 2-Pink (рожевий), 3-Yellow (жовтий), 4-Orange (жовтогарячий), 5-Red (червоний). Контакти 1,2,3,4 — для під'єднання відповідних фаз. Контакт 5 — загальний для всіх фаз.
Живлення 4-фазного крокового двигуна здійснюється або від Arduino контролера або зовнішнього джерела живлення (блока живлення, батареї). Робоча напруга двигуна 5 В. Подавати живлення від Arduino контролера не рекомендується, оскільки двигун споживає великий струм і може пошкодити контролер. Найкращим способом є живлення від мережевого адаптера (блока живлення) або батареї.

 Характеристики:

  • модель: 28byj-48 5vdc;
  • напруга живлення: 5 В постійного струму;
  • кількість фаз: 4;
  • передавальне співвідношення: 1/64;
  • кут кроку: 5,625 x 1/64:
  • частота: 100 Гц;
  • опір постійного струму: 50 Ом ± 7/% (за температури 25 °C);
  • крутний момент: 34 мН/м;
  • створюваний шум: 35дБ;
  • габарити: 41,9 х 31,1 х 29,0 мм;
  • вага: 34 г.




Скетч управління кроковим двигуном 28BYJ-48
У пакеті Arduino IDE є стандартна бібліотека Stepper.h для управління уніполярними і біполярними кроковими двигунами. ЇЇ не потрібно шукати і завантажувати з інтернета. Вона встановлюється разом із пакетом Arduino IDE. Бібліотека дуже проста. Крім того, конструктор має всього дві функції: setSpeed і step.

Опис бібліотеки Stepper.h
Stepper( steps, pin1, pin2, pin3, pin4 ) - конструктор класу Stepper. Створює об'єкт типу Stepper.

Параметри:

steps – кількість кроків двигуна на один оборот (360°). Параметр використовується функцією setSpeed() для вирахування швидкості обертання.
pin1, pin2, pin3, pin4 – виводи для підключення драйвера двигуна. Для двох проводових схем підключення pin3 і pin4 не використовуються. Для чотирьох провідних схем pin1, pin2, pin3, pin4 відповідають фазам A, C, B, D при однополярному режимі управління.
void setSpeed(long rpms) - встановлює швидкість обертання двигуна в оборотах в хвилину.

Параметри:

rpms - швидкість обертання в оборотах в хвилину.
void step(int steps) - викликає поворот двигуна на задане число кроків. Функція залишає виконання програми до того часу, поки не завершиться.

Параметри:

steps – число кроків, на яке потрібно повернути ротор двигуна. Відразливе значення крутить двигун у протилежну сторону.
Приклад простого ескізу управління двигуном 28BYJ-48:

#include <Stepper.h> Stepper motor(48, 10, 12, 11, 13); // об'єкт motor, 48 кроків на оберт void setup() { motor.setSpeed(60); // швидкість 60 об. в хв. } void loop() { motor.step(240); // 5 обертів(240 шагов) за часовой стрілки delay(1000); motor.step(-240); // 5 обертів(240 шагов) проти часовой стрілки delay(1000); }

Підключення Джойстика
Підключається до запиту, аналогові осі (VRX і VRY) – на аналогові піни, кнопка SW – на цифровий пін. Кнопка нікуда не підтянута, але це можна зробити засобами мікроконтроллера. Джойстик зручно підключати проводами папа-мама до макетке:


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

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

Завантажте на плату 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) < (530)) {
    i1++;
  }
  if (analogRead (A0) > (531) && analogRead (A0) < (999)) {
    i1--;
    t = t12;
  }
  if (analogRead (A0) > (1000)) {
    i1--;
    t = t11;
  }
}

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

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

void prodlit22() { //функция для продления цикла
  if (analogRead (A1) > (500)) {
    i2++;
  }
  if (analogRead (A1) > (51) && analogRead (A1) < (499)) {
    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) > (531)) {
    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) < (499)) {
    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) > (531)) {
    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) < (499)) {
    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();
  }
}

Немає коментарів: