基于PAJ7620和STM32手势识别应用案例

发布者:RadiantDreams最新更新时间:2024-03-22 来源: elecfans关键字:STM32  手势识别 手机看文章 扫描二维码
随时随地手机看文章

1.简介

 手势识别是计算机科学和语言技术中的一个主题,目的是通过数学算法来识别人类手势。 手势可以源自任何身体运动或状态,但通常源自面部或手。 本领域中的当前焦点包括来自面部和手势识别的情感识别。 用户可以使用简单的手势来控制或与设备交互,而无需接触他们。姿势,步态和人类行为的识别也是手势识别技术的主题。手势识别可以被视为计算机理解人体语言的方式,从而在机器和人之间搭建比原始文本用户界面或甚至GUI(图形用户界面)更丰富的桥梁。


手势识别使人们能够与机器进行通信,并且无需任何机械设备即可自然交互。 使用手势识别的概念,可以将手指指向计算机屏幕,使得光标将相应地移动。 这可能使常规输入设备(如鼠标,键盘甚至触摸屏)变得冗余。越来越多的电子设备都在使用手势识别功能。顾名思义,手势识别旨在识别人类的物理运动或“手势”。例如,在设备前面以特定模式挥动您的手可能会告诉它启动特定的应用程序,诸如此类的手势识别经常出现在智能手机和平板电脑中。


手势识别被分类为一种非接触式用户界面(TUI)。与触摸屏设备不同,TUI设备无需触摸即可控制。像Google Home和Amazon Alexa这样的语音控制智能扬声器是TUI的主要例子。

手势识别也打开了通向输入可能性的全新世界的大门。用户可以尝试其他基于手势的输入形式,而不是仅限于传统的输入形式。有些设备甚至允许用户设置自己的手势。

除智能手机和平板电脑外,手机识别还可用于汽车信息娱乐中心、视频游戏控制台、人机界面等。最重要的是,手势识别技术正变得越来越流行,并且没有任何迹象表明它会很快放慢速度。

2.PAJ7620介绍

PAJ-7620U2是由原相科技公司开发的一款手势识别芯片, 内集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。

⚫可直接识别 9 种基本手势,支持手势中断输出

⚫ 内置红外 LED 和光学镜头,能在低光和黑暗环境下工作

⚫ 支持 I2C 接口通信,仅需两根信号脚即可控制

⚫ 板载电平转换电路,可兼容 3.3V/5V 的逻辑电平

poYBAGKsPrKATaDzAAK_vikK3Ro138.png#pic_center

2.1 通讯方式

  PAJ7620使用IIC通信接口可达400KHz通信速率。
  功能模块框图如下所示:

在这里插入图片描述

其中, I2C_SCL 和 I2C_SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制PAJ7620,在上述框图可以看到,该芯片内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。 芯片工作时通过内部 LED 驱动器,驱动红外 LED向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据会存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。

2.3 硬件驱动

  1.打开STM32CubeMX软件,配置手势识别引脚PB6(IIC_SCL)、PB7(IIC_SDA)。

在这里插入图片描述

2.设置引脚模式为推挽输出模式,初始化电平为高电平。

在这里插入图片描述

3.软件实现

  1.通过手势实现时间切换、日期切换等;
  2.利用手势实现LED控制、蜂鸣器控制;
  3.实时时间校准,可通过串口校时;


3.1 串口校时

  通过自定义串口协议,通过串口调试助手获取PC端时间,完成RTC时间校准;发送数据格式为:*20220617121220。

  以 *作为起始标志,4字节年+2字节月+2字节日+2字节时+2字节分+2字节秒,字符串方式接收数据处理。


  if(usart1_flag)

  {

    printf('%srn',usart1_buff_rx);

    if(usart1_buff_rx[0]== '*')

    {

      DateToUpdate.Year=(usart1_buff_rx[3]-'0')*10+(usart1_buff_rx[4]-'0')*1;//年

      DateToUpdate.Month=(usart1_buff_rx[5]-'0')*10+(usart1_buff_rx[6]-'0')*1;//月

      DateToUpdate.Date=(usart1_buff_rx[7]-'0')*10+(usart1_buff_rx[8]-'0')*1;//日


      sTime.Hours=(usart1_buff_rx[9]-'0')*10+(usart1_buff_rx[10]-'0')*1;

      sTime.Minutes=(usart1_buff_rx[11]-'0')*10+(usart1_buff_rx[12]-'0')*1;

      sTime.Seconds=(usart1_buff_rx[13]-'0')*10+(usart1_buff_rx[14]-'0')*1;

      printf('time:%d/%d/%d -- %d:%d:%drn',DateToUpdate.Year,DateToUpdate.Month,DateToUpdate.Date,sTime.Hours,sTime.Minutes,sTime.Seconds);

      HAL_RTC_SetDate(&hrtc, &DateToUpdate,RTC_FORMAT_BIN);

      HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BIN);       

    }

    usart1_flag=0;

    usart1_count=0;

  }   

