Arduino Uno颜色识别TCS3200传感器使用教程 – 凌顺实验室

您所在的位置:网站首页 识别颜色数值的app Arduino Uno颜色识别TCS3200传感器使用教程 – 凌顺实验室

Arduino Uno颜色识别TCS3200传感器使用教程 – 凌顺实验室

2024-07-04 07:16| 来源: 网络整理| 查看: 265

目录

凌顺实验室(lingshunlab.com)在本实验中介绍TCS3200数字RGB颜色传感器的使用方法,包括工作原理、接线方式、代码实现和实验验证。通过详细的原理解析、直观的接线图、完整的测试程序代码与结果展示,让读者对该传感器有一个系统的理解,并完全掌握它的使用方法。读者可以通过这个教程自主地开发颜色识别的项目,利用TCS3200获取准确的RGB数据,从而实现智能排序、颜色追踪等功能。

实验效果

把色纸放在传感器2CM左右高的地方,可以检测到该物体的RGB值,然后我们通过画板可以检验出颜色是否正确。

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

20170224162920997

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

元件说明

20170224165138545

TCS3200颜色传感器是一款基于RGB三原色的颜色检测模块。它内含光源和光电传感器,可以发出红、绿、蓝三原色的光,并测量反射光的强度。

通过顺序让三原色光照射被检测物体,测量反射光信号输出的频率,就可以分析出物体对每个原色的吸收情况,进而判定物体的颜色。

该模块输出数字信号,可以直接连接微控制器进行颜色采集。使用简单的控制引脚选择工作模式,通过读取输出脉冲计数,就可以轻松获取物体的RGB值。

TCS3200灵敏度高,对光强变化响应迅速。采用白平衡校准后,可以有效消除光源色温影响,输出稳定的颜色识别结果。

该模块体积小巧,省电效果好,成本低廉。是实现物体颜色检测的理想选择。可广泛应用于智能argsort识、颜色分选、颜色追踪等领域。

引脚说明 引脚名称 输入/输出 说明 GND(4) 电源接地。所有电压参考GND OE(3) 输入 启用fo (低电平有效). OUT 输出 输出频率(fo). S0,S1(1,2) 输入 输出频率缩放选择输入 S2,S3(7,8) 输入 光电二极管类型选择输入 VDD(5) 提供电压 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

20170224161243026

安装库

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

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

程序代码 // welcome to lingshunlab.com #include //申明库文件 //把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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3