回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器2 中等

头像 驴友花雕 2023.07.24 21 2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块
 

04.jpg

知识点:TCS3200D
是TAOS(Texas Advanced Optoelectronic Solutions)公司推出的可编程彩色光到频率的转换器。它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上还集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器。TCS3200D的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其它逻辑电路相连接。由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单。该颜色传感器主要可用于尿液分析仪,生化分析仪,验钞机等需要检测颜色的产品上。
 

000.jpg

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

 

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

 

02-.jpg
 

 

模块电原理图
 

06 (1).jpg

Arduino实验接线示意图

 

07 (1).jpg

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

实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块

实验程序之三:颜色识别感应

Arduino参考开源代码


 

代码
/*
  【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);
}

实验串口返回情况

 

22.jpg

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

实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块

项目之五:颜色传感器识别测试

 

24 (1).jpg
26.jpg

27.jpg
28.jpg
29.jpg

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

实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块

项目之五:颜色传感器识别测试

Arduino参考开源代码
 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验六十四: TCS3200D颜色识别传感器(可编程彩色光频识别转换器模块)
  项目之五:颜色传感器识别测试
*/

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// 存储光电二极管读取的频率
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

//存储红色、绿色和蓝色
int redColor = 0;
int greenColor = 0;
int blueColor = 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);

  // 以 115200 bps 初始化串行通信
  Serial.begin(115200);
}

void loop() {
  // 设置要读取的 RED (R) 滤波光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  // 读取输出频率
  redFrequency = pulseIn(sensorOut, LOW);
  // 将 RED (R) 频率的值从 0 重新映射到 255
  // 你必须用你自己的值替换。下面是一个例子:
  // redColor = map(redFrequency, 62, 115, 255,0);
  redColor = map(redFrequency, 30, 313, 255, 0);//白,红色R为255

  // Printing the RED (R) value
  Serial.print("R = ");
  Serial.print(redColor);
  delay(100);

  // Setting GREEN (G) filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);

  // Reading the output frequency
  greenFrequency = pulseIn(sensorOut, LOW);
  // Remaping the value of the GREEN (G) frequency from 0 to 255
  // You must replace with your own values. Here's an example:
  // greenColor = map(greenFrequency, 89, 185, 255, 0);
  greenColor = map(greenFrequency, 38, 440, 255, 0);//白、绿色为G255

  // Printing the GREEN (G) value
  Serial.print(" G = ");
  Serial.print(greenColor);
  delay(100);

  // Setting BLUE (B) filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);

  // Reading the output frequency
  blueFrequency = pulseIn(sensorOut, LOW);
  // Remaping the value of the BLUE (B) frequency from 0 to 255
  // You must replace with your own values. Here's an example:
  // blueColor = map(blueFrequency, 35, 79, 255, 0);
  blueColor = map(blueFrequency, 30, 300, 255, 0);

  // Printing the BLUE (B) value
  Serial.print(" B = ");
  Serial.print(blueColor);
  delay(100);

  // Checks the current detected color and prints
  // a message in the serial monitor
  if (redColor > greenColor && redColor > blueColor) {
    Serial.println(" - RED detected!");
  }
  if (greenColor > redColor && greenColor > blueColor) {
    Serial.println(" - GREEN detected!");
  }
  if (blueColor > redColor && blueColor > greenColor) {
    Serial.println(" - BLUE detected!");
  }
}

实验串口返回情况
测白色

 

30.jpg

Arduino实验场景图

 

31.jpg

Arduino实验接线示意图

 

32.jpg

25.jpg

评论

user-avatar
  • 伦**

    伦**2024.03.31

    666

    0
    • hacker_

      hacker_2023.08.09

      666

      0
      icon 他的勋章
        展开更多