0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用ADXL335实现手势控制机器人的设计

科技观察员 来源:hackster.io 作者:hackster.io 2022-05-07 17:33 次阅读

该无线控制的机器人汽车使用手势:手的倾斜/方向来向前、向后、向左或向右行驶。

说到机器人,手势控制机器人是业余爱好者和学生在物理和实际项目中理解和实施微控制器知识的最常见的项目类型之一。其背后的概念很简单:手掌的方向控制机器人汽车的运动。但如果你要问它是怎么做到的?那就得让我们仔细分解一下。

为了更好地理解,我们将通过了解每个组件的角色和功能,然后将它们组合起来以实现所需的性能。

1. ADXL335(加速度计)

加速度计的功能很简单:感知手腕的方向。加速度计测量加速度,包括重力加速度“g”。因此,我们可以使用加速度计通过测量 ADXL335 任何特定轴上的“g”分量来感知手腕的方向,如下图所示:

pYYBAGJ2PMCAT4zaAAQPc98DUbE171.png

由于手的倾斜,X 和/或 Y 轴的角度随垂直方向发生变化,因此“g”加速度的分量也作用在它们上,这可以被测量并因此指示手的方向。

ADXL335 可以测量高达 3g 的加速度,并通过将其轴引脚连接到 Arduino模拟引脚来与 Arduino 接口。加速度计输出与加速度成比例的电压值。

在这个项目中,加速度计连接到 Arduino Nano 并附在手掌上。ADXL335 输出电压范围为 0 到 Vcc(施加电压通常为 3.3V),并由 Arduino 的模拟引脚读取。因此对于用户来说,我们得到一个范围从 0 到 1024(10 位 ADC)的值。不同的方向为每个轴产生不同的模拟值,然后映射到不同的机器人运动。

加速度计的电路图是:

pYYBAGJ2PLyAGexOAAJsTRCEnwM667.png

了解 ADXL335 工作的测试代码如下:

pYYBAGJ2PLiAG9ByAADNNyHx_4k112.png

你可以运行这个程序来查看你的手掌和手腕向前、向后、向左和向右倾斜的值,这些值最终将用于控制机器人。

2. RF-433 发射器和接收器

RF模块的功能很简单:将手腕Arduino Nano的命令数据传输到控制Arduino Uno的电机。RF 模块使用 433hz 频率的无线电波,因此命名为 RF-433。它们使用幅度调制来发送数据,但不会涉及太多技术细节并保持简单,它们将用于向机器人传输命令,即:向前、向后、向右或向左移动。在没有数据的情况下,静止不动。它们的工作范围可达 10 米。

现在要了解如何在我们的项目中实现射频模块,让我们依次处理发射器和接收器电路。

发射器电路

发射器电路由两部分组成:发射器RF和编码器HT12E。发射器由一个数据引脚、一个天线、一个接地和电源组成。向发送器提供数据是HT12E编码器的工作。编码器由 4 个可以发送数据的数据引脚组成。我们将使用这 4 个数据引脚来表示四种运动,这些引脚上的高电平将分别表示四种运动之一,所有引脚上的低电平表示静止。

电路图如图所示:

pYYBAGJ2PLSAeJi0AAJoBVpwHAg607.png

左侧引脚(A0-A7)是地址引脚,定义了将交换数据的对(具有相同地址的发送器和接收器将仅共享数据)。我们将 A0-A7 设置为 LOW(接地)。

数据输入引脚连接到 Arduino 数字引脚(在本项目中为 6 到 9),它们将输出命令数据为:

数字引脚命令(高电平时)

9 前锋

10 反向

11 左

12 右

我们将根据 ADXL335 的输入将数字引脚写入高电平以执行所需的运动。

接收电路

接收器电路与所示的发射器电路完全相似,但数据引脚不是作为 Arduino 的输出,在这种情况下,它们将被读取为输入,以接收 Arduino Uno 的命令并根据需要运行电机:

pYYBAGJ2PK-ADbS8AAIj-Kuz-_8557.png

为简化起见,您可以在引脚 17 处将 LED 与 1K 电阻串联,而不是如图所示的复杂电路,以指示与发射器的正确连接。

3.电机护罩

由于 Adafruit 库 AFMotor 的可用性,电机护罩是最容易处理的部分,链接:- https://github.com/adafruit/Adafruit-Motor-Shield-library

下载并复制 Arduino 库文件夹中的库,以便能够将其包含在程序草图中。

AFMotor 库的示例如下所示:

#include
AF_DCMotor motor(4);
//Attach motor wires to point Motor 4 on shield
void setup()
{
Serial.begin(9600);
// set up Serial library at 9600 bps
Serial.println("Motor test!");
// turn on motor
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop()
{
uint8_t i;
Serial.print("tick");
motor.run(FORWARD);
for (i=0; i<255; i++) 
{
motor.setSpeed(i);
delay(10);
}
for (i=255; i!=0; i--)
{
motor.setSpeed(i);
delay(10);
}
Serial.print("tock");
motor.run(BACKWARD);
for (i=0; i<255; i++) {
motor.setSpeed(i);
delay(10);
}
for (i=255; i!=0; i--) {
motor.setSpeed(i);
delay(10);
}
Serial.print("tech");
motor.run(RELEASE);
delay(1000);

4.结合所有部分

最后也是最后一部分包括将上述所有部分组合在一起,形成一个完整的机器人,遵循手的命令!

由于电机屏蔽使用几乎所有的数字引脚,我们将使用 Arduino Uno 的模拟引脚来读取接收器数据。最终的电路图如下所示:

pYYBAGJ2PKiAZv_1AAGiLR1eVf4419.png

电机屏蔽处理与电机的连接。将 9V 电池连接到屏蔽的电源输入端。

注意:我个人更喜欢将 2 甚至 3.9V 电池并联到屏蔽电源输入端,以提供足够的电力来运行所有四个电机。我已将四个电机连接成一组 2(同一侧电机并联连接在一起,因此只需要电机点 3 和 4 即可运行)。

pYYBAGJ2PKSABYZ-AAN5EXyf5_M083.png

最终代码
Arduino Nano:

int x_axis = 0;
int y_axis = 0;
int forward = 9;
int backward = 10;
int right = 11;
int left = 12;
void setup()
{
pinMode(A0, INPUT); //X-Axis
pinMode(A3, OUTPUT); //Y-Axis
pinMode(forward, OUTPUT); //HIGH to move Forward
pinMode(backward, OUTPUT); //HIGH to move Backward
pinMode(right, OUTPUT); //HIGH to move Right
pinMode(left, OUTPUT); //HIGH to move Left
Serial.begin(9600);
}
void loop()
{
x_axis = analogRead(A0);
y_axis = analogRead(A3);
Serial.print(" X = ");
Serial.println(x_axis);
Serial.print(" Y = ");
Serial.println(y_axis);
if (y_axis >= 390)
{
Serial.println("Forward");
digitalWrite(forward, HIGH);
}
else
{
if (y_axis <= 310)
{
Serial.println("BACK");
digitalWrite(backward, HIGH);
}
else
{
if (x_axis >= 380)
{
Serial.println("RIGHT");
digitalWrite(right, HIGH);
}
else
{
if (x_axis <= 320)
{
Serial.println("LEFT");
digitalWrite(left, HIGH);
}
Serial.println(" ");
}
}
}
delay(200);
if (x_axis > 320 && x_axis < 380 && y_axis > 310 && y_axis < 390)
{
digitalWrite(forward, LOW);
digitalWrite(backward, LOW);
digitalWrite(right, LOW);
digitalWrite(left, LOW);
}
}

#include
AF_DCMotor motor_right(3);
AF_DCMotor motor_left(4);
int forward=0;
int backward=0;
int right=0;
int left=0;
void setup()
{
pinMode(A2,INPUT);
pinMode(A3,INPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
Serial.begin(9600);
motor_right.setSpeed(255);
motor_left.setSpeed(255);
motor_right.run(RELEASE);
motor_left.run(RELEASE);
}
void loop()
{
forward=digitalRead(A0);
backward=digitalRead(A1);
right=digitalRead(A2);
left=digitalRead(A3);
if(forward==HIGH)
{
motor_right.run(FORWARD);
motor_left.run(FORWARD);
Serial.println("Forward");
}
if(backward==HIGH)
{
motor_right.run(BACKWARD);
motor_left.run(BACKWARD);
Serial.println("Reverse");
}
if(right==HIGH)
{
motor_right.run(FORWARD);
motor_left.run(RELEASE);
Serial.println("RIGHT");
}
if(left==HIGH)
{
motor_right.run(RELEASE);
motor_left.run(FORWARD);
Serial.println("LEFT");
}
if(left==LOW&&right==LOW&&forward==LOW&&backward==LOW)
{
motor_right.run(RELEASE);
motor_left.run(RELEASE);
}
delay(100);
}

发射器电路:

pYYBAGJ2PJqANy-AAASARTr7zHc438.png

加速度计:

pYYBAGJ2PJWAKZkCAAbxzIXTWbo830.png

完整的全部模块:

poYBAGJ2PJCAUgYmAAYv8Uop1Qk663.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    206

    文章

    26974

    浏览量

    201297
  • 无线控制
    +关注

    关注

    0

    文章

    92

    浏览量

    19877
  • ADXL335
    +关注

    关注

    1

    文章

    15

    浏览量

    10462
收藏 人收藏

    评论

    相关推荐

    请问下ADXL335温度飘零是线性的吗?

    请问下ADXL335温度飘零是线性的么? 采集的时候发现X轴输出 在 20°的时候有转折点
    发表于 01-01 06:13

    求基于STM32的ADXL335的程序?

    求基于STM32的ADXL335的程序?
    发表于 12-28 21:28

    【mBot申请】双足行走机器人设计

    申请理由:大学时期所学习的各种课程总是理论性较强,为了是同学们能够亲身体会所学习各科的实用性的必要性,我们选择了设计制作双足行走机器人,在制作过程中让理论与实际结合,让同学们体会到控制理论,代码编写
    发表于 11-30 15:57

    加速度传感器ADXL203和ADXL335

    ADXL203和ADXL335除了双轴和三轴的区别还有其他什么区别呢?我最近要做一个倾斜测量的项目,手头有ADXL335,但是老师让用ADXL203,他们有什么大的区别吗?
    发表于 04-22 17:25

    请问ADXL335ADXL345精度对比误差大约多少?

    ADXL335模拟输出,精度140ug/Hz,这个很好理解,在15hz频率下的误差大约1.16mg,。但是ADXL345说4LSB/mg,这个是什么意思了?在15Hz全分辨率测量的时候误差大约多少呢?请懂行的专家指导指导,谢谢~~
    发表于 08-02 07:23

    请问怎么将adxl335与PSoC接口

    大家好,我是PSoC的新手。我想把一个ADXL335加速度计与PSoC3(CY8CKIT-030)接口。有人能建议我怎么做吗? 以上来自于百度翻译 以下为原文Hello guys, I am a
    发表于 01-24 07:51

    【Longan Nano申请】手势控制云端互联全息投影机器人

    项目名称:手势控制云端互联全息投影机器人试用计划:近年来,各大行业巨头在语音识别人工智能的竞争此起彼伏,如苹果公司的语音助手siri,在网络上一度掀起过热潮,现在还有天猫精灵等从智能手机中独立出来
    发表于 10-22 10:24

    ADXL335三轴加速度计简介

    STM32F030C8T6单片机与GY-61 ADXL335模块测角度ADXL335 是一款小尺寸、薄型、低功耗、完整的三轴加速度计,提供经过信号调理的电压输出,能以最小±3 g 的满量程范围测量
    发表于 12-02 06:47

    基于Arduino设计的手势控制机器人

    描述如何在家制作 DIY Arduino 手势控制机器人接收器(坦克)所需的零件:1) 机器人坦克底盘 2) Arduino Nano V3 3) L298N 电机驱动器 4) NRF
    发表于 06-20 09:21

    使用Arduino和PAJ7620手势传感器制作手势控制机器人

    使用Arduino和PAJ7620手势传感器制作手势控制机器人,简单程序即可实现。小小的传感器可以识别各种
    发表于 09-27 06:17

    ADXL335,pdf,Accelerometer

    The ADXL335 is a small, thin, low power, complete 3-axis accel-erometer with signal conditioned
    发表于 03-01 09:10 80次下载

    ADXL335 小尺寸、低功耗、三轴±3G 加速度计

    电子发烧友网为你提供(adi)ADXL335相关数据表资料,例如:ADXL335的引脚图、接线图、封装手册、中文资料、英文资料,ADXL335真值表,ADXL335管脚等资料,希望可以
    发表于 02-15 18:37
    <b class='flag-5'>ADXL335</b> 小尺寸、低功耗、三轴±3G 加速度计

    用于Arduino的ADXL335加速度计

    电子发烧友网站提供《用于Arduino的ADXL335加速度计.zip》资料免费下载
    发表于 07-04 11:25 0次下载
    用于Arduino的<b class='flag-5'>ADXL335</b>加速度计

    ADXL335三轴加速度计开源分享

    电子发烧友网站提供《ADXL335三轴加速度计开源分享.zip》资料免费下载
    发表于 12-12 11:45 5次下载
    <b class='flag-5'>ADXL335</b>三轴加速度计开源分享

    使用ADXL335三轴加速度计制作快速简便的设备

    电子发烧友网站提供《使用ADXL335三轴加速度计制作快速简便的设备.zip》资料免费下载
    发表于 06-09 09:50 1次下载
    使用<b class='flag-5'>ADXL335</b>三轴加速度计制作快速简便的设备