原文地址:https://circuitdigest.com/microcontroller-projects/accelerometer-based-hand-gesture-controlled-robot-using-arduino
使用Arduino的基于加速度计的手势控制机器人
经过**萨达姆** 2015年7月28日135
机器人在建筑,军事,医疗,制造等各个领域的自动化领域中都起着重要作用。在制造出一些基本的机器人(如直线跟随器机器人,计算机控制机器人等)之后,我们通过使用来开发了这种基于加速度计的手势控制机器人阿尔杜诺乌诺 在这个项目中,我们使用手势来驱动机器人。为此,我们使用了加速度计。
所需组件
- Arduino UNO
- 直流电动机
- 加速度计
- HT12D
- HT12E
- 射频对
- 马达驱动器L293D
- 9伏电池
- 电池接头
- USB电缆
- 机器人底盘
RF对:
手势控制的机器人是通过代替如按钮或操纵杆的任何其它方法的使用手控制。在这里,只需要动手就可以控制机器人。您的手中使用了一个包含射频发射器和加速度计的发射设备。这会将命令传输到机器人,以便它可以执行所需的任务,例如前进,后退,左转,右转和停止。所有这些任务将通过手势执行。
这里最重要的组件是加速度计。加速度计是具有+ -3g范围的3轴加速度测量设备。该器件是通过使用多晶硅表面传感器和信号调节电路来测量加速度而制成的。该设备的输出本质上是模拟的,并且与加速度成正比。当我们倾斜重力时,此设备会测量重力的静态加速度。并以运动或振动的形式给出结果。
根据adxl335的数据表,将多晶硅表面微加工结构放置在硅晶圆顶部。多晶硅弹簧将结构悬挂在晶片表面上方,并提供抵抗加速力的能力。结构的变形是使用差分电容器测量的,该差分电容器包括独立的固定板和连接到移动质量块上的板。固定板由180°异相方波驱动。加速度会使移动的质量发生偏转,并使差分电容器失衡,从而导致传感器输出的幅度与加速度成比例。然后使用相敏解调技术确定加速度的大小和方向。
加速度计的引脚说明
- Vcc 5伏电源应连接到此引脚。
- X-OUT此引脚在x方向上提供模拟输出
- Y-OUT该引脚在y方向上提供模拟输出
- Z-OUT此引脚在z方向上提供模拟输出
- GND地
- ST此引脚用于设置传感器的灵敏度
电路图和说明
手势控制机器人分为两个部分:
- 发射器部分
- 接收器部分
在发射器部分,使用了加速度计和RF发射器单元。正如我们已经讨论过的,加速度计提供模拟输出,因此在这里我们需要将该模拟数据转换为数字。为此,我们使用了4通道比较器电路来代替任何ADC。通过设置参考电压,我们得到一个数字信号,然后将该信号施加到HT12E编码器以对数据进行编码或将其转换为串行形式,然后使用RF发送器将该数据发送到环境中。
在接收器端,我们已经使用RF接收器接收数据,然后将其应用于HT12D解码器。该解码器IC将接收到的串行数据转换为并行数据,然后使用arduino读取。根据接收到的数据,我们使用两个直流电动机在前进,后退,左,右和停止方向上驱动机器人。
在职的
当我们将发射器放在手中时,手势控制的机器人会根据手的移动进行移动。当我们向前倾斜手时,机器人开始向前移动并继续向前移动,直到发出下一个命令为止。
当我们向后倾斜手时,机器人会改变其状态并开始向后移动,直到发出其他命令为止。
当我们将其向左侧倾斜时,机器人会左转直到下一个命令。
当我们向右倾斜手时,机器人将向右转。
对于停止机器人,我们保持稳定。
发射器部分的电路图
接收器部分的电路图
这个手势控制机器人的电路非常简单。如以上示意图所示,RF对用于通信并与arduino连接。电动机驱动器已连接到arduino以运行机器人。电机驱动器的输入引脚2、7、10和15分别连接到arduino数字引脚6、5、4和3。在这里,我们使用了两个直流电动机来驱动机器人,其中一个电动机连接在电动机驱动器3和6的输出引脚上,另一电动机连接在11和14上。一个9伏电池也用于为电动机驱动器供电。
程序说明
首先,在程序中我们定义了电机的输出引脚。
然后在设置过程中,我们给出了固定的指示。
之后,我们使用“ if语句”读取输入并执行相关操作。
该手势控制机器人总共有以下五个条件:
手的动作 | 手势输入Arduino | ||||
---|---|---|---|---|---|
边 | D3 | D2 | D1 | D0 | 方向 |
稳定的 | 0 | 0 | 0 | 0 | 停止 |
向右倾斜 | 0 | 0 | 0 | 1个 | 右转 |
向左倾斜 | 0 | 0 | 1个 | 0 | 左转 |
向后倾斜 | 1个 | 0 | 0 | 0 | 落后 |
倾斜前 | 0 | 1个 | 0 | 0 | 向前 |
我们已经根据上表条件编写了完整的程序。以下是完整的代码。
代码
#define FD 16
#define BD 17
#define LD 18
#define RD 19
#define m11 3
#define m12 4
#define m21 5
#define m22 6
void forward()
{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}
void backward()
{
digitalWrite(m11, LOW);
digitalWrite(m12, HIGH);
digitalWrite(m21, LOW);
digitalWrite(m22, HIGH);
}
void left()
{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}
void right()
{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}
void Stop()
{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}
void setup()
{
pinMode(FD, INPUT);
pinMode(BD, INPUT);
pinMode(LD, INPUT);
pinMode(RD, INPUT);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
}
void loop()
{
int temp1 = digitalRead(FD);
int temp2 = digitalRead(BD);
int temp3 = digitalRead(LD);
int temp4 = digitalRead(RD);
if (temp1 == 1 && temp2 == 0 && temp3 == 0 && temp4 == 0)
backward();
else if (temp1 == 0 && temp2 == 1 && temp3 == 0 && temp4 == 0)
forward();
else if (temp1 == 0 && temp2 == 0 && temp3 == 1 && temp4 == 0)
left();
else if (temp1 == 0 && temp2 == 0 && temp3 == 0 && temp4 == 1)
right();
else
Stop();
}