第二部分的内容主要是IIC以及USB枚举知识的学习,其中通过IIC部分的学习实现PAJ7620模块的功能实现,USB枚举实现键盘设备的模拟。
先了解一下IIC协议,IIC协议是一种同步半双工通信协议,允许主机和从机之间的双向数据传输,但在同一时间只能有一个数据发送方和数据接收方,SDA线用于传输数据,SCL线用于提供时钟信号以确保所有设备同步进行数据交换,每个从设备都有唯一的设备地址,用于主机进行点到点通信。IIC设备地址为8位,其中高7位为设备地址,最低位为读写位(0表示写,1表示读)(也有11位地址的)。两条线采用开漏输出和上拉电阻的设计,以适应不同的外设电压和防止短路。
本次需要实现功能的PAJ7620模块的从机地址就是0x73.
USB枚举设计的内容实际上就很多了,各种描述符,这一部分我们再实操中进行体现,说实话,会用就可以了,以前曾经看过USB专门的学习书籍,太复杂了,不过现在通过STM32CubeMX实现就方便多了。配置USB:
键盘实际上就是一个外设,所以选择仅为设备,同时开启USB FS中断;
上面只是进行基础USB功能的配置,接下来还要进行使用USBx协议栈进行配置,同时开启实时系统THREADX,注意实时系统需要系统时钟配置为定时器,这里我们选择的是定时器7:
配置USBx:
可以看到可以直接选择为KEYBOARD,所以这方面的描述符都可以自动生成了;
在测试过程中需要不断修改USB的内存大小,过小会失败。
为了测试USB上报功能,我们引入按键进行展示,目前根据教程实现按键按键一次输入一次字母a,按键对应的是PC13:
可以在设置里面看到咱们模拟的键盘:
每次按键触发后可以写一个a;
目前来看USB HID功能正常,键盘输入正常;
号外:在USB枚举学习的过程中看到有网友通过printf打印进行串口打印的状态上报,这种方式对于调试的好处还是挺多的,不用再新建各种各样的数组或者指针了,所以我们在这里也加入printf打印功能,用于手势状态的串口上报。
接下来进行PAJ7620模块的功能实现:
由于开发板的接口都是2.54的插针,而购买的模块使用的是YH2.0的连接座,所以我们在网上购买了连接线,自己焊接也是没问题的.
PAJ7620凭借其集成的LED光源、环境光抑制滤波器、镜头和手势感测器,为各种嵌入式系统和设备提供了在黑暗或低光环境下可靠的手势识别和接近检测功能。PAJ7620的集成设计使得它成为了一个紧凑而功能强大的解决方案。内置的光源确保了传感器在各种光照条件下都能稳定工作,而环境光抑制滤波器则有效减少了外界光源的干扰,提高了手势识别的准确性。同时,镜头和手势感测器的紧密集成进一步提升了传感器的性能。
PAJ7620的手势识别功能是其核心功能之一。它支持多达9种手势类型,并能输出手势中断和结果。这使得设备能够响应用户的各种手势指令,从而提供更加直观、自然的交互体验。不过本接口没有中断引脚,如果使用需要另外焊接一下。
在工作原理方面,PAJ7620通过内部LED驱动器驱动红外LED向外发射红外信号。当传感器阵列在有效地距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取。这些数据会被存储在寄存器中,随后手势识别阵列会对这些原始数据进行识别处理,并将手势结果也存储到寄存器中。用户可以通过I2C接口读取这些原始数据和手势数据,从而实现与设备的交互。PAJ7620内部有两个BANK寄存器区域:BANK0和BANK1。这两个区域用于存储不同的配置参数和数据。要进入BANK0区域,需要向传感器的0XEF地址写入0X00;而要进入BANK1区域,则需要向同一地址写入0x01。这种设计使得用户可以灵活地配置传感器以满足不同的应用需求。
PAJ7620的驱动文件众多,可以根据具体的应用场景和需求,通过改写其中的一些文件以适应特定的硬件平台或操作系统,这里重点就是接口的适配。
配置I2C1,使用的引脚是PB10和PC8:
下面就是接口适配了,PAJ7620模块是通过模块地址以及寄存器地址进行数据访问的,这边需要注意一下。
模块手势效果如下: