【雕爷学编程】Arduino动手做(165)---TCS34725颜色识别模块

发布时间 2023-07-18 10:05:08作者: 行者花雕

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十五:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

 

知识点:TCS3472芯片
TCS3472 器件提供红色、绿色、蓝色 (RGB) 和清晰光感测值的数字返回。 IR阻塞滤波器,集成在芯片上并定位到颜色感应光电二极管,最大限度地减少红外光谱入射光的组成部分,并允许准确地进行颜色测量。灵敏度高,宽动态范围和 IR 阻挡滤波器使 TCS3472 成为理想的颜色传感器解决方案,适用于不同的照明条件和通过衰减材料。

TCS3472 颜色传感器具有广泛的应用,包括 RGB LED 背光控制、固态照明、健康/健身产品、工业过程控制和医疗诊断设备。除此之外IR 阻挡滤波器使 TCS3472 能够执行环境光感测 (ALS)。环境光感测应用广泛用于基于显示的产品,如手机、笔记本电脑和电视,以感知照明环境和启用自动显示亮度以获得最佳观看效果和节能效果。 TCS3472 本身可以输入一个光感测之间的低功耗等待状态,以进一步降低平均功耗。

TCS34725特征
1、红色、绿色、蓝色 (RGB) ,
并清除光红外阻塞过滤器检测
− 可编程模拟增益和积分时间
− 3,800,000:1 动态范围
− 非常高的灵敏度− 比较适合黑玻璃背后的操作

2、可屏蔽中断
− 可编程的上、下阈值与持久性过滤器

3、电源管理
− 低功耗 — 2.5- A 睡眠状态
− 65- 具有可编程等待的等待状态
状态时间从 2.4 ms 到 > 7 秒

4、I2C 快速模式兼容接口
− 数据速率高达 400 kbit/s
− 输入电压电平与 VDD 兼容
或 1.8 V 总线

5、寄存器组和引脚兼容
TCS3x71系列

TCS34725功能框图

TCS3472工作原理
TCS3472 光数字转换器包含一个 3 × 4 光电二极管阵列、四个模数转换器(ADC) 集成光电二极管电流、数据寄存器、状态机和 I2C 接口。 3×4光电二极管阵列由红色过滤、绿色过滤、蓝色过滤和透明(未过滤)光电二极管组成。

此外,光电二极管还涂有红外线阻挡滤光片。四个积分 ADC 同时将放大的光电二极管电流转换为 16 位数字值。转换周期完成后,结果被传送到数据寄存器,这些寄存器是双缓冲的,以确保数据的完整性。全部内部时序以及低功耗等待状态由状态机控制。

TCS3472 数据的通信是通过高达 400 kHz 的快速两线 I2C 串行总线完成的。这行业标准 I2C 总线有助于轻松、直接连接到微控制器和嵌入式处理器。除了 I2C 总线,TCS3472 还提供单独的中断信号输出。当中断是启用,并且超过用户定义的阈值,低电平有效中断被断言并保持断言直到它被控制器清除。这种中断功能简化并提高了系统的效率无需轮询 TCS3472。用户可定义上下中断阈值并应用中断持久性过滤器。中断持久过滤器允许用户定义产生中断之前所需的连续超出阈值事件的数量。中断输出是漏极开路的,因此它可以与其他设备进行线或。

TCS3472 光谱响应

