专业编程基础技术教程

网站首页 > 基础教程 正文

怎样快速入门Arduino?(二十三)—TCS3200颜色传感器

ccvgpt 2024-10-12 15:01:43 基础教程 25 ℃

有这样一种生物——螳螂虾,号称世界上视力最好的海洋生物,它拥有16个眼部感光器,可以看到紫外线、可见光和偏振光。事实上,它们是唯一已知的动物可以检测圆偏振光,他们还可以用一只眼睛感知的深度,另一只眼感受距离。是不是很神奇呢?

我们人眼虽然没有这样强大的功能,但胜在我们会生产并利用工具呀!今天就来为大家介绍一款颜色检测器,一起来看看吧。

怎样快速入门Arduino?(二十三)—TCS3200颜色传感器

实验名称:TCS3200颜色传感器

  • TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。
  • TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。
  • 每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。
  • 内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。

一、实验说明

学习TCS3200颜色传感器的具体使用方法,并在串口监控器查看。

二、物料清单

PS:所需物料可以在这里购买—http://tbll000175.cn/DXSXCvr4

三、模块说明

针脚说明:

四、连线图

五、重要提示

1、TCS3200识别颜色的原理

TCS3200这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。本文以 TCS3200 在液体颜色识别中的应用为例,介绍它的具体使用。在开始介绍TCS3200 的颜色识别前,先来了解一些光与颜色的知识。

2、 三原色的感应原理

通常所看到的物体的颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。

3、 TCS3200识别颜色的原理

由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS3200 传感器上的光的颜色。

4、白平衡和颜色识别原理

白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于TCS3200 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS3200 的RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得TCS3200 对所检测的"白色"中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS3200 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的三个调整参数。

当用TCS3200 识别颜色时,就用这三个参数对所测颜色的R 、G 和B 进行调整。这里有两种方法来计算调整参数:①依次选通三种颜色的滤波器,然后对 TCS3200的输出脉冲依次进行计数。当计数到255 时停止计数,分别计算每个通道所用的时间。这些时间对应于实际测试时TCS3200 每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R 、G 和B 的值。②设置定时器为一固定时间(例如10ms ),然后选通三种颜色的滤波器,计算这段时间内 TCS3200 的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G和B的值。

使用本模块的结果都是基于白平衡而工作的。

六、实验代码

/*
 作者:山东迅鸣物联网
 时间:2019年1月30日
 发表地址:
 程序说明:TCS3200颜色传感器的使用
*/
#include <TimerOne.h>
 
#define S0 6 // Please notice the Pin's define
#define S1 5
#define S2 4
#define S3 3
#define OUT 2
 
int g_count = 0; // count the frequecy
int g_array[3]; // store the RGB value
int g_flag = 0; // filter of RGB queue
float g_SF[3]; // save the RGB Scale factor
 
 
// Init TSC230 and setting Frequency.
void TSC_Init()
{
 pinMode(S0, OUTPUT);
 pinMode(S1, OUTPUT);
 pinMode(S2, OUTPUT);
 pinMode(S3, OUTPUT);
 pinMode(OUT, INPUT);
 
 digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2%
 digitalWrite(S1, HIGH);
}
 
// Select the filter color
void TSC_FilterColor(int Level01, int Level02)
{
 if (Level01 != 0)
 Level01 = HIGH;
 
 if (Level02 != 0)
 Level02 = HIGH;
 
 digitalWrite(S2, Level01);
 digitalWrite(S3, Level02);
}
 
void TSC_Count()
{
 g_count ++ ;
}
 
void TSC_Callback()
{
 switch (g_flag)
 {
 case 0:
 Serial.println("->WB Start");
 TSC_WB(LOW, LOW); //Filter without Red
 break;
 case 1:
 Serial.print("->Frequency R=");
 Serial.println(g_count);
 g_array[0] = g_count;
 TSC_WB(HIGH, HIGH); //Filter without Green
 break;
 case 2:
 Serial.print("->Frequency G=");
 Serial.println(g_count);
 g_array[1] = g_count;
 TSC_WB(LOW, HIGH); //Filter without Blue
 break;
 
 case 3:
 Serial.print("->Frequency B=");
 Serial.println(g_count);
 Serial.println("->WB End");
 g_array[2] = g_count;
 TSC_WB(HIGH, LOW); //Clear(no filter)
 break;
 default:
 g_count = 0;
 break;
 }
}
 
void TSC_WB(int Level0, int Level1) //White Balance
{
 g_count = 0;
 g_flag ++;
 TSC_FilterColor(Level0, Level1);
 Timer1.setPeriod(1000000); // set 1s period
}
 
void setup()
{
 TSC_Init();
 Serial.begin(9600);
 Timer1.initialize(); // defaulte is 1s
 Timer1.attachInterrupt(TSC_Callback);
 attachInterrupt(0, TSC_Count, RISING);
 
 delay(4000);
 
 for (int i = 0; i < 3; i++)
 Serial.println(g_array[i]);[/i]
 
 g_SF[0] = 255.0 / g_array[0]; //R Scale factor
 g_SF[1] = 255.0 / g_array[1] ; //G Scale factor
 g_SF[2] = 255.0 / g_array[2] ; //B Scale factor
 
 Serial.println(g_SF[0]);
 Serial.println(g_SF[1]);
 Serial.println(g_SF[2]);
 
}
 
void loop()
{
 g_flag = 0;
 for (int i = 0; i < 3; i++)
 Serial.println(int(g_array * g_SF));
 delay(4000);
 
}

串口监视器:

七、相关函数介绍

delay(ms):延时函数(参数:时间,单位:ms)。延时一段时间,以毫秒为单位,如1000为1秒。

Serial.print(val) :在串行口以人们可以看懂的 ASSCII 码的形式打印数据。参数val:要打印的值。

Serial.println(val):将数据作为人类可读的ASCII文本打印到串行端口,后跟回车符(ASCII 13或'\ r')和换行符(ASCII 10或'\ n')。参数val:要打印的值。

今天的内容你学会了吗?动手实践才是真理呦,赶快跟着小编的讲解实际操作一下吧!有问题还可以在评论区留言呦!关注我们的微信公众号:xunmingiot,后台回复“入门”即可获取学习资料,帮助你更好的进入学习。

我们下期再见啦!(码字不易,点个赞再走呗)

往期教程可以点击以下链接查看:

怎样快速入门Arduino?(二十二)—在SD卡中进行文件读写

怎样快速入门Arduino?(二十一)—ADXL345加速度传感器+1602

怎样快速入门Arduino?(二十)—1602液晶显示实验(2)

最近发表
标签列表