ESP8266-Arduino编程实例-PAJ7620手势传感器驱动

PAJ7620手势传感器驱动

1、PAJ7620介绍

PAJ7620 将手势识别功能与通用 I2C 接口集成到单个芯片中,形成图像分析传感器系统。 可识别上、下、左、右、前、后、顺时针、逆时针、挥手等9种人手手势。

它还提供内置的接近检测,以感应接近或离开传感器的物体。 PAJ7620 在省电机制方面具有极大的灵活性,非常适合低功耗电池供电的 HMI 设备。

PAJ7620 封装成模块形式,内置红外 LED 和光学透镜,作为完整的传感器解决方案。

在这里插入图片描述

PAJ7620具有如下特性:

  • 手势模式:单目标检测
  • 图像阵列大小:60 x 60
  • 采样率:240fps
  • 操作距离:20cm
  • 输出类型:9 种手势:上、下、左、右、前进、后退、顺时针方向、逆时针方向和挥手)
  • 光标模式:是
  • 接口:I2C/SPI
  • 光源 : 集成红外 LED 与光学

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • PAJ7620传感器模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

传感器引脚 ESP8266开发板引脚
Vin 3.3v
Gnd Gnd
SCL D1
SDA D2

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次实例使用如下驱动库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <Wire.h>
#include "paj7620.h"

#define GES\_REACTION\_TIME 500 // You can adjust the reaction time according to the actual circumstance.
#define GES\_ENTRY\_TIME 800 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES\_ENTRY\_TIME(0.8s).
#define GES\_QUIT\_TIME 1000

void setup() {
uint8\_t error = 0;

Serial.begin(9600);
Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 9 gestures.");

error = paj7620Init(); // initialize Paj7620 registers
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); // Read Bank\_0\_Reg\_0x43/0x44 for gesture result.
if (!error) {
switch (data) { // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
case GES_RIGHT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG) {
Serial.println("Forward");
delay(GES_QUIT_TIME);
} else if (data == GES_BACKWARD_FLAG) {
Serial.println("Backward");
delay(GES_QUIT_TIME);
} else {
Serial.println("Right");
}
break;
case GES_LEFT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG) {
Serial.println("Forward");
delay(GES_QUIT_TIME);
} else if (data == GES_BACKWARD_FLAG) {
Serial.println("Backward");
delay(GES_QUIT_TIME);
} else {
Serial.println("Left");
}
break;
case GES_UP_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG) {
Serial.println("Forward");
delay(GES_QUIT_TIME);
} else if (data == GES_BACKWARD_FLAG) {
Serial.println("Backward");
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");
delay(GES_QUIT_TIME);
} else if (data == GES_BACKWARD_FLAG) {
Serial.println("Backward");
delay(GES_QUIT_TIME);
} else {
Serial.println("Down");
}
break;
case GES_FORWARD_FLAG:
Serial.println("Forward");
delay(GES_QUIT_TIME);
break;
case GES_BACKWARD_FLAG:
Serial.println("Backward");
delay(GES_QUIT_TIME);
break;
case GES_CLOCKWISE_FLAG:
Serial.println("Clockwise");
break;
case GES_COUNT_CLOCKWISE_FLAG:
Serial.println("anti-clockwise");
break;
default:
paj7620ReadReg(0x44, 1, &data1);
if (data1 == GES_WAVE_FLAG) {
Serial.println("wave");
}
break;
}
}
delay(100);
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Wire.h>
#include "paj7620.h"

void setup()
{
Serial.begin(9600);
paj7620Init();
}

void loop()
{
uint8\_t data = 0; // Read Bank\_0\_Reg\_0x43/0x44 for gesture result.

paj7620ReadReg(0x43, 1, &data);

if (data == GES_UP_FLAG)
{
Serial.println("GES\_UP\_FLAG !");
}

if (data == GES_DOWN_FLAG)
{
Serial.println("GES\_DOWN\_FLAG !");
}

if(data == GES_FORWARD_FLAG)
{
Serial.println("GES\_FORWARD\_FLAG !");
}

if(data == GES_BACKWARD_FLAG)
{
Serial.println("GES\_BACKWARD\_FLAG !");
}

if(data == GES_RIGHT_FLAG)
{
Serial.println("GES\_RIGHT\_FLAG !");
}

if(data ==GES_LEFT_FLAG)
{
Serial.println("GES\_LEFT\_FLAG !");
}

}

文章来源: https://iotsmart.blog.csdn.net/article/details/126636601