該無線控制的機器人汽車使用手勢:手的傾斜/方向來向前、向后、向左或向右行駛。
說到機器人,手勢控制機器人是業余愛好者和學生在物理和實際項目中理解和實施微控制器知識的最常見的項目類型之一。其背后的概念很簡單:手掌的方向控制機器人汽車的運動。但如果你要問它是怎么做到的?那就得讓我們仔細分解一下。
為了更好地理解,我們將通過了解每個組件的角色和功能,然后將它們組合起來以實現所需的性能。
1. ADXL335(加速度計)
加速度計的功能很簡單:感知手腕的方向。加速度計測量加速度,包括重力加速度“g”。因此,我們可以使用加速度計通過測量 ADXL335 任何特定軸上的“g”分量來感知手腕的方向,如下圖所示:
由于手的傾斜,X 和/或 Y 軸的角度隨垂直方向發生變化,因此“g”加速度的分量也作用在它們上,這可以被測量并因此指示手的方向。
ADXL335 可以測量高達 3g 的加速度,并通過將其軸引腳連接到 Arduino 的模擬引腳來與 Arduino 接口。加速度計輸出與加速度成比例的電壓值。
在這個項目中,加速度計連接到 Arduino Nano 并附在手掌上。ADXL335 輸出電壓范圍為 0 到 Vcc(施加電壓通常為 3.3V),并由 Arduino 的模擬引腳讀取。因此對于用戶來說,我們得到一個范圍從 0 到 1024(10 位 ADC)的值。不同的方向為每個軸產生不同的模擬值,然后映射到不同的機器人運動。
加速度計的電路圖是:
了解 ADXL335 工作的測試代碼如下:
你可以運行這個程序來查看你的手掌和手腕向前、向后、向左和向右傾斜的值,這些值最終將用于控制機器人。
RF模塊的功能很簡單:將手腕Arduino Nano的命令數據傳輸到控制Arduino Uno的電機。RF 模塊使用 433hz 頻率的無線電波,因此命名為 RF-433。它們使用幅度調制來發送數據,但不會涉及太多技術細節并保持簡單,它們將用于向機器人傳輸命令,即:向前、向后、向右或向左移動。在沒有數據的情況下,靜止不動。它們的工作范圍可達 10 米。
現在要了解如何在我們的項目中實現射頻模塊,讓我們依次處理發射器和接收器電路。
發射器電路
發射器電路由兩部分組成:發射器RF和編碼器HT12E。發射器由一個數據引腳、一個天線、一個接地和電源組成。向發送器提供數據是HT12E編碼器的工作。編碼器由 4 個可以發送數據的數據引腳組成。我們將使用這 4 個數據引腳來表示四種運動,這些引腳上的高電平將分別表示四種運動之一,所有引腳上的低電平表示靜止。
電路圖如圖所示:
左側引腳(A0-A7)是地址引腳,定義了將交換數據的對(具有相同地址的發送器和接收器將僅共享數據)。我們將 A0-A7 設置為 LOW(接地)。
數據輸入引腳連接到 Arduino 數字引腳(在本項目中為 6 到 9),它們將輸出命令數據為:
數字引腳命令(高電平時)
9 前鋒
10 反向
11 左
12 右
我們將根據 ADXL335 的輸入將數字引腳寫入高電平以執行所需的運動。
接收電路
接收器電路與所示的發射器電路完全相似,但數據引腳不是作為 Arduino 的輸出,在這種情況下,它們將被讀取為輸入,以接收 Arduino Uno 的命令并根據需要運行電機:
為簡化起見,您可以在引腳 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 的模擬引腳來讀取接收器數據。最終的電路圖如下所示:
電機屏蔽處理與電機的連接。將 9V 電池連接到屏蔽的電源輸入端。
注意:我個人更喜歡將 2 甚至 3.9V 電池并聯到屏蔽電源輸入端,以提供足夠的電力來運行所有四個電機。我已將四個電機連接成一組 2(同一側電機并聯連接在一起,因此只需要電機點 3 和 4 即可運行)。
最終代碼
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);
}
發射器電路:
加速度計:
完整的全部模塊:
-
機器人
+關注
關注
212文章
29319瀏覽量
211070 -
無線控制
+關注
關注
0文章
97瀏覽量
20178 -
ADXL335
+關注
關注
1文章
15瀏覽量
10603
發布評論請先 登錄
加速度傳感器ADXL203和ADXL335
請問怎么將adxl335與PSoC接口
【Longan Nano申請】手勢控制云端互聯全息投影機器人
ADXL335三軸加速度計簡介
基于Arduino設計的手勢控制機器人
使用Arduino和PAJ7620手勢傳感器制作手勢控制機器人
ADXL335,pdf,Accelerometer
ADXL335小型低功耗三軸加速度計

ADXL335 小尺寸、低功耗、三軸±3G 加速度計

評論