Один из подписчиков решил сделать привод для телескопа, и попросил меня помочь с написанием скетча.
Раз уж скетч написан, то будет не лишним рассказать что для этого понадобится, и предоставить схему для сборки устройства.
Так выглядит устройство для управление двумя шаговыми двигателями с помощью джойстика на базе Arduino UNO.
Для его сборки понадобится:
Плата 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) < (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 миллиампер.
Чтобы инвертировать направление вращения вала шагового двигателя:
Поменяйте местами контакты 5, 6 или 4, 7 для 1 шагового двигателя.
Поменяйте местами контакты 11, 12 или 10, 13 для 2 шагового двигателя.
Чтобы поменять местами оси X, Y поменяйте местами контакты A0, A1.