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值落在范围内,就可以认为被测物体是那种特定颜色的物体。这样设定颜色值范围的方法,可以有效提高物体颜色的识别率。

时间: 2024-12-09 03:50:05

YL-64 颜色传感器的相关文章

颜色传感器TCS230及颜色识别电路(转)

摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS230的原理和应用,以及色光和白平衡的知识,并用一个实例说明TCS230识别颜色的过程. 关键词 TCS23 0颜色传感器 颜色识别 白平衡调整 引言 随着现代工业生产向高速化.自动化方向的发展,生产过程中长期以来由人眼起主导作用的颜色识别工作将越来越多地被相应的颜色传感器所替代.例如:图书馆使用颜色区

RGB颜色传感器

RGB颜色传感器.传感器芯片不知道是TCS230,或是TCS3200.二者pinout及电气性能一样.左边的模块有8个引脚,LED常亮.S0, S1 默认上拉为高电平,/OE下拉低电平.S2, S3, OUT 三个引脚供单片机接口.如下: 照片中右边的模块有10个引脚,原理与8pin相同,只是多了一个LED控制引脚.默认LED点亮,接低电平熄灭: S2, S3选择颜色通道,如下表.OUT输出50% duty方波,方波频率与光强成比例,规格书给出的范围为 10-20kHz(周期50-100us):

传感器的使用

传感器类型:方向.加速度(重力).光线.磁场.距离(临近性).温度等. 方向传感器:   Sensor.TYPE_ORIENTATION 加速度(重力)传感器: Sensor.TYPE_ACCELEROMETER 光线传感器:    Sensor.TYPE_LIGHT 磁场传感器:   Sensor.TYPE_MAGNETIC_FIELD 距离(临近性)传感器: Sensor.TYPE_PROXIMITY 温度传感器:   Sensor.TYPE_TEMPERATURE //获取某种类型的感应器

基于CAN总线多视觉传感器测控系统的设计

1.引言 视觉检测技术是以机器视觉为基础的新型测试技术,因其具有测量非接触.速度快.信息量大.应用领域宽广等特点而受到欢迎.结构光传感器是应用较早.发展较成熟的视觉传感器,因此本系统采用结构光传感器来采集图像并经图像采集卡送给计算机处理.由于视觉传感器在视觉测量中担负着视频图像信号(测量数据)的采集.切换与传输.因此,如何让视觉传感器测控系统快速.精确地获得理想的视频图像信息,进而为后期的图像处理提供可靠的支持,亦即视觉传感器的测控系统的设计显得尤为重要. 2.视觉系统的概述 视觉检测系统中采集

智力题:1-28题

1.你让工人为你工作7天,给工人的回报是一根金条.金条平分成相连的7段 ,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费? 答案:分成1/7,2/7,4/7,因为1,2,4可以组合成1-7的任何一个数字. 2.请把一盒蛋糕切成8份,分给8个人,但蛋糕盒里还必须留有一份. 答案:面对这样的怪题,把切成的8份蛋糕先拿出7份分给7人,剩下的 1份连蛋糕盒一起分给第8个人. 3.小明一家过一座桥,过桥时是黑夜,所以必须有灯.现在小明过桥要1秒, 小明的弟弟要3秒,小明

java 生成二维码

package com.wasu.login.util; import java.util.Arrays; /** * 工具类,生成随机验证码字符串 * * @version 1.0 2012/12/01 * @author shiyz * */ public class SecurityCode { /** * 验证码难度级别,Simple只包含数字,Medium包含数字和小写英文,Hard包含数字和大小写英文 */ public enum SecurityCodeLevel { Simple

具有避障和寻线功能的Arduino小车

标签:  Arduino  乐高  机器人 创客对于成年人来说,多半是科技娱乐,或者是一种是一种向往科技的人生态度,总是希望自己不仅可以看到或者听到科技的资讯,还希望能够亲身制作科技玩意,从而更好地体验科技. 说到科技娱乐,也就是做东西,不需要什么指标,高兴即可,所以做些容易的,也是OK的.这次带来的作品又是Arduino与乐高结合的小车,小车具有简单的避障和寻线功能. 避障传感器是夏普GP2Y0A21红外测距传感器,它是模拟量传感器,该传感器测距范围为10cm~80cm.Arduino模拟量信

IT行业智力测试题

一. 智力测试题: 1. 有A.B.C.D四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10分钟,只有一支手电,并且同时最多只能两个人一起过桥.请问,如何安排,能够在17分钟内这四个人都过桥? 答案: 第一步:A(1)和B(2)过桥,A(1)返回 Cost:1+2 第二步: C(5)和D(10)过桥,B(2)返回 Cost:10+2 第三步: A(1)和B(2)过桥 Cost:2 2. 有一个埃及人拾到一枚标有"公元前3世纪"的金币,他问一个考古学家,考古学家说是假币

学Arduino 需要做哪些准备?(引自&quot;知乎用户:郑兴芳,DhP&quot;的回答)

本人非电子专业,使用Arduino完全出于兴趣,目前主要用于实验过程中的自动化操作. 一.基础准备主要是看一些入门介绍的电子文档,如Arduino_Basic.PDF.ArduinoL2.PDF .<ARDUINO_NOTEBOOKv6>.<Getting Started with Arduino>.<Making Things Talk>前面两个PDF文档见如下地址 http://www.docin.com/p-33827760.htmlhttp://www.doci