YL-64 颜色传感器
TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白光LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。它适合于色度计测量应用领域。比如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。
TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式,如下图。
TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择,如下图。
这个测试实验,我把TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率比率因子设为2%,有了输出频率比例因子,但是如何通过OUT引脚输出信号频率来换算出被测物体由三原色光强组成的RGB颜色值呢?这还需进行白平衡校正来得到RGB比例因子才行!
白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。
现在谈谈,如何进行TCS3200各控制引脚与Arduino控制器的硬件连线问题,下图分别是TCS3200传感器和其连线图。
上图中TCS3200传感器各控制引脚与Arduino控制器数字端口连线的对应关系,我设置为:
#define S0 6
#define S1 5
#define S2 4
#define S3 3
#define OUT 2
#define LED 7
当被测物体为不发光物体时,应该把TCS3200的LED引脚设置为高电平,以点亮TCS3200传感器电路板上的四个白光LED灯。
下文展示了一个带有白平衡的测试程序,把这个程序下载到Arduino控制器中,同时把一个白色物体放置在TCS3200颜色传感器之下,点亮传感器上的4个白光LED灯,再打开Arduino IDE的串口监视器,会出现下图监视画面,可以在该画面中找到白色物体RGB值255以及RGB比例因子。(可通过QQ截图来锁定画面,以便观察。)(双击图片,可以放大看!)
把白平衡时放置在TCS3200颜色传感器之下白色物体拿走,放上另一个黄色物体,在Arduino IDE串口监视器看到的这个黄色物体RGB值为233、157、56,如下图所示。
打开电脑Windows操作系统自带的画图板,点击菜单栏“颜色”--->“编辑颜色”--->“规定自定义颜色”-->右下角输入RGB值,查看对应的颜色与实际测试的颜色是否相符。实际测试结果是测得的物体颜色与实际颜色有些偏色,但并不影响区分出被测物体是哪种颜色的物体。
介绍完TCS3200传感器颜色识别原理和其与Arduino控制器的硬件连线,以及如何利用串口监视器找到白平衡后的比例因子和被测物体的RGB值。下面展示的是Arduino测试程序。注意:下面的#include 《TimerOne.h> 要改为单括号形式。
Arduino程序:
#include 《TimerOne.h> //申明库文件
//把TCS3200颜色传感器各控制引脚连到Arduino数字端口
#define S0 6 //物体表面的反射光越强,TCS3002D内置振荡器产生的方波频率越高,
#define S1 5 //S0和S1的组合决定输出信号频率比例因子,比例因子为2%
//比率因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
#define S2 4 //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
#define S3 3
#define OUT 2 //TCS3200颜色传感器输出信号连接到Arduino中断0引脚,并引发脉冲信号中断
//在中断函数中记录TCS3200输出信号的脉冲个数
#define LED 7 //控制TCS3200颜色传感器是否点亮LED灯
float g_SF[3]; //从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
int g_count = 0; // 计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数
// 数组用于存储在1s内TCS3200输出信号的脉冲数,它乘以RGB比例因子就是RGB标准值
int g_array[3];
int g_flag = 0; // 滤波器模式选择顺序标志
// 初始化TSC3200各控制引脚的输入输出模式
//设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2%
void TSC_Init()
{
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(S0, LOW);
digitalWrite(S1, HIGH);
}
//选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
void TSC_FilterColor(int Level01, int Level02)
{
if(Level01 != 0)
Level01 = HIGH;
if(Level02 != 0)
Level02 = HIGH;
digitalWrite(S2, Level01);
digitalWrite(S3, Level02);
}
//中断函数,计算TCS3200输出信号的脉冲数
void TSC_Count()
{
g_count ++ ;
}
//定时器中断函数,每1s中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
//TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
void TSC_Callback()
{
switch(g_flag)
{
case 0:
Serial.println("->WB Start");
TSC_WB(LOW, LOW); //选择让红色光线通过滤波器的模式
break;
case 1:
Serial.print("->Frequency R=");
Serial.println(g_count); //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
g_array[0] = g_count; //存储1s内的红光通过滤波器时,TCS3200输出的脉冲个数
TSC_WB(HIGH, HIGH); //选择让绿色光线通过滤波器的模式
break;
case 2:
Serial.print("->Frequency G=");
Serial.println(g_count); //打印1s内的绿光通过滤波器时,TCS3200输出的脉冲个数
g_array[1] = g_count; //存储1s内的绿光通过滤波器时,TCS3200输出的脉冲个数
TSC_WB(LOW, HIGH); //选择让蓝色光线通过滤波器的模式
break;
case 3:
Serial.print("->Frequency B=");
Serial.println(g_count); //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
Serial.println("->WB End");
g_array[2] = g_count; //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
TSC_WB(HIGH, LOW); //选择无滤波器的模式
break;
default:
g_count = 0; //计数值清零
break;
}
}
//设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
//该函数被TSC_Callback( )调用
void TSC_WB(int Level0, int Level1)
{
g_count = 0; //计数值清零
g_flag ++; //输出信号计数标志
TSC_FilterColor(Level0, Level1); //滤波器模式
Timer1.setPeriod(1000000); //设置输出信号脉冲计数时长1s
}
//初始化
void setup()
{
TSC_Init();
Serial.begin(9600); //启动串行通信
Timer1.initialize(); // defaulte is 1s
Timer1.attachInterrupt(TSC_Callback); //设置定时器1的中断,中断调用函数为TSC_Callback()
//设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
attachInterrupt(0, TSC_Count, RISING);
digitalWrite(LED, HIGH);//点亮LED灯
delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数
//通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
g_SF[0] = 255.0/ g_array[0]; //红色光比例因子
g_SF[1] = 255.0/ g_array[1] ; //绿色光比例因子
g_SF[2] = 255.0/ g_array[2] ; //蓝色光比例因子
//打印白平衡后的红、绿、蓝三色的RGB比例因子
Serial.println(g_SF[0],5);
Serial.println(g_SF[1],5);
Serial.println(g_SF[2],5);
//红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
//打印被测物体的RGB值
for(int i=0; i<3; i++)
Serial.println(int(g_array[i] * g_SF[i]));
}
//主程序
void loop()
{
g_flag = 0;
//每获得一次被测物体RGB颜色值需时4s
delay(4000);
//打印出被测物体RGB颜色值
for(int i=0; i<3; i++)
Serial.println(int(g_array[i] * g_SF[i]));
}
程序中的头文件TimerOne.h文件请下载:http://yunpan.cn/QnKIsvphPb4Mv
上面是带有白平衡的测试程序,对于具体项目的应用程序,要在此基础上加以变动。
如果TCS3200传感器与被测物体的检测距离以及周围环境光线没有发生大的变化,进行一次白平衡校正后,RGB比例因子就可以确定下来了。于是您一定要把得到的RGB比例因子直接替代掉红色字体标识程序段中的数组g_array[3]各元素变量。另外绿色字体标识的程序段也可以注释掉。
在具体项目中,您所检测的是某种特定颜色的物体,可能就像文章的第一张图片展示的5个色块类似,绝不会有连续变化颜色的物体。于是,应该以上述程序获得的被测物体颜色R、G、B值为中心,设置一个距离中心值±20的范围值,在任何环境光条件下,再次检测被测物体的RGB值,只要RGB值落在范围内,就可以认为被测物体是那种特定颜色的物体。这样设定颜色值范围的方法,可以有效提高物体颜色的识别率。
YL-64 颜色传感器的更多相关文章
- 颜色传感器TCS230及颜色识别电路(转)
摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...
- TCS3200颜色传感器测试实验
TCS3200颜色传感器测试实验 2013-08-02 17:18:24 分享: 标签: Arduino TCS3200 传感器 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAO ...
- 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)
截图 描述: l STM32 HAL库编程 l 使用模拟IIC通信,方便程序移植 l Python界面编写,蘑菇头的帽子是什么颜色 l STM32 HAL库串口通信 l Python界面使用 ...
- 【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- Android传感器【转】
本文转载自:http://blog.csdn.net/ffmxnjm/article/details/52101592?locationNum=3&fps=1 传感器的意义 事实上,目前智能手 ...
- 【雕爷学编程】Arduino动手做(64)---RGB全彩LED模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 【转】camera tuning
chromatix项目必须包含有效的 ADC image.png filcker: 交流电照明灯发出的光会一定频率的抖动导致sensor图像出现行方向的水波纹,称之为filcker.目前主要的交流电频 ...
随机推荐
- POJ 1127 Jack Straws(计算几何)
题目链接 抄的模版,居然1Y了.就是简单的线段相交+并查集. #include <iostream> #include <cstring> #include <cstdi ...
- iOS 网络框架编写总结
一,常用 1> 不错的处理接收到的网络图片数据的方法 id img= ISNSNULL(pic)?nil:[pic valueForKey:@"img"]; NSString ...
- flex关于字符串转Boolean .
最近做一项目,输入一个boolean类型的参数,结果一致无法获取正确值,后在网上查找才发现原因如下,转帖保存一个: . "false" as Boolean //flase .&q ...
- JQuery+Ajax制作省市联动
$(document).ready(function () { $("#Province").append("<option value=''>" ...
- Maven3路程(一)用Maven创建第一个web项目(2)
工具/原料 Windows 系统 JDK 1.5 及以上版本 Maven 3.0 及以上版本 方法/步骤 1 首先检查Eclipse是否已经添加的Maven插件,打开Eclipse, 依次选择 &qu ...
- 李洪强漫谈iOS开发[C语言-050]-doWhile统计用户输入字符
- hive中导入json格式的数据(hive分区表)
hive中建立外部分区表,外部数据格式是json的如何导入呢? json格式的数据表不必含有分区字段,只需要在hdfs目录结构中体现出分区就可以了 This is all according to t ...
- [转载]学习VC MFC开发必须了解的常用宏和指令————复习一下
1.#include指令 包含指定的文件 2.#define指令 预定义,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善.背后一长串”的宏,它本身并不在编译过程中进行,而 ...
- [转]理解Linux系统中的load average
转自:http://heipark.iteye.com/blog/1340384 谢谢,写的非常好的文章. 一.什么是load average linux系统中的Load对当前CPU工作量的度量 (W ...
- vbox下Oracle Enterprise liunx5.4虚拟机安装10G RAC实验(二)
接第一篇 http://www.cnblogs.com/myrunning/p/3993824.html 3.集群方面的配置 3.1配置hosts文件 此配置需要在两个节点都要配置. 3.2配置 Ha ...