在这篇文章中,我们将学习如何控制使用操纵杆和Arduino的伺服电机。我们将看到概述关于操纵杆,它的脚,它的建设和工作。我们将从操纵杆,这将是用于控制伺服电机底座可以提取有用的数据。
介绍
这篇文章的座右铭不仅仅是控制伺服电机但是,学习如何使用操纵杆控制许多其他外围设备。
现在,让我们来看看操纵杆。
操纵杆是一种输入设备,它由一个可以在X轴和Y轴上向多个方向移动的杠杆组成。杠杆的运动用于控制电机或任何外围电子设备。
从遥控玩具到波音飞机,操纵杆都有类似的功能。此外,游戏和更小的摇杆在Z轴上有一个按钮,可以通过编程来执行许多有用的操作。
操纵杆的插图:
操纵杆通常是电子设备,所以我们需要使用电源。杠杆的移动在输出引脚处产生电压差。电压水平由微控制器处理以控制输出设备,如电机。
图中的操纵杆与PlayStation和Xbox的手柄类似。你不需要破坏这些控制器来挽救一个。这些模块在当地的电子商店和电子商务网站都可以买到。
现在让我们看看这个操纵杆的构造。
它有两个10千欧姆电位器定位成与弹簧,使得X和Y轴,则它返回到原来的位置时,从杆的用户释放力。它有一个推动ON按钮上Z轴。
它有5个引脚,5伏的Vcc,GND,变量X,变量Y,和SW(Z轴开关)。当我们施加电压,并留在原来的杆位置的操纵杆。X和Y引脚将产生所施加的电压的一半。
当我们移动杠杆的电压在X和Y输出引脚变化。现在,让我们几乎接口操纵杆Arduino的。
原理图:
引脚连接细节在电路旁边给出。连接完成的硬件设置并上传代码。
计划:
//--------------- 项目由R.Girish --------------//
INT X_AXIS = A0;
int Y_axis = A1;
int Z_axis = 2;
Int x = 0;
诠释Y = 0;
Int z = 0;
void setup()
{
Serial.begin (9600);
pinMode (X_axis、输入);
pinMode(Y_AXIS,INPUT);
pinMode (Z_axis、输入);
digitalWrite(Z_AXIS,HIGH);
}
无效循环()
{
X = analogRead(X_AXIS);
Y = analogRead(Y_AXIS);
z = digitalRead (Z_axis);
系列。print("X轴= ");
Serial.println(X);
Serial.print( “Y轴=”);
以(y);
Serial.print( “Z轴=”);
如果(z = =高)
{
Serial.println( “按钮没有按下”);
}
别的
{
Serial.println( “按下按钮”);
}
以 ("----------------------------");
延迟(500);
}
//--------------- 项目由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的可以连接到9 v电池或计算机。如果你把Arduino连接到电脑上,你可以打开串行监视器,看到伺服执行器的角度和电压水平。
伺服电机控制程序:
//--------------- 项目由R.Girish --------------//
# include < Servo.h >
伺服servo_X;
伺服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;
诠释Y = 0;
Int z = 0;
Int pos = 0;
INT CHECK1 = 0;
Int check2 = 0;
INT阈值= 10;
void setup()
{
Serial.begin (9600);
servo_X.attach (7);
servo_Y.attach(6);
pinMode (X_axis、输入);
pinMode(Y_AXIS,INPUT);
pinMode (Z_axis、输入);
digitalWrite(Z_AXIS,HIGH);
}
无效循环()
{
X = analogRead(X_AXIS);
Y = analogRead(Y_AXIS);
z = digitalRead (Z_axis);
如果(z = =低)
{
系列。print("Z轴状态= ");
Serial.println( “按下按钮”);
Serial.println( “扫伺服致动器”);
为(位置= 0; POS <= 180; POS + = 1)
{
servo_X.write (pos);
延迟(10);
}
为(位置= 180; POS> = 0; POS - = 1)
{
servo_X.write (pos);
延迟(15);
}
为(位置= 0; POS <= 180; POS + = 1)
{
servo_Y.write (pos);
延迟(10);
}
为(位置= 180; POS> = 0; POS - = 1)
{
servo_Y.write (pos);
延迟(15);
}
Serial.println( “完成!”);
}
If (x > check1 + threshold || x < check1 - threshold)
{
X_angleValue = map(x, 0, 1023, 0, 180);
servo_X.write (X_angleValue);
check1 = x;
系列。print("X轴电压电平= ");
Serial.println(X);
Serial.print( “X轴伺服电动机角度=”);
Serial.print(X_angleValue);
Serial.println( “度”);
Serial.println( “------------------------------------------”);
}
如果(Y> CHECK2 +阈||ý
Y_angleValue = map(y, 0, 1023, 0, 180);
servo_Y.write(Y_angleValue);
CHECK2 = Y;
Serial.print( “Y轴电压电平=”);
以(y);
系列。打印(“Y轴伺服电机角度=”);
Serial.print(Y_angleValue);
Serial.println( “度”);
Serial.println( “------------------------------------------”);
}
}
//--------------- 项目由R.Girish --------------//
如果你有关于这个项目的任何具体问题,请随时在评论部分来表达,你可能会收到一个快速回复。
嗨swagatam,有没有一个可以修改操纵杆到万向节?
嗨,miiebaka,我不确定,需要调查一下。
不应在2个伺服被连接到PWM引脚?
你好,
你可以连接,如果你想从这两个马达得到相同的臂力矩。
您无法连接,如果你想从两个电机独立控制手臂。
您可以连接伺服电机非PWM引脚也。
问候
日Thnx