智能家居硬件小製作(含源碼)《手勢識別控制器》基於PAJ7620手勢模塊、L298N驅動板、arduino
介紹
手勢識別控制器,基於arduino、PAJ7620傳感器,可實現9種手勢識別,應用於製作各種智能硬件
控制電視、窗簾、門、計算機、手機、智能車、機器人等各種硬件
以下以控制電機爲例子
材料
- Arduino uno
- PAJ7620手勢模塊
- Base shield擴展板(可選),使接線簡單
- L298N驅動板
- 直流電機
- 杜邦線
PAJ7620手勢模塊👇
L298N驅動板👇
PAJ7620手勢模塊
參數
主板支持:Arduino UNO / Seeeduino / Arduino Mega2560
模塊支持9種手勢,如下
硬件連接
-
你可以通過連接Base Shield 將此模塊連接到 Base Shield 的 I2C 端口,如下
先把PAJ7620手勢模塊連接到 Base shield 的 I2C 端口上然後將 Base shield 連接到 Arduino UNO 上,即可 -
如果沒有 Base Shield ,您也可以通過跳線將PAJ7620手勢直接連接到 Arduino,方法如下
Arduino UNO | Base Shield | PAJ7620手勢模塊 |
---|---|---|
5V | I2C 端口 | VCC |
GND | I2C 端口 | GND |
SDA | I2C 端口 | SDA |
SCL | I2C 端口 | SCL |
Digit 2 | 未連接 | INT (Reserved pad) |
庫文件
爲了使用使用PAJ7620手勢模塊,我們需要引入一個庫文件
庫文件:PAJ7620
- 從上面鏈接將庫代碼的zip文件下載.
- 打開arduino IDE
- 點擊【項目】----->【加載庫】-----> 【添加.ZIP庫】
- 選擇剛剛下載的文件,打開即可
使用
官方的簡單演示
以下簡單的演示將向您展示一個非常簡單的應用:當您向上移動時,紅色的LED將被打開,反之紅色的LED將被關閉。
#include <Wire.h>
#include "paj7620.h"
void setup()
{
paj7620Init(); //初始化手勢傳感器芯片PAJ7620
}
void loop()
{
uint8_t data = 0; // Read Bank_0_Reg_0x43/0x44 for gesture result.
paj7620ReadReg(0x43, 1, &data); // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
if (data == GES_UP_FLAG) // When up gesture be detected,the variable 'data' will be set to GES_UP_FLAG.
digitalWrite(4, HIGH); // turn the LED on (HIGH is the voltage level)
if (data == GES_DOWN_FLAG) // When down gesture be detected,the variable 'data' will be set to GES_DOWN_FLAG.
digitalWrite(4, LOW); // turn the LED off by making the voltage LOW
您可以自己查看 .h 和 .cpp 文件,以查看所有可用的功能
其他硬件
關於其他硬件有需要可以查看我的其他博客
Arduino小白入門全解,學習筆記
有能力的小夥伴可以考慮自己加上顯示功能,我的lcd筆記如下
製作手勢識別控制器
接線
L298N驅動和直流電機接線方法參考我的博客
Arduino實踐詳細說明(三)L298N驅動直流電機
PAJ7620手勢接線方法如上述
這裏就不再囉嗦重複,有疑問可評論
源代碼
持續更新arduino 樹莓派 python linux c語言等等
接到有幫助的話 求點贊👍 求關注❤️ 求分享👥
有問題可以評論
點關注,不迷路
如果有任何錯誤,如何建議,請批評指教,不勝感激 !
/*手勢模塊,控制l298n驅動電機*/
#include <Wire.h>
#include "paj7620.h" //導入庫,並調用
#define GES_REACTION_TIME 500
#define GES_ENTRY_TIME 800
#define GES_QUIT_TIME 1000
#define IN1 3 //定義IN1爲3口
#define IN2 4 //定義IN2爲4口
#define ENA 10 //定義ENA爲10口
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(ENA,OUTPUT);
uint8_t error = 0;
Serial.begin(9600);
Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 9 gestures.");
error = paj7620Init(); //初始化手勢模塊
if (error)
{
Serial.print("INIT ERROR,CODE:");
Serial.println(error);
}
else
{
Serial.println("INIT OK");
}
Serial.println("Please input your gestures:\n");
}
void loop()
{
uint8_t data = 0, data1 = 0, error;
error = paj7620ReadReg(0x43, 1, &data);
{
switch (data)
{
case GES_RIGHT_FLAG:
{ delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if(data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
digitalWrite(IN1,LOW); //控制電機停下
digitalWrite(IN2,LOW);
analogWrite(ENA,255);
delay(GES_QUIT_TIME);}
else if(data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
digitalWrite(IN1,HIGH); //控制電機正轉
digitalWrite(IN2,LOW);
analogWrite(ENA,200); //控制電機轉速,超過150電機纔開始轉
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Right");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
}}
break;
case GES_LEFT_FLAG:
{ delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if(data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
delay(GES_QUIT_TIME);
}
else if(data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Left");
digitalWrite(IN1,LOW); //電機反轉
digitalWrite(IN2,HIGH);
analogWrite(ENA,200);
}}
break;
case GES_UP_FLAG:
{ delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if(data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
delay(GES_QUIT_TIME);
}
else if(data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Up");
}}
break;
case GES_DOWN_FLAG:
{ delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if(data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
delay(GES_QUIT_TIME);}
else if(data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Down");
}}
break;
case GES_FORWARD_FLAG:
{ Serial.println("Forward");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
delay(GES_QUIT_TIME);
}
break;
case GES_BACKWARD_FLAG :
{ Serial.println("Backward");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
delay(GES_QUIT_TIME);
}
break;
case GES_CLOCKWISE_FLAG:
{ Serial.println("Clockwise");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
}
break;
case GES_COUNT_CLOCKWISE_FLAG:
{ Serial.println("anti-clockwise");
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,200);
}
break;
default:
paj7620ReadReg(0x44, 1, &data1);
if (data1 == GES_WAVE_FLAG)
{
Serial.println("wave");
}
break;
}
}
delay(100);
}