一、介绍
本模块是基于 AMS 的 TCS3472XFN 彩色光数字转换器为核心的颜色传感器,传感器提供红色,绿色,蓝色(RGB)和清晰光感应值的数字输出。集成红外阻挡滤光片可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。具有高灵敏度,宽动态范围和红外阻隔滤波器。最小化 IR 和 UV 光谱分量效应,以产生准确的颜色测量。并且带有环境光强检测和可屏蔽中断。通过 I2C 接口通信。
二、 参数
工作电压:3.3V/5V
控制芯片:TCS3472XFN
逻辑电压:3.3V/5V
通信接口:I2C
三、原理图
四、通信协议
1. I2C 通信:
一条数据线(SDA),一条时钟线(SCL)。
I2C 总线在传送数据 过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据 I2C 写时序 。
2. I2C 写时序:
首先主机会发送一个开始信号,然后将其 I2C 的 7 位地 址与写操作位组合成8 位的数据发送给从机, 从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机,从机接收到发送 响应信号,此时主机发送命令寄存的值,从机回应一个响应信号,直到主机发送一个停止信 号,此次 I2C 写数据操作结束。
3. I2C 读时序:
首先主机会发送一个开始信号,然后将其 I2C 的 7 位地址与写操作位组合成 8位的数 据发送给从机,从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机, 从机接收到发送响应信号,此时主机重新发送一个开始信号,并且将其 7 位地址和读操作位 组合成 8 位的数据发送给从机,从机接收到信号后发送响应信号,再将其寄存器中的值发送 给主机,主机端给予响应信号,直到主机端发送停止信号,此次通信结束。
4. I2C 地址:
I2C 设备地址为 0X29
注意:0X29 这个设备地址是 7 位的,8 位设备地址需要向高位移一位变成 0X52。
五、实验
测试使用的是 ARDUION UNO 开发板,波特率为 115200。
测试代码
#include 《Wire.h》
#include “MH_TCS34725.h”
#include 《Adafruit_NeoPixel.h》
#ifdef __AVR__
#include 《avr/power.h》
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN 6
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16
// our RGB -》 eye-recognized gamma color
byte gammatable[256];
MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
Serial.println(“Color View Test!”);
if (tcs.begin()) {
Serial.println(“Found sensor”);
} else {
Serial.println(“No TCS34725 found 。.. check your connections”);
while (1); // halt!
}
pixels.begin(); // This initializes the NeoPixel library.
// thanks PhilB for this gamma table!
// it helps convert RGB colors to what humans see
for (int i=0; i《256; i++) {
float x = i;
x /= 255;
x = pow(x, 2.5);
x *= 255;
gammatable[i] = x;
}
}
void loop() {
uint16_t clear, red, green, blue;//clear 函数的使用 ????
tcs.getRGBC(&red, &green, &blue, &clear);
tcs.lock(); // turn off LED
// 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(“t”);
Serial.print((int)g, HEX);
Serial.print(“t”);
Serial.print((int)b, HEX);
delay(1000);
Serial.print(“t”);
Serial.print((int)r, BIN);
Serial.print(“t”);
Serial.print((int)g, BIN);
Serial.print(“t”);
Serial.print((int)b, BIN);
delay(1000);
Serial.print(“t”);
Serial.print((int)r);
Serial.print(“t”);
Serial.print((int)g);
Serial.print(“t”);
Serial.print((int)b);
Serial.println();
//Serial.print((int)r ); Serial.print(“ ”); Serial.print((int)g);Serial.print(“ ”); Serial.println((int)b );
//Set the color lamp
for(int i=0;i《NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(gammatable[(int)r], gammatable[(int)g], gammatable[(int)b])); // Moderately bright green color.
// pixels.setPixelColor(i, pixels.Color((int)r, (int)g, (int)b));
pixels.show(); // This sends the updated pixel color to the hardware.
// delay(500); // Delay for a period of time (in milliseconds)。
}
}
一、介绍
本模块是基于 AMS 的 TCS3472XFN 彩色光数字转换器为核心的颜色传感器,传感器提供红色,绿色,蓝色(RGB)和清晰光感应值的数字输出。集成红外阻挡滤光片可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。具有高灵敏度,宽动态范围和红外阻隔滤波器。最小化 IR 和 UV 光谱分量效应,以产生准确的颜色测量。并且带有环境光强检测和可屏蔽中断。通过 I2C 接口通信。
二、 参数
工作电压:3.3V/5V
控制芯片:TCS3472XFN
逻辑电压:3.3V/5V
通信接口:I2C
三、原理图
四、通信协议
1. I2C 通信:
一条数据线(SDA),一条时钟线(SCL)。
I2C 总线在传送数据 过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据 I2C 写时序 。
2. I2C 写时序:
首先主机会发送一个开始信号,然后将其 I2C 的 7 位地 址与写操作位组合成8 位的数据发送给从机, 从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机,从机接收到发送 响应信号,此时主机发送命令寄存的值,从机回应一个响应信号,直到主机发送一个停止信 号,此次 I2C 写数据操作结束。
3. I2C 读时序:
首先主机会发送一个开始信号,然后将其 I2C 的 7 位地址与写操作位组合成 8位的数 据发送给从机,从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机, 从机接收到发送响应信号,此时主机重新发送一个开始信号,并且将其 7 位地址和读操作位 组合成 8 位的数据发送给从机,从机接收到信号后发送响应信号,再将其寄存器中的值发送 给主机,主机端给予响应信号,直到主机端发送停止信号,此次通信结束。
4. I2C 地址:
I2C 设备地址为 0X29
注意:0X29 这个设备地址是 7 位的,8 位设备地址需要向高位移一位变成 0X52。
五、实验
测试使用的是 ARDUION UNO 开发板,波特率为 115200。
测试代码
#include 《Wire.h》
#include “MH_TCS34725.h”
#include 《Adafruit_NeoPixel.h》
#ifdef __AVR__
#include 《avr/power.h》
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN 6
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16
// our RGB -》 eye-recognized gamma color
byte gammatable[256];
MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
Serial.println(“Color View Test!”);
if (tcs.begin()) {
Serial.println(“Found sensor”);
} else {
Serial.println(“No TCS34725 found 。.. check your connections”);
while (1); // halt!
}
pixels.begin(); // This initializes the NeoPixel library.
// thanks PhilB for this gamma table!
// it helps convert RGB colors to what humans see
for (int i=0; i《256; i++) {
float x = i;
x /= 255;
x = pow(x, 2.5);
x *= 255;
gammatable[i] = x;
}
}
void loop() {
uint16_t clear, red, green, blue;//clear 函数的使用 ????
tcs.getRGBC(&red, &green, &blue, &clear);
tcs.lock(); // turn off LED
// 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(“t”);
Serial.print((int)g, HEX);
Serial.print(“t”);
Serial.print((int)b, HEX);
delay(1000);
Serial.print(“t”);
Serial.print((int)r, BIN);
Serial.print(“t”);
Serial.print((int)g, BIN);
Serial.print(“t”);
Serial.print((int)b, BIN);
delay(1000);
Serial.print(“t”);
Serial.print((int)r);
Serial.print(“t”);
Serial.print((int)g);
Serial.print(“t”);
Serial.print((int)b);
Serial.println();
//Serial.print((int)r ); Serial.print(“ ”); Serial.print((int)g);Serial.print(“ ”); Serial.println((int)b );
//Set the color lamp
for(int i=0;i《NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(gammatable[(int)r], gammatable[(int)g], gammatable[(int)b])); // Moderately bright green color.
// pixels.setPixelColor(i, pixels.Color((int)r, (int)g, (int)b));
pixels.show(); // This sends the updated pixel color to the hardware.
// delay(500); // Delay for a period of time (in milliseconds)。
}
}
举报