3.2 LED呼吸灯

  呼吸灯通过定时器PWM模式实现;设置定时器分频系数为72,周期时间为300us;


  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  TIM_OC_InitTypeDef sConfigOC = {0};


  /* USER CODE BEGIN TIM4_Init 1 */


  /* USER CODE END TIM4_Init 1 */

  htim4.Instance = TIM4;

  htim4.Init.Prescaler = 72;

  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim4.Init.Period = 300;

  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

通过改变PWM波占空比来实现呼吸灯效果;


  if(flag==0)j++;

  else j--;

  if(j>=300)flag=1;

  if(j==0)flag=0;

  Delay_Ms(2);

  htim4.Instance->CCR3=j;//调节占空比

  htim4.Instance->CCR4=j;

3.3 手势识别检测

  PAJ7620支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别。用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。


复制

paj7620u2_selectBank(BANK0);//切换BANK0寄存器区域

status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态

if(!status)

{

gesture_data =(u16)data[1]<<8 | data[0];

if(gesture_data) 

{

switch(gesture_data)

{

case GES_UP:  //向上 

printf('向上 Uprn'); 

          HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin, GPIO_PIN_RESET);//关闭蜂鸣器        

ledflash=1;     

break; 

case GES_DOWM:  //向下

          HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin, GPIO_PIN_SET);//开启蜂鸣器

printf('向下 Dowmrn');          

ledflash=1;      

break; 

case GES_LEFT: //向左

          if(rtc_stat==0)

            {

              rtc_stat=3;

            }

            else rtc_stat--;

            printf('rtc_stat=%dn',rtc_stat);

printf('向左 Leftrn');          

ledflash=1;      

break; 

case GES_RIGHT:  //向右

            if(rtc_stat==4)

            {

              rtc_stat=0;

            }

            else rtc_stat++;       

printf('向右 Rightrn');      

ledflash=1;      

break; 

case GES_FORWARD:  //向前      

printf('向前 Forwardrn');       

ledflash=1;     

break; 

case GES_BACKWARD: //向后        

printf('向后 Backwardrn');     

ledflash=1;     

break; 

case GES_CLOCKWISE:   //顺时针

printf('顺时针 Clockwisern');     

ledflash=1;     

break;

case GES_COUNT_CLOCKWISE:  //逆时针

printf('逆时针 AntiClockwisern'); 

ledflash=1;      

break; 

case GES_WAVE:

printf('挥动 Wavern');          

ledflash=1;     

break; //挥动

default:  ledflash=0; break;

}

}

}


pYYBAGKsPrSAOQ1-AA1qU3j0f1o432.png#pic_center

关键字:STM32  手势识别 引用地址:基于PAJ7620和STM32手势识别应用案例

上一篇:STM32常用的一些开发工具
下一篇:STM32的串口编程实验理解分析

推荐阅读最新更新时间:2024-11-09 08:44

