zoukankan      html  css  js  c++  java
  • ROC-RK3308-CC开发实例总结--TCS3200颜色传感器模块调试

    颜色传感器介绍:
           TCS230 是美国 TAOS 公司生产的一种可编程彩色光到频率的转换器。关于这款颜色传感器的原理不过多介绍,更详细可参考数据手册,总结来说它就是可以识别出颜色的rgb值,从out引脚以脉冲的形式表达出来。这个颜色传感器在网上有大量的51单片机的驱动代码,而对于linux驱动的代码却是非常少。网上的驱动思路最常见的就是:固定时间(比如10ms),计算三颜色的脉冲个数,分别乘以比例因子,最后得到颜色的rgb值

    编写设备树:
           讲完大概的驱动思路,然后来看看如何在rk3308去实现该驱动。在设备树描述设备:

    color_sensor: color_sensor {
       compatible= "firefly,color-sensor-demo";
       status= "okay";
       led_gpio=<&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
       out_gpio=<&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
       s2_gpio=<&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
       s3_gpio=<&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
      };
    

      

    这里描述了四个引脚,led引脚用来控制颜色传感器模块上的led,out引脚时输出三原色脉冲数,s2、s3是颜色传感器滤波器的配置引脚,引脚的详细介绍参考数据手册。

    编写驱动
          配置完设备树后,来看看驱动代码,在代码里用一个结构体来描述颜色传感器,如下:

    //描述颜色传感器的类型
    struct color_sensor{
       unsigned int gpio_s2,gpio_s3;
       unsigned int gpio_led,gpio_out;
       unsigned int out_irq;
       unsigned int rgb_cnt[3];//0 r 1 g 2 b //rgb颜色的脉冲计数
       int rgb_value[3];                                        //rgb颜色的值
       unsigned char lbq_status;                    //颜色传感器的滤波器状态
       struct timer_list timer;                              //定时器
       struct semaphore sem;                          //信号量
       unsigned char flag;                                 //1 识别颜色 0 白色平衡校验
     };
    

      

    在中断里进行脉冲计数,如下:

    static irqreturn_t color_sensor_irq_handler(int irq, void *data)
    {
        switch(dev_sensor->lbq_status)
        {
            case 0://红色
                dev_sensor->rgb_cnt[0]++;
                break;
            case 1://绿色
                dev_sensor->rgb_cnt[1]++;
                break;
            case 2://蓝色
                dev_sensor->rgb_cnt[2]++;
                break;
        }
        return IRQ_HANDLED;
    }
    

      

    在定时器的回调函数里进行计算,如下:

    static void timer_callback(unsigned long data)
     {
             .....
                 if(dev_sensor->flag==1)
                 {
                 dev_sensor->rgb_value[0]=pdata->rgb_cnt[0]*KR/10;
                 dev_sensor->rgb_value[1]=pdata->rgb_cnt[1]*KG/10;
                 dev_sensor->rgb_value[2]=pdata->rgb_cnt[2]*KB/10;
                 }else
                 {
                  dev_sensor->rgb_value[0]=pdata->rgb_cnt[0];
                  dev_sensor->rgb_value[1]=pdata->rgb_cnt[1];
                  dev_sensor->rgb_value[2]=pdata->rgb_cnt[2];
                 }
            .....     
     }
    

      

    完整的驱动代码在附件。

    测试:
    1.白色平衡校验
    在串口终端进入/sys/color_sensor目录ls

    # ls
    color_sensor  white_blance
    # 
    

      

    color_sensor用于颜色识别,white_blance用于白色平衡校验。
    注意:一般更换环境或者掉电后都需要进行一次白色平衡校验,然后再用新的比例因子去进行识别颜色。

    因此首先开发板上电后进入接口目录,将手机的背光调制最大,打开图库,换上一张纯白色的背景,然后将手机靠近颜色传感器。

    # cat white_blance 
    r:145 g:125 b:128 
    # echo "kr17kg20kb20" >white_blance 
    # 
    

      

    在白色背景下看到r:145 g:125 b:128 

    换算成比例因子:
        10*255/145约等于17
        10*255/125约等于20
        10*255/128约等于20
    通过 "krxxkgxxkbxx"的格式将新的比例因子写入。
    注意:比例因子放大了10倍  


    2.颜色的测试:
    红色背景:

    # cat color_sensor
    r:192 g:26 b:38 
    

      

    黑色背景:

    # cat color_sensor
    r:5 g:4 b:4 
    

      

    蓝色背景:

    # cat color_sensor
    r:8 g:44 b:158 
    

      

    绿色背景:

    # cat color_sensor
    r:45 g:176 b:58
    

      

    黄色背景:

    # cat color_sensor
    r:235 g:189 b:84
    

      

    根据rgb值在下面颜色表里得出相应的颜色
    http://www.atool.org/colorpicker.php

    注意:笔者调试过程发现识别出的颜色值和测试的颜色背景会有一点误差,主要原因如下:
    1.白色平衡校验受环境其他颜色影响,因此比例因子不准确。
    2.颜色识别测试也受环境其他颜色影响。
    3.比例因子的换算也会有一些误差

    进入Firefly开发者社区可下载附件。

  • 相关阅读:
    rem单位
    JS_高程5.引用类型(5)Array类型的操作方法
    JS_理解函数参数按值传递
    JS_高程5.引用类型(4)Array类型的各类方法
    JS_高程5.引用类型(3)Array类型-检测数组
    JS_高程5.引用类型(2)Array类型
    JS_高程5.引用类型(1)Object类型
    JS_高程4.变量,作用域和内存问题(3)垃圾收集
    JS_高程4.变量,作用域和内存问题(2)执行环境及作用域
    JS_高程4.变量,作用域和内存问题(1)
  • 原文地址:https://www.cnblogs.com/TeeFirefly/p/10375003.html
Copyright © 2011-2022 走看看