Firefly开源社区

打印 上一主题 下一主题

[技术讨论] ROC-RK3308-CC开发实例总结--TCS3200颜色传感器模块调试

166

积分

1

威望

0

贡献

技术小白

积分
166

ROC-RK3308-CC开发实例总结--TCS3200颜色传感器模块调试

发表于 2019-1-5 16:07:50      浏览:10132 | 回复:9        打印      只看该作者   [复制链接] 楼主
本帖最后由 飞神 于 2019-1-5 16:07 编辑

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

编写设备树:
       讲完大概的驱动思路,然后来看看如何在rk3308去实现该驱动。在设备树描述设备:
  1. color_sensor: color_sensor {
  2.    compatible= "firefly,color-sensor-demo";
  3.    status= "okay";
  4.    led_gpio=<&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
  5.    out_gpio=<&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
  6.    s2_gpio=<&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
  7.    s3_gpio=<&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
  8.   };
复制代码
     这里描述了四个引脚,led引脚用来控制颜色传感器模块上的led,out引脚时输出三原色脉冲数,s2、s3是颜色传感器滤波器的配置引脚,引脚的详细介绍参考数据手册。

编写驱动
      配置完设备树后,来看看驱动代码,在代码里用一个结构体来描述颜色传感器,如下:
  1. //描述颜色传感器的类型
  2. struct color_sensor{
  3.    unsigned int gpio_s2,gpio_s3;
  4.    unsigned int gpio_led,gpio_out;
  5.    unsigned int out_irq;
  6.    unsigned int rgb_cnt[3];//0 r 1 g 2 b //rgb颜色的脉冲计数
  7.    int rgb_value[3];                                        //rgb颜色的值
  8.    unsigned char lbq_status;                    //颜色传感器的滤波器状态
  9.    struct timer_list timer;                              //定时器
  10.    struct semaphore sem;                          //信号量
  11.    unsigned char flag;                                 //1 识别颜色 0 白色平衡校验
  12. };
复制代码
在中断里进行脉冲计数,如下:
  1. static irqreturn_t color_sensor_irq_handler(int irq, void *data)
  2. {
  3.     switch(dev_sensor->lbq_status)
  4.     {
  5.         case 0://红色
  6.             dev_sensor->rgb_cnt[0]++;
  7.             break;
  8.         case 1://绿色
  9.             dev_sensor->rgb_cnt[1]++;
  10.             break;
  11.         case 2://蓝色
  12.             dev_sensor->rgb_cnt[2]++;
  13.             break;
  14.     }
  15.     return IRQ_HANDLED;
  16. }
复制代码
在定时器的回调函数里进行计算,如下:
  1. static void timer_callback(unsigned long data)
  2. {
  3.          .....
  4.              if(dev_sensor->flag==1)
  5.              {
  6.              dev_sensor->rgb_value[0]=pdata->rgb_cnt[0]*KR/10;
  7.              dev_sensor->rgb_value[1]=pdata->rgb_cnt[1]*KG/10;
  8.              dev_sensor->rgb_value[2]=pdata->rgb_cnt[2]*KB/10;
  9.              }else
  10.              {
  11.               dev_sensor->rgb_value[0]=pdata->rgb_cnt[0];
  12.               dev_sensor->rgb_value[1]=pdata->rgb_cnt[1];
  13.               dev_sensor->rgb_value[2]=pdata->rgb_cnt[2];
  14.              }
  15.         .....     
  16. }
复制代码
完整的驱动代码在附件。

测试:
1.白色平衡校验
在串口终端进入/sys/color_sensor目录ls
  1. # ls
  2. color_sensor  white_blance
  3. #
复制代码
color_sensor用于颜色识别,white_blance用于白色平衡校验。
注意:一般更换环境或者掉电后都需要进行一次白色平衡校验,然后再用新的比例因子去进行识别颜色。

因此首先开发板上电后进入接口目录,将手机的背光调制最大,打开图库,换上一张纯白色的背景,然后将手机靠近颜色传感器。
  1. # cat white_blance
  2. r:145 g:125 b:128
  3. # echo "kr17kg20kb20" >white_blance
  4. #
复制代码
在白色背景下看到r:145 g:125 b:128

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


2.颜色的测试:
红色背景:
  1. # cat color_sensor
  2. r:192 g:26 b:38
复制代码



黑色背景:
  1. # cat color_sensor
  2. r:5 g:4 b:4
复制代码



蓝色背景:
  1. # cat color_sensor
  2. r:8 g:44 b:158
复制代码



绿色背景:
  1. # cat color_sensor
  2. r:45 g:176 b:58
复制代码



黄色背景:
  1. # cat color_sensor
  2. r:235 g:189 b:84
复制代码

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

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

color_sensor_drv.tar.gz

2.9 KB, 下载次数: 32, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

789

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
789
发表于 2019-1-5 16:34:55        只看该作者  沙发
很详细的讲解,学习了
回复

使用道具 举报

888

积分

4

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
888
发表于 2019-1-8 09:56:14        只看该作者  板凳
回复

使用道具 举报

5

积分

0

威望

0

贡献

吃瓜的群众

积分
5
发表于 2019-1-11 16:10:19        只看该作者  地板
谢谢分享,正在学习
回复

使用道具 举报

121

积分

0

威望

0

贡献

技术小白

积分
121
发表于 2019-1-15 13:40:40        只看该作者  5#
感谢分享,学习了!
回复

使用道具 举报

144

积分

0

威望

0

贡献

技术小白

积分
144
发表于 2019-2-19 10:45:27        只看该作者  6#
感谢
回复

使用道具 举报

7

积分

0

威望

0

贡献

技术小白

积分
7
发表于 2019-3-30 11:03:42        只看该作者  7#
good
回复

使用道具 举报

10

积分

0

威望

0

贡献

技术小白

积分
10
发表于 2019-4-2 09:00:11        只看该作者  8#
very good
回复

使用道具 举报

26

积分

0

威望

0

贡献

技术小白

积分
26
发表于 2020-10-27 21:41:49        只看该作者  9#
学习一下
回复

使用道具 举报

12

积分

0

威望

0

贡献

技术小白

积分
12
发表于 2021-12-30 10:14:07        只看该作者  10#
感谢楼主 非常实用!!!!!学习学习
回复

使用道具 举报

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

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表