这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【手势翻页笔开发贴】【三、实现手势控制PPT翻页】

共2条 1/1 1 跳转至

【手势翻页笔开发贴】【三、实现手势控制PPT翻页】

高工
2024-04-26 00:35:35     打赏

代码地址:nucleo-stm32h503rb

在上一篇开发贴,已经实现了手势检测。

进一步开发USB,实现手势控制PPT翻页。

STM32CUBE已经配置了一路USB:

至此USB底层的读写便已经被配置好了,接下来就是选择用哪一个USB协议栈。在STM32CUBE上可以选择,前提是需要勾选THREADX。

Snipaste_2024-04-25_23-27-00.png

目前代码里面有BabyOS, 再添加一个THREADX感觉乱七八糟的。还是将工程整的精简点,使用TinyUSB。

最新的TinyUSB mater分支的代码支持了STM32H5,岂不正好。

BabyOS增加第三方代码TinyUSB和USB软件模块,这里对代码不详细介绍,感兴趣的可以看源码:

Snipaste_2024-04-25_23-31-44.png

为了让TinyUSB使用更加简单,便封装了两个接口。下面看mian.c里面的实现:

逻辑比较单一:

任务A: 每500ms检测一次手势,当有left和right手势时,告诉任务B发送键盘信息HID_KEY_ARROW_LEFT和HID_KEY_ARROW_RIGHT

任务B:等着任务A的消息,然后发送键盘按键指令给电脑,用于给PPT翻页。

检测手势:

PT_THREAD(GestureTask)(struct pt *pt, void *arg) {
  uint16_t result = 0;
  uint8_t msg = 0;
  static uint8_t led_f = 0;
  static int bGestureFd = -1;
  B_TASK_INIT_BEGIN();
  bGestureFd = bOpen(bPAJ7620U2, BCORE_FLAG_R);
  B_TASK_INIT_END();
  PT_BEGIN(pt);
  while (1) {
    bTaskDelayMs(pt, 500);
    bHalGpioWritePin(B_HAL_GPIOA, B_HAL_PIN5, led_f);
    led_f = led_f ? 0 : 1;
    if (bRead(bGestureFd, (uint8_t *)&result, 2) == 2) {
      if (result & PAJ7620U2_READ_GESTURE_LEFT) {
        msg = 0;
        b_log("PAJ7620U2_READ_GESTURE_LEFT \r\n");
        bQueuePutNonblock(bMsgQId, &msg);
      } else if (result & PAJ7620U2_READ_GESTURE_RIGHT) {
        msg = 1;
        b_log("PAJ7620U2_READ_GESTURE_RIGHT \r\n");
        bQueuePutNonblock(bMsgQId, &msg);
      }
    }
  }
  PT_END(pt);
}

发送键盘消息:

extern tusb_desc_device_t const desc_device;
extern uint8_t *desc_hid_report_table[];
extern uint8_t *desc_config_table[];
PT_THREAD(USBTask)(struct pt *pt, void *arg) {
  uint8_t msg = 0;
  uint8_t keycode[6] = {0};
  B_TASK_INIT_BEGIN();
  bUSBInit((uint8_t *)&desc_device, &desc_config_table[0], 1, NULL, 0);
  bUSBHidSetReportDescrip(&desc_hid_report_table[0], 1);
  B_TASK_INIT_END();
  PT_BEGIN(pt);
  while (1) {
    if (bQueueGetCount(bMsgQId) > 0) {
      if (0 == bQueueGetNonblock(bMsgQId, &msg)) {
        keycode[0] = (msg == 0) ? HID_KEY_ARROW_LEFT : HID_KEY_ARROW_RIGHT;
        tud_hid_keyboard_report(0, 0, keycode);
        bTaskDelayMs(pt, 200);
        tud_hid_keyboard_report(0, 0, NULL);
        bTaskDelayMs(pt, 200);
      }
    }
    bTaskDelayMs(pt, 5);
  }
  PT_END(pt);
}

另外TinyUSB已经对USB的中断进行了处理,所以STM32CUBEMX生成的代码,USB中断服务函数需要屏蔽,然后增加如下代码:

void USB_DRD_FS_IRQHandler(void) { bHalItInvoke(B_HAL_IT_USB, 0, NULL); }


至此便可以上电体验:

Snipaste_2024-04-25_23-40-39.png


演示视频:

【通过手势控制PPT切换页面】 https://www.bilibili.com/video/BV19t421w7et/?share_source=copy_web&vd_source=358f4f81f2c6b5f79b885e03eb3b1bbc





关键词: 手势翻页笔     PAJ7620U2     STM32H5     B    

高工
2024-04-26 08:55:50     打赏
2楼

好迅速啊


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]