电机控制
直播中

李桂英

7年用户 1307经验值
私信 关注
[文章]

如何开发一个使用力传感器、Arduino Uno和伺服电机的电路?

在本教程中,我们将开发一个使用力传感器、Arduino Uno
和伺服电机的电路。它将是一个伺服控制系统,其中伺服轴位置由力传感器上的重量决定。在进一步讨论之前,让我们先谈谈伺服器和其他组件。

伺服电机用于需要精确轴运动或位置的地方。这些不建议用于高速应用。这些建议用于低速、中等扭矩和精确位置应用。这些电机用于机械臂机器、飞行控制和控制系统。伺服电机也用于一些打印机和传真机。

伺服电机有不同的形状和尺寸。伺服电机将主要有电线,一个用于正电压,另一个用于接地,最后一个用于位置设置。红线连接到电源,黑线接地,黄线连接到信号。

伺服电机是直流电机、位置控制系统、齿轮的组合。直流电机轴的位置由伺服中的控制电子设备根据PWM信号的占空比SIGNAL引脚进行调整。简单地说,控制电子设备通过控制直流电机来调整轴位置。有关轴位置的数据通过SIGNAL引脚发送。控制器的位置数据应通过伺服电机的信号引脚以PWM信号的形式发送。

PWM(脉宽调制)信号的频率可能因伺服电机的类型而异。这里重要的是PWM信号的占空比。根据此负载配给,控制电子设备调整轴。

如下图所示,要使轴移动到 9 点钟,打开口粮必须为 1/18.ie。18ms 信号中的 1 毫秒“开启时间”和 17 毫秒“关机时间”。

用于伺服电机的PWM脉冲

对于要移动到 12 点时钟的轴,信号的导通时间必须为 1.5ms,关闭时间应为 16.5ms。

该比率由控制系统在伺服中解码,并据此调整位置。

这里的PWM是使用ARDUINO UNO生成的。

所以现在我们知道,我们可以通过改变UNO产生的PWM信号的占空比来控制伺服电机轴。

现在让我们谈谈力传感器或重量传感器。

为了将FORCE传感器与ARDUINO UNO连接,我们将在arduno uno中使用8位ADC(模数转换)功能。

FORCE传感器是一种传感器,当在表面上施加压力时,它会改变其电阻。力传感器有不同的尺寸和形状。

我们将使用更便宜的版本之一,因为我们在这里不需要太多的准确性。FSR400 是市场上最便宜的力传感器之一。FSR400的图片如下图所示。

现在需要注意的是,FSR 400沿长度敏感,力或重量应集中在传感器眼中间的迷宫上,如图所示。

如果在错误的时间施加力,设备可能会永久损坏。

要知道的另一件重要事情是,传感器可以驱动高范围的电流。因此,在安装时请记住驱动电流。此外,传感器的力极限为10牛顿。所以我们只能施加1Kg的重量。如果施加的重量大于1Kg,则传感器可能会显示一些偏差。如果增加超过3Kg,传感器可能会永久损坏。

力传感器

如前所述,该传感器用于感测压力的变化。因此,当将砝码施加在FORCE传感器的顶部时,电阻会发生巨大变化。FS400超重电阻如下图所示:

力传感器重量阻力图

如上图所示,传感器两个触点之间的电阻随重量减小或传感器两个触点之间的电导增加。

纯导体的电阻由下式给出:

公式

哪里

p- 导体电阻率

l= 导体长度

A= 导体面积。

现在考虑一个电阻为“R”的导体,如果在导体顶部施加一些压力,导体上的面积会减小,导体的长度会因压力而增加。因此,根据公式,导体的电阻应该增加,因为电阻R与面积成反比,也与长度l成正比。

因此,对于在压力或重量下的导体,导体的电阻增加。但与整体阻力相比,这种变化很小。对于相当大的变化,许多导体堆叠在一起。

这就是上图所示的力传感器内部发生的情况。仔细观察,可以看到传感器内部有许多线条。这些线中的每一条都代表一个导体。传感器的灵敏度以导体数为单位。

但在这种情况下,电阻会随着压力而减小,因为这里使用的材料不是纯导体。这里的FSR是坚固的聚合物厚膜(PTF)器件。所以这些不是纯导体材料器件。它们由一种材料组成,随着施加到传感器表面的力的增加,电阻会降低。

该材料显示的特性如FSR图所示。

除非我们能读懂它们,否则抵抗力的这种变化不会有任何好处。手头的控制器只能读取电压的机会,仅此而已,为此我们将使用分压器电路,这样我们就可以将电阻变化推导出为电压变化。

