极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: eagler8

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

[复制链接]
 楼主| 发表于 2019-7-21 15:58:26 | 显示全部楼层
三原色原理
人眼对红、绿、蓝最为敏感,人的眼睛像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样,绝大多数单色光也可以分解成红、绿、蓝三种色光,这是色度学的最基本的原理,也称三原色原理。白光通过棱镜后被分解成多种颜色逐渐过渡的色谱,颜色依次为红、橙、黄、绿、青、蓝、紫,这就是可见光谱。其中人眼对红、绿、蓝最为敏感,人的眼睛就像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样绝大多数单色光也可以分解成红绿蓝三种色光。这是色度学的最基本原理,即三基色原理。三种基色是相互独立的,任何一种基色都不能有其它两种颜色合成。红绿蓝是三基色,这三种颜色合成的颜色范围最为广泛。红绿蓝三基色按照不同的比例相加合成混色称为相加混色。
红色+绿色=黄色
绿色+蓝色=青色
红色+蓝色=品红
红色+绿色+蓝色=白色

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 16:28:15 | 显示全部楼层
本帖最后由 eagler8 于 2019-7-21 16:52 编辑

TCS230是TAOS公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器,TCS230的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其他逻辑电路相连接,由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单,TCS230的引脚图


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 16:51:54 | 显示全部楼层
本帖最后由 eagler8 于 2019-7-21 17:07 编辑

TCS230采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管,这些二极管分为四种类型,其16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器,其余16个不带有任何滤波器,可以透过全部的光信息,这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时,通过两个可编程的引脚来动态选择所需要的滤波器,该传感器的典型输出频率范围从2Hz-500kHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力。例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS230的输出频率和计数器相匹配。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 17:12:51 | 显示全部楼层
TCS3200识别颜色的原理
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS3200 传感器上的光的颜色。TCS3200这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。

