Как да управлявате серво мотора с помощта на джойстик

Опитайте Нашия Инструмент За Премахване На Проблемите





В тази публикация ще научим как да управляваме серво мотори с помощта на джойстик и Arduino. Ще видим преглед на джойстика, неговите щифтове, неговата конструкция и работа. Ще извличаме полезни данни от джойстика, който ще бъде основата за управление на сервомоторите.

Въведение

Мотото на тази статия не е само да управлявайте серво моторите но, за да научите как да използвате a джойстик за управление много други периферни устройства.



Сега да разгледаме джойстика.

Джойстик е входно устройство, което се състои от лост, който може да се движи в няколко посоки по оси X и Y. Движението на лоста се използва за управление на мотор или някакви периферни електронни устройства.



Джойстиците се използват от RC играчки до самолети Boing и изпълняват подобни функции. Освен това игрите и по-малките джойстици имат бутон в оста Z, който може да бъде програмиран да извършва много полезни действия.

Илюстрация на джойстика:

Илюстрация на джойстика:

Джойстиците като цяло са електронни устройства, така че трябва да прилагаме мощност. Движението на лоста води до разлика в напрежението на изходните щифтове. Нивата на напрежение се обработват от микроконтролер за управление на изходното устройство като двигател.

Илюстрираният джойстик е подобен на този, който може да бъде намерен в контролерите PlayStation и Xbox. Не е необходимо да разбивате тези контролери, за да ги спасите. Тези модули са лесно достъпни в местните електронни магазини и сайтове за електронна търговия.

Сега нека видим конструкцията на този джойстик.

Той има два 10 кило ома потенциометър позициониран в оси X и Y с пружини, така че да се върне в първоначалното си положение, когато потребителят освободи силата от лоста. Той има бутон за включване по ос Z.

Той има 5 щифта, 5 волта Vcc, GND, променлива X, променлива Y и SW (превключвател на оста Z). Когато подадем напрежение и оставим джойстика в първоначалното му положение на лоста. Щифтовете X и Y ще генерират половината от приложеното напрежение.

Когато преместваме лоста, напрежението варира в изходните щифтове X и Y. Сега нека на практика свържем джойстика с Arduino.

Схематична диаграма:

Arduino Servo Motor Control с помощта на джойстик

Подробностите за връзката на щифтовете са дадени до веригата. Свържете завършената хардуерна настройка и качете кода.

Програма:

//---------------Program Developed by R.Girish--------------//
int X_axis = A0
int Y_axis = A1
int Z_axis = 2
int x = 0
int y = 0
int z = 0
void setup()
{
Serial.begin(9600)
pinMode(X_axis, INPUT)
pinMode(Y_axis, INPUT)
pinMode(Z_axis, INPUT)
digitalWrite(Z_axis, HIGH)
}
void loop()
{
x = analogRead(X_axis)
y = analogRead(Y_axis)
z = digitalRead(Z_axis)
Serial.print('X axis = ')
Serial.println(x)
Serial.print('Y axis = ')
Serial.println(y)
Serial.print('Z axis = ')
if(z == HIGH)
{
Serial.println('Button not Pressed')
}
else
{
Serial.println('Button Pressed')
}
Serial.println('----------------------------')
delay(500)
}
//---------------Program Developed by R.Girish--------------//

Отворете серийния монитор, можете да видите нивото на напрежение на щифтовете на осите X и Y и състоянието на оста Z, т.е. бутон, както е показано по-долу.

Тези стойности на оси X, Y, Z се използват за интерпретиране на позицията на лоста. Както можете да видите стойностите са от 0 до 1023.

Това е така, защото Arduino е вградил ADC конвертор, който преобразува стойностите на напрежението 0V - 5V в 0 до 1023.

Можете да станете свидетели от серийния монитор, че когато лостът е оставен недокоснат, лостът остава в средно положение на двете оси X и Y и показва половината стойност от 1023.

Можете също така да видите, че не е точно половината от 1023, защото производството на тези джойстици никога не е било перфектно.

Досега бихте получили някои технически познания за джойстиците.

Сега нека видим как да управлявате два серво мотора с помощта на един джойстик.

Електрическа схема:

Двата серво мотора се управляват от един джойстик, когато преместите джойстика по оста X, серво, свързано на щифт # 7, се движи по посока на часовниковата стрелка и в посока против часовниковата стрелка в зависимост от позицията на лоста.

Можете също така да задържите серво задвижването в позиция, ако държите нивото на джойстика в определена позиция.

Подобно на серво мотора, свързан на щифт # 6, можете да преместите лоста по оста Y.

Когато натиснете лоста по оста Z, двата двигателя ще извършат размах на 180 градуса.

Можете да свържете arduino към 9v battery или към компютър. Ако свържете Arduino към компютър, можете да отворите сериен монитор и да видите ъгъла на серво задвижванията и нивата на напрежение.

Програма за управление на серво мотора:

//---------------Program Developed by R.Girish--------------//
#include
Servo servo_X
Servo servo_Y
int X_angleValue = 0
int Y_angleValue = 0
int X_axis = A0
int Y_axis = A1
int Z_axis = 2
int x = 0
int y = 0
int z = 0
int pos = 0
int check1 = 0
int check2 = 0
int threshold = 10
void setup()
{
Serial.begin(9600)
servo_X.attach(7)
servo_Y.attach(6)
pinMode(X_axis, INPUT)
pinMode(Y_axis, INPUT)
pinMode(Z_axis, INPUT)
digitalWrite(Z_axis, HIGH)
}
void loop()
{
x = analogRead(X_axis)
y = analogRead(Y_axis)
z = digitalRead(Z_axis)
if(z == LOW)
{
Serial.print('Z axis status = ')
Serial.println('Button Pressed')
Serial.println('Sweeping servo actuators')
for (pos = 0 pos <= 180 pos += 1)
{
servo_X.write(pos)
delay(10)
}
for (pos = 180 pos >= 0 pos -= 1)
{
servo_X.write(pos)
delay(15)
}
for (pos = 0 pos <= 180 pos += 1)
{
servo_Y.write(pos)
delay(10)
}
for (pos = 180 pos >= 0 pos -= 1)
{
servo_Y.write(pos)
delay(15)
}
Serial.println('Done!!!')
}
if(x > check1 + threshold || x {
X_angleValue = map(x, 0, 1023, 0, 180)
servo_X.write(X_angleValue)
check1 = x
Serial.print('X axis voltage level = ')
Serial.println(x)
Serial.print('X axis servo motor angle = ')
Serial.print(X_angleValue)
Serial.println(' degree')
Serial.println('------------------------------------------')
}
if(y > check2 + threshold || y {
Y_angleValue = map(y, 0, 1023, 0, 180)
servo_Y.write(Y_angleValue)
check2 = y
Serial.print('Y axis voltage level = ')
Serial.println(y)
Serial.print('Y axis servo motor angle = ')
Serial.print(Y_angleValue)
Serial.println(' degree')
Serial.println('------------------------------------------')
}
}
//---------------Program Developed by R.Girish--------------//

Ако имате някакъв конкретен въпрос относно този проект, не се колебайте да изразите в раздела за коментари, може да получите бърз отговор.




Предишна: Цифрова верига за измерване на капацитет, използваща Arduino Напред: Използване на цифров потенциометър MCP41xx с Arduino