在这篇文章中,我们将学习如何使用操纵杆和Arduino来控制伺服电机。我们将看到有关操纵杆,其引脚,其建筑和工作的概述。我们将从Joy Stick中提取有用的数据,这将是用于控制伺服电机的基础。
介绍
这篇文章的座右铭是不只是为了控制伺服电机但是,要学习如何使用a操纵杆控制许多其他外围设备。
现在让我们看看操纵杆。
操纵杆是一种输入装置,它由一个杠杆组成,可以在X和Y轴的几个方向上移动。杠杆的运动用于控制电机或任何外围电子设备。
操纵杆使用从遥控玩具波音飞机和执行类似的功能。此外,游戏和更小的操纵杆在Z轴上有一个按钮,可以通过编程来执行许多有用的操作。
操纵杆的插图:
操纵杆一般都是电子设备,所以我们需要使用电源。杠杆的运动在输出引脚处产生电压差。电压水平由微控制器处理以控制输出设备,如电机。
图中的操纵杆与PlayStation和Xbox的手柄类似。你不需要破坏这些控制器来挽救一个。这些模块可以在当地的电子商店和电子商务网站轻松获得。
现在让我们看看这个操纵杆的构造。
它有两个10千欧姆电位计使用弹簧的X和Y轴定位,使得当用户从杠杆释放力时返回其原始位置。它在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;
int y = 0;
Int z = 0;
void setup()
{
Serial.begin (9600);
pinMode (X_axis、输入);
PinMode(Y_AXIS,输入);
pinMode (Z_axis、输入);
DigitalWrite(Z_Axis,高);
}
无效循环()
{
x = analogread(x_axis);
y = angogread(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;
int 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,输入);
pinMode (Z_axis、输入);
DigitalWrite(Z_Axis,高);
}
无效循环()
{
x = analogread(x_axis);
y = angogread(y_axis);
z = digitalRead (Z_axis);
如果(z = =低)
{
系列。print("Z轴状态= ");
serial.println(“按下按钮”);
系列。println(“扫地伺服执行机构”);
for(POS = 0; POS <= 180; POS + = 1)
{
servo_X.write (pos);
延迟(10);
}
for(POS = 180; POS> = 0; POS - = 1)
{
servo_X.write (pos);
延迟(15);
}
for(POS = 0; POS <= 180; POS + = 1)
{
servo_Y.write (pos);
延迟(10);
}
for(POS = 180; POS> = 0; POS - = 1)
{
servo_Y.write (pos);
延迟(15);
}
serial.println(“完成!!!”);
}
如果(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(“----------------------------------------);
}
if(y> check2 +阈值|| y
Y_angleValue = map(y, 0, 1023, 0, 180);
servo_y.write(y_anglevalue);
check2 = y;
serial.print(“Y轴电压电平=”);
以(y);
系列。print("Y轴伺服电机角度= ");
并同时Y_angleValue);
serial.println(“学位”);
serial.println(“----------------------------------------);
}
}
//--------------- 项目由R.Girish --------------//
如果您对此项目有任何具体问题,请随时在评论部分中表达,您可以获得快速回复。
Swagatam说
非常感谢
我说
不应该将2个伺服连接到PWM引脚?
GR说
你好,
你可以连接,如果你想让两个马达的臂力矩相等。
如果您希望从两个电机中控制独立手臂控制,则无法连接。
您也可以将伺服电机连接到非PWM引脚。
问候
Miebaka.说
嗨Swagatam,有没有人可以将操纵杆修改为万能?
赃物说
嗨,米巴卡,我不确定,需要调查一下…