完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
颜色传感器介绍: 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 注意:笔者调试过程发现识别出的颜色值和测试的颜色背景会有一点误差,主要原因如下: 1.白色平衡校验受环境其他颜色影响,因此比例因子不准确。 2.颜色识别测试也受环境其他颜色影响。 3.比例因子的换算也会有一些误差 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
533 浏览 0 评论
803 浏览 1 评论
700 浏览 1 评论
1926 浏览 1 评论
3171 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:23 , Processed in 0.445707 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号