相关技术资料(英文版)
http://pdf-html.ic37.com/pdf_file_B/20200531/pdf_pdf/pdf6/AMSCO/TCS3472_datasheet_1159592/188527/TCS347_datasheet.pdf
傲雪电子(中文版)
[https://www.waveshare.net/w/upload/3/3c/TCS34725_Color_Sensro_user_manual_cn.pdf](https://www.waveshare.net/w/upload/3/3c/TCS34725_Color_Sensro_user_manual_cn.pdf)

TCS34725颜色传感器模块

【简介】
我是一款颜色传感器,支持通过I2C接口输出RGB颜色数据和光照强度,具有高灵敏度、宽动态范围和测量精确等优点。
【特点】
采用TCS34725FN,内置ADC,高灵敏度,宽动态范围
通过I2C接口通信,不会占用太多接口引脚资源
集成红外阻挡滤光片,可大幅度地减少入射光的红外频谱
支持输出RGB颜色数据,不需要白平衡
支持输出光强度,能够得到近似人眼对光的反应
支持光强中断输出,可编程设置上下限阈值
支持LED灯补光控制,可通过PWM调节亮度
板载电平转换电路,可兼容3.3V/5V的工作电平
提供完善的配套资料手册(Raspberry/Arduino/STM32等示例程序)
【参数】
控制芯片:TCS34725FN
通信接口:I2C
工作电压:3.3V/5V
产品尺寸:27mm × 20mm
分辨率:4通道RGBC,每个通道16位
推荐检测距离:2mm
【用途】
颜色排序、感应与校准环境光、产品颜色识别和分类等。

TCS34725颜色识别传感器模块电原理图

TCS34725颜色识别模块概述
本模块是 ams AG 的 TCS34725FN 彩色光数字转换器为核心的颜色传感器,传感器提供红色,绿色,蓝色(RGB)和清晰光感应值的数字输出。集成红外阻挡滤光片可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。具有高灵敏度,宽动态范围和红外阻滤波器。最小化 IR 和 UV 光谱分量效应,以产生准确的颜色测量。并且带有环境光强检测和可屏蔽中断。通过 I2C 接口通信。

参数
工作电压: 3.3V/5V
控制芯片 TCS34725FN
逻辑电压: 3.3V/5V
通信接口: I2C
产品尺寸: 27X20(mm)

接口说明

实验硬件连接示意图

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

  实验一百六十五:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

  项目之一:简单的颜色识别,串口输出识别情况

Arduino实验开源代码

 

/*

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

  实验一百六十五:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

 项目之一:简单的颜色识别,串口输出识别情况

*/

#include "DEV_Config.h"

#include "TCS34725.h"

RGB rgb, RGB888;

UWORD  RGB565 = 0;

void setup() {

 Config_Init();

 if (TCS34725_Init() != 0) {

  Serial.print("TCS34725 初始化错误!\r\n");

  return 0;

 }

 Serial.print("TCS34725 初始化成功!\r\n");

}

void loop() {

 rgb = TCS34725_Get_RGBData();

 RGB888 = TCS34725_GetRGB888(rgb);

 RGB565 = TCS34725_GetRGB565(rgb);

 Serial.print("RGB888 :R=");

 Serial.print(RGB888.R);

 Serial.print(" G=");

 Serial.print(RGB888.G);

 Serial.print(" B=");

 Serial.print(RGB888.B);

 Serial.print("\r\n");

 Serial.print("RGB 编号= 0x");

 Serial.println((RGB565), HEX);

 if (TCS34725_GetLux_Interrupt(0xff00, 0x00ff) == 1) {

  Serial.print("Lux_Interrupt = 1\r\n");

 } else {

  Serial.print("勒克斯中断 = 0\r\n");

 }

 Serial.print("\r\n");

 DEV_Delay_ms(1000);

}

  

实验串口返回情况

实验场景图

实验开源图形编程(Mind+、Mixly、编玩边学)
项目之二:TCS34725颜色识别

实验串口返回情况

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

  实验一百六十五:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

  项目之三:测试Adafruit TCS34725 的突破库

Arduino实验开源代码

 

/*

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

  TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

 项目之三:测试Adafruit TCS34725 的突破库

 模块接线:

 TCS34725 Arduino

 VCC    5V

 GND    GND

 SDA    A4

 SCL    A5

*/

#include <Wire.h>

#include "Adafruit_TCS34725.h"

/* Initialise with default values (int time = 2.4ms, gain = 1x) */

// Adafruit_TCS34725 tcs = Adafruit_TCS34725();

//使用特定的 int 时间和增益值初始化

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);