白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于 TCS3200 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS3200 的RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得TCS3200 对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS3200 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的三个调整参数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 18:04:51 | 显示全部楼层
TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 18:09:10 | 显示全部楼层
TCS3200颜色识别传感器(静态识别)
【简要说明】
一、尺寸:长35mmX宽17mmX高10mm
二、主要芯片:TCS3200
三、工作电压:直流5V
四、输出频率电压0~5V
五、特点:
1、所有的引脚全部引出
2、输出占空比50%
3、采用高亮白色LED灯反射光
4、可直接和单片机连接
5、静态检测被测物颜色(即:被测物和传感器相对静止状态)
6、检测距离10mm最佳
7、检测有效距离小于等于5厘米

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 19:05:59 | 显示全部楼层
模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 19:27:23 | 显示全部楼层
颜色传感器与Arduino接线脚图
Arduino UNO———–TSC3200颜色传感器
Digital 6——————S0
Digital 5——————S1
Digital 4——————S2(决定颜色通过引脚,配合S3引脚)
Digital 3——————S3
Digital 2——————OUT
VCC————————VCC
GND————————GND

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 19:37:20 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 11:33:16 | 显示全部楼层
  1. /*
  2. 【Arduino】66种传感器模块系列实验(64)
  3. 实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  4. */

  5. #include <TimerOne.h>//申明库文件
  6. //把TCS3200颜色识别传感器各控制引脚连到Arduino数字端口
  7. #define S0     6   //物体表面的反射光越强,TCS3200内置震荡器产生的方波频率越高,
  8. #define S1    5   //SO和S1的组合决定输出信号频率比例因子,比例因子为2%
  9. //比例因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
  10. #define S2     4  //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
  11. #define S3     3
  12. #define OUT    2 //TCS3200颜色传感器输出信号
  13. //在中断函数中纪录TCS3200输出信号的脉冲个数
  14. int   g_count = 0;    // 计算与反射光相对应TCS3200颜色传感器输出信号的脉冲数
  15. int   g_array[3];     // 存储RGB值
  16. int   g_flag = 0;     // 滤波器模式选择顺序标志
  17. float g_SF[3];        // 从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
  18. //初始化TSC3200各控制引脚的输入输出模式
  19. //设置TCS3200的内置振荡器方波频率与其输出信号频率的比例因子为2%
  20. void TSC_Init()
  21. {
  22.    pinMode(S0, OUTPUT);
  23.    pinMode(S1, OUTPUT);
  24.    pinMode(S2, OUTPUT);
  25.    pinMode(S3, OUTPUT);
  26.    pinMode(OUT, INPUT);
  27.    digitalWrite(S0, LOW);
  28.   digitalWrite(S1, HIGH);
  29. }
  30. //选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
  31. void TSC_FilterColor(int Level01, int Level02)
  32. {
  33.    if(Level01 != 0)
  34.      Level01 = HIGH;
  35.    if(Level02 != 0)
  36.      Level02 = HIGH;
  37.    digitalWrite(S2, Level01);
  38.    digitalWrite(S3, Level02);
  39. }
  40. //中断函数,计算TCS3200输出信号的脉冲波
  41. void TSC_Count()
  42. {
  43.    g_count ++ ;
  44. }
  45. //定时器中断函数,每1S中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
  46. //TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
  47. void TSC_Callback()
  48. {
  49.    switch(g_flag)
  50.    {
  51.      case 0:
  52.           Serial.println("->WB Start");
  53.           TSC_WB(LOW, LOW);              //选择让红色光线通过滤波器的模式

  54.           break;
  55.      case 1:
  56.           Serial.print("->Frequency R=");
  57.           Serial.println(g_count);    //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
  58.           g_array[0] = g_count;       //存储1S内的红光通过滤波器时,TCS3200输出的脉冲个数
  59.           TSC_WB(HIGH, HIGH);            //选择让绿色光线通过滤波器的模式

  60.           break;
  61.      case 2:
  62.           Serial.print("->Frequency G=");
  63.           Serial.println(g_count);  //打印1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
  64.           g_array[1] = g_count;  //存储1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
  65.           TSC_WB(LOW, HIGH);             //选择让蓝色光线通过滤波器的模式

  66.           break;
  67.      case 3:
  68.           Serial.print("->Frequency B=");
  69.           Serial.println(g_count);  //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
  70.           Serial.println("->WB End");
  71.           g_array[2] = g_count;  //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
  72.           TSC_WB(HIGH, LOW);             //选择无滤波器的模式  
  73.           break;
  74.     default:
  75.           g_count = 0;  //计数值清零
  76.           break;
  77.    }
  78. }
  79. //设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
  80. //该函数被TSC_Callback()调用
  81. void TSC_WB(int Level0, int Level1)      //White Balance
  82. {
  83.    g_count = 0; //计数值清零
  84.    g_flag ++;  //输出信号计数标志
  85.    TSC_FilterColor(Level0, Level1); //滤波器模式
  86.    Timer1.setPeriod(1000000);             // 设置输出信号脉冲计数时长1s
  87. }
  88. //初始化
  89. void setup()
  90. {
  91.    TSC_Init();
  92.    Serial.begin(9600);  //启动串口通信
  93.    Timer1.initialize();             // defaulte is 1s缺省是1秒
  94.    Timer1.attachInterrupt(TSC_Callback);  //设置定时器1的中断,中断调用函数为TSC_Callbace()

  95. //设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
  96.    attachInterrupt(0, TSC_Count, RISING);  
  97.    delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数

  98. //通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
  99.    for(int i=0; i<3; i++)
  100.      Serial.println(g_array[i]);
  101.    g_SF[0] = 255.0/ g_array[0];     //红色光比例因子
  102.    g_SF[1] = 255.0/ g_array[1] ;    //绿色光比例因子
  103.    g_SF[2] = 255.0/ g_array[2] ;    //蓝色光比例因子

  104. //打印白平衡后的红、绿、蓝三色的RGB比例因子
  105.    Serial.println(g_SF[0]);
  106.    Serial.println(g_SF[1]);
  107.    Serial.println(g_SF[2]);
  108. }
  109. //红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
  110. //打印被测物体的RGB值
  111. void loop()
  112. {
  113.     g_flag = 0;//每获得一次被测物体的RGB颜色值时需要4s
  114.     for(int i=0; i<3; i++)      //打印被测物体的RGB值
  115.      Serial.println(int(g_array[i] * g_SF[i]));
  116.     delay(4000);
  117. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 11:38:18 | 显示全部楼层
识别接近灰白色的串口输出数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 11:51:41 | 显示全部楼层
白色的串口数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 11:56:54 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 12:11:00 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 12:12:57 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 19:49 , Processed in 0.040489 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表