目录

模块介绍:

基本部分:

引脚配置:

工作原理:

展示部分:

代码部分展示(在正点的基础上加了一个读手势去控制舵机):

视频展示:

模块介绍:

基本部分:

手势模块搭载的芯片是PAJ7620,无论是正点原子的还是别的手势模块的底层是一致的,甚至代码也是通用的。

芯片内部集成了光学数组式传感器,以使复杂的手势和光标模式输出,自带九种手势识别,支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,有效探测距离为5-15cm;也可以检测物体的距离和大小

原理图(正点的):

引脚配置:

VCC-GND:3.3V到5V

SCL-SDA:IIC接口

(额外)正点的模块是多两个个INT和NC的引脚:NT是中断引脚,NC是未连接引脚。NC没用.主要是INT,INT是中断引脚,或者相当于手势识别模块的输出引脚,NT引脚连接到外部微控制器的中断输入引脚(例如Arduino的数字引脚),用于通知微控制器检测到手势。当检测到手势时,PAJ7620芯片会将基于手势识别的控制信号转换成一个电平,从INT引脚输出,通过这个引脚,可以实现手势识别后的外部设备控制。

工作原理:

手势识别模块的原理:通过红外线传感器读取手部的动作信息来识别手势,然后将手势信息转化为电信号输出,通过电路接口给连向的设备控制指令。

具体来说,芯片内置有一个红外线LED和一个接收电路。红外线LED发射一束红外线,当手部移动或进行手势动作时,红外线会被反射回来。接收电路接收反射回来的红外线,并将其转化为电信号。这些信号经过处理后,可以识别手势,然后转化为符合IIC协议的电信号输出到电路接口,用于操控外部设备。

模块展示:

 

 注意:图三,凹进去的地方在上方,才是正确的摆放位置,如图三的方位就是正确的

展示部分:

代码部分展示(在正点的基础上加了一个读手势去控制舵机):

//手势识别测试

void Gesrure_test(void)

{

u8 i;

u8 status;

u8 key;

Servo_Init();

u8 data[2]={0x00};

u16 gesture_data;

u8 ledflash=0;

paj7620u2_selectBank(BANK0);//进入BANK0

for(i=0;i

{

GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手势识别模式初始化

}

paj7620u2_selectBank(BANK0);//切换回BANK0

i=0;

POINT_COLOR=BLUE;//设置字体为蓝色

LCD_Fill(30,170,300,300,WHITE);

LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");

LCD_ShowString(30,210,200,16,16,"Gesrure test");

POINT_COLOR=RED;//设置字体为蓝色

while(1)

{

key = KEY_Scan(0);

if(key==WKUP_PRES)

{

GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//关闭手势识别中断输出

GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);

break;

}

status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态

if(!status)

{

gesture_data =(u16)data[1]<<8 | data[0];

if(gesture_data)

{

switch(gesture_data)

{

case GES_UP: LCD_ShowString(110,250,200,16,24,"UP ");

printf("Up\r\n"); ledflash=1; break; //向上

case GES_DOWM: LCD_ShowString(100,250,200,16,24,"Dowm ");

printf("Dowm\r\n"); ledflash=1; break; //向下

case GES_LEFT: LCD_ShowString(100,250,200,16,24,"Left ");

printf("Left\r\n"); ledflash=1; break; //向左

case GES_RIGHT: LCD_ShowString(100,250,200,16,24,"Right ");

printf("Right\r\n"); ledflash=1; break; //向右

case GES_FORWARD: LCD_ShowString(80,250,200,16,24,"Forward ");

printf("Forward\r\n"); ledflash=1; break; //向前

case GES_BACKWARD: LCD_ShowString(80,250,200,16,24,"Backward ");

printf("Backward\r\n"); ledflash=1; break; //向后

case GES_CLOCKWISE: LCD_ShowString(70,250,200,16,24,"Clockwise ");

printf("Clockwise\r\n"); Angle += 30; ledflash=1; break; //顺时针

case GES_COUNT_CLOCKWISE: LCD_ShowString(50,250,200,16,24,"AntiClockwise");

printf("AntiClockwise\r\n");Angle -= 30; ledflash=1; break; //逆时针

case GES_WAVE: LCD_ShowString(100,250,200,16,24,"Wave ");

printf("Wave\r\n"); ledflash=1; break; //挥动

default: ledflash=0; break;

}

if (Angle > 180)

{

Angle = 0;

}

if (Angle < 0)

{

Angle = 180;

}

Servo_SetAngle(Angle);

if(ledflash)//DS1闪烁

{

LED1=0;delay_ms(80);LED1=1;delay_ms(80);

LED1=0;delay_ms(80);LED1=1;delay_ms(80);

delay_ms(300);

LCD_ShowString(40,250,200,16,24," ");

ledflash=0;

}

}

}

delay_ms(50);

i++;

if(i==5)

{

LED0=!LED0;//提示系统正在运行

i=0;

}

}

}

视频展示:

VID_20230506_194518

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: