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

描述

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

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

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

1. ADXL335(加速度计)

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

ADXL335

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

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

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

加速度计的电路图是:

ADXL335

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

ADXL335

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

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

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

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

发射器电路

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

电路图如图所示:

ADXL335

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

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

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

9 前锋

10 反向

11 左

12 右

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

接收电路

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

ADXL335

为简化起见,您可以在引脚 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 的模拟引脚来读取接收器数据。最终的电路图如下所示:

ADXL335

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

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

ADXL335

最终代码
 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);
}

发射器电路:

ADXL335

加速度计:

ADXL335

完整的全部模块:

ADXL335

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分