STM32驱动PAJ7620手势识别传感器

STM32驱动PAJ7620手势识别传感器

*
传感器简介
模块原理图
STM32F407ZGT6开发板与传感器连接
代码片
总结

原文链接:https://www.yourcee.com/newsinfo/2925937.html

STM32驱动PAJ7620手势识别传感器

点击图片购买

传感器简介

PAJ-7620U2是由原相科技公司开发的一款手势识别芯片, 内集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。
传感器内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。

STM32驱动PAJ7620手势识别传感器

; 模块原理图

STM32驱动PAJ7620手势识别传感器

VIN供电输入3.3-5V,GND供电负极,SDA数据线,SCL时钟线,INT中断输出

手势方向定义

STM32驱动PAJ7620手势识别传感器

STM32F407ZGT6开发板与传感器连接

STM32开发板手势传感器模块GNDGND5VVINPB11SDAPB10SCL

STM32驱动PAJ7620手势识别传感器

代码片

手势传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手程序显示出来。
在 main 函数中,首先对 USART 串口与 KEY 按键进行初始化配置。然后对传感器paj7620u2 进行初始化配置。当对传感器初始化成功后则退出 while 循环,进入第 21 行paj7620u2 传感器功能测试阶段。

int main(void)
{

  Debug_USART_Config();
  EXTI_Key_Config();

  printf(" 欢迎使用野火开发板\r\n");
  printf(" 手势识别传感器实验\r\n");

  while(!paj7620u2_init())
    {
      printf("PAJ7620U2 初始化失败!!!\r\n");
      delay_ms(600);
    }
    printf("PAJ7620U2 初始化成功\r\n");
  while(1)
    {
        paj7620u2_sensor_test();
    }
 }

在 test 函数中,第 12 行使用 scanf 函数,使开发板获取来自串口调试助手发出的控制指令。当开发板接收到的指令字符为”1″时,开发板控制传感器进入手势识别工作模式;当接收到的指令字符为”2″时,开发板控制传感器进入接近检测工作模式;当接收的字符既不是”1″也不是”2″时,则打印提示用户输入合法指令。


void paj7620u2_sensor_test(void)
{
    uint32_t   ch;

    Show_Mode_Message();
    while(1)
    {
        scanf("%d",&ch);
    printf("接收到字符:%d\r\n",ch);

        switch(ch)
        {
            case 1:  Gesrure_test();                    break;
            case 2:  Ps_test();                         break;
      default: printf("请输入合法指令!\r\n");     break;
        }
        Show_Mode_Message();
    }
}

手势识别传感器可以工作在手势识别与接近检测 2 种模式状态下。为了进行工作模式
的切换,我们采用了 KEY 按钮外部中端的方式。

  1. KEY 外部中断
    当我们想退出当前的工作模式时,可通过按住 key1 按钮,激发产生 EXTI 中断响应。在 IRQHandler 中断处理函数中,(第 9 行)当接受到中断信号时,变量 flag 赋值为 1。
    中断代码如下
void KEY1_IRQHandler(void)
{

    if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
    {
        flag=1;

        EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
    }
}
  1. 手势识别工作模式
    在 Gesrure_test()函数中,首先对 PAJ7620U2 手势识别检测进行初始化,(第 14 行代码)配置其 gesture_arry 数组的参数值。该数组有使能 9 个手势识别的中断标志输出的配置,初始化完毕后,在 while 循环中一直读取手势中断标志寄存器(第 26 行代码),当识别到相应的手势,手势标志会置 1,读取寄存器标志会自动清 0。根据手势的标志手势结果将被打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 20 行代码),此时关闭 9 个手势识别的检测输出,退出当前的手势识别测试模式。

void Gesrure_test(void)
{
  uint8_t status,i;
    uint8_t data[2]={0x00};
    uint16_t gesture_data;

    paj7620u2_selectBank(BANK0);
    for(i=0;i<GESTURE_SIZE;i++)
    {
        GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);
    }
    paj7620u2_selectBank(BANK0);
  printf("按KEY1键退出当前模式\r\n");

    while(1)
    {
        if(flag)
        {
      flag=0;
            GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);
            GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);
            break;
        }
    status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);
        if(!status)
        {
            gesture_data =(uint16_t)data[1]<<8 | data[0];
            if(gesture_data)
            {
                switch(gesture_data)
                {
                    case GES_UP:
                                               printf("Up\r\n");                break;
                    case GES_DOWM:
                                               printf("Dowm\r\n");              break;
                    case GES_LEFT:
                                               printf("Left\r\n");              break;
                    case GES_RIGHT:
                                                 printf("Right\r\n");             break;
                    case GES_FORWARD:
                                                 printf("Forward\r\n");           break;
                    case GES_BACKWARD:
                                                 printf("Backward\r\n");          break;
                    case GES_CLOCKWISE:
                                                 printf("Clockwise\r\n");         break;
                    case GES_COUNT_CLOCKWISE:
                                               printf("AntiClockwise\r\n");     break;
                    case GES_WAVE:
                                                 printf("Wave\r\n");              break;
                    default:  break;
                }
            }
        }
    }
}
  1. 接近检测测试
    Ps_test()函数实现接近检测,获取接近物体的体积大小和亮度的数据。首先对PAJ7620U2 接近检测进行初始化,配置其 proximity_arry 的数组参数值(第 16 行代码),初始化完成后,在 while(1)循环中,读取获取体积大小和亮度的寄存器,并将读取结果打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 23 行代码),退出当前的接近检测测试模式。

void Ps_test(void)
{

  uint8_t i;
    uint8_t data[2]={0x00};
    uint8_t obj_brightness=0;
    uint16_t obj_size=0;

    paj7620u2_selectBank(BANK0);
    for(i=0;i<PROXIM_SIZE;i++)
    {
        GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);
    }
    paj7620u2_selectBank(BANK0);
    printf("按KEY1键退出当前模式\r\n");

    while(1)
    {
        if(flag)
    {
      flag=0;
      break;
    }
        obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);
        data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);
        data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);
        obj_size = ((uint16_t)data[1] & 0x0f)<<8 | data[0];
        printf("obj_brightness: %d\r\n",obj_brightness);
    printf("obj_size: %d\r\n",obj_size);

        delay_ms(500);
    }
}

STM32驱动PAJ7620手势识别传感器
STM32驱动PAJ7620手势识别传感器

总结

本实验可以通过挥舞手势直观的了解传感器的手势识别的基本功能以及接近检测的功能。

Original: https://blog.csdn.net/qq_42250136/article/details/114520451
Author: 优信电子
Title: STM32驱动PAJ7620手势识别传感器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598240/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球