Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器系列实验(64)---TCS3200D颜色识别传感器

[复制链接]
 楼主| 发表于 2020-2-24 13:41 | 显示全部楼层

        TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白光LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。它适合于色度计测量应用领域。比如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。


       通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。


       由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。



 楼主| 发表于 2020-2-24 13:44 | 显示全部楼层

TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式,如下图。

     TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择,如下图。


 楼主| 发表于 2020-2-24 13:46 | 显示全部楼层
白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。




 楼主| 发表于 2020-2-24 14:18 | 显示全部楼层
安装程序中的TimerOne.h库文件的二种办法
1、请下载:

18.jpg


 楼主| 发表于 2020-2-24 14:19 | 显示全部楼层
2、安装TimerOne库:IDE—工具—管理库—搜索TimerOne—安装

19.jpg
 楼主| 发表于 2020-2-24 17:14 | 显示全部楼层
[mw_shl_code=arduino,true]/*
  【Arduino】168种传感器模块系列实验(64)
  实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  实验程序之二:不使用库,实现简单颜色感应

  实验模块接线
  Arduino Uno   <----->   TSC3200颜色传感器
  Pin 6                <----->                  S0
  Pin 5                <----->                  S1
  Pin 4                <----->                  S2
  Pin 3                <----->                  S3
  Pin 2                <----->                 OUT
  5V                   <----->                 VCC
  GND                  <----->                 GND
*/

#define S0 6
#define S1 5
#define S2 4
#define S3 3
#define sensorOut 2

int frequency = 0;
void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);

  // 将频率缩放设置为20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  Serial.begin(9600);
}
void loop() {
  // 设置要读取的红色滤波光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -49, 255, 0);
  // 在串行监视器上打印值
  Serial.print("R= ");//打印名称
  Serial.print(frequency);//打印红色频率
  Serial.print("  ");
  delay(2000);
  
  // 设置要读取的绿色过滤光电二极管
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -50, 255, 0);
  //在串行监视器上打印值
  Serial.print("G= ");//打印名称
  Serial.print(frequency);//打印绿色频率
  Serial.print("  ");
  delay(2000);
  
  // 设置要读取的蓝色滤光光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -41, 255, 0);
  // 在串行监视器上打印值
  Serial.print("B= ");//打印名称
  Serial.print(frequency);//打印蓝色频率
  Serial.println("  ");
  delay(2000);
}[/mw_shl_code]
 楼主| 发表于 2020-2-24 17:19 | 显示全部楼层
不同颜色,数值不同

20.jpg
 楼主| 发表于 2020-2-24 17:20 | 显示全部楼层
本帖最后由 eagler8 于 2020-2-24 17:38 编辑

21.jpg
 楼主| 发表于 2020-2-24 17:38 | 显示全部楼层
[mw_shl_code=arduino,true]/*
  【Arduino】168种传感器模块系列实验(64)
  实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  实验程序之三:颜色识别感应

  实验模块接线
  Arduino Uno   <----->   TSC3200颜色传感器
  Pin 6                <----->                  S0
  Pin 5                <----->                  S1
  Pin 4                <----->                  S2
  Pin 3                <----->                  S3
  Pin 2                <----->                 OUT
  5V                   <----->                 VCC
  GND                  <----->                 GND
*/

int s0 = 6, s1 = 5, s2 = 4, s3 = 3;
int out = 2;
int flag = 0;
byte counter = 0;
byte countR = 0, countG = 0, countB = 0;
void setup()
{
  Serial.begin(115200);
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);

}
void TCS()
{
  flag = 0;
  digitalWrite(s1, HIGH);
  digitalWrite(s0, HIGH);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer0_init();

}
void ISR_INTO()
{
  counter++;
}
void timer0_init(void)
{
  TCCR2A = 0x00;
  TCCR2B = 0x07; //时钟频率源1024点
  TCNT2 = 100;   //10毫秒再次溢出
  TIMSK2 = 0x01; //允许中断
}
int i = 0;
ISR(TIMER2_OVF_vect)
//计时器2,10ms再次中断溢出,内部溢出中断执行功能
{
  TCNT2 = 100;
  flag++;
  if (flag == 1)
  {
    countR = counter;
    Serial.print("red=");
    Serial.println(countR, DEC);
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
  }
  else if (flag == 2)
  {
    countG = counter;
    Serial.print("green=");
    Serial.println(countG, DEC);
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
  }
  else if (flag == 3)
  {
    countB = counter;
    Serial.print("blue=");
    Serial.println(countB, DEC);
    Serial.println("\n");
    digitalWrite(s2, LOW);
    digitalWrite(s3, LOW);

  }
  else if (flag == 4)
  {
    flag = 0;
  }
  counter = 0;
}

void loop()
{
  TCS();
  while (1);
}[/mw_shl_code]
 楼主| 发表于 2020-2-24 17:39 | 显示全部楼层
22.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-11-29 23:07 , Processed in 0.072460 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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