这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 手势翻页笔之PAJ7620U2驱动

共2条 1/1 1 跳转至

手势翻页笔之PAJ7620U2驱动

高工
2024-07-15 22:06:44     打赏

PAJ7620U2传感器是一手势传感器,在得捷商城可以很轻松的找到规格书并下载

写的也很清楚

能够识别一些简单的手势,上下左右,向前向后,顺时针逆时针等此传感器是IIC接口,STM32H5的板卡上已经引出了相应的端口

根据原理图,我们使用了CN10的 3-5-7-9四个接口,分别是PB6-SCL PB7-SDA AVDD GND,不过模块上是一个2.0的端子接口,这里我直接使用了一个2.54转2.0接口的线,如下

硬件已经连接完成,这里我直接借用了坛友已经成功的驱动,只需要配置对应的IIC接口,添加驱动即可

点击生成即可

下边添加驱动

#include "paj7620.h"
#include "stm32h5xx.h" // Device header
#include "i2c.h"
#include "usart.h"
#include "stdio.h"

// PAJ7620初始化寄存器数组:219对 {Address, value}
uint8_t Paj7620Init_Reg_Array[][2] = {
    {0xEF, 0x00},
    {0x32, 0x29},
    {0x33, 0x01},
    {0x34, 0x00},
    {0x35, 0x01},
    {0x36, 0x00},
    {0x37, 0x07},
    {0x38, 0x17},
    {0x39, 0x06},
    {0x3A, 0x12},
    {0x3F, 0x00},
    {0x40, 0x02},
    {0x41, 0xFF},
    {0x42, 0x01},
    {0x46, 0x2D},
    {0x47, 0x0F},
    {0x48, 0x3C},
    {0x49, 0x00},
    {0x4A, 0x1E},
    {0x4B, 0x00},
    {0x4C, 0x20},
    {0x4D, 0x00},
    {0x4E, 0x1A},
    {0x4F, 0x14},
    {0x50, 0x00}, // 25

    {0x51, 0x10},
    {0x52, 0x00},
    {0x5C, 0x02},
    {0x5D, 0x00},
    {0x5E, 0x10},
    {0x5F, 0x3F},
    {0x60, 0x27},
    {0x61, 0x28},
    {0x62, 0x00},
    {0x63, 0x03},
    {0x64, 0xF7},
    {0x65, 0x03},
    {0x66, 0xD9},
    {0x67, 0x03},
    {0x68, 0x01},
    {0x69, 0xC8},
    {0x6A, 0x40},
    {0x6D, 0x04},
    {0x6E, 0x00},
    {0x6F, 0x00},
    {0x70, 0x80},
    {0x71, 0x00},
    {0x72, 0x00},
    {0x73, 0x00},
    {0x74, 0xF0}, // 50

    {0x75, 0x00},
    {0x80, 0x42},
    {0x81, 0x44},
    {0x82, 0x04},
    {0x83, 0x20},
    {0x84, 0x20},
    {0x85, 0x00},
    {0x86, 0x10},
    {0x87, 0x00},
    {0x88, 0x05},
    {0x89, 0x18},
    {0x8A, 0x10},
    {0x8B, 0x01},
    {0x8C, 0x37},
    {0x8D, 0x00},
    {0x8E, 0xF0},
    {0x8F, 0x81},
    {0x90, 0x06},
    {0x91, 0x06},
    {0x92, 0x1E},
    {0x93, 0x0D},
    {0x94, 0x0A},
    {0x95, 0x0A},
    {0x96, 0x0C},
    {0x97, 0x05}, // 75

    {0x98, 0x0A},
    {0x99, 0x41},
    {0x9A, 0x14},
    {0x9B, 0x0A},
    {0x9C, 0x3F},
    {0x9D, 0x33},
    {0x9E, 0xAE},
    {0x9F, 0xF9},
    {0xA0, 0x48},
    {0xA1, 0x13},
    {0xA2, 0x10},
    {0xA3, 0x08},
    {0xA4, 0x30},
    {0xA5, 0x19},
    {0xA6, 0x10},
    {0xA7, 0x08},
    {0xA8, 0x24},
    {0xA9, 0x04},
    {0xAA, 0x1E},
    {0xAB, 0x1E},
    {0xCC, 0x19},
    {0xCD, 0x0B},
    {0xCE, 0x13},
    {0xCF, 0x64},
    {0xD0, 0x21}, // 100

    {0xD1, 0x0F},
    {0xD2, 0x88},
    {0xE0, 0x01},
    {0xE1, 0x04},
    {0xE2, 0x41},
    {0xE3, 0xD6},
    {0xE4, 0x00},
    {0xE5, 0x0C},
    {0xE6, 0x0A},
    {0xE7, 0x00},
    {0xE8, 0x00},
    {0xE9, 0x00},
    {0xEE, 0x07},
    {0xEF, 0x01},
    {0x00, 0x1E},
    {0x01, 0x1E},
    {0x02, 0x0F},
    {0x03, 0x10},
    {0x04, 0x02},
    {0x05, 0x00},
    {0x06, 0xB0},
    {0x07, 0x04},
    {0x08, 0x0D},
    {0x09, 0x0E},
    {0x0A, 0x9C}, // 125

    {0x0B, 0x04},
    {0x0C, 0x05},
    {0x0D, 0x0F},
    {0x0E, 0x02},
    {0x0F, 0x12},
    {0x10, 0x02},
    {0x11, 0x02},
    {0x12, 0x00},
    {0x13, 0x01},
    {0x14, 0x05},
    {0x15, 0x07},
    {0x16, 0x05},
    {0x17, 0x07},
    {0x18, 0x01},
    {0x19, 0x04},
    {0x1A, 0x05},
    {0x1B, 0x0C},
    {0x1C, 0x2A},
    {0x1D, 0x01},
    {0x1E, 0x00},
    {0x21, 0x00},
    {0x22, 0x00},
    {0x23, 0x00},
    {0x25, 0x01},
    {0x26, 0x00}, // 150

    {0x27, 0x39},
    {0x28, 0x7F},
    {0x29, 0x08},
    {0x30, 0x03},
    {0x31, 0x00},
    {0x32, 0x1A},
    {0x33, 0x1A},
    {0x34, 0x07},
    {0x35, 0x07},
    {0x36, 0x01},
    {0x37, 0xFF},
    {0x38, 0x36},
    {0x39, 0x07},
    {0x3A, 0x00},
    {0x3E, 0xFF},
    {0x3F, 0x00},
    {0x40, 0x77},
    {0x41, 0x40},
    {0x42, 0x00},
    {0x43, 0x30},
    {0x44, 0xA0},
    {0x45, 0x5C},
    {0x46, 0x00},
    {0x47, 0x00},
    {0x48, 0x58}, // 175

    {0x4A, 0x1E},
    {0x4B, 0x1E},
    {0x4C, 0x00},
    {0x4D, 0x00},
    {0x4E, 0xA0},
    {0x4F, 0x80},
    {0x50, 0x00},
    {0x51, 0x00},
    {0x52, 0x00},
    {0x53, 0x00},
    {0x54, 0x00},
    {0x57, 0x80},
    {0x59, 0x10},
    {0x5A, 0x08},
    {0x5B, 0x94},
    {0x5C, 0xE8},
    {0x5D, 0x08},
    {0x5E, 0x3D},
    {0x5F, 0x99},
    {0x60, 0x45},
    {0x61, 0x40},
    {0x63, 0x2D},
    {0x64, 0x02},
    {0x65, 0x96},
    {0x66, 0x00}, // 200

    {0x67, 0x97},
    {0x68, 0x01},
    {0x69, 0xCD},
    {0x6A, 0x01},
    {0x6B, 0xB0},
    {0x6C, 0x04},
    {0x6D, 0x2C},
    {0x6E, 0x01},
    {0x6F, 0x32},
    {0x71, 0x00},
    {0x72, 0x01},
    {0x73, 0x35},
    {0x74, 0x00},
    {0x75, 0x33},
    {0x76, 0x31},
    {0x77, 0x01},
    {0x7C, 0x84},
    {0x7D, 0x03},
    {0x7E, 0x01}, // 219
};

