LSM6DSV16X基于MLC智能笔动作识别(4)----中断获取智能笔状态

描述

概述

LSM6DSV16X 支持通过中断(INT)输出 MLC(机器学习核)识别的动作。具体来说,MLC 可以配置为在满足某些条件或机器学习分类结果发生变化时生成中断信号。 LSM6DSV16X 的机器学习核可以配置为在分类结果发生变化时生成中断,并且该中断信号可以路由到中断引脚(如 INT1 或 INT2)。系统可以在检测到动作时做出响应,而不需要持续轮询传感器,从而优化功耗和效率。

最近在弄ST的课程,需要样片的可以加群申请:615061293 。

智能笔

视频教学

[https://www.bilibili.com/video/BV1Kb4FeME9R/]

样品申请

[https://www.wjx.top/vm/OhcKxJk.aspx#]

源码下载

[https://download.csdn.net/download/qq_24312945/89843520]

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。

主控为STM32H503CB,陀螺仪为LSM6DSV16X,磁力计为LIS2MDL。

智能笔

开启INT中断

陀螺仪LSM6DSV16X的中断管脚接到了PA6,需要将PA6设置为中端口。

智能笔

智能笔

开启中断。

智能笔

参考驱动程序

[https://github.com/STMicroelectronics/lsm6dsv16x-pid/tree/main]

配置中断

MD1_CFG (5Eh) 寄存器用于将各种事件路由到 INT1 引脚。每个位代表不同的功能,通过设置这些位,你可以选择将哪些传感器事件输出到 INT1 引脚。下表详细描述了每个位的功能:
INT1_EMB_FUNC (bit 1):
● 用于将嵌入式功能事件(如机器学习或状态机的输出)路由到 INT1。

智能笔

mian.c中定义变量。

/* USER CODE BEGIN 0 */
uint8_t mlc_flag = 0;
/* USER CODE END 0 */

mian.c中开启中断。

// Enable interrupt for MLC on INT1 pin
  lsm6dsv16x_pin_int_route_t pin_int;
    lsm6dsv16x_pin_int1_route_get(&dev_ctx, &pin_int);
  pin_int.emb_func = PROPERTY_ENABLE;
  lsm6dsv16x_pin_int1_route_set(&dev_ctx, &pin_int);

在stm32h5xx_it.c中添加回调函数引用。

/* USER CODE BEGIN 0 */
extern void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);


/* USER CODE END 0 */
处理PB0外部中断线0(EXTI Line0)的中断。  

/**
  * @brief This function handles EXTI Line0 interrupt.
  */
void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */
    HAL_GPIO_EXTI_Callback(INT1_Pin);
  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(INT1_Pin);
  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */
}

在main.c中添加回调函数的定义,检查中断是否由 GPIO_PIN_0引脚触发。

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    if(GPIO_Pin == GPIO_PIN_0)
    {
        mlc_flag=1;
        }    
}
/* USER CODE END 4 */

主程序

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if(mlc_flag==1)
    {
        mlc_flag=0;
        lsm6dsv16x_mlc_handler();        
        if (event_catched != 0) 
        {

            printf("event_catched=%d",event_catched);
             // 握(0) 拍(1) 挥(2) 拍(3) 静(4) 止(5)
            switch(event_catched) 
            {
                    case 2:
                        event_catched = 0;

                        printf("闲置(Idle)rn");
                        break;
                    case 4:
                        event_catched = 0;

                        printf("书写(Writing)rn");
                        break;
                    case 8:
                        event_catched = 0;

                        printf("其他(other)rn");
                        break;
                    case 12:
                        event_catched = 0;

                        printf("静止(Steady)rn");
                        break;                    
                    default:break;
            }
            event_catched = 0;
        }        
    }    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

演示

静止状态如下。

智能笔

闲置状态如下,手抓笔静止。

智能笔

书写状态如下,移动笔进行识别判定。

智能笔

其他如下,笔倒置。

智能笔

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分