Arduino 入门学习8 Arduino MEGA + TCS3200进行颜色识别
一、颜色识别原理
通常我们看到的物体颜色,实际上是物体表面吸收了照射在它上面的白光中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白光是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光。根据三原色理论,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
二、一般颜色识别实现方式
为了实现颜色识别,我们可以设置三个光电二级管,分别覆盖三个经过修正的红、绿、蓝滤波片,然后对输出信号进行处理。TCS3200 集成了该功能,并可以直接输出数字信号,大大简化了方案的复杂程度。
三、TCS3200 简介
TCS3200 颜色传感器由TAOS公司推出,包括了一块TAOS TCS3200RGB感应芯片和4个白光LED灯,采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管,这些二极管分为四种类型,红、绿、蓝滤波器各有16个光电二极管;另外16个不带滤波器,可以透过所有光。 这些光电二极管交叉排列,相同颜色的二极管并联连接、均匀分布。 TCS3200能在一定范围内检测和测量几乎所有的可见光,适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。
四、TCS3200 工作原理
当选定一个颜色滤波器时,TCS3200只允许某种特定的原色通过,阻止其它原色的通过,然后获得允许通过的光的强度。同样方式TCS3200 可以分别获得红、绿、蓝的光的强度,通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。
五、TCS3200 使用
TCS3200 通过 S2、S3来控制滤波器模式:
实战颜色识别传感器使用 Arduino MEGA + TCS3200
TCS3200有可编程的光、电转换器,其内置振荡器将光强度转换成方波。光线频率越高,方波频率也越高。TCS3200的OUT引脚输出值,与内置振荡器的频率成比例关系,它们的比率因子靠其引脚S0和S1来设置:
被测物体与TCS3200的最佳距离是1cm。测试时要避免外界光线的干扰,否则影响识别效果,最好在密闭、无反射的环境里。
六、内部原理图
TSC3200 引脚说明
- S0、S1:选择输出比例因子或电源判断模式
- S2、S3:选择滤波器的类型
- OE:频频输出使能引脚,可以控制输出的状态,有多个芯片引脚共用微处理器的输出引脚时,也可以作为片选信号。
- OUT:频率输出引脚
- GND:接地引脚
- VCC:工作电源,3.3V-5V输入。
- LED:当测试不发光物体时,应将LED置为高,以点亮TCS3200 的四个白光LED灯。
七、白平衡校正
白平衡就是告诉系统什么是白色。虽然理论上白色是由等量的红、绿、蓝混合而成,但实际中三原色并不完全相等。后面演示程序第一次启动时,必须放一个标准白色,进行白平衡校正。
模块重启、更新光源时,都应进行白平衡调整。
八、开发环境
实验环境使用Arduino Mega2560,程序托管在码云上,可以搜索“悠悠科教”找到项目并下载。
九、接线
其中:
- S0 : PWM-6
- S1 : PWM-5
- S2 : PWM-4
- S3 : PWM-3
- OUT : PWM - 2
电源接到Arduino5V引脚
Arduino程序
要添加TimeOne库:文章结尾的gitee地址可以下载TimeOne库。
十、实战颜色识别传感器使用 Arduino MEGA + TCS3200
#include <TimerOne.h> //申明库文件
// 引脚定义
#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输出信号的脉冲个数
float g_scale_factor[3]; // 从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
int g_count = 0; // 计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数
int g_pulse_number_array[3]; // 数组用于存储在1s内TCS3200输出信号的脉冲数,它乘以RGB比例因子就是RGB标准值
int g_flag = 0; // 滤波器模式选择顺序标志
void TSC_Init()
{
// 初始化TSC3200各控制引脚的输入输出模式
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
// 设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2%
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_pulse_number_array[3]的相应元素变量中
void TSC_Callback()
{
switch(g_flag)
{
case 0:
Serial.println("--->WB Start Filter");
TSC_WB(LOW, LOW); // 选择让红色光线通过滤波器的模式
break;
case 1:
Serial.print("->Frequency R=");
Serial.println(g_count); // 打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
g_pulse_number_array[0] = g_count; // 存储1s内的红光通过滤波器时,TCS3200输出的脉冲个数
TSC_WB(HIGH, HIGH); // 选择让绿色光线通过滤波器的模式
break;
case 2:
Serial.print("->Frequency G=");
Serial.println(g_count); // 打印1s内的绿光通过滤波器时,TCS3200输出的脉冲个数
g_pulse_number_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 Filter");
g_pulse_number_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()
attachInterrupt(0, TSC_Count, RISING);// 设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
delay(4000); // 延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数
//通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
g_scale_factor[0] = 255.0 / g_pulse_number_array[0]; // 红色光比例因子
g_scale_factor[1] = 255.0 / g_pulse_number_array[1] ; // 绿色光比例因子
g_scale_factor[2] = 255.0 / g_pulse_number_array[2] ; // 蓝色光比例因子
// 打印白平衡后的红、绿、蓝三色的RGB比例因子
Serial.println("after white banlance:");
Serial.println(g_scale_factor[0], DEC);
Serial.println(g_scale_factor[1], DEC);
Serial.println(g_scale_factor[2], DEC);
// 红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
// 打印被测物体的RGB值
for(int i=0; i<3; i++)
Serial.println(int(g_pulse_number_array[i] * g_scale_factor[i]));
}
// 主程序
void loop()
{
g_flag = 0;
// 每获得一次被测物体RGB颜色值需时4s
delay(4000);
// 打印出被测物体RGB颜色值
Serial.print("RGB=");
for(int i=0; i<3; i++){
Serial.print(int(g_pulse_number_array[i] * g_scale_factor[i]));
Serial.print(",");
}
Serial.println("--end--");
}
运行时,第一次先放一个白色,白平衡后再检测其它物体颜色。
实战颜色识别传感器使用 Arduino MEGA + TCS3200
本文代码来源于网络,网上流传太多,找不到源出处,侵删。
项目开源地址:
https://gitee.com/xundh/Arduino_TCS3200