stm32之HAL库操作PAJ75620
一、模块简介
手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输,本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势,包括
- 右:编码为 0x01
- 左:编码为 0x02
- 上:编码为 0x04
- 下:编码为 0x08
- 前:编码为 0x10
- 后:编码为 0x20
- 顺时针:编码为 0x40
- 逆时针:编码为 0x80
- 挥动:编码为 0x0100
1.1、PAJ7620 框图
红色框是实验模块的引脚,无SPI,其中SDA,SCL 是IIC协议线,INT是手势结果输出引脚,输出结果时会触发低电平,所以可以利用轮询的方式检测该引脚或者利用外部中断的方式。
1.2、模块原理图
1.3、IIC 协议
这里不过多描述,详细可参考51 iic 读写格式如下:
PAJ7620的Slave ID 是0x73, 在使用时要左移一位,因为IIC中的第一个字节包括SlaveID + (R/W),R/W 确定读或写。
1.4、寄存器
PAJ7620寄存器也挺多,都是八位,但是每个寄存器功能比较单一。有两个主要的寄存器,BANK0和BANK1, 向0xEF 地址写0或写1分别选中BANK0或BANK1。每个BANK下又有好多个8位寄存器。比如:
BANK0下包括手势中断的寄存器
BANK1下包括模式选择寄存器,手势使用0x00
二、代码
根据上述的IIC读写格式,可以对应以下读写代码
uint8_t iic_write_7620(uint8_t devAddress, uint8_t regAddress, uint8_t *data, uint16_t length) {uint16_t cnt;iic_start();iic_send_byte(devAddress << 1 | 0);if(iic_wait_ack() == NACK){iic_stop();return 1;}iic_send_byte(regAddress);if(iic_wait_ack() == NACK) {iic_stop();return 2;}for(cnt = 0; cnt < length; cnt++){iic_send_byte(data[cnt]);if(iic_wait_ack() == NACK) {iic_stop();return 3;}}iic_stop();return ACK;
}uint8_t iic_read_7620(uint8_t devAddress, uint8_t regAddress, uint8_t *data, uint16_t length) {uint16_t cnt;iic_start();iic_send_byte(devAddress << 1 | 0);if(iic_wait_ack() == NACK) {iic_stop();return 1;}iic_send_byte(regAddress);if(iic_wait_ack() == NACK) {iic_stop();return 2;}iic_start();iic_send_byte(devAddress << 1 | 1);if(iic_wait_ack() == NACK) {iic_stop();return 3;}for(cnt = 0; cnt < length; cnt++){data[cnt] = iic_read_byte();if(cnt == length - 1) {iic_send_ack(NACK);} else {iic_send_ack(ACK);}}iic_stop();return 0;
}
2.1、获取手势的代码
轮询
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(paj7620_getInterrupt()){paj7620_action();}HAL_Delay(20);}
中断(记得配置成下降沿触发)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {paj7620_action();
}
手势处理代码
void paj7620_action(void) {uint16_t gCode = 0;gCode = paj7620_get_gesture();printf("%d====》", gCode);switch (gCode) {case 0x01: // uppaj7620_up();break;case 0x02: // downpaj7620_down();break;case 0x04: // leftpaj7620_left();break;case 0x08: // rightpaj7620_right();break;case 0x10: // pushpaj7620_push();break;case 0x20: // poppaj7620_pop();break;case 0x40: // rotate rightpaj7620_rotate_right();break;case 0x80: // rotate leftpaj7620_rotate_left();break;case 0x100:// wavepaj7620_wave();break;case 0x00: // nothingpaj7620_nothing();break;default:paj7620_error();}
}
初始化代码
uint8_t paj_init(void) {uint8_t data = 0, rtn = 0;uint16_t cnt = 0;delay_us(700); //Wait 700us for PAJ7620U2 to stabilizepaj7620_sekect_bank(PAJ7620_BANK0);// 读0x00地址,正常会返回0x20rtn = iic_read_7620(PAJ7620_ADDRESS, PAJ7620_ADDR_PART_ID_0, &data, 1);if(rtn) {return rtn;}if(data != PAJ7620_PART_ID_0){return 0xff;}// 这一步文档上没有找到说明rtn = iic_read_7620(PAJ7620_ADDRESS, PAJ7620_ADDR_PART_ID_1, &data, 1);if(rtn){return rtn;}if(data != PAJ7620_PART_ID_1){return 0xfe;}for (cnt = 0; cnt < INIT_REG_ARRAY_SIZE; cnt++) {rtn = iic_write_7620(PAJ7620_ADDRESS, initRegisterArray[cnt][0], &initRegisterArray[cnt][1], 1);if(rtn){return rtn;}}paj7620_sekect_bank(PAJ7620_BANK1); //gesture flage reg in Bank1// 这一步文档上没有找到说明//data = 0xB7; // far mode 120 fps//data = 0x12; // near mode 240 fps//iic_write_7620(PAJ7620_ADDRESS, 0x65, &data, 1); paj7620_sekect_bank(PAJ7620_BANK0); //gesture flage reg in Bank0return 0;
}
三、效果
手势小车
手势目前用在了小车上,简单操作了小车的左右转向,前后进等。
完整版代码评论区留言。
相关文章:

stm32之HAL库操作PAJ75620
一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输,本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势,包括 右:编码为 0x01左:编码为 0x0…...

医学影像归档与通讯系统(PACS)系统源码 PACS三维图像后处理技术
医学影像归档与通讯系统(PACS)系统源码 PACS三维图像处理 医学影像归档与通讯系统(PACS)系统,是一套适用于从单一影像设备到放射科室、到全院级别等各种应用规模的医学影像归档与通讯系统。PACS集患者登记、图像采集、…...

web漏洞-PHP反序列化
目录 PHP反序列化序列化反序列化原理涉及技术利用危害CTF靶场 PHP反序列化 序列化 将对象转换成字符串 反序列化 相反,将字符串转换成对象。 数据格式的转换对象的序列化有利于对象的保存和传输,也可以让多个文件共享对象。 原理 未对用户输入的序列化字…...

Redis-分布式锁
分布式锁相关内容 超卖问题切入可以使用互斥锁给先获取到锁的线程加锁吗?使用redis分布式锁解决超卖问题setnx命令实现分布式锁为什么需要设置过期时间?Redis实现分布式锁如何合理控制锁的有效时长 redisson实现分布式锁 超卖问题切入 我们先来看一个项目…...
什么时候使用继承,好莱坞原则(设计模式与开发实践 P11+)
文章目录 好莱坞原则真的需要继承吗? 好莱坞原则 如果你熟悉继承方法、乃至模板方法模式后,就可以了解一个设计原则 好莱坞原则 新人演员把简历发给好莱坞,许久之后没有回应不耐烦打电话给好莱坞,只收到回应:不要来找…...

蓝桥等考Python组别十四级001
第一部分:选择题 1、Python L14 (15分) 运行下面程序,输出的结果是( )。 d {A: 501, B: 602, C: 703, D: 804} print(d[B]) 501602703804 正确答案:B 2、Python L14 (15分…...
TI单芯片毫米波雷达代码走读(二十七)—— 角度维(3D)处理之通道间幅相一致性补偿
TI单芯片毫米波雷达1642代码走读(〇)——总纲 书接上回,我们知晓了3D处理的主要流程,相信大家都已理解基本的原理。在正式进行数据分析之前还有一步关键的步骤需要说明,即通道间的幅相一致性补偿问题。 细心的朋友可能注意到,在3D处理的的原码中有两个函数我一直没有讲:…...
数据结构 2.2 单循环链表
2.单循环链表 data|next——>data|next——>data|next——>头节点 1.初始化链表 2.增加节点(头插法、尾插法) 3.删除节点 4.遍历链表 定义一个结构体,存放data域和指针域: typedef struct Node {//定义一个结构体&…...
矩阵距离——多源BFS
给定一个 N 行 M 列的 01 矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])|i−k||j−l| 输出一个 N 行 M 列的整数矩阵 B,其中:B[i][j]min1≤x≤N,1≤y≤M,A[x][y]1dist(A[i][j],A[x][y]) 输入格式 第…...
关于在 Notion 中使用 Markdown 语法
关于在 Notion 中使用 Markdown 语法 习惯使用的 Markdown 的伙伴们应该知道,当需要加粗字体时,会首先输入 ** **,然后在里面填内容。 但是在 Notion 中,这个就不太行了。它所定义的规则是从前往后,也就是先键入**&…...
sigmoid和softmax函数有什么区别
Sigmoid函数和Softmax函数都是常用的激活函数,但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数(也称为 Logistic函数): Sigmoid函数将输入值映射到0到1之间的连续实数范围,通常用于二元分类问题。 Si…...
第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第七节 - Python 中使用 % 进行字符串格式化)
在Python中,可以通过不同的方法来实现对字符串所需的格式化。他们之中有一些是; 1) 使用 % 2) 使用 {} 3)使用模板字符串本文讨论使用 % 进行格式化。使用 % 的格式类似于 C 编程语言中的“printf”。%d – 整数 %f – 浮点数 %s – 字符串 %x – 十六进制 %o – 八进制 下面的…...

【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)
一,VMware下载地址: 百度网盘链接链接:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https:/…...

Eclipse MAT解析headp dump,total size小于file size
1. 问题描述 使用Eclipse MAT分析20GB的heap dump文件 最后解析出来dump size只有1GB 2. 原因:heap dump中包含许多unreachable objects Eclipse MAT的官方文档,《Basic Tutorial》章节,有对上图的Overview page做介绍 针对total size小…...
【数据挖掘】2022年 Quiz 1-3 整理 带答案
目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1 (50%). Consider the set of training data shown below. Here, A, B, C C C are attributes, and D D...
AcWing 288. 休息时间,《算法竞赛进阶指南》,环形与后效性处理
288. 休息时间 - AcWing题库 在某个星球上,一天由 N 个小时构成,我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时,以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛,它每天要休息 B 个小…...

一文掌握Linux系统信息查看命令(CPU、内存、进程、网口、磁盘、硬件)
引言 大家好,欢迎来到我的技术博客!如果你是一名Linux系统管理员、开发者或者热衷于学习Linux系统的用户,那么你一定需要掌握查看系统信息的命令。在这篇博客中,我将为你介绍一些常用的Linux命令,帮助你快速了解和监控…...

UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】
目录 需要考虑的问题 重定向的修复函数 代码: 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候,会发现,有些资产在删除的时候会出现有被什么什么引用,还有的是没有被引用。 而我们如果直接选择一片去进行…...

防抖和节流的实现
防抖和节流的实现 什么是防抖和节流实现防抖和节流防抖节流 防抖和节流的应用场景 什么是防抖和节流 防抖和节流是前端开发中常用的两种性能优化技术。 为什么需要防抖和节流呢? 两者目的都是为了防止某个时间段内操作频繁触发,造成性能消耗。 防抖&…...
alsa pcm接口之阻塞和非阻塞打开和异步通知模式
阻塞和非阻塞打开(Blocked and non-blocked open) 当设备打开在一个阻塞或非阻塞模式,ALSA pcm api接口使用不同的行为,模式可以指定通过mode参数通过snd_pcm_open函数,blocked mode阻塞模式是默认打开方式,在这个模式下,行为表现为当资源被其他应用程序使用,应该阻…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

简单聊下阿里云DNS劫持事件
阿里云域名被DNS劫持事件 事件总结 根据ICANN规则,域名注册商(Verisign)认定aliyuncs.com域名下的部分网站被用于非法活动(如传播恶意软件);顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...

[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...