Arduino Uno 使用TCS3200D颜色传感器 分辨颜色
2017-02-24 16:52
639 查看
TCS3200颜色传感器
可以检测到该物体的RGB值,
然后我们通过画板可以检验出颜色是否正确
在实际环境中,自然光,灯光都有其色温,白色也有不同的颜色偏差。
注意测试前,第一个物体必须是白色的,因为程序先运行白平衡测试,测试后程序计算得出比例因子,之后就可以比较正确的测出其他颜色。
TSC3200 颜色传感器 *1
面包板 *1
跳线若干
白色物体
红色或各色物体等
Pin 6 <-----> S0
Pin 5 <-----> S1
Pin 4 <-----> S2
Pin 3 <-----> S3
Pin 2 <-----> OUT
5V <-----> VCC
GND <-----> GND
TimerOne 库下载 http://download.csdn.net/detail/ling3ye/9762875
备用下载
城通网盘免费下载(会有些广告,不喜勿点) https://u16460183.ctfile.com/fs/16460183-234375893
**本示例模块没有LED控制的引脚,所以LED 可以不用接
实验效果
把色纸放在传感器2CM左右高的地方,可以检测到该物体的RGB值,
然后我们通过画板可以检验出颜色是否正确
在实际环境中,自然光,灯光都有其色温,白色也有不同的颜色偏差。
注意测试前,第一个物体必须是白色的,因为程序先运行白平衡测试,测试后程序计算得出比例因子,之后就可以比较正确的测出其他颜色。
BOM表
Arduino Uno *1TSC3200 颜色传感器 *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 可以不用接
相关文章推荐
- arduino之arduino uno与舵机的使用
- 数控软件Grbl使用系列(2):烧写到Arduino UNO
- arduino之arduino uno与超声波传感器的使用
- Java 与 Arduino uno 使用 RXTX串口通信
- Java 与 Arduino uno 使用 RXTX串口通信
- UIColor (16进制颜色、透明色使用)
- ros_arduino_bridge使用总结
- JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
- 使用Arduino开发板制作自动空调温度控制器
- Arduino--基础(四)--weMos D1 ESP8266模块的使用
- WPF整理-使用用户选择主题的颜色和字体
- 硬件开发之bt输出---BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明
- Arduino初初教程6——串口的使用
- PHP匹配颜色函数的使用技巧
- 点击或者按下背景或字体颜色修改使用及注意问题
- 使用SetSysColors 修改系统颜色
- Arduino模拟I/O的使用
- Visual Studio界面颜色更换 及 Visual Assist X助手使用
- 使用 Java 进行图像处理 - 取得图像上指定位置像素的 rgb 颜色分量
- 使用CSS3创建文字颜色渐变(CSS3 Text Gradient)