PAJ7620手势传感器快速驱动- -基于涂鸦CBU模组开发板

正在,或是想要开发物联网小产品的你是否会觉得一些常用的控制需要繁琐地掏出手机会让你的产品体验不佳?添加实体按键又显得太 low ?不妨来试试既能满足线下控制又能让你的小产品变酷炫的手势传感器吧!

硬件方案

使用的传感器型号为PAJ7260,可以识别上、下、左、右、向前、向后、顺时针、逆时针和挥动9种手势,并将手势信号通过IIC协议通信传输给主控,功能相当强大。

主控部分选用的是一块搭载了涂鸦CBU模组的开发板,模组详细信息可查看模组规格书。

由于 CBU 模组没有硬件IIC,所以传感器的SDA和SCL引脚可以连接用模组任意两个IO口,用模拟IIC的方式与传感器通信。INT引脚是中断输出脚,本文例程用的是轮询获取传感器数据的方式,所以可以不接。

软件实现

首先是根据IIC通信基本协议实现起始信号、停止信号、应答信号、单字节数据等相关的发送、接收操作:

STATIC int __iic_start(VOID)
{vI2CSDASet();vI2CSCLSet();vI2CDelay(5);vI2CSDAReset();vI2CDelay(5);vI2CSCLReset();return 0;
}STATIC int __iic_stop(VOID)
{   vI2CSCLReset();vI2CSDAReset();vI2CDelay(5);vI2CSCLSet();vI2CSDASet();vI2CDelay(5);return 0;
}STATIC VOID __iic_send_ack(VOID)
{   vI2CSCLReset();vI2CSDAReset();vI2CDelay(2);vI2CSCLSet();vI2CDelay(2);vI2CSCLReset();
}STATIC VOID __iic_send_nack(VOID)
{   vI2CSCLReset();vI2CSDASet();vI2CDelay(2);vI2CSCLSet();vI2CDelay(2);vI2CSCLReset();
}STATIC UINT8_T __iic_recv_ack(VOID)
{   UINT8_T ucErrTime=0;UINT8_T recv_ack;vI2CSDARelease();vI2CSCLSet();vI2CDelay(5);while(ucI2CSDAInputRead()) {ucErrTime++;if(ucErrTime>250) {__iic_stop();PR_NOTICE("-------iic ack error-----");return 1;}}vI2CSCLReset();return 0;
}STATIC VOID __iic_send_byte(UCHAR_T sendbyte)
{UCHAR_T i = 0;vI2CSCLReset;for(i = 0x80; i > 0; i >>= 1){if((sendbyte & i) == 0) {vI2CSDAReset();} else {vI2CSDASet();}vI2CDelay(2);   vI2CSCLSet();vI2CDelay(2); vI2CSCLReset();vI2CDelay(2);}
}STATIC UINT8_T __iic_read_byte(UCHAR_T ack)
{UCHAR_T i = 0;UCHAR_T readbyte = 0;vI2CSDARelease();for(i = 0x80; i > 0; i >>= 1){vI2CSCLReset();vI2CDelay(2);vI2CSCLSet();if(ucI2CSDAInputRead()) {readbyte |= i;    }vI2CDelay(2);}if(!ack) {__iic_send_nack(); }else {__iic_send_ack();}return readbyte;
}

然后,使用上面实现好的操作函数搭出 PAJ7620 的完整一帧数据的发送和读取函数:

VOID paj7620_iic_write(UINT8_T drv_addr, UINT8_T reg_addr, UINT8_T reg_data)
{   __iic_start();__iic_send_byte((drv_addr << 1)); //发送从机地址写命令__iic_recv_ack();__iic_send_byte(reg_addr);__iic_recv_ack();__iic_send_byte(reg_data);__iic_recv_ack();__iic_stop();
}VOID paj7620_iic_read(UINT8_T drv_addr, UINT8_T reg_addr, UINT8_T *p_data)
{   __iic_start();__iic_send_byte((drv_addr << 1) | 0x00); //发送从机地址写命令__iic_recv_ack();__iic_send_byte(reg_addr);__iic_recv_ack();__iic_send_byte((drv_addr << 1) | 0x01); //发送从机地址读命令__iic_recv_ack();*p_data = __iic_read_byte(1);__iic_stop();
}

PAJ7620 在初始化时需要唤醒,唤醒方法就是发送地址后直接发送停止就可以了,不用等待 PAJ7620 的应答。发送完唤醒后,读取 PAJ7620 的 0x00 寄存器,若数值为 0x20 则表示唤醒成功:

VOID paj7620_wake_up(VOID)
{UINT8_T data = 0x0a;UINT8_T i =0;__iic_start();__iic_send_byte(PAJ7620_I2C_ADDR << 1);__iic_stop();vI2CDelay(1000);__iic_start();__iic_send_byte(PAJ7620_I2C_ADDR << 1);__iic_stop();paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620_ADDR_BASE,PAJ7620_BANK0);paj7620_iic_read(PAJ7620_I2C_ADDR, 0x00, &data);if(data!= 0x20) {PR_NOTICE("PAJ7620 init failed");}
}

然后是 PAJ7620 的初始化函数:

VOID paj7620_init(PAJ7620_init_t* param)
{UINT8_T flag;UINT8_T i;i2c_pin_t i2c_config = {.ucSDA_IO = param ->SDA_PIN,.ucSCL_IO = param ->SCL_PIN,};opSocI2CInit(&i2c_config);          /* SDA&SCL GPIO INIT */vI2CDelay(100);paj7620_wake_up();//进入BANK0寄存器区域    paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620_ADDR_BASE,PAJ7620_BANK0);//发送 PAJ7620 初始化命令for(i = 0; i < 51; i++) {paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620Global_InitArray[i][0], PAJ7620Global_InitArray[i][1]);}paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620_ADDR_BASE,PAJ7620_BANK0);paj7620_wake_up();paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620_ADDR_BASE,PAJ7620_BANK0);//发送手势识别模式初始化命令for(i = 0; i < 30; i++) {paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620Gesture_InitArray[i][0], PAJ7620Gesture_InitArray[i][1]);}}

最后是实现手势信号的读取接口:

UINT16_T paj7620_get_data(UINT8_T reg_addr)
{   UINT8_T i = 0;UINT8_T data;__iic_start();__iic_send_byte((PAJ7620_I2C_ADDR << 1) | 0x00);       //发送从机地址写命令__iic_recv_ack();__iic_send_byte(reg_addr);__iic_recv_ack();__iic_start();__iic_send_byte((PAJ7620_I2C_ADDR << 1) + 1);__iic_recv_ack();data = __iic_read_byte(0);__iic_stop();paj7620_iic_write(PAJ7620_I2C_ADDR,PAJ7620_ADDR_BASE,PAJ7620_BANK0);return data;
}UINT8_T paj7620_read_gesture_state(VOID)
{switch (paj7620_get_data(PAJ_GET_INT_FLAG1)){case GES_UP://向上return 1;case GES_DOWM://向下return 2;case GES_LEFT://向左return 3;case GES_RIGHT://向右return 4;case GES_FORWARD://向前return 5;case GES_BACKWARD: //向后return 6;case GES_CLOCKWISE://顺时针return 7;case GES_COUNT_CLOCKWISE://逆时针return 8;case GES_WAVE://挥动return 9;default:return 0;}
}

至此,PAJ7260 的驱动代码就全部完成啦,使用时只需调用一次paj7620_init(&paj7620_init_param)初始化传感器,然后在循环内调用paj7620_read_gesture_state()来不停获取识别到的手势,再根据手势值来进行想要执行的功能即可。

总结

PAJ7620 传感器功能强大,适用场景广泛,在各类智能产品中都能找到应用之处。挥挥手打开风扇,划一下打开台灯… … 各种常用操作都可以变成“举手之劳”。
若想使用涂鸦 CBU 模组SOC开发方案体验PAJ7620传感器的话,可以去本文例程的github库里参照 readme 文档进行编译烧录。

本文例程:github

PAJ7620手势传感器快速应用- -基于涂鸦CBU模组开发板相关推荐

  1. 快速开发GD32和涂鸦CBU模组通信

    MCU和CBU模组通信 采用兆易创新的GD32单片机和涂鸦 CBU (低功耗嵌入式Wi-Fi+BLE 双协议)模组进行通信. 本文将教大家如何从0开始上手GD32系列单片机,并移植涂鸦MCU-SDK来 ...

  2. 涂鸦CBU模组使用说明

    大家好,我是程序员小哈. 幻彩灯带活动进行中 前几天tuya有一个幻彩灯带的活动,正好公众号的读者有兴趣,我们就建了个群,一起玩玩. 这个活动持续到6月底,感兴趣的可以随时私信我,我拉你进群,一起玩哈 ...

  3. 涂鸦智能模组SDK开发系列课程——涂鸦IoT平台介绍(二)

    使用涂鸦Wi-Fi模组和涂鸦Wi-Fi&Bluetooth LE双模模组进行产品开发主要有三种不同的方式进行开发: 零代码开发:涂鸦提供可视化功能配置界面,无需任何编程经验,只需在线配置好产品 ...

  4. 4.0 树莓派做下位机播放视频、控制电机舵机、超声波检测、paj7620手势传感器控制,树莓派串口通信等程序分析

    文章目录 一.前言 二.Python实现封装打包自己写的代码 参考链接 我的参考 _init_.py setup.py 三. 树莓派的硬件解码播放器--Omxplayer 四.树莓派控制舵机,驱动L2 ...

  5. 涂鸦模组开发光照传感器

    涂鸦模组开发光照传感器(OPT3006) 概述 涂鸦智能 视频教学 系统框架设计 OPT3006 超薄环境光传感器 TYZS5 模组 特点 PCB绘制 涂鸦零代码开发 涂鸦模组开发文章 最后 概述 亮 ...

  6. 如何快速使用STM32 HAL库和涂鸦Wi-Fi模组进行通信

     简介:本文将教大家如何使用STM32HAL库快速开发和涂鸦WIFI模组通信,接入涂鸦云. 实现功能:通过APP实时监测温湿度数据 程序下载路径:demo程序. demo(定时采集数据)程序. 一.使 ...

  7. 涂鸦模组开发(压力传感器HX711)——4. 上报传感器数据给涂鸦模块

    涂鸦模组开发_压力传感器HX711--4. 上报传感器数据给涂鸦模块 概述 视频演示 资料下载 涂鸦智能 涂鸦功能修改 压力值上报 压力状态上报 增值服务 最后 概述 涂鸦智能 (NYSE:TUYA) ...

  8. 涂鸦模组开发(压力传感器HX711)

    涂鸦模组开发(压力传感器HX711) 概述 资料下载 涂鸦智能 视频教学 系统框架设计 压力传感器 信号处理 涂鸦蓝牙模块 软件设计 涂鸦模块开发 智慧生活App 开发文章 最后 概述 1999年我国 ...

  9. c语言模拟32u4单片机,一种基于Atmega32u4的教学型Arduino开发板的制作方法

    本实用新型涉及一种教学型Arduino开发板,具体是基于Atmega32u4芯片的教学型Arduino开发板. 背景技术: 近些年来,互联网和物联网高速发展,在推动社会生产力快速发展的同时,也对我们的 ...

最新文章

  1. 分页插件php,文章内容分页插件
  2. R语言包_rCharts
  3. mysql,简单介绍一下索引
  4. 超大数据量存储常用数据库分表分库算法总结
  5. 发现一个病毒文件你删了他又自动创建怎么解决
  6. Android 应用开发(第四章)---APP数据埋点
  7. 使用Jquery EasyUi常见问题解决方案
  8. python是动态_Python中的对象和动态性 [菜鸟的理解,高手莫入]
  9. java 汉字转拼音(解决多音字问题)
  10. 微型夹爪行业调研报告 - 市场现状分析与发展前景预测
  11. 安洵信息渗透工程师面试经验分享
  12. 微信对账单 java_[Java]获取微信api中的下载对账单和下载资金账单功能
  13. IOS开发把汉字转换成拼音的两种方法和返回拼音首字母
  14. 基于中文语义词典的语义相关度量方法比较研究
  15. sudo rm -f /
  16. OpenGL学习之路17---- 镜面反射光
  17. JDBC-----什么是JDBC
  18. 71java并发编程不得不知道的几件事
  19. 2021年安全员-C证(上海市)考试APP及安全员-C证(上海市)新版试题
  20. mysql font for linux_Navicat for MySQL与MySQL-Front比较 [图文]

热门文章

  1. 自动驾驶仿真(Matlab)
  2. 【网络攻防课实验】五:Nmap脚本引擎 (NSE) 的使用及脚本编写
  3. 计算机网络技术入学要求,诺森比亚大学计算机网络技术理科硕士入学条件及实习就业...
  4. java竖直制表符怎么用_java制表符怎么用
  5. 电子硬件-FFC/FPC/PCB
  6. AJAX框架衣柜内部结构,嘘!超好用的6种衣柜内部结构图偷偷分享给你!
  7. 【小白理财】定投实践结束 - 番外篇
  8. 学习素材之USART篇——通过使用STM32与ESP8266(esp-01s)连接阿里云系列操作来了解USART协议和寄存器操作
  9. 电信行业云原生白皮书
  10. Threejs+lumion 360全景图