基于Hal库的paj7620u2手势识别

最近做一个小项目需要用到手势识别,写一篇博客记录一下。

为什么要写的,因为我的淘宝商家给我发的例程和参考博客都是arduino的,我只能一点点移植过来,中间调试遇见hal库的I2C卡死整的没脾气,给大家一个解决I2C卡死的方案。

PAJ7620的寄存器及结果所对应的手势

主要核心还是在于hal库的I2C的使用环节上,在此之前写一下PAJ7620的几个重要寄存器及地址。

#define PAJ7620U2_I2C_ADDRESS		0x73<<1 /*paj7620的i2c地址,左移一位后为左对齐七位地址*/
#define PAJ_BANK_SELECT			0xEF		/*寄存器页选择寄存器,Bank0=0x00,Bank1=0x01*/
#define PAJ_INT_FLAG1		    0x43		/*检测结果数据低八位数据所在地址*/
#define PAJ_INT_FLAG2			0x44		/*检测结果数据高八位数据所在地址*/

 读取结果的数值所对应的状态:

//Gesture detection interrupt flag
#define PAJ_UP				    0x01 
#define PAJ_DOWN			    0x02
#define PAJ_LEFT			    0x04 
#define PAJ_RIGHT			    0x08
#define PAJ_FORWARD			    0x10 
#define PAJ_BACKWARD		    0x20
#define PAJ_CLOCKWISE			0x40
#define PAJ_COUNT_CLOCKWISE		0x80
#define PAJ_WAVE				0x100

在使用传感器之前需要对PAJ7620进行初始化,需要单片机给芯片的寄存器写入一些数据,这些数据都是什么我无从得知,初始化矩阵来源于商家的程序中,详见Arduino Uno + PAJ7620U2 实现手势识别控制LED灯工作_arduino手势识别-CSDN博客

初始化矩阵为

uint8_t Init_Register_Array[][2] = {
	{0xEF, 0x00},
  {0x32, 0x29},
  {0x33, 0x01},
  {0x34, 0x00},
  {0x35, 0x01},
  {0x36, 0x00},
  {0x37, 0x07},
  {0x38, 0x17},
  {0x39, 0x06},
  {0x3A, 0x12},
  {0x3F, 0x00},
  {0x40, 0x02},
  {0x41, 0xFF},
  {0x42, 0x01},
  {0x46, 0x2D},
  {0x47, 0x0F},
  {0x48, 0x3C},
  {0x49, 0x00},
  {0x4A, 0x1E},
  {0x4B, 0x00},
  {0x4C, 0x20},
  {0x4D, 0x00},
  {0x4E, 0x1A},
  {0x4F, 0x14},
  {0x50, 0x00},
  {0x51, 0x10},
  {0x52, 0x00},
  {0x5C, 0x02},
  {0x5D, 0x00},
  {0x5E, 0x10},
  {0x5F, 0x3F},
  {0x60, 0x27},
  {0x61, 0x28},
  {0x62, 0x00},
  {0x63, 0x03},
  {0x64, 0xF7},
  {0x65, 0x03},
  {0x66, 0xD9},
  {0x67, 0x03},
  {0x68, 0x01},
  {0x69, 0xC8},
  {0x6A, 0x40},
  {0x6D, 0x04},
  {0x6E, 0x00},
  {0x6F, 0x00},
  {0x70, 0x80},
  {0x71, 0x00},
  {0x72, 0x00},
  {0x73, 0x00},
  {0x74, 0xF0},
  {0x75, 0x00},
  {0x80, 0x42},
  {0x81, 0x44},
  {0x82, 0x04},
  {0x83, 0x20},
  {0x84, 0x20},
  {0x85, 0x00},
  {0x86, 0x10},
  {0x87, 0x00},
  {0x88, 0x05},
  {0x89, 0x18},
  {0x8A, 0x10},
  {0x8B, 0x01},
  {0x8C, 0x37},
  {0x8D, 0x00},
  {0x8E, 0xF0},
  {0x8F, 0x81},
  {0x90, 0x06},
  {0x91, 0x06},
  {0x92, 0x1E},
  {0x93, 0x0D},
  {0x94, 0x0A},
  {0x95, 0x0A},
  {0x96, 0x0C},
  {0x97, 0x05},
  {0x98, 0x0A},
  {0x99, 0x41},
  {0x9A, 0x14},
  {0x9B, 0x0A},
  {0x9C, 0x3F},
  {0x9D, 0x33},
  {0x9E, 0xAE},
  {0x9F, 0xF9},
  {0xA0, 0x48},
  {0xA1, 0x13},
  {0xA2, 0x10},
  {0xA3, 0x08},
  {0xA4, 0x30},
  {0xA5, 0x19},
  {0xA6, 0x10},
  {0xA7, 0x08},
  {0xA8, 0x24},
  {0xA9, 0x04},
  {0xAA, 0x1E},
  {0xAB, 0x1E},
  {0xCC, 0x19},
  {0xCD, 0x0B},
  {0xCE, 0x13},
  {0xCF, 0x64},
  {0xD0, 0x21},
  {0xD1, 0x0F},
  {0xD2, 0x88},
  {0xE0, 0x01},
  {0xE1, 0x04},
  {0xE2, 0x41},
  {0xE3, 0xD6},
  {0xE4, 0x00},
  {0xE5, 0x0C},
  {0xE6, 0x0A},
  {0xE7, 0x00},
  {0xE8, 0x00},
  {0xE9, 0x00},
  {0xEE, 0x07},
  {0xEF, 0x01},
  {0x00, 0x1E},
  {0x01, 0x1E},
  {0x02, 0x0F},
  {0x03, 0x10},
  {0x04, 0x02},
  {0x05, 0x00},
  {0x06, 0xB0},
  {0x07, 0x04},
  {0x08, 0x0D},
  {0x09, 0x0E},
  {0x0A, 0x9C},
  {0x0B, 0x04},
  {0x0C, 0x05},
  {0x0D, 0x0F},
  {0x0E, 0x02},
  {0x0F, 0x12},
  {0x10, 0x02},
  {0x11, 0x02},
  {0x12, 0x00},
  {0x13, 0x01},
  {0x14, 0x05},
  {0x15, 0x07},
  {0x16, 0x05},
  {0x17, 0x07},
  {0x18, 0x01},
  {0x19, 0x04},
  {0x1A, 0x05},
  {0x1B, 0x0C},
  {0x1C, 0x2A},
  {0x1D, 0x01},
  {0x1E, 0x00},
  {0x21, 0x00},
  {0x22, 0x00},
  {0x23, 0x00},
  {0x25, 0x01},
  {0x26, 0x00},
  {0x27, 0x39},
  {0x28, 0x7F},
  {0x29, 0x08},
  {0x30, 0x03},
  {0x31, 0x00},
  {0x32, 0x1A},
  {0x33, 0x1A},
  {0x34, 0x07},
  {0x35, 0x07},
  {0x36, 0x01},
  {0x37, 0xFF},
  {0x38, 0x36},
  {0x39, 0x07},
  {0x3A, 0x00},
  {0x3E, 0xFF},
  {0x3F, 0x00},
  {0x40, 0x77},
  {0x41, 0x40},
  {0x42, 0x00},
  {0x43, 0x30},
  {0x44, 0xA0},
  {0x45, 0x5C},
  {0x46, 0x00},
  {0x47, 0x00},
  {0x48, 0x58},
  {0x4A, 0x1E},
  {0x4B, 0x1E},
  {0x4C, 0x00},
  {0x4D, 0x00},
  {0x4E, 0xA0},
  {0x4F, 0x80},
  {0x50, 0x00},
  {0x51, 0x00},
  {0x52, 0x00},
  {0x53, 0x00},
  {0x54, 0x00},
  {0x57, 0x80},
  {0x59, 0x10},
  {0x5A, 0x08},
  {0x5B, 0x94},
  {0x5C, 0xE8},
  {0x5D, 0x08},
  {0x5E, 0x3D},
  {0x5F, 0x99},
  {0x60, 0x45},
  {0x61, 0x40},
  {0x63, 0x2D},
  {0x64, 0x02},
  {0x65, 0x96},
  {0x66, 0x00},
  {0x67, 0x97},
  {0x68, 0x01},
  {0x69, 0xCD},
  {0x6A, 0x01},
  {0x6B, 0xB0},
  {0x6C, 0x04},
  {0x6D, 0x2C},
  {0x6E, 0x01},
  {0x6F, 0x32},
  {0x71, 0x00},
  {0x72, 0x01},
  {0x73, 0x35},
  {0x74, 0x00},
  {0x75, 0x33},
  {0x76, 0x31},
  {0x77, 0x01},
  {0x7C, 0x84},
  {0x7D, 0x03},
  {0x7E, 0x01},
};

