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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿来这样1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值