void setup(void) {

 Serial.begin(9600);

 if (tcs.begin()) {

  Serial.println("Found sensor");

 } else {

  Serial.println("No TCS34725 found ... check your connections");

  while (1);

 }

 // 现在我们准备好获取读数了!

}

void loop(void) {

 uint16_t r, g, b, c, colorTemp, lux;

 tcs.getRawData(&r, &g, &b, &c);

 // colorTemp = tcs.calculateColorTemperature(r, g, b);

 colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);

 lux = tcs.calculateLux(r, g, b);

 Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");

 Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");

 Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");

 Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");

 Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");

 Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");

 Serial.println(" ");

}

  

实验串口返回情况

最简接线法的实验示意图

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

  实验一百六十五:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor

  项目之四:使用 TCS34725 模块的 RGB 灯颜色传感器

Arduino实验开源代码

 

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百九十三:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor
  项目之四:使用 TCS34725 模块的 RGB 灯颜色传感器
*/

#include <Wire.h>
#include "Adafruit_TCS34725.h"

#define redpin 3
#define greenpin 5
#define bluepin 6

#define commonAnode false
byte gammatable[256];
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup() {
  Serial.begin(9600);
  Serial.println("Color View Test!");

  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1); // halt!
  }

  // use these three pins to drive an LED
  pinMode(redpin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  pinMode(bluepin, OUTPUT);

  for (int i = 0; i < 256; i++) {
    float x = i;
    x /= 255;
    x = pow(x, 2.5);
    x *= 255;

    if (commonAnode) {
      gammatable[i] = 255 - x;
    } else {
      gammatable[i] = x;
    }
    //Serial.println(gammatable[i]);
  }
}

void loop() {
  uint16_t clear, red, green, blue;
  tcs.setInterrupt(false);      // turn on LED
  delay(60);
  tcs.getRawData(&red, &green, &blue, &clear);
  tcs.setInterrupt(true);

  Serial.print("C:\t"); Serial.print(clear);
  Serial.print("\tR:\t"); Serial.print(red);
  Serial.print("\tG:\t"); Serial.print(green);
  Serial.print("\tB:\t"); Serial.print(blue);

  // Figure out some basic hex code for visualization
  uint32_t sum = clear;
  float r, g, b;
  r = red; r /= sum;
  g = green; g /= sum;
  b = blue; b /= sum;
  r *= 256; g *= 256; b *= 256;
  Serial.print("\t");
  Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX);
  Serial.println();

  //Serial.print((int)r ); Serial.print(" "); Serial.print((int)g);Serial.print(" ");  Serial.println((int)b );
  analogWrite(redpin, gammatable[(int)r]);
  analogWrite(greenpin, gammatable[(int)g]);
  analogWrite(bluepin, gammatable[(int)b]);
}

  

代码分解:

#define redpin 3
#define greenpin 5
#define bluepin 6

这部分是您将 RGB 引脚分配到 arduino 的地方。这里选择了 3 作为红色引脚,5 作为绿色引脚,6 作为蓝色引脚,最后一个引脚用于 GND,因为使用了一个普通的 共阴极 RGB LED。如果您使用的是共阳极,则应将其接VCC。

#define commonAnode false

如果使用了通用阳极 RGB LED,请将其设置为 true。

pinMode(redpin, OUTPUT);
pinMode(greenpin, OUTPUT);
pinMode(bluepin, OUTPUT);

在这部分中,我们将 RGB LED 指定为 RGB 传感器的输出。我们使用这三个引脚驱动的 RGB LED。

analogWrite(redpin, gammatable[(int)r]);
analogWrite(greenpin, gammatable[(int)g]);
analogWrite(bluepin, gammatable[(int)b]);

最后,使用了 AnalogWrite函数,因为与 DigitalWrite函数相比,我们希望我们的输出为任意数字(模拟量),而DigitalWrite输出只有 HIGH 和 LOW(数字量)。

 

实验串口返回情况

测量红色物体,RGB灯发红色光

测量红色物体,RGB灯发红色光,实验串口返回情况

 

测量绿色物体,RGB灯发绿色光

测量绿色物体,RGB灯发绿色光,实验串口返回情况