在這篇文章中,我們將學(xué)習(xí)如何使用操縱桿和Arduino控制伺服電機(jī)。我們將看到有關(guān)操縱桿,其銷,其結(jié)構(gòu)和工作的概述。我們將從操縱桿中提取有用的數(shù)據(jù),這些數(shù)據(jù)將成為控制伺服電機(jī)的基礎(chǔ)。
現(xiàn)在讓我們看一下操縱桿。
操縱桿是一種輸入設(shè)備,由杠桿組成,杠桿可以在 X 軸和 Y 軸上沿多個(gè)方向移動(dòng)。杠桿的運(yùn)動(dòng)用于控制電機(jī)或任何外圍電子設(shè)備。
從遙控玩具到Boing飛機(jī),操縱桿都用于執(zhí)行類似的功能。此外,游戲和較小的操縱桿在Z軸上有一個(gè)按鈕,可以對(duì)其進(jìn)行編程以執(zhí)行許多有用的操作。
操縱桿通常是電子設(shè)備,因此我們需要施加電源。杠桿的移動(dòng)會(huì)在輸出引腳上產(chǎn)生電壓差。電壓電平由微控制器處理,以控制電機(jī)等輸出設(shè)備。
圖示的操縱桿與此類似,可以在PlayStation和Xbox控制器中找到。您無(wú)需破壞這些控制器即可挽救一個(gè)。這些模塊在當(dāng)?shù)仉娮由痰旰碗娮由虅?wù)網(wǎng)站上隨時(shí)可用。
現(xiàn)在讓我們看看這個(gè)操縱桿的構(gòu)造。
它有兩個(gè) 10 千歐姆電位器,位于帶有彈簧的 X 軸和 Y 軸上,因此當(dāng)用戶從杠桿釋放力時(shí),它會(huì)返回到其原始位置。它在 Z 軸上有一個(gè)按下 ON
按鈕。
它具有 5 個(gè)引腳、5 伏 Vcc、GND、可變 X、可變 Y 和 SW(Z 軸開關(guān))。當(dāng)我們施加電壓并將操縱桿留在其原始杠桿位置時(shí)。X 和 Y
引腳將產(chǎn)生施加電壓的一半。
當(dāng)我們移動(dòng)杠桿時(shí),X 和 Y 輸出引腳的電壓會(huì)發(fā)生變化?,F(xiàn)在讓我們實(shí)際將操縱桿連接到Arduino。
示意圖:
引腳連接詳細(xì)信息在電路旁邊給出。連接完成的硬件設(shè)置并上傳代碼。
程序:
//---------------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()
{
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--------------//
Open the Serial monitor you can see the voltage level at the X and Y axes
pins and the status of the Z axis i.e. push button as illustrated below.
These X, Y, Z axes values are used to interpret the position of the lever.
As you can see the values are from 0 to 1023.
That’s because Arduino has built in ADC converter which convert the voltage
0V - 5V to 0 to 1023 values.
You can witness from the serial monitor that when the lever is left
untouched the lever stays at mid position of both X and Y axes and shows half
value of 1023.
You can also see it is not exact half of the 1023 that’s because
manufacturing these joysticks never been perfect.
By now, you would have got some technical knowledge about joysticks.
Now let’s see how to control two servo motors using one joystick.
Circuit Diagram:
兩個(gè)伺服電機(jī)由一個(gè)操縱桿控制;當(dāng)您沿 X 軸移動(dòng)操縱桿時(shí),連接在引腳 #7 處的伺服器會(huì)根據(jù)操縱桿位置順時(shí)針和逆時(shí)針移動(dòng)。
如果將操縱桿水平保持在特定位置,也可以將伺服執(zhí)行器保持在某個(gè)位置。
與在引腳 #6 處連接的伺服電機(jī)類似,您可以沿 Y 軸移動(dòng)杠桿。
當(dāng)您沿 Z 軸按下杠桿時(shí),兩個(gè)電機(jī)將執(zhí)行 180 度掃描。
您可以將 arduino 連接到 9v 電池或計(jì)算機(jī)。如果將Arduino連接到計(jì)算機(jī),則可以打開串行監(jiān)視器并查看伺服執(zhí)行器的角度和電壓電平。
伺服電機(jī)控制程序:
//---------------Program Developed by R.Girish--------------//
#include《Servo.h》
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 《 check1 - threshold)
{
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 《 check2 - threshold)
{
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(“------------------------------------------”);
}
}
-
伺服電機(jī)
+關(guān)注
關(guān)注
85文章
2048瀏覽量
57875 -
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
187106 -
操縱桿
+關(guān)注
關(guān)注
0文章
69瀏覽量
8545
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論