![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
软件配置:keil5.38a 硬件:STM32H533主板,STM32H533拓展版,IIC模块:PAJ7620U2 一:模块资料介绍:PAJ7620U2 Gesture Sensor是一款基于PAJ7620U2的手势识别模块,可直接识别9种基本手势,支持I2C接口,兼容3.3V/5V电平。这里为了方式调试,我使用的是STM32硬件的IIC驱动代码,也加深了自己对IIC通讯的理解;(由于自己手头上没能找到I3C的设备,等以后找到了设备再回来测试I3C,或者是有小伙伴测试了I3C的话,麻烦告知一声) 模块资料: 电源电压 : 3.3V/5V 工作原理:光学数组式环境亮度传感检测 通讯接口:I²C 接口,400Khz(Max) 识别速度:240Hz 工作环境光:<100K Lux(抗灯光干扰) 有效探测距离:5~15cm 检测角度范围:60°~180° 手势识别种类:内置 9 个手势类型:(上、下、左、右、前、后、顺时针旋转、逆时针旋转、挥动) 功耗:3~10mA(待机功耗电流 15uA) PAJ7620U2传感器的工作原理 我们可以看到PAJ7620U2传感器内部自带 LED 驱动器(可发射红外线信号),内置有传感器感应阵列、目标信息提取阵列和手势识别阵列。另外,PAJ7620U2作为一种光学数组式传感器,其内置LED驱动器集成了环境光和光源抑制滤波器,模块基本不受环境光干扰。 红外LED手势识别原理:传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,采集到的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中。 根据 PAJ7620U2传感器数据手册,用户可通过I²C接口总线采集信号并迅速识别出UP、Down、Right、Left等9种常用手势。另外PAJ7620U2还提供内置的接近检测功能,用于检测物体的接近或离开。 二:学习,了解IIC通讯 2.1:硬件连接方式:I²C的两根线:SCL时钟线和SDA数据线。 SCL时钟线:是为整个通信过程提供了时钟信号 SDA数据线:在每一个周期里发送0或者1,用这些0和1传输数据 软件传输: 数据线SDA以时钟线SCL作为参照。 开始信号:当SCL为高电平时,SDA由高电平向低电平跳变时,开始传输数据。 结束信号:当SCL为高电平时,SDA由低电平向高电平跳变时,停止传输数据。 应答信号:接收数据的IC 在接收完8个bit的数据之后,返回应答ack指令,表示数据已被签收。 三:实际硬件连接 1脚 GND 供电负极 2脚 VCC 供电正极 这里我设计的是5V 3脚 SDA IIC的数据线 PB6 4脚 SCL IIC的时钟线 PB7 电路图: STM32cube的配置图: 然后配置好之后, 点击生成软件代码即可。 查看生成的IIC底层驱动是否正确: / 用户代码开始 0 / / 用户代码结束 0 / I2C_HandleTypeDef Hi2C1; / I2C1 初始化函数 / void MX_I2C1_Init(void) { / 用户代码开始 I2C1_Init 0 / / 用户代码结束 I2C1_Init 0 / / 用户代码开始 I2C1_Init 1 / / 用户代码结束 I2C1_Init 1 / Hi2C1 中。实例 = I2C1; Hi2C1 中。初始化计时 = 0x60808CD3; Hi2C1 中。Init.OwnAddress1 = 0; Hi2C1 中。Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; Hi2C1 中。Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; Hi2C1 中。Init.OwnAddress2 = 0; Hi2C1 中。Init.OwnAddress2Masks = I2C_OA2_NOMASK; Hi2C1 中。Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; Hi2C1 中。Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } /** 配置模拟滤波器 */ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { Error_Handler(); } /** 配置数字滤波器 */ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { Error_Handler(); } / 用户代码开始 I2C1_Init 2 / / 用户代码结束 I2C1_Init 2 / } void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(i2cHandle->实例==I2C1) { / 用户代码开始 I2C1_MspInit 0 / / 用户代码结束 I2C1_MspInit 0 / /** 初始化外设时钟 */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C1; PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2C1 GPIO配置 PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.模式=GPIO_MODE_AF_OD; GPIO_InitStruct.拉=GPIO_PULLUP; GPIO_InitStruct.速度=GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.备用 = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); / I2C1 时钟使能 / __HAL_RCC_I2C1_CLK_ENABLE(); / 用户代码开始 I2C1_MspInit 1 / / 用户代码结束 I2C1_MspInit 1 / } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) { if(i2cHandle->实例==I2C1) { / 用户代码开始 I2C1_MspDeInit 0 / / 用户代码结束 I2C1_MspDeInit 0 / / 外设时钟禁用 / __HAL_RCC_I2C1_CLK_DISABLE(); /**I2C1 GPIO配置 PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); / 用户代码开始 I2C1_MspDeInit 1 / / 用户代码结束 I2C1_MspDeInit 1 / } } 确保配置引脚与实际接线保持一致,这里我设置的IIC的通讯速率是100KHZ; 手势模块驱动函数如下:这里我封装到了一个c文件里面,方便再次移植; 主函数程序如下: uint8_t rxBuffer[9] ; int 接收指数 = 0 ; int Fredata = 10000 ; int Dutydata = 5 ; define VDDA_APPLI (3300U)/ 用户代码结束 0 / /**
*/ int main(void) { / 用户代码开始 1 / / 用户代码结束 1 / / 单片机配置--------------------------------------------------------/ / 重置所有外设,初始化 Flash 接口和 Systick。/ HAL_Init(); / 用户代码开始初始化 / / 用户代码结束初始化 / / 配置系统时钟 / SystemClock_Config(); / 用户代码开始 SysInit / / 用户代码结束 SysInit / / 初始化所有配置的外设 / MX_GPIO_Init(); MX_ICACHE_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_TIM2_Init(); MX_ADC1_Init(); MX_I2C1_Init(); / 用户代码开始 2 / HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1); printf("autor by congconggege\r\n"); HAL_Delay(1000); printf(“PAJ7620U2手势传感器测试程序 ...\r\n”); PAJ7620_Init(); printf(“PAJ7620U2手势传感器正常 \r\n”); / 用户代码结束 2 / / 无限循环 / / 用户代码开始时 / 而 (1) { / 用户代码结束时 / / 用户代码开始 3 / GetCurrentGesture();// HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); HAL_Delay(500); } / 用户代码结束 3 / } 实物图片如下: 试验效果:向上(Up)、向下(Dowm)、向左(Left)、向右(Right)、向前(Forward)、向后(Backward)、顺时针(Clockwise)、逆时针(Counterclockwise)、和挥动(Wave)。当识别到正确的手势,手势类型会打印在串口2,测试截图 |
【STM32H7S78-DK评测】XIP模板问题处理与电机控制
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题
【STM32H7S78-DK评测】开发板初识与工程模板创建
【STM32H7S78-DK评测】搭建基于ST官方VSCode扩展的STM32开发环境
【NUCLEO-H533RE评测】+点亮小灯
【NUCLEO H533RE评测分享】高性能和低成本双Buff加持的NUCLEO H533RE
【NUCLEO-H533RE评测】+09 低功耗测试
【NUCLEO-H533RE评测】+08 初识FreeRtos
【NUCLEO-H533RE评测】+06 ADC调试
【NUCLEO-H533RE评测】+05 调试PWM