該無線控制的機(jī)器人汽車使用手勢:手的傾斜/方向來向前、向后、向左或向右行駛。
說到機(jī)器人,手勢控制機(jī)器人是業(yè)余愛好者和學(xué)生在物理和實(shí)際項(xiàng)目中理解和實(shí)施微控制器知識的最常見的項(xiàng)目類型之一。其背后的概念很簡單:手掌的方向控制機(jī)器人汽車的運(yùn)動(dòng)。但如果你要問它是怎么做到的?那就得讓我們仔細(xì)分解一下。
為了更好地理解,我們將通過了解每個(gè)組件的角色和功能,然后將它們組合起來以實(shí)現(xiàn)所需的性能。
1. ADXL335(加速度計(jì))
加速度計(jì)的功能很簡單:感知手腕的方向。加速度計(jì)測量加速度,包括重力加速度“g”。因此,我們可以使用加速度計(jì)通過測量 ADXL335 任何特定軸上的“g”分量來感知手腕的方向,如下圖所示:
由于手的傾斜,X 和/或 Y 軸的角度隨垂直方向發(fā)生變化,因此“g”加速度的分量也作用在它們上,這可以被測量并因此指示手的方向。
ADXL335 可以測量高達(dá) 3g 的加速度,并通過將其軸引腳連接到 Arduino 的模擬引腳來與 Arduino 接口。加速度計(jì)輸出與加速度成比例的電壓值。
在這個(gè)項(xiàng)目中,加速度計(jì)連接到 Arduino Nano 并附在手掌上。ADXL335 輸出電壓范圍為 0 到 Vcc(施加電壓通常為 3.3V),并由 Arduino 的模擬引腳讀取。因此對于用戶來說,我們得到一個(gè)范圍從 0 到 1024(10 位 ADC)的值。不同的方向?yàn)槊總€(gè)軸產(chǎn)生不同的模擬值,然后映射到不同的機(jī)器人運(yùn)動(dòng)。
加速度計(jì)的電路圖是:
了解 ADXL335 工作的測試代碼如下:
你可以運(yùn)行這個(gè)程序來查看你的手掌和手腕向前、向后、向左和向右傾斜的值,這些值最終將用于控制機(jī)器人。
RF模塊的功能很簡單:將手腕Arduino Nano的命令數(shù)據(jù)傳輸?shù)娇刂艫rduino Uno的電機(jī)。RF 模塊使用 433hz 頻率的無線電波,因此命名為 RF-433。它們使用幅度調(diào)制來發(fā)送數(shù)據(jù),但不會(huì)涉及太多技術(shù)細(xì)節(jié)并保持簡單,它們將用于向機(jī)器人傳輸命令,即:向前、向后、向右或向左移動(dòng)。在沒有數(shù)據(jù)的情況下,靜止不動(dòng)。它們的工作范圍可達(dá) 10 米。
現(xiàn)在要了解如何在我們的項(xiàng)目中實(shí)現(xiàn)射頻模塊,讓我們依次處理發(fā)射器和接收器電路。
發(fā)射器電路
發(fā)射器電路由兩部分組成:發(fā)射器RF和編碼器HT12E。發(fā)射器由一個(gè)數(shù)據(jù)引腳、一個(gè)天線、一個(gè)接地和電源組成。向發(fā)送器提供數(shù)據(jù)是HT12E編碼器的工作。編碼器由 4 個(gè)可以發(fā)送數(shù)據(jù)的數(shù)據(jù)引腳組成。我們將使用這 4 個(gè)數(shù)據(jù)引腳來表示四種運(yùn)動(dòng),這些引腳上的高電平將分別表示四種運(yùn)動(dòng)之一,所有引腳上的低電平表示靜止。
電路圖如圖所示:
左側(cè)引腳(A0-A7)是地址引腳,定義了將交換數(shù)據(jù)的對(具有相同地址的發(fā)送器和接收器將僅共享數(shù)據(jù))。我們將 A0-A7 設(shè)置為 LOW(接地)。
數(shù)據(jù)輸入引腳連接到 Arduino 數(shù)字引腳(在本項(xiàng)目中為 6 到 9),它們將輸出命令數(shù)據(jù)為:
數(shù)字引腳命令(高電平時(shí))
9 前鋒
10 反向
11 左
12 右
我們將根據(jù) ADXL335 的輸入將數(shù)字引腳寫入高電平以執(zhí)行所需的運(yùn)動(dòng)。
接收電路
接收器電路與所示的發(fā)射器電路完全相似,但數(shù)據(jù)引腳不是作為 Arduino 的輸出,在這種情況下,它們將被讀取為輸入,以接收 Arduino Uno 的命令并根據(jù)需要運(yùn)行電機(jī):
為簡化起見,您可以在引腳 17 處將 LED 與 1K 電阻串聯(lián),而不是如圖所示的復(fù)雜電路,以指示與發(fā)射器的正確連接。
3.電機(jī)護(hù)罩
由于 Adafruit 庫 AFMotor 的可用性,電機(jī)護(hù)罩是最容易處理的部分,鏈接:- https://github.com/adafruit/Adafruit-Motor-Shield-library
下載并復(fù)制 Arduino 庫文件夾中的庫,以便能夠?qū)⑵浒诔绦虿輬D中。
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.結(jié)合所有部分
最后也是最后一部分包括將上述所有部分組合在一起,形成一個(gè)完整的機(jī)器人,遵循手的命令!
由于電機(jī)屏蔽使用幾乎所有的數(shù)字引腳,我們將使用 Arduino Uno 的模擬引腳來讀取接收器數(shù)據(jù)。最終的電路圖如下所示:
電機(jī)屏蔽處理與電機(jī)的連接。將 9V 電池連接到屏蔽的電源輸入端。
注意:我個(gè)人更喜歡將 2 甚至 3.9V 電池并聯(lián)到屏蔽電源輸入端,以提供足夠的電力來運(yùn)行所有四個(gè)電機(jī)。我已將四個(gè)電機(jī)連接成一組 2(同一側(cè)電機(jī)并聯(lián)連接在一起,因此只需要電機(jī)點(diǎn) 3 和 4 即可運(yùn)行)。
最終代碼
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);
}
發(fā)射器電路:
加速度計(jì):
完整的全部模塊:
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28379瀏覽量
206912 -
無線控制
+關(guān)注
關(guān)注
0文章
96瀏覽量
19971 -
ADXL335
+關(guān)注
關(guān)注
1文章
15瀏覽量
10510
發(fā)布評論請先 登錄
相關(guān)推薦
評論