在本教程中,我们将使用FLEX传感器,Arduino Uno和伺服电机开发电路。该项目是一个伺服控制系统,其中伺服轴的位置由FLEX传感器的弯曲或弯曲或偏差确定。
让我们先谈谈伺服电机。伺服电机用于需要精确的轴运动或位置的场合。不建议将这些用于高速应用。这些建议用于低速,中等扭矩和精确的位置应用。这些马达用于机械手臂,飞行控制和控制系统。伺服电机用于自动售货机等嵌入式系统中。
伺服电机有不同的形状和尺寸。伺服电机主要有电线,一个用于正电压,另一个用于接地,最后一个用于位置设置。红线连接到电源,黑线连接到地,黄线连接到信号。
伺服电机是直流电机,位置控制系统和齿轮的组合。直流电机轴的位置由伺服中的控制电子设备根据SIGNAL引脚的PWM信号的占空比进行调整。
简单地说,控制电子设备通过控制直流电动机来调节轴的位置。有关轴位置的数据通过SIGNAL引脚发送。通过伺服电机的信号引脚以PWM信号的形式发送到控制器的位置数据。
PWM(脉冲宽度调制)信号的频率可以根据伺服电机的类型而变化。这里重要的是PWM信号的占空比。根据该占空比,控制电子装置可调节轴。为了使轴移动到9o时钟,开启率必须为1 / 18.ie。在18 ms信号中,“开启时间”为1毫秒,“关闭时间”为17毫秒。
要将轴移动到12o时钟,信号的接通时间必须为1.5ms,断开时间应为16.5ms。该比率由伺服系统中的控制系统解码,并根据该比率调整位置。
这里的PWM是使用ARDUINO UNO生成的。因此,到目前为止,我们可以通过更改Arduino Uno生成的PWM信号的占空比来控制伺服电机轴。UNO具有特殊功能,使我们能够提供SERVO的位置而不会干扰PWM信号。但是,了解PWM占空比-伺服位置关系很重要。我们将在描述中进一步讨论它。
现在让我们谈谈FLEX SENSOR。为了将FLEX传感器连接到ARDUINO UNO,我们将使用8位ADC(模数转换)功能来完成这项工作。FLEX传感器是一种传感器,当其形状改变时会改变其电阻。FLEX传感器的长度为2.2英寸或手指长度。如图所示。
挠曲传感器是一种传感器,当线性表面弯曲时会改变其电阻。因此,将其命名为柔性传感器。简单地说,传感器端子的电阻在弯曲时会增加。如下图所示。
除非我们能读懂它们,否则这种抵抗力的改变是没有用的。眼前的控制器只能读取电压的机会,为此,我们将使用分压器电路,这样我们就可以得出电阻随电压变化的变化。
分压器是一个电阻电路,如图所示。在这种电阻网络中,我们有一个恒定电阻和另一个可变电阻。如图所示,R1是恒定电阻,R2是充当电阻的FLEX传感器。
分支的中点被测量。随着R2的变化,我们在Vout有了变化。因此,有了这个电压,电压会随重量而变化。
现在要注意的重要一点是,控制器用于ADC转换的输入低至50µAmp。基于电阻的分压器的这种负载效应非常重要,因为从分压器的Vout汲取的电流会增加误差百分比,因此现在我们不必担心负载效应。
FLEX SENSOR弯曲时其电阻会发生变化。将此换能器连接到分压器电路后,通过换能器上的FLEX可以改变电压。该可变电压通过FED连接至ADC通道之一,我们将获得一个与FLEX相关的数字值。
我们将这个数字值与伺服位置进行匹配,这样我们就可以通过flex进行伺服控制。
组件
硬件: Arduino Uno , 电源(5v),1000 uF电容器,100nF电容器(3件),100KΩ电阻,SERVO MOTOR(SG 90),220Ω电阻,FLEX传感器。
软体: Atmel studio 6.2或每晚的Aurdino。
电路图和说明
下图显示了通过FLEX传感器控制伺服电机的电路图。
传感器两端的电压不是完全线性的。会很吵。为了滤除噪声,如图所示,在分压器电路中的每个电阻器之间放置电容器。
在这里,我们将采用分压器提供的电压(线性表示重量的电压),并将其馈入Arduino UNO的ADC通道之一。我们将为此使用A0。ADC初始化之后,我们将获得代表传感器弯曲的数字值。我们将采用该值并将其与伺服位置匹配。
为此,我们需要在程序中建立一些指令,我们将在下面详细讨论它们。
如图所示,ARDUINO有六个ADC通道。在这些情况下,它们中的任何一个或全部都可用作模拟电压的输入。UNO ADC的分辨率为10位(所以(0-(2 ^ 10)1023)中的整数值)。这意味着它将映射0到5伏之间的输入电压到0到1023之间的整数。 (5/1024 = 4.9mV)每单位。
在这里,我们将使用UNO的A0。
我们需要知道一些事情。
|
首先,UNO ADC通道的默认参考值为5V。这意味着我们可以在任何输入通道上为ADC转换提供5V的最大输入电压。由于某些传感器提供的电压范围为0-2.5V,使用5V基准电压时,我们获得的精度较低,因此我们有一条指令使我们能够更改该基准值。因此,对于更改参考值,我们有(“ analogReference();”),现在将其保留为。
默认情况下,我们获得的最大板载ADC分辨率为10位,可以使用指令(“ analogReadResolution(bits);”)更改此分辨率。在某些情况下,此分辨率更改可能会派上用场。现在,我们将其保留为。
现在,如果将上述条件设置为默认值,我们可以通过直接调用函数“ analogRead(pin);”从通道“ 0”的ADC读取值,这里的“ pin”代表我们连接模拟信号的引脚,在这种情况下将为“ A0”。
ADC的值可以取为整数,例如“ int SENSORVALUE = AnalogRead(A0); ”,则该指令会将ADC之后的值存储在整数“ SENSORVALUE”中。
现在让我们谈谈SERVO,UNO具有一项功能,使我们能够通过仅提供度值来控制伺服位置。假设我们希望伺服为30,则可以直接在程序中表示该值。SERVO头文件在内部负责所有占空比的计算。
#包括
伺服伺服 伺服。附件(3); 伺服写入(度); |
第一条语句表示用于控制SERVO MOTOR的头文件。
第二句话是命名伺服;我们将其保留为伺服器本身。
第三条陈述了伺服信号引脚的连接位置;这必须是PWM引脚。在这里,我们使用的是PIN3。
第四个语句以度为单位给出定位伺服电动机的命令。如果给定30,则伺服电动机旋转30度。
现在sg90可以从0-180度移动,我们得到ADC结果0-1024
因此ADC约为伺服位置的六倍。因此,通过将ADC结果除以6,我们将获得大约SERVO手位置。
这样,我们就可以将伺服位置值馈入伺服电机,该值与弯曲或弯曲成比例。当该挠性传感器安装在手套上时,我们可以通过手的移动来控制伺服位置。