本帖最后由 小恩GG 于 2021-4-19 15:37 编辑
基于ble的手势控制PPT 1 介绍两块开发板通过ble来传递控制信息,一块开发板连接PAJ7620,通过iic总线提供手势信息,另一块开发板使用ble和USB HID,ble用来接收数据,USBHID则模拟键盘输入从而控制ppt 图1 2 准备两块开发板QN908x,手势控制paj7620,IDE使用IAR,使用的例程temperature_sensor,以及temperature_collector,sdk版本是2.2.3
3代码3.1 temperature_sensor代码的编写 我们要实现iic读取手势信息以及将数据发送。 iic使用的引脚是PA6和PA7 将代码中的iic读写代码进行简单封装,创建i2c_operation.c和其对应的头文件。在里面实现iic初始化,以及读写寄存器函数
图2 读寄存器 图3 写寄存器
3.1.1 拥有这些函数以后开始编写手势识别的代码,首先添加两个空白文件paj7620.c和paj7620.h
选择bank寄存器区域函数 图4
唤醒paj7620读取设备状态函数 图5
初始化设备 图6
手势测试函数 图7
3.1.2准备好读取设备信息以后,在BleApp_Init函数中初始化iic和paj7620 图8
原则上我们需要为PAJ设备创建一个自定义的服务,但是我们节省一下,替换例程中的温度数据作为我们手势控制的数据。如果要创建自定义服务参考该链接。 custom profile
3.1.3创建一个定时器,这个定时器定时发送手势数据。 在temerature_sensor.c文件中, 定义定时器ID,statictmrTimerID_t dataTimerId; 分配定时器dataTimerId = TMR_AllocateTimer(); 定义定时器的回调函数。 图9 启动定时器当链接成功以后 图10 将低功耗关闭,#define cPWR_UsePowerDownMode 0 这样服务器端代码就完成编写。 3.2 temperature_collector代码编写 在这里最重要的是将USB HID移植进这里。我们使用的usb例程是usb键盘鼠标的例程。
3.2.1 把例程下的osa,usb文件夹加入工程目录,并且按照原例程的文件结构,将文件拷贝到对应文件夹。 图11 3.2.2 完成以后添加头文件目录 图12
同时在该选项卡里,添加两个宏定义 USB_STACK_FREERTOS_HEAP_SIZE=16384 USB_STACK_FREERTOS
3.2.3 usb例程本身时候main函数和初始化的我们需要进行修改,在composite.c文件中有main函数,我们做如图修改。 图13 它调用了APP_task,这个函数也做修改 图14 3.2.4找到hid_mouse.c,将USB_DeviceHidMouseAction函数注释掉 找到hid_keyboard.h,定义手势信息 图15 找到hid_keyboard.c函数,我们需要修改USB_DeviceHidKeyboardAction所要执行的任务。 改成如图 图16
其中还要实现如下函数,当检测上挥手势就播放上一张ppt,下挥就是下一张ppt,左挥退出ppt,向前则播放ppt 图17 这里面还引用了一个外部变量gesture_from_server,这个变量定义 在temperature_colloctor.c中,用来获取手势信息。
3.2.5完成以上以后,我们到BleApp_StateMachineHandler函数中,在case为mAppRunning_c中调用usb_main来初始化USB HID 图18 3.2.6 最后在BleApp_PrintTemperature中,将收到的数据放到gesture_from_server里 图19
|