STM32学习笔记—引起电源和系统异常复位的原因
每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。 STM32的复位功能非常强大,可通过软件、硬件和一些事件触发系统复位,而且通过其复位状态标志可分析复位原因。该部分位于STM32的RCC(Reset and Clock Control)模块。 STM32 复位介绍 对于STM32来说,复位通常分为三种类型:系统复位、电源复位和备份域复位。本文结合STM32F4描述系统和电源复位的内容。 1. 系统复位 除了RCC的复位标志和备份域中的寄存器外,系统复位会将其它全部寄存器都复位为复位值。 产生系统复位事件: NRST 引脚低电平 窗口看门狗计数结束 独立看门狗计数结束 软件
[单片机]
STM32管脚重定义
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o... STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别
[单片机]
请问一下STM32管脚重映射支持任意组合吗?
这里分享我们在STM32应用中可能遇到的两个小话题,尤其对于STM32应用新手。 话题一、STM32管脚重映射支持任意组合吗? 有人使用STM32F4芯片做开发,用到USART1外设。发现有4个GPIO管脚可以支持USART1复用,即PA9,PA10,PB6,PB7。 他在21论坛发帖咨询在保持TX或RX功能不变的前提下,这4个管脚是否基于TX/RX功能自由组合呢?即是否支持下图中箭头所指的4种组合来使用。 在我的印象中,STM32系列中只有最早推出的STM32F1系列的管脚复用功能稍微弱点外,其它系列在外设功能端口与GPIO复用方面表现得更为灵活。比方以USART1的复用管脚为例,STM32F1系列是以组为单位,仅支
[单片机]
请问一下<font color='red'>STM32</font>管脚重映射支持任意组合吗?
STM32编码器接口 以及应用编程
Ⅰ 关于编码器 编码器的种类有很多,什么增量式编码器、绝对值编码器,有轴或者无轴编码器,电压输出、推拉输出、集电极开路输出等等。但不管什么类型的编码器,其目的都类似,得到转动的角度,角速度、位移等。 本文讲述常见的增量式编码器,增量式编码器也可以叫正交编码器,也就是说可以通过其A、B的相位知道编码器是正转,还是反转,还可以根据编码器参数得出旋转了多少角度等。 常见的增量式编码器A、B、Z三根线代表什么意思呢?使用过编码器的人不难理解,这里简单给初学者讲述一下: A、B两线提供相位相差90度的脉冲信号,用其来计算旋转的角度;Z线为过零点线,也就是说每转一转,经过某一点都会输出一个脉冲信号,主要用于“过零校正”,三线的信号大致
[单片机]
<font color='red'>STM32</font>编码器接口 以及应用编程
STM32中断,看着一篇就够了
1,环境搭建: 硬件平台:STM32H750XBH6开发环境:STM32CubeMX V6.8.1+KEIL V5.28.0.0STM32H750固件版本:package V1.11.0仿真下载驱动:ST-Link 2,中断的定义 中断(Interrupt)微控制器中的一种机制,允许在正常程序执行期间暂停当前正在执行的任务,以处理特定事件或条件。这些事件或条件可以是来自外部的信号、设备状态的改变、定时器触发、错误条件等。中断使系统能够及时响应重要事件,而无需不断轮询或等待事件的发生。 3,中断的分类 中断可以根据多个因素进行分类,主要根据其来源、优先级、触发方式和处理方式。以下是一些常见的中断分类: 根据来源分类:A.外部中断
[单片机]
<font color='red'>STM32</font>中断,看着一篇就够了
USART(STM32
USART / USRT 串口模式实现有三种 阻塞模式 / 普通模式:在主函数中接收函数 非阻塞模式 / 中断模式:产生的不影响主程序运行 DMA模式:与主函数互不影响,独立运行 我的理解:阻塞就是死等,非阻塞就是中断 阻塞模式就像是一个延时函数,当这个函数没处理完那么,所有的按照流程需要执行的代码都不会被执行,要等到这个延时完成,类似 平时看书上写的LED灯闪烁,用的delay()一样… 而非阻塞模式就像他定义的那样,一般用的是中断,执行这条语句的时候,开启相应的中断达到一定的条件才进行处理,这样不会影响到流程的执行. STM32中的F0和F1的AF操作方式是不一样的。F0是复用,F1是备用。 据《STM32中文参考
[单片机]
USART(<font color='red'>STM32</font>)
STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
一、环境介绍 MCU: STM32F103ZET6 编程软件环境: keil5 红外线传输协议: NEC协议---38KHZ载波:。NEC协议是红外遥控协议中常见的一种。 解码思路: 外部中断 + 定时器方式 代码风格: 模块化编程,寄存器直接操作方式 完整keil工程源码下载(解压即可编译运行测试): https://download.csdn.net/download/xiaolong1126626497/19863275 二、NEC协议与解码思路介绍 2.1 采用的相关硬件 图1: 这是NEC协议的红外线遥控器: 如果自己手机没有红外线遥控器的功能,可以淘宝上买一个小遥控器来学习测试,成本不高
[单片机]
<font color='red'>STM32</font>入门开发: NEC红外线协议解码(超低成本无线传输方案)
玩转STM32(2)入门软件的基本条件
前面说了硬件的入门条件,现在就来学习一下软件的入门基本条件。我们知道要想跟外国人打交道,必须学习一门外语,才可以跟他们对话,进行沟通。同理,我们要跟STM32的CPU进行沟通,也需要学会一门外语,这门外语有很多选择,至于选择那一门外语,就在于你自己的喜欢和需要跟那一个国家进行沟通了。在外语方面有英语、德语等等,同样对于CPU来说,也是一样有汇编语言、C语言、C++语言或者Python语言等等。在你继续跟着学习之前,你应该先学习一门语言,本系列文章主使用C语言来进行沟通的,所以你要先学会C语言。 当你学会C语言之后,就可以具备与CPU进行沟通的能力了。我们知道C语言只是方便人类看懂而设计的,但是机器还是太简单了,只能懂0和1,而
[单片机]
玩转<font color='red'>STM32</font>(2)入门软件的基本条件
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved