• ROC-RK3308-CC开发实例总结--PAJ7620手势传感器模块调试


    传感器介绍

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


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

     



    驱动思路和原理

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

    <ignore_js_op> 


    设备树编写:

                  讲完传感器的介绍后,我们首先开始在设备树文件描述手势传感器,手势传感器是i2c协议通信的,我选择roc-rk3308的i2c1组进行通信,因此可以如下描述即可。

    &i2c1 {
        clock-frequency = <400000>;
        status = "okay";
        paj7620: paj7620@73 {
                 compatible = "pxi,paj7620";
                 reg = <0x73>;
             };
    };
    

      

    从设备的地址可在数据手册上找到,它是7bit的地址0x73。
    设备驱动编写:

                 这里我采用轮徇的方式去获取传感器的手势动作状态,并且将手势传感器实现成一个输入设备,因此可以用一个结构体这样描述它

    struct gesture_sensor{
        struct i2c_client *client;                     //记录i2c的client
        struct delayed_work poll_work;     //工作队列
        struct input_dev *inputdev;             //输入设备
    };
    

      

    根据传感器的时序进行封装paj7620的i2c读写函数

    //paj7620写寄存器
    static int paj_write_reg(struct i2c_client *client ,unsigned char addr,unsigned char data)
    {
        unsigned char buf[2]={addr,data};
        return  i2c_master_send(client,buf,2);
    }
    //paj7620读寄存器
    //paj7620的读中间是p(停止)信号,因此要将read操作分成两次transfer
    static unsigned char  paj_read_reg(struct i2c_client *client ,unsigned char addr)
    {
        int ret;
        struct i2c_msg msg[2];
        unsigned char data;
        msg[0].addr=client->addr;
        msg[0].flags =0;//写
        msg[0].len=1;
        msg[0].buf=&addr;
        ret=i2c_transfer(client->adapter,msg,1);
        if(ret<0)
        {
            printk("i2c_transfer read error %d
    ",ret);
            return ret;
        }
        msg[1].addr = client->addr;
        msg[1].flags |= I2C_M_RD;//读
        msg[1].len = 1;
        msg[1].buf = &data;
        ret = i2c_transfer(client->adapter,&msg[1], 1);
        if(ret < 0)
        {
            printk("i2c_transfer read error %d
    ",ret);
            return ret;
        }
        return data;
    }
    

      

    在工作队列中将数据获取,并且上报给用户层。代码太长,此处将不粘贴,详细的代码可参考附件或私信我。

    功能测试:

                   在这里,我做了一个应用层的demo来获取手势数据,在串口终端里运行gesturedemo,我们进行手势动作识别测试,效果如下,可以获取9种识别的手势:

    # gesturedemo /dev/input/event1
    gesture:down
    gesture:up
    gesture:left
    gesture:right
    gesture:forward
    gesture:backward
    gesture:clockwise
    gesture:count clockwise
    gesture:wave
    

      

    进入Firefly开发者社区可下载Demo

  • 相关阅读:
    js鼠标右键菜单
    js变量作用域好玩的东东
    清除浮动
    http通信示例Httpclient和HttpServer
    sql复杂案例
    微信小程序(小游戏)后台开发
    自动授时同步NTP时钟之NTP农历源代码算法立显电子技术部宣
    NTP同步时钟系统的实现及局域网授时方法
    modbus协议显示屏|modbus通讯显示屏|modbus显示电子屏功能码实现代码分享
    带掉电记忆功能的LED时钟代码分享
  • 原文地址:https://www.cnblogs.com/TeeFirefly/p/10375077.html
Copyright © 2020-2023  润新知