您的位置:首页 > 产品设计 > UI/UE

Arduino Uno 使用TCS3200D颜色传感器 分辨颜色

2017-02-24 16:52 639 查看
TCS3200颜色传感器



实验效果

把色纸放在传感器2CM左右高的地方,

可以检测到该物体的RGB值,

然后我们通过画板可以检验出颜色是否正确

在实际环境中,自然光,灯光都有其色温,白色也有不同的颜色偏差。

注意测试前,第一个物体必须是白色的,因为程序先运行白平衡测试,测试后程序计算得出比例因子,之后就可以比较正确的测出其他颜色。



BOM表

Arduino Uno *1

TSC3200 颜色传感器   *1

面包板   *1

跳线若干

白色物体

红色或各色物体等

接线

Arduino Uno   <----->   TSC3200颜色传感器

Pin 6                <----->                  S0

Pin 5                <----->                  S1                        

Pin 4                <----->                  S2

Pin 3                <----->                  S3

Pin 2                <----->                 OUT

5V                     <----->                 VCC

GND                <----->                 GND



源码

本例程使用到TimerOne库,请更新到Arduino的函数库里

TimerOne 库下载   http://download.csdn.net/detail/ling3ye/9762875

备用下载

城通网盘免费下载(会有些广告,不喜勿点) https://u16460183.ctfile.com/fs/16460183-234375893
#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]));
}


**本示例模块没有LED控制的引脚,所以LED 可以不用接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: