单片机交流
直播中

陈艳

7年用户 920经验值
私信 关注
[问答]

怎样去设计一种基于TCS3472XFN的通信颜色识别传感器模块

基于TCS3472XFN的通信颜色识别传感器模块有何优点?
怎样去设计一种基于TCS3472XFN的通信颜色识别传感器模块?

回帖(1)

张辉

2021-9-23 15:53:45
  一、介绍
  本模块是基于 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)。
  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分