hal库I2C的使用

主要使用以下两个函数

HAL_I2C_Mem_Read();
HAL_I2C_Mem_Write();

如何使用在这里不在介绍,在使用这两个函数时记得从机的地址为七位左对齐。

PAJ初始化函数与手势识别函数

//初始化,返回0则初始化失败
uint8_t PAJ7620U2_init(void)
{
	uint8_t i,State,n;
	State = 0;
	while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,0xef,I2C_MEMADD_SIZE_8BIT,&State,1,500)){HAL_Delay(5);printf("1");}

	for (i=0;i< 219 ;i++)
	{
		while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,Init_Register_Array[i][0],I2C_MEMADD_SIZE_8BIT,&Init_Register_Array[i][1],1,500)){HAL_Delay(5);printf("2");}
		HAL_Delay(5);
	}
	
	while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,0xef,I2C_MEMADD_SIZE_8BIT,&State,1,500)){HAL_Delay(5);printf("3");}
	HAL_Delay(5);
	
	while (HAL_OK != HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,0x32,I2C_MEMADD_SIZE_8BIT,&n,1,500)){HAL_Delay(5);printf("4");}
	if(n != 0x29)
	{
	return 0;
	}
	
	return 1;
}

//检测手势并输出
void gesture(void)
{	
	uint8_t Data[2]={0,0};
	uint16_t Gesture_Data;
	HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,PAJ_INT_FLAG1,I2C_MEMADD_SIZE_8BIT,&Data[0],1,500);
	HAL_Delay(5);

	HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,PAJ_INT_FLAG2,I2C_MEMADD_SIZE_8BIT,&Data[1],1,500);
	HAL_Delay(5);

	Gesture_Data= Data[1]<<8 | Data[0];
	printf("\n %x \r\n",Gesture_Data);
	if(Gesture_Data !=0)
	{	
	switch (Gesture_Data)
			{
				case PAJ_UP:			  			  printf("Up\r\n");				break;
				case PAJ_DOWN:							printf("Down\r\n");				break;
				case PAJ_LEFT:							printf("Left\r\n");				break;
				case PAJ_RIGHT:							printf("Right\r\n"); 			break;
				case PAJ_FORWARD:						printf("Forward\r\n");			break;
				case PAJ_BACKWARD:					printf("Backward\r\n"); 		break;
				case PAJ_CLOCKWISE:					printf("Clockwise\r\n"); 		break;
				case PAJ_COUNT_CLOCKWISE:		printf("AntiClockwise\r\n"); 	break;
				case PAJ_WAVE:							printf("Wave\r\n"); 			break;
				default: break;
			}
			Gesture_Data=0;
		}		
}

I2C卡死的野路子解决办法

之前看有博主说通过配置IO口翻转电平可以解决卡死问题,我凭感觉的直接调用MX_I2C1_Init();函数进行复位,使用之后不卡死了。

具体就是在每次调用gesture函数后调用该函数,立即对I2C进行初始化。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值