Firefly开源社区

123
发表新贴

[技术讨论] ROC-RK3308-CC开发实例总结--PAJ7620手势传感器模块调试

166

积分

1

威望

0

贡献

技术小白

积分
166
发表于 2019-1-26 11:22:43     
本帖最后由 飞神 于 2019-1-26 11:22 编辑

传感器介绍

               PAJ7620传感器是原相科技(Pixart)的一款内部集成光学阵列式传感器,以使复杂的手势和光标模式输出,内部集成了九种手势的识别:上、下、左、右、向前、向后、顺时针、逆时针以及挥动的手势动作识别、模块以i2c通信,传感器功能很强大,更详细模块说明的可参考数据手册。手册过大无法上传附件,需要可私信我,我做了pdf目录标签,方便定位查看。
              手势传感器可以用来做大量丰富的应用开发,我在网上找到这样的应用场景图片,如下:
gesture_application1.png
gesture_application2.png


还有有些oppo手机的手势隔空操作,可以翻转桌面和图片等操作,估计也是手势传感器来实现的。

gesture_application3.png


驱动思路和原理

              paj7620的驱动步骤在手册的programing sequence and function application里有详细的步骤说明,我在这里就总结一下注意事项。传感器的读时序中间有stop信号,因此在封装读函数需要调用两次i2c_transfer,,在下面的代码会看到。

paj7620_i2c_Read.png


设备树编写:

              讲完传感器的介绍后,我们首先开始在设备树文件描述手势传感器,手势传感器是i2c协议通信的,我选择roc-rk3308的i2c1组进行通信,因此可以如下描述即可。
  1. &i2c1 {
  2.     clock-frequency = <400000>;
  3.     status = "okay";
  4.     paj7620: paj7620@73 {
  5.              compatible = "pxi,paj7620";
  6.              reg = <0x73>;
  7.          };
  8. };
复制代码
             从设备的地址可在数据手册上找到,它是7bit的地址0x73。
设备驱动编写:

             这里我采用轮徇的方式去获取传感器的手势动作状态,并且将手势传感器实现成一个输入设备,因此可以用一个结构体这样描述它
  1. struct gesture_sensor{
  2.     struct i2c_client *client;                     //记录i2c的client
  3.     struct delayed_work poll_work;     //工作队列
  4.     struct input_dev *inputdev;             //输入设备
  5. };
复制代码
根据传感器的时序进行封装paj7620的i2c读写函数
  1. //paj7620写寄存器
  2. static int paj_write_reg(struct i2c_client *client ,unsigned char addr,unsigned char data)
  3. {
  4.     unsigned char buf[2]={addr,data};
  5.     return  i2c_master_send(client,buf,2);
  6. }
  7. //paj7620读寄存器
  8. //paj7620的读中间是p(停止)信号,因此要将read操作分成两次transfer
  9. static unsigned char  paj_read_reg(struct i2c_client *client ,unsigned char addr)
  10. {
  11.     int ret;
  12.     struct i2c_msg msg[2];
  13.     unsigned char data;
  14.     msg[0].addr=client->addr;
  15.     msg[0].flags =0;//写
  16.     msg[0].len=1;
  17.     msg[0].buf=&addr;
  18.     ret=i2c_transfer(client->adapter,msg,1);
  19.     if(ret<0)
  20.     {
  21.         printk("i2c_transfer read error %d\n",ret);
  22.         return ret;
  23.     }
  24.     msg[1].addr = client->addr;
  25.     msg[1].flags |= I2C_M_RD;//读
  26.     msg[1].len = 1;
  27.     msg[1].buf = &data;
  28.     ret = i2c_transfer(client->adapter,&msg[1], 1);
  29.     if(ret < 0)
  30.     {
  31.         printk("i2c_transfer read error %d\n",ret);
  32.         return ret;
  33.     }
  34.     return data;
  35. }
复制代码
在工作队列中将数据获取,并且上报给用户层。代码太长,此处将不粘贴,详细的代码可参考附件或私信我。

功能测试:

               在这里,我做了一个应用层的demo来获取手势数据,在串口终端里运行gesturedemo,我们进行手势动作识别测试,效果如下,可以获取9种识别的手势:
  1. # gesturedemo /dev/input/event1
  2. gesture:down
  3. gesture:up
  4. gesture:left
  5. gesture:right
  6. gesture:forward
  7. gesture:backward
  8. gesture:clockwise
  9. gesture:count clockwise
  10. gesture:wave
复制代码

gesture_demo.tar.gz

3.53 KB, 下载次数: 72, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

29

积分

0

威望

0

贡献

技术小白

积分
29
发表于 2019-1-28 09:55:09     
谢谢分享!
回复

使用道具 举报

785

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
785
发表于 2019-1-28 16:30:50     
厉害厉害!
回复

使用道具 举报

121

积分

0

威望

0

贡献

技术小白

积分
121
发表于 2019-2-1 10:55:37     
学习了,感谢分享!
回复

使用道具 举报

88

积分

10

威望

10

贡献

技术小白

积分
88
发表于 2019-2-22 16:50:14     
谢谢分享!
回复

使用道具 举报

6

积分

0

威望

0

贡献

技术小白

积分
6
发表于 2019-4-8 11:38:22     
真是没办法,无法下载
回复

使用道具 举报

6

积分

0

威望

0

贡献

技术小白

积分
6
发表于 2019-4-8 11:47:38     
让人无可奈何
回复

使用道具 举报

6

积分

0

威望

0

贡献

技术小白

积分
6
发表于 2019-4-8 11:51:08     
PAJ7620设备驱动查看一下子
回复

使用道具 举报

166

积分

1

威望

0

贡献

技术小白

积分
166
发表于 2019-4-8 16:15:56     
vkaoke 发表于 2019-4-8 11:51
PAJ7620设备驱动查看一下子

怎么了?下载不了?留邮箱我发给你吧
回复

使用道具 举报

12

积分

0

威望

0

贡献

技术小白

积分
12
发表于 2019-4-9 21:31:08     
您好,能问一下您是怎么使用这些函数的吗,完全新手,想使用一下7620手势识别传感器
回复

使用道具 举报

返回列表
123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2014-2022 中山市天启智能科技有限公司 粤ICP备14022046号
快速回复 返回顶部 返回列表