TCS230彩色探测器测量三原色红色,绿色
和蓝色,也有一个单独的白光探测器。既然有的话
color can be
从这些主要颜色的不同级别创建,可以找出光源的颜色组成。
突破的四个LED 电路板(如下所示)有没有亮起 受试者具有均匀光源,使测量更可靠。
您可以使用TCS230(或更新设备TCS3200 看 here 有关差异)您需要根据颜色采取行动 一个东西。该设备确实对红外作出反应,所以可能需要 红外线过滤器 或在封闭空间中使用该设备。
这 TSC230芯片安装在突破板上。
Parameter |
价值 |
---|---|
Voltage Supply (VDD.) |
2v7〜5v5 |
Abs.Max VDD. |
-0.3V〜6v3 |
Measurement range |
约。 300nm至980nm [3] |
输出接口类型 |
频率引脚O / P单引脚 [2] |
Logic Levels | CMOS或TTL. |
逻辑输入电压(L,H) | 0v0〜0v8,2v0〜vDD. |
逻辑输出电压(L,H) | 0v4,4.5(对于vDD.=5V) |
输出频率尺度100% |
600khz(典型值) [1][2] |
输出频率尺度20% | 120khz(典型值) [1][2] |
输出频率尺度2% | 12khz(典型值) [1][2] |
Active current |
2mA(典型值),3mA(最大值) |
Power down current |
7ua(典型值),15ua(max) |
工作温度 |
-40°C〜70°C |
下载数据表 这里.
TC230的输出来自单个方波输出
改变频率,感测光量。特定传感器
使用两个数字控制输入选择R,G,B或W.
方波的频率比例
落在一组光检测二极管上的光量。从那里
是四种不同的信息来源红色,绿色,蓝色和清晰
photodiodes.
你控制哪套 二极管使用两个数字控制输入连接到输出。所以只有一个 一组光电二极管一次连接以生成输出。
在下面的照片中,您可以看到个体红色,蓝色,绿色和清晰 filters. It'有点模糊 - 但那是一个非常困难的照片 记住每个部分是120um平方,所以每个部分都是围绕头发的宽度 (17-181um)[Brian Ley]!
特写 of the TCS230
放大 在上面的图像中的TCS230的过滤器中。
实际上,每种颜色的几个光电二极管并联连接 这些在传感器表面上均匀地蔓延,正如您在照片中看到的那样 以上。该布局对于不仅仅是来自单个光电二极管的每种颜色都会获得整体读数。为了 TCS230总共有64个光电二极管。 16上方有一个红色过滤器,16 有一个绿色过滤器,16个具有蓝色过滤器,16个具有清晰的过滤器。
TCS230输出的信号通过电流频率获得 转换器,以其输入所选集的平均电流 光电二极管。这个想法是你切换一个设置,读一下然后 切换到下一个设置,直到完成所有四次测量。输出信号 是平方波,甚至标记为空间比:50%高,低50%。
设备输出的方波也可以划分(内部在TCS230中)和此 允许更慢的处理器更容易进行测量。没有 作为分开的输出的测量惩罚只是平均值 原来的。唯一的缺点是,因为信号是较低的 频率您无法快速进行测量。
如果重要的是让光线读取非常快,那么你想要 使用高速处理器并不会划分输出信号。你可以 想象一下,这在工业过程测量中可能变得重要 例如用于测量产品的状态。你想要快 测量传送带上的物品的颜色,如果它是拒绝它 wrong color.
显示了TCS230的最大全尺度频率输出
below for
由S0和S1控制的缩放因子。缩放真的只是
使用内部时钟芯片计算输入信号(主要
从光电二极管电流输出到变频器的时钟输出)和
生成分开的时钟。
S0 | S1 | 最大输出频率KHz | %规模 |
---|---|---|---|
H | H | 600kHz | 100% |
H | L | 120kHz | 20% |
L | H | 12kHz | 2% |
L | S1 = L | 断电 | 断电 |
S2 | S3 | 选择的光电二极管 |
---|---|---|
L | L | 红色的 |
L | H | 蓝色 |
H | L | 清除 |
H | H | 绿色的 |
注意:对于TCS230,TCS3200和TCS3210上述参数是
identical.
在Arduino上最简单的使用TCS230的方法是使用 Planein() 功能,首先设置分隔符 输出最低频率。
范围 | TCS230 | TCS3200 / [TCS3210] | 单位 |
---|---|---|---|
光电二极管数量 | 64 | 64 / [24] | - |
电流电源 | 2(最多3) | 1.4(最多2) | 嘛 |
电源电流 | 7(最多15个) | 0.1(最多0.1) | ua |
MIN操作温度。 | 0 | -40 | °C. |
注意:典型值如上所示。
从上表中,您可以看到TCS3200和TCS3210已成为 优化用于低功耗操作(以关闭电源模式),并在0°C以下操作。
版本:1.8.3.
没有使用:只需使用函数脉冲素。
击中任何关键都会向您展示当前的传感器读数(RGB)并尝试 检测当前颜色。目前的颜色存储在两个数组中:
RGB阵列保存在Colname阵列时要找到的颜色值 保存要为相应的RBG值显示的文本。
传感器对光线的任何变化和实践非常敏感 意味着从传感器到对象的任何轻微距离会导致一个 不同的阅读。此外,任何环境光变化也会导致一个 different reading.
所以要准确(可重复的)读数,您需要控制两个 elements:
要校准传感器,请将传感器推到彩色纸上,甚至是a 由于传感器非常敏感,因此小调整失败。
将串行监视器设置为115200波特,然后将传感器推下来并打击 'Enter'串行监视器输入字段中的键。然后这将向您展示 当前的RGB值。将这些值复制到RBG阵列中并设置等效物 COLNAME文本。重新编译(或添加一些不同的彩色对象)。重新编译和 check that the 'color' is found.
现在你可以测试'objects'使用代码现在报告颜色
object.
至于"real"校准 - 它的困难和你唯一的方法
实现它是将传感器放在您可以的封闭环境中
控制照明电平 - 这将可重复可靠
measurements.
单击下面的代码以将其复制到 clipboard.
//
// Detect colors using TCS230.
//
// Arduino uno pins for control of TCS230
#define TCS320_OE 7
#define TCS320_S0 10
#define TCS320_S1 11
#define TCS320_S2 2
#define TCS320_S3 3
#define TCS320_OUT 4
#define 方差 50 // Acceptable detection error 2%.
#define SEL_RED \
digitalWrite(TCS320_S2,LOW);digitalWrite(TCS320_S3,LOW)
#define SEL_GREEN \
digitalWrite(TCS320_S2,HIGH);digitalWrite(TCS320_S3,HIGH)
#define SEL_BLUE \
digitalWrite(TCS320_S2,LOW);digitalWrite(TCS320_S3,HIGH)
#define SEL_CLEAR \
digitalWrite(TCS320_S2,HIGH);digitalWrite(TCS320_S3,LOW)
#define TWO_PER \
digitalWrite(TCS320_S0,LOW);digitalWrite(TCS320_S1,HIGH);
#define debug(a) Serial.println((a));
#define NUMCOL 5
// int RGB[NUMCOL][3]; // Five colors with 3 elements.
// Array of NUMCOL strings len 10. 11 for null.
// Char Colname [Numcol] [11];
// Typical values for 2% dividers (set variance to 50).
在 t RGB[NUMCOL][3]={
{248,647,393},
{188,261,265},
{404,710,546},
{506,493,304},
{930,1199,837},
};
char colname[NUMCOL][11]={
"red",
"yellow",
"brown",
"blue",
"black",
};
////////////////////////////////////////////////////////////////
void setup() {
pinMode(TCS320_OE,OUTPUT);
pinMode(TCS320_S0,OUTPUT);
pinMode(TCS320_S1,OUTPUT);
pinMode(TCS320_S2,OUTPUT);
pinMode(TCS320_S3,OUTPUT);
pinMode(TCS320_OUT,INPUT);
TWO_PER;
digitalWrite(TCS320_OE,LOW); // On always.
Serial.begin(115200);
Serial.println("TCS230 color detector");
}
////////////////////////////////////////////////////////////////
unsigned long get_TCS230_reading(void) {
unsigned long val;
noInterrupts();
val = pulseIn(TCS320_OUT,HIGH,20000); // 2000us=2ms 2Hz min.
在 terrupts();
return val;
}
static 在 t clr,red,green,blue;
////////////////////////////////////////////////////////////////
uint16_t detect(void) {
unsigned long val;
SEL_RED;
red = val = get_TCS230_reading();
Serial.print("RED: "); Serial.print(val);
SEL_GREEN;
green = val = get_TCS230_reading();
Serial.print(" GREEN: "); Serial.print(val);
SEL_BLUE;
blue = val = get_TCS230_reading();
Serial.print(" BLUE: "); Serial.print(val);
Serial.print(" \n");
}
////////////////////////////////////////////////////////////////
在 t withinEQ(在 t c, 在 t xl, 在 t xh) {
if (c>=xl && c<=xh) return 1;
return 0;
}
////////////////////////////////////////////////////////////////
// Compare a value to a value and variance.
在 t compare(在 t c, 在 t v, 在 t err) {
在 t xh=v+err, xl=v-err;
if (withinEQ(c,xl,xh)) return 1;
return 0;
}
////////////////////////////////////////////////////////////////
void loop() {
uint8_t chr,i,fnd;
if (Serial.available()>0) {
chr = Serial.read(); // Consume.
// Find color match.
detect();
fnd=0;
for (i=0;i<NUMCOL;i++) {
if ( compare(red,RGB[i][0],variance) &&
compare(green,RGB[i][1],variance) &&
compare(blue,RGB[i][2],variance)
) { // Found
Serial.print("Col is :");
Serial.println(colname[i]);
fnd=1;
break;
}
}
if (!fnd) Serial.println("NOT Found");
}
}
您可以选择使用原始100%,20%或2%的输出和大多数其他代码 examples use 20%.
用于测量芯片输出的功能是脉冲素,即 准确到4us,因此获得最大精度,我们需要一个大的输出 足够与脉冲的准确性相比。
从我的设置中取出以下数据,这可能是平均值 照明设置在办公室。提供这些以显示典型的最小值和 可使用的微秒内的最大时间段 pulseIn function.
要回答的问题是:
改变分频器输出的效果是多少
来自TCS230的输出周期待测量?
改变分隔符如何影响输出周期?
{248,647,393},
{188,261,265},
{404,710,546},
{506,493,304},
{930,1199,837}
来自上述测量的最大和最小期间是:
1199us和188us
这里所涉及的频率是:
1.0 / 1199E-6 = 834Hz至1.0 / 188E-6 = 5319Hz (5.3khz)。 (MAX是12kHz - T = 83us)。
{18,26,26},
{48,47,30},
{40,69,54},
{27,71,43},
{92,119,83}
来自上述测量的最大和最小期间是:
119us和18us。
这里所涉及的频率是:
1.0 / 119E-6 = 8403Hz至1.0 / 18E-6 = 55555Hz(55kHz)。 (MAX是120khz - t = 8.3us)。
引用的最大频率为600kHz - 未测量。这段时间将是 1.6us.
对于20%的分隔线,您正在接近测量能力
脉冲蛋白是4us i.e测量的最小时期是18US并且仅限
-5脉冲数据计数。因此,测量也靠近存在
小而且因此不太准确,即颜色之间的差异需要
要更大以注册芯片输出的差异=较少的敏感性。
这里的决议是最短时期的22%,这是相当糟糕的。
100%输出的时期将更小(1.0 / 600E3 = 1.6us)和 使用Arduino Atmega328P微控制器不会测量。
当使用2%的分隔符时,该程序可以实现最准确的时间
测量由于芯片输出的时段长度相比
脉冲素精度为4us。即,测量的最低时段为188US
分隔师(〜48期4us)与18卢比(〜5期4us)相比
20% dividers.
这里的决议是最短时期的2.13%,这是相当不错的。
因此,2%的分频器输出是更好的测量精度选择。
所有的光电二极管的光谱响应都很有趣 光电二极管对红外光反应(700nm以上的时段)。当你添加时 绿色和蓝色过滤器,每个响应都显示了可见的两个峰值 光谱和红外光谱中的一个。所以,当您使用TCS230或 TCS3200(相同的光电二极管)用于测量红色,绿色,蓝色或白光 将实际上收集红外反应。所以这绝对是 与你的眼睛不同的反应's response to light.
问题是:这真的很重要吗? ......答案是:它 depends!
如果您的项目试图衡量尽可能接近的响应 对人的眼睛反应然后是的,它确实很重要。另一方面,如果 项目是根据颜色对项目进行排序,并用于定义良好的 环境,(不改变荧光和白炽灯泡)那么没有, it does not matter.
只要探测器被括在一个定义的环境中,那么它就会 始终以相同的方式操作,即在机器内关闭,有自己的LED 光源;检测器的输出将产生相同的测量 结果(然而,考虑Aeging和温度效应)。
在TCS230的数据表中,有两个光谱图:复制 以下 。此外,我已添加来自维基百科的颜色谱图 显示人眼反应。
重要的是要注意光电二极管的颜色检测 他们自己受到红外线的影响,并获得更好的结果 受红外线影响,您必须使用红外过滤器。
颜色 | 波长(NM) |
---|---|
红色的 | 700〜635. |
绿色的 | 560〜520 |
蓝色 | 490〜450 |
这是TCS230对左侧没有红外过滤器的响应 用红外线过滤器 on the right.
[来源:陶斯数据表]。
在左侧,您可以看到绿色响应有两个峰(〜550nm和 〜830nm),蓝色响应有两个峰(〜470nm和〜800nm)和红色 响应从600nm到1100nm。你真正想要的最大响应是 从450nm到700nm,由于700nm波长是您的眼睛最大的最大值 探测。这意味着您的眼睛无法看到的任何红外辐射 除非使用IR过滤器,否则影响红色,绿色和蓝色读数。
Taos建议的过滤器是:
当您使用IR过滤器(上面的右图)过滤器平滑 沿700nm的波长排出波长,每种类型只有一个峰值响应 光电二极管。响应与所示的人眼反应相似。 below.
[资源 //en.wikipedia.org/wiki/Color]
霍伊亚或肖特过滤器的唯一麻烦是他们花了很多钱 超过传感器本身;您可以在eBay上找到一个廉价的红外线过滤器 搜索X2 IR-CUT CS镜头安装。
获得更准确的色彩检测的最佳方法,更紧密 匹配人眼反应,是在前面使用红外线过滤器 传感器。请注意,这也适用于TSC3200和TCS3210 还采用具有类似响应曲线的类似光电二极管。
但是,您仍然可以使用没有IR过滤器的设备,并仍然存在 获得颜色结果,只要照明条件和距离 对象保持不变。
使用ADS1115精度16位ADC进行教程进行低功耗。
arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。
了解DigitalWrite()的工作原理......现在使用17倍宏宏!
如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。
使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。
HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。
新的! Comments
让你说到你刚刚阅读的东西!留下下面的框中的评论。