TCS34725颜色感应识别模块
- 前言
- 一、模块介绍
- 二、产品参数
- 三、实物图
- 四、模块引脚介绍
- 五、使用说明
- 工作模式的选择
- 上位机界面说明
- 六、实例应用
- 实物接线
- 所用代码
前言
TCS34725传感器模块,使用IIC或者UART通信,可直接输出RGB值。
能当做单纯的简单TCS34725模块使用,还能用内部MCU读取TCS34725数据,MCU计算后直接输出RGB,内部白平衡程序。
一、模块介绍
TCS34725是一款低成本颜色识别传感器模块。有功耗小,体积小,安装方便的优势。
其工作原理是,通过照明LED发光,照射到被测物体后,返回光经过滤镜检测RGB的比例值,根据RGB的比例值识别出颜色。
模块具有两种方式读取数据,即串口UART(TTL电平)或者IIC(2线),串口的波特率有9600bps与115200bps可配置,有连续、询问输出两种方式还能掉电保存设置。
还可以进行简单的7种颜色识别,不需要计算RGB值。能适应不同的工作环境,与单片机及电脑连接。
模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU不参与数据处理工作。
二、产品参数
名称 | 参数 |
---|---|
测量范围 | RGB 0-255 |
响应频率 | 10HZ |
工作电压 | 3~5V(DC) |
工作电流 | 15mA |
工作温度 | -20~85℃ |
传感器芯片 | TCS34725 |
三、实物图
四、模块引脚介绍
引脚名称 | 功能作用 |
---|---|
VCC | 电源输入+(3-5V) |
CT | 串口UART_TX / IIC_SCL |
DR | 串口UART_RX / IIC_SDA |
GND | 电源输出(地) |
NC | 保留,无需连接,建议悬空 |
INT | TCS34725颜色芯片中断 S1=0 (接GND时启用) |
SDA | TCS34725颜色芯片数据线 S1=0 (接GND时启用) |
SCL | TCS34725颜色芯片时钟线 S1=0 (接GND时启用) |
S0 | 串口 / MCU_IIC模式选择 |
S1 | 仅使用传感器芯片(IIC)模式选择 |
相信很多人没看懂s0和s1这个两个引脚的作用。别急,我们留到使用说明时再详细讲解。
五、使用说明
工作模式的选择
TCS34725模块为串口和IIC输出模块,其默认为串口模式。
模块左边的S0引脚处于断开状态则为串口模式;
模块左边的S0引脚接GND,模块进入IIC模式;
将模块右边的S1引脚接GND,模块进入仅用传感器芯片(IIC)模式。
串口模式下,使用该模块配套的上位机可方便的对模块进行相应的设置,上位机command框对应模块串口的command 寄存器,在相应位置 1,然后点右下角的“发送”按钮,即对模块进行了设置,模块将向外发送相应数据,数据将显示在左侧对应的方框中。
MCU_IIC 通信模式下,通信时钟需在 40Khz~200Khz 之间,通过读取相应寄存器即可,全部数据读取间隔应小于 10hz;
IIC 对模块的配置支持“LED 亮度调节”、“白平衡校准”。
仅用传感器芯片模式下,模块的 MCU 不对颜色芯片进行设置和读取,用户还可通过串口或 IIC 控制模块的 LED 亮度等级。可用INT、SCL、SDA 引脚直接控制颜色芯片
上位机界面说明
六、实例应用
本次选用IIC通信模式,使用Arduino UNOR3开发板进行测试
实物接线
所用代码
主程序:
#include <i2cmaster.h>/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/
/*
uart
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{uint16_t Red;uint16_t Green;uint16_t Blue;uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};void setup() {Serial.begin(115200);i2c_init();delay(1);
}
void loop() {unsigned char data[9]={0};if(!sign){iic_read(0x00,data,8);rgb.Red=(data[0]<<8)|data[1];rgb.Green=(data[2]<<8)|data[3];rgb.Blue=(data[4]<<8)|data[5];rgb.Clear=(data[6]<<8)|data[7];Serial.print("Red: ");Serial.print(rgb.Red);Serial.print(",Green: ");Serial.print( rgb.Green);Serial.print(",Blue");Serial.print( rgb.Blue);Serial.print(",Clear");Serial.println(rgb.Clear);iic_read(0x08,data,4);Lux=(data[0]<<8)|data[1];CT=(data[2]<<8)|data[3];Serial.print("CT:");Serial.print(CT);Serial.print(",Lux:");Serial.println( Lux);iic_read(0x0c,data,3);rgb_data[0]=data[0];rgb_data[1]=data[1];rgb_data[2]=data[2];Serial.print("r:");Serial.print( rgb_data[0]);Serial.print(",g:"); Serial.print( rgb_data[1]);Serial.print(",b:"); Serial.println( rgb_data[2]);iic_read(0x0f,data,1); color=data[0];Serial.print(",color:"); Serial.println( color,HEX);}if(sign==1){iic_read(0x10,&data[8],1);i2c_start_wait(0xb4);i2c_write(0x10);i2c_write(0x31);// i2c_write((data[8]|0x01));i2c_stop();sign=3;}delay(200);
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{i2c_start_wait(0xb4);i2c_write(add);i2c_start_wait(0xb5);while(len-1){*data++=i2c_readAck();len--;}*data=i2c_readNak();i2c_stop();
}
void serialEvent() {while (Serial.available()) { Re_buf=(unsigned char)Serial.read();if (Re_buf=='a')sign=0;if (Re_buf=='b') sign=1; Re_buf=0; }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/
/*
uart
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{uint16_t Red;uint16_t Green;uint16_t Blue;uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};void setup() {Serial.begin(115200);i2c_init();delay(1);
}
void loop() {unsigned char data[9]={0};if(!sign){iic_read(0x00,data,8);rgb.Red=(data[0]<<8)|data[1];rgb.Green=(data[2]<<8)|data[3];rgb.Blue=(data[4]<<8)|data[5];rgb.Clear=(data[6]<<8)|data[7];Serial.print("Red: ");Serial.print(rgb.Red);Serial.print(",Green: ");Serial.print( rgb.Green);Serial.print(",Blue");Serial.print( rgb.Blue);Serial.print(",Clear");Serial.println(rgb.Clear);iic_read(0x08,data,4);Lux=(data[0]<<8)|data[1];CT=(data[2]<<8)|data[3];Serial.print("CT:");Serial.print(CT);Serial.print(",Lux:");Serial.println( Lux);iic_read(0x0c,data,3);rgb_data[0]=data[0];rgb_data[1]=data[1];rgb_data[2]=data[2];Serial.print("r:");Serial.print( rgb_data[0]);Serial.print(",g:"); Serial.print( rgb_data[1]);Serial.print(",b:"); Serial.println( rgb_data[2]);iic_read(0x0f,data,1); color=data[0];Serial.print(",color:"); Serial.println( color,HEX);}if(sign==1){iic_read(0x10,&data[8],1);i2c_start_wait(0xb4);i2c_write(0x10);i2c_write(0x31);// i2c_write((data[8]|0x01));i2c_stop();sign=3;}delay(200);
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{i2c_start_wait(0xb4);i2c_write(add);i2c_start_wait(0xb5);while(len-1){*data++=i2c_readAck();len--;}*data=i2c_readNak();i2c_stop();
}
void serialEvent() {while (Serial.available()) { Re_buf=(unsigned char)Serial.read();if (Re_buf=='a')sign=0;if (Re_buf=='b') sign=1; Re_buf=0; }
}
i2cmaster.h
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
//*
uart
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{uint16_t Red;uint16_t Green;uint16_t Blue;uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};void setup() {Serial.begin(115200);i2c_init();delay(1);
}
void loop() {unsigned char data[9]={0};if(!sign){iic_read(0x00,data,8);rgb.Red=(data[0]<<8)|data[1];rgb.Green=(data[2]<<8)|data[3];rgb.Blue=(data[4]<<8)|data[5];rgb.Clear=(data[6]<<8)|data[7];Serial.print("Red: ");Serial.print(rgb.Red);Serial.print(",Green: ");Serial.print( rgb.Green);Serial.print(",Blue");Serial.print( rgb.Blue);Serial.print(",Clear");Serial.println(rgb.Clear);iic_read(0x08,data,4);Lux=(data[0]<<8)|data[1];CT=(data[2]<<8)|data[3];Serial.print("CT:");Serial.print(CT);Serial.print(",Lux:");Serial.println( Lux);iic_read(0x0c,data,3);rgb_data[0]=data[0];rgb_data[1]=data[1];rgb_data[2]=data[2];Serial.print("r:");Serial.print( rgb_data[0]);Serial.print(",g:"); Serial.print( rgb_data[1]);Serial.print(",b:"); Serial.println( rgb_data[2]);iic_read(0x0f,data,1); color=data[0];Serial.print(",color:"); Serial.println( color,HEX);}if(sign==1){iic_read(0x10,&data[8],1);i2c_start_wait(0xb4);i2c_write(0x10);i2c_write(0x31);// i2c_write((data[8]|0x01));i2c_stop();sign=3;}delay(200);
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{i2c_start_wait(0xb4);i2c_write(add);i2c_start_wait(0xb5);while(len-1){*data++=i2c_readAck();len--;}*data=i2c_readNak();i2c_stop();
}
void serialEvent() {while (Serial.available()) { Re_buf=(unsigned char)Serial.read();if (Re_buf=='a')sign=0;if (Re_buf=='b') sign=1; Re_buf=0; }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
//*
uart
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{uint16_t Red;uint16_t Green;uint16_t Blue;uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};void setup() {Serial.begin(115200);i2c_init();delay(1);
}
void loop() {unsigned char data[9]={0};if(!sign){iic_read(0x00,data,8);rgb.Red=(data[0]<<8)|data[1];rgb.Green=(data[2]<<8)|data[3];rgb.Blue=(data[4]<<8)|data[5];rgb.Clear=(data[6]<<8)|data[7];Serial.print("Red: ");Serial.print(rgb.Red);Serial.print(",Green: ");Serial.print( rgb.Green);Serial.print(",Blue");Serial.print( rgb.Blue);Serial.print(",Clear");Serial.println(rgb.Clear);iic_read(0x08,data,4);Lux=(data[0]<<8)|data[1];CT=(data[2]<<8)|data[3];Serial.print("CT:");Serial.print(CT);Serial.print(",Lux:");Serial.println( Lux);iic_read(0x0c,data,3);rgb_data[0]=data[0];rgb_data[1]=data[1];rgb_data[2]=data[2];Serial.print("r:");Serial.print( rgb_data[0]);Serial.print(",g:"); Serial.print( rgb_data[1]);Serial.print(",b:"); Serial.println( rgb_data[2]);iic_read(0x0f,data,1); color=data[0];Serial.print(",color:"); Serial.println( color,HEX);}if(sign==1){iic_read(0x10,&data[8],1);i2c_start_wait(0xb4);i2c_write(0x10);i2c_write(0x31);// i2c_write((data[8]|0x01));i2c_stop();sign=3;}delay(200);
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{i2c_start_wait(0xb4);i2c_write(add);i2c_start_wait(0xb5);while(len-1){*data++=i2c_readAck();len--;}*data=i2c_readNak();i2c_stop();
}
void serialEvent() {while (Serial.available()) { Re_buf=(unsigned char)Serial.read();if (Re_buf=='a')sign=0;if (Re_buf=='b') sign=1; Re_buf=0; }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
//*
uart
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{uint16_t Red;uint16_t Green;uint16_t Blue;uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};void setup() {Serial.begin(115200);i2c_init();delay(1);
}
void loop() {unsigned char data[9]={0};if(!sign){iic_read(0x00,data,8);rgb.Red=(data[0]<<8)|data[1];rgb.Green=(data[2]<<8)|data[3];rgb.Blue=(data[4]<<8)|data[5];rgb.Clear=(data[6]<<8)|data[7];Serial.print("Red: ");Serial.print(rgb.Red);Serial.print(",Green: ");Serial.print( rgb.Green);Serial.print(",Blue");Serial.print( rgb.Blue);Serial.print(",Clear");Serial.println(rgb.Clear);iic_read(0x08,data,4);Lux=(data[0]<<8)|data[1];CT=(data[2]<<8)|data[3];Serial.print("CT:");Serial.print(CT);Serial.print(",Lux:");Serial.println( Lux);iic_read(0x0c,data,3);rgb_data[0]=data[0];rgb_data[1]=data[1];rgb_data[2]=data[2];Serial.print("r:");Serial.print( rgb_data[0]);Serial.print(",g:"); Serial.print( rgb_data[1]);Serial.print(",b:"); Serial.println( rgb_data[2]);iic_read(0x0f,data,1); color=data[0];Serial.print(",color:"); Serial.println( color,HEX);}if(sign==1){iic_read(0x10,&data[8],1);i2c_start_wait(0xb4);i2c_write(0x10);i2c_write(0x31);// i2c_write((data[8]|0x01));i2c_stop();sign=3;}delay(200);
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{i2c_start_wait(0xb4);i2c_write(add);i2c_start_wait(0xb5);while(len-1){*data++=i2c_readAck();len--;}*data=i2c_readNak();i2c_stop();
}
void serialEvent() {while (Serial.available()) { Re_buf=(unsigned char)Serial.read();if (Re_buf=='a')sign=0;if (Re_buf=='b') sign=1; Re_buf=0; }
}