// PAJ7620U2初始化,返回0则初始化失败
uint8_t paj7620_init(void)
{
    uint8_t i, State, n;
    State = 0;

    // 写入BANK0区域前, 先向 0xEF 地址写0
    while (HAL_OK != HAL_I2C_Mem_Write(&hi2c1, PAJ7620_I2C_ADDRESS, PAJ_BANK_SELECT, I2C_MEMADD_SIZE_8BIT, &State, 1, 500))
    {
        HAL_Delay(5);
        printf("paj7620_init err: 1 \r\n");
    }

    for (i = 0; i < 219; i++)
    {
        // 循环向BANK1中写入配置字节,共219字节
        while (HAL_OK != HAL_I2C_Mem_Write(&hi2c1, PAJ7620_I2C_ADDRESS, Paj7620Init_Reg_Array[i][0], I2C_MEMADD_SIZE_8BIT, &Paj7620Init_Reg_Array[i][1], 1, 500))
        {
            HAL_Delay(5);
            printf("paj7620_init err: 2 \r\n");
        }
        HAL_Delay(5);
    }

    // 读取BANK0区域前, 先向 0xEF 地址写0
    while (HAL_OK != HAL_I2C_Mem_Write(&hi2c1, PAJ7620_I2C_ADDRESS, PAJ_BANK_SELECT, I2C_MEMADD_SIZE_8BIT, &State, 1, 500))
    {
        HAL_Delay(5);
        printf("paj7620_init err: 3 \r\n");
    }
    HAL_Delay(5);

    // 读取地址0x32内存的值,存入n中
    while (HAL_OK != HAL_I2C_Mem_Read(&hi2c1, PAJ7620_I2C_ADDRESS, 0x32, I2C_MEMADD_SIZE_8BIT, &n, 1, 500))
    {
        HAL_Delay(5);
        printf("paj7620_init err: 4 \r\n");
    }

    if (n != 0x29)
    {
        return 0;
    }

    return 1;
}

// 检测手势并输出
uint16_t getGesture(void)
{
    uint8_t Data[2] = {0, 0};
    uint16_t Gesture_Data;
    HAL_I2C_Mem_Read(&hi2c1, PAJ7620_I2C_ADDRESS, PAJ_INT_FLAG1, I2C_MEMADD_SIZE_8BIT, &Data[0], 1, 500);
    HAL_Delay(5);

    HAL_I2C_Mem_Read(&hi2c1, PAJ7620_I2C_ADDRESS, PAJ_INT_FLAG2, I2C_MEMADD_SIZE_8BIT, &Data[1], 1, 500);
    HAL_Delay(5);

    Gesture_Data = (Data[1] << 8) | Data[0];
    // printf("\n %x \r\n", Gesture_Data);

    return Gesture_Data;
}

void usart_print_gesture(uint16_t status) // 通过串口打印手势信息
{
    if (status == PAJ_ZERO) // 未检测到任何手势
    {
        return;
    }

    switch (status)
    {
    case PAJ_UP:
        printf("Up\r\n");
        break;
    case PAJ_DOWN:
        printf("Down\r\n");
        break;
    case PAJ_LEFT:
        printf("Left\r\n");
        break;
    case PAJ_RIGHT:
        printf("Right\r\n");
        break;
    case PAJ_FORWARD:
        printf("Forward\r\n");
        break;
    case PAJ_BACKWARD:
        printf("Backward\r\n");
        break;
    case PAJ_CLOCKWISE:
        printf("Clockwise\r\n");
        break;
    case PAJ_COUNT_CLOCKWISE:
        printf("AntiClockwise\r\n");
        break;
    case PAJ_WAVE:
        printf("Wave\r\n");
        break;
    default:
        printf("Error Gesture value ~~~\r\n");
    }
}
#ifndef __PAJ7620_H__
#define __PAJ7620_H__
#include "stdint.h"

//PAJ7620地址寄存器定义  
#define PAJ7620_I2C_ADDRESS        0x73<<1     //paj7620的i2c地址,7bit  
#define PAJ_BANK_SELECT            0xEF        //寄存器页选择寄存器:Bank0=0x00, Bank1=0x01  
#define PAJ_INT_FLAG1              0x43        //检测结果数据低八位数据所在地址  
#define PAJ_INT_FLAG2              0x44        //检测结果数据高八位数据所在地址  

//手势状态定义  
#define PAJ_ZERO                   0x00        //未检测到任何手势 
#define PAJ_UP                     0x01        //上  
#define PAJ_DOWN                   0x02        //下  
#define PAJ_LEFT                   0x04        //左  
#define PAJ_RIGHT                  0x08        //右  
#define PAJ_FORWARD                0x10        //接近  
#define PAJ_BACKWARD               0x20        //远离  
#define PAJ_CLOCKWISE              0x40        //顺时针旋转  
#define PAJ_COUNT_CLOCKWISE        0x80        //逆时针旋转  
#define PAJ_WAVE                   0x100       //挥动
uint8_t paj7620_init(void);        //PAJ7620U2初始化函数  
uint16_t getGesture(void);             //PAJ7620U2获取手势识别函数  
void usart_print_gesture(uint16_t status);       //通过串口打印手势信息
#endif
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ICACHE_Init();
  MX_USART1_UART_Init();
  MX_USART3_UART_Init();
  MX_USB_PCD_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
  printf("App Begin\r\n");
  paj7620_init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint16_t gesture_statu;
  while (1)
  {
    // printf("Blink\r\n");
    HAL_GPIO_TogglePin(USER_LED_GPIO_Port, USER_LED_Pin);
    HAL_Delay(100);
    gesture_statu = getGesture();       // 检测手势
    usart_print_gesture(gesture_statu); // 打印手势状态
    /* USER CODE END WHILE */

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





关键词: PAJ7620U2    

高工
2024-07-15 23:50:53     打赏
2楼

共2条 1/1 1 跳转至

回复

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