使用Arduino的基于加速度计的手势控制机器人

原文地址:https://circuitdigest.com/microcontroller-projects/accelerometer-based-hand-gesture-controlled-robot-using-arduino

使用Arduino的基于加速度计的手势控制机器人

ARDUINO的

经过**萨达姆** 2015年7月28日135
在这里插入图片描述
机器人在建筑,军事,医疗,制造等各个领域的自动化领域中都起着重要作用。在制造出一些基本的机器人(如直线跟随器机器人计算机控制机器人等)之后,我们通过使用来开发了这种基于加速度计的手势控制机器人阿尔杜诺乌诺 在这个项目中,我们使用手势来驱动机器人。为此,我们使用了加速度计。

所需组件

  1. Arduino UNO
  2. 直流电动机
  3. 加速度计
  4. HT12D
  5. HT12E
  6. 射频对
  7. 马达驱动器L293D
  8. 9伏电池
  9. 电池接头
  10. USB电缆
  11. 机器人底盘

RF对:
在这里插入图片描述
手势控制的机器人是通过代替如按钮或操纵杆的任何其它方法的使用手控制。在这里,只需要动手就可以控制机器人。您的手中使用了一个包含射频发射器和加速度计的发射设备。这会将命令传输到机器人,以便它可以执行所需的任务,例如前进,后退,左转,右转和停止。所有这些任务将通过手势执行。

这里最重要的组件是加速度计。加速度计是具有+ -3g范围的3轴加速度测量设备。该器件是通过使用多晶硅表面传感器和信号调节电路来测量加速度而制成的。该设备的输出本质上是模拟的,并且与加速度成正比。当我们倾斜重力时,此设备会测量重力的静态加速度。并以运动或振动的形式给出结果。

根据adxl335数据表,将多晶硅表面微加工结构放置在硅晶圆顶部。多晶硅弹簧将结构悬挂在晶片表面上方,并提供抵抗加速力的能力。结构的变形是使用差分电容器测量的,该差分电容器包括独立的固定板和连接到移动质量块上的板。固定板由180°异相方波驱动。加速度会使移动的质量发生偏转,并使差分电容器失衡,从而导致传感器输出的幅度与加速度成比例。然后使用相敏解调技术确定加速度的大小和方向。
在这里插入图片描述
加速度计的引脚说明

  1. Vcc 5伏电源应连接到此引脚。
  2. X-OUT此引脚在x方向上提供模拟输出
  3. Y-OUT该引脚在y方向上提供模拟输出
  4. Z-OUT此引脚在z方向上提供模拟输出
  5. GND地
  6. ST此引脚用于设置传感器的灵敏度

电路图和说明

手势控制机器人分为两个部分:

  1. 发射器部分
  2. 接收器部分

在发射器部分,使用了加速度计和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
D3D2D1D0方向
稳定的0000停止
向右倾斜0001个右转
向左倾斜001个0左转
向后倾斜1个000落后
倾斜前01个00向前

我们已经根据上表条件编写了完整的程序。以下是完整的代码。

代码

#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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值