分压器是一种电阻电路,如图所示。在这个电阻网络中,我们有一个恒定电阻和其他可变电阻。如图所示,这里的R1是恒定电阻,R2是作为电阻的FORCE传感器。

以分支的中点进行测量。随着 R2 的变化,我们在 Vout 也有变化。因此,我们有一个随重量变化的电压。

分压器电路

现在需要注意的重要一点是,控制器用于ADC转换的输入低至50μA。基于电阻的分压器的负载效应很重要,因为从分压器的Vout汲取的电流会增加误差百分比的增加,现在我们不必担心负载效应。

现在,当力施加在力传感器上时,分压器端的电压会改变该引脚,因为连接到UNO的ADC通道,每当传感器上的力发生变化时,我们将从UNO的ADC获得不同的数字值。

该ADC数字值与PWM信号的占空比相匹配,因此我们可以根据施加在传感器上的力进行伺服位置控制。

组件

硬件: UNO,电源(5V),1000uF电容器,100nF电容器(3个),100KΩ电阻,伺服电机(SG
90),220Ω电阻,FSR400力传感器。

软件: 爱特梅尔工作室 6.2 或奥尔迪诺每晚。

电路图及工作说明

通过力传感器控制伺服电机的电路图如下图所示。

按重量划分的Arduino伺服电机控制的电路图(力传感器)

传感器两端的电压不是完全线性的;这将是一个嘈杂的。为了滤除噪声,分压器电路中的每个电阻上放置一个电容器,如图所示。

在这里,我们将采用分压器提供的电压(线性表示重量的电压)并将其馈入Arduino
Uno的ADC通道之一。转换后,我们将获取该数字值(代表重量)并将其与PWM值相关联,并将该PWM信号提供给伺服电机。

因此,对于重量,我们有一个PWM值,该值根据数字值改变其占空比。数字值越高,PWM的占空比越高。因此,对于更高的占空比PWM信号,伺服轴应按照介绍中提供的数字到达最右侧或最左侧。

如果重量较轻,我们将具有较低的PWM占空比,并且根据介绍中的数字,伺服应达到最右侧。

有了这个,我们有一个通过重量或力的伺服位置控制。

为此,我们需要在程序中建立一些指令,我们将在下面详细讨论它们。

ARDUINO有六个ADC通道,如图所示。其中任何一个或全部都可以用作模拟电压的输入。UNO ADC 的分辨率为 10 位(因此整数值来自
(0-(2^10) 1023))。这意味着它将 0 到 5 伏之间的输入电压映射到 0 到 1023 之间的整数值。因此,对于每个单位(5/1024=
4.9mV)。

在这里,我们将使用 UNO 的 A0。我们需要知道一些事情。

模拟读取(引脚);

模拟参考();

模拟读取分辨率(位);

首先,Arduino 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”中。

UNO的PWM可以在PCB板上符号为“~”的任何引脚上实现。UNO 中有六个 PWM 通道。我们将使用 PIN3 来实现我们的目的。

模拟写入(3,值);

从上述条件下,我们可以直接在相应的引脚上获得PWM信号。括号中的第一个参数用于选择PWM信号的引脚数。第二个参数用于写入占空比。

Arduino Uno 的 PWM 值可以从 0 更改为 255。最低为“0”,最高为“255”。以 255 作为占空比,我们将在 PIN3 处获得
5V。如果占空比为125,我们将在PIN3处获得2.5V。

现在让我们谈谈伺服电机控制,Arduino Uno 具有一项功能,使我们能够通过给出度值来控制伺服位置。假设我们希望伺服处于
30,我们可以直接表示程序中的值。SERVO 头文件在内部处理所有占空比计算。您可以在此处了解有关使用 arduino 进行伺服电机控制的更多信息。

现在 sg90 可以从 0-180 度移动,我们有 ADC 结果 0-1024。

因此,ADC大约是伺服位置的六倍。因此,通过将ADC结果除以6,我们将得到近似的伺服手位置。因此,我们有一个PWM信号,其占空比随重量或力线性变化。这是给伺服电机的,我们可以通过力传感器控制伺服电机。

#include <Servo.h> //header for controller servo

Servo servo; //keeping name of servo SERVO itself

int sensorvalue =0;

void setup()

{

pinMode(A0,INPUT); //force sensor value input

pinMode(3,OUTPUT); //PWM output to servo

servo.attach(3); //telling where signal pin of servo attached(must be a PWM pin)

}

void loop()

{

sensorvalue = analogRead(A0); //read analog value from sensor

servo.write(sensorvalue/6); //set servo position based on ADC result

}

更多回帖

发帖
×
20
完善资料,
赚取积分