“颜色传感器”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
程序
第3行: 第3行:
 
|-
 
|-
 
|
 
|
==目的==
+
==概述==
 +
颜色传感器采用TCS3414CS色彩芯片,通过I2C接口进行连接。基于8×2过滤光电二极管和16位模拟-数位转换器,你通过可以测量光线或物体表面的光反射来获得颜色值。
  
本教程将教大家如何使用Mcookie的颜色传感器。
+
==规则==
 +
*电气特性
 +
**工作电压: 3.3 ~6.0 V
 +
**工作温度 : -40 ~ 85  °C
 +
*尺寸
 +
*模块尺寸:2.0cm*2.0cm
 +
*接口
 +
*接口:1.27mm*4pin
 +
*接口构成:SCL,SDA,VCC,GND
  
==设备==
+
==开发==
*'''[[Microduino-CoreUSB/zh]]'''
+
===设备===
*'''[[Microduino-Lantern/zh]]'''
+
*'''[[mCookie-CoreUSB/zh]]'''
 
*'''[[Microduino-Color detector/zh]]'''
 
*'''[[Microduino-Color detector/zh]]'''
*'''[[Microduino-Sensorhub/zh]]'''
+
*'''[[mCookie-Hub/zh]]'''
 
 
  
 
*其他硬件设备
 
*其他硬件设备
 
**USB数据连接线  一根
 
**USB数据连接线  一根
 +
[[File:Reflcect.jpg|400px|center]]
  
 +
===准备===
 +
*Setup 1:将颜色传感器接口和Hub的IIC接起来。
 +
[[file:mCookie-shock-sensor.JPG|600px|center]]
 +
*Setup 2:将CoreUSB,Hub,颜色传感器连接在一起。通过USB数据线将接入电脑。
 +
[[file:mCookie-shock-pc.JPG|600px|center]]
  
==程序==
+
===调试===
 
+
*打开Arduino IDE,将下列代码复制到IDE中。
 
+
<source lang="cpp">
[[https://github.com/Microduino/Microduino_Tutorials/tree/df0a1175ef707a5c541c6cf37efa4b83dbeb6030/mCookie_sensor/MicroduinoColorSensor MicroduinoColorSensor]]
+
#include <Wire.h>
 
+
#include <math.h>
==调试==
+
#define COLOR_SENSOR_ADDR  0x39//the I2C address for the color sensor
 
+
#define REG_CTL 0x80
步骤一:
+
#define REG_TIMING 0x81
把Microduino的LED灯插到Microduino-SensorHub的D6引脚,再把Microduino的颜色传感器插到IIC引脚。
+
#define REG_INT 0x82
[[File:McookieColorDetector.png|600px|center|thumb]]
+
#define REG_INT_SOURCE 0x83
 
+
#define REG_ID 0x84
 
+
#define REG_GAIN 0x87
步骤二:
+
#define REG_LOW_THRESH_LOW_BYTE 0x88
用USB线连接电脑,下载代码并烧录到Microduino-CoreUSB中。
+
#define REG_LOW_THRESH_HIGH_BYTE 0x89
[[File:McookieColorDetector1.png|600px|center|thumb]]
+
#define REG_HIGH_THRESH_LOW_BYTE 0x8A
 
+
#define REG_HIGH_THRESH_HIGH_BYTE 0x8B
 
+
#define REG_BLOCK_READ 0xCF
步骤三:
+
#define REG_GREEN_LOW 0xD0
烧录完毕后,确定颜色传感器的开关开着,传感器对着各种颜色,查看led灯的变化:
+
#define REG_GREEN_HIGH 0xD1
[[File:McookieColorDetector2.png|600px|center|thumb]]
+
#define REG_RED_LOW 0xD2
 
+
#define REG_RED_HIGH 0xD3
 
+
#define REG_BLUE_LOW 0xD4
步骤四:
+
#define REG_BLUE_HIGH 0xD5
Led灯应该随着传感器的变化而变化出相应的颜色。
+
#define REG_CLEAR_LOW 0xD6
[[File:McookieColorDetector3.png|600px|center|thumb]]
+
#define REG_CLEAR_HIGH 0xD7
 
+
#define CTL_DAT_INIITIATE 0x03
 +
#define CLR_INT 0xE0
 +
//Timing Register
 +
#define SYNC_EDGE 0x40
 +
#define INTEG_MODE_FREE 0x00
 +
#define INTEG_MODE_MANUAL 0x10
 +
#define INTEG_MODE_SYN_SINGLE 0x20
 +
#define INTEG_MODE_SYN_MULTI 0x30
 +
 +
#define INTEG_PARAM_PULSE_COUNT1 0x00
 +
#define INTEG_PARAM_PULSE_COUNT2 0x01
 +
#define INTEG_PARAM_PULSE_COUNT4 0x02
 +
#define INTEG_PARAM_PULSE_COUNT8 0x03
 +
//Interrupt Control Register
 +
#define INTR_STOP 40
 +
#define INTR_DISABLE 0x00
 +
#define INTR_LEVEL 0x10
 +
#define INTR_PERSIST_EVERY 0x00
 +
#define INTR_PERSIST_SINGLE 0x01
 +
//Interrupt Souce Register
 +
#define INT_SOURCE_GREEN 0x00
 +
#define INT_SOURCE_RED 0x01
 +
#define INT_SOURCE_BLUE 0x10
 +
#define INT_SOURCE_CLEAR 0x03
 +
//Gain Register
 +
#define GAIN_1 0x00
 +
#define GAIN_4 0x10
 +
#define GAIN_16 0x20
 +
#define GANI_64 0x30
 +
#define PRESCALER_1 0x00
 +
#define PRESCALER_2 0x01
 +
#define PRESCALER_4 0x02
 +
#define PRESCALER_8 0x03
 +
#define PRESCALER_16 0x04
 +
#define PRESCALER_32 0x05
 +
#define PRESCALER_64 0x06
 +
 +
int readingdata[20];
 +
int i,green,red,blue,clr,ctl;
 +
double X,Y,Z,x,y,z;
 +
void setup()
 +
 +
Serial.begin(9600);
 +
Wire.begin(); // join i2c bus (address optional for master)
 +
}
 +
void loop()
 +
{
 +
  setTimingReg(INTEG_MODE_FREE);//Set trigger mode.Including free mode,manually mode,single synchronizition mode or so.
 +
  setInterruptSourceReg(INT_SOURCE_GREEN); //Set interrupt source
 +
  setInterruptControlReg(INTR_LEVEL|INTR_PERSIST_EVERY);//Set interrupt mode
 +
  setGain(GAIN_1|PRESCALER_4);//Set gain value and prescaler value
 +
  setEnableADC();//Start ADC of the color sensor
 +
  while(1)
 +
{
 +
  readRGB();
 +
  calculateCoordinate();
 +
  delay(1000);
 +
  clearInterrupt(); 
 +
}
 +
}
 +
/************************************/
 +
void setTimingReg(int x)
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_TIMING);
 +
  Wire.write(x);
 +
  Wire.endTransmission(); 
 +
  delay(100);
 +
}
 +
void setInterruptSourceReg(int x)
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_INT_SOURCE);
 +
  Wire.write(x);
 +
  Wire.endTransmission(); 
 +
  delay(100);
 +
}
 +
void setInterruptControlReg(int x)
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_INT);
 +
  Wire.write(x);
 +
  Wire.endTransmission(); 
 +
  delay(100);
 +
}
 +
void setGain(int x)
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_GAIN);
 +
  Wire.write(x);
 +
  Wire.endTransmission();
 +
}
 +
void setEnableADC()
 +
{
 +
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_CTL);
 +
  Wire.write(CTL_DAT_INIITIATE);
 +
  Wire.endTransmission(); 
 +
  delay(100); 
 +
}
 +
void clearInterrupt()
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(CLR_INT);
 +
  Wire.endTransmission();
 +
}
 +
void readRGB()
 +
{
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.write(REG_BLOCK_READ);
 +
  Wire.endTransmission();
 +
 +
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
 +
  Wire.requestFrom(COLOR_SENSOR_ADDR,8);
 +
  delay(500);
 +
  if(8<= Wire.available())    // if two bytes were received
 +
  {
 +
    for(i=0;i<8;i++)
 +
    {
 +
      readingdata[i]=Wire.read();
 +
      //Serial.println(readingdata[i],BIN);
 +
    }
 +
  }
 +
  green=readingdata[1]*256+readingdata[0];
 +
  red=readingdata[3]*256+readingdata[2];
 +
  blue=readingdata[5]*256+readingdata[4];
 +
  clr=readingdata[7]*256+readingdata[6];
 +
  Serial.println("The RGB value and Clear channel value are");
 +
  Serial.println(red,DEC);
 +
  Serial.println(green,DEC);
 +
  Serial.println(blue,DEC);
 +
  Serial.println(clr,DEC); 
 +
}
 +
void calculateCoordinate()
 +
{
 +
  X=(-0.14282)*red+(1.54924)*green+(-0.95641)*blue;
 +
  Y=(-0.32466)*red+(1.57837)*green+(-0.73191)*blue;
 +
  Z=(-0.68202)*red+(0.77073)*green+(0.56332)*blue;
 +
  x=X/(X+Y+Z);
 +
  y=Y/(X+Y+Z);
 +
  if((X>0)&&(Y>0)&&(Z>0))
 +
  {
 +
    Serial.println("The x,y value is");
 +
Serial.print("(");
 +
    Serial.print(x,2);
 +
Serial.print(" , ");
 +
    Serial.print(y,2);
 +
Serial.println(")");
 +
Serial.println("Please reference the figure(Chromaticity Diagram) in the wiki ");
 +
Serial.println("so as to get the recommended color.");
 +
  }
 +
else
 +
Serial.println("Error,the value overflow");
 +
}
 +
</source>
 +
*选择正确的板卡和COM端口,编译通过后直接下载。
 +
[[file:upload.JPG|400px|center]]
 +
*打开串口监视器。
 +
[[file:comxx.JPG|400px|center]]
 +
**获得X、Y结果后,根据下图得到对应的颜色值。
 +
[[file:Chromaticity_Diagram.jpg|400px|center]]
 +
== 拓展阅读 ==
  
==结果==
+
色彩传感器使用的是TCS3414CS色彩芯片,检测的返回数据包含4个通道:红色(R)、绿色(G)、蓝色(B)、空白(C),然后这4个通道的数据可以转化为色度图上的X、Y值。这个转化是依据Commission Internationale de l’Eclairage (CIE)的标准。<br />
  
你可以通过颜色传感器检测出的颜色来控制led灯的颜色了。
+
  [[File:Coordinates transform.png|thumb|left|400px|Chromaticity Calculation Process Overview]]
 +
<br clear="all">
 +
 +
通过下面的方程进行转化: <br>[[File:Equations.png|thumb|left|400px|Transformation Equations]]<br clear="all">
  
 
==视频==
 
==视频==
  
 
|}
 
|}

2015年10月27日 (二) 05:34的版本

概述

颜色传感器采用TCS3414CS色彩芯片,通过I2C接口进行连接。基于8×2过滤光电二极管和16位模拟-数位转换器,你通过可以测量光线或物体表面的光反射来获得颜色值。

规则

  • 电气特性
    • 工作电压: 3.3 ~6.0 V
    • 工作温度 : -40 ~ 85 °C
  • 尺寸
  • 模块尺寸:2.0cm*2.0cm
  • 接口
  • 接口:1.27mm*4pin
  • 接口构成:SCL,SDA,VCC,GND

开发

设备

  • 其他硬件设备
    • USB数据连接线 一根

准备

  • Setup 1:将颜色传感器接口和Hub的IIC接起来。
  • Setup 2:将CoreUSB,Hub,颜色传感器连接在一起。通过USB数据线将接入电脑。

调试

  • 打开Arduino IDE,将下列代码复制到IDE中。
#include <Wire.h>
#include <math.h>
#define COLOR_SENSOR_ADDR  0x39//the I2C address for the color sensor 
#define REG_CTL 0x80
#define REG_TIMING 0x81
#define REG_INT 0x82
#define REG_INT_SOURCE 0x83
#define REG_ID 0x84
#define REG_GAIN 0x87
#define REG_LOW_THRESH_LOW_BYTE 0x88
#define REG_LOW_THRESH_HIGH_BYTE 0x89
#define REG_HIGH_THRESH_LOW_BYTE 0x8A
#define REG_HIGH_THRESH_HIGH_BYTE 0x8B
#define REG_BLOCK_READ 0xCF
#define REG_GREEN_LOW 0xD0
#define REG_GREEN_HIGH 0xD1
#define REG_RED_LOW 0xD2
#define REG_RED_HIGH 0xD3
#define REG_BLUE_LOW 0xD4
#define REG_BLUE_HIGH 0xD5
#define REG_CLEAR_LOW 0xD6
#define REG_CLEAR_HIGH 0xD7
#define CTL_DAT_INIITIATE 0x03
#define CLR_INT 0xE0
//Timing Register
#define SYNC_EDGE 0x40
#define INTEG_MODE_FREE 0x00
#define INTEG_MODE_MANUAL 0x10
#define INTEG_MODE_SYN_SINGLE 0x20
#define INTEG_MODE_SYN_MULTI 0x30
 
#define INTEG_PARAM_PULSE_COUNT1 0x00
#define INTEG_PARAM_PULSE_COUNT2 0x01
#define INTEG_PARAM_PULSE_COUNT4 0x02
#define INTEG_PARAM_PULSE_COUNT8 0x03
//Interrupt Control Register 
#define INTR_STOP 40
#define INTR_DISABLE 0x00
#define INTR_LEVEL 0x10
#define INTR_PERSIST_EVERY 0x00
#define INTR_PERSIST_SINGLE 0x01
//Interrupt Souce Register
#define INT_SOURCE_GREEN 0x00
#define INT_SOURCE_RED 0x01
#define INT_SOURCE_BLUE 0x10
#define INT_SOURCE_CLEAR 0x03
//Gain Register
#define GAIN_1 0x00
#define GAIN_4 0x10
#define GAIN_16 0x20
#define GANI_64 0x30
#define PRESCALER_1 0x00
#define PRESCALER_2 0x01
#define PRESCALER_4 0x02
#define PRESCALER_8 0x03
#define PRESCALER_16 0x04
#define PRESCALER_32 0x05
#define PRESCALER_64 0x06
 
int readingdata[20];
int i,green,red,blue,clr,ctl;
double X,Y,Z,x,y,z;
void setup()
{  
	Serial.begin(9600);
	Wire.begin(); // join i2c bus (address optional for master)
}
void loop()
{
  setTimingReg(INTEG_MODE_FREE);//Set trigger mode.Including free mode,manually mode,single synchronizition mode or so.
  setInterruptSourceReg(INT_SOURCE_GREEN); //Set interrupt source 
  setInterruptControlReg(INTR_LEVEL|INTR_PERSIST_EVERY);//Set interrupt mode
  setGain(GAIN_1|PRESCALER_4);//Set gain value and prescaler value
  setEnableADC();//Start ADC of the color sensor
  while(1)
 { 
   readRGB();
   calculateCoordinate();
   delay(1000);
   clearInterrupt();  
 }
}
/************************************/
void setTimingReg(int x)
{
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_TIMING);
   Wire.write(x);
   Wire.endTransmission();  
   delay(100); 
}
void setInterruptSourceReg(int x)
{
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_INT_SOURCE);
   Wire.write(x);
   Wire.endTransmission();  
   delay(100);
}
void setInterruptControlReg(int x)
{
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_INT);
   Wire.write(x);
   Wire.endTransmission();  
   delay(100);
}
void setGain(int x)
{
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_GAIN);
   Wire.write(x);
   Wire.endTransmission();
}
void setEnableADC()
{
 
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_CTL);
   Wire.write(CTL_DAT_INIITIATE);
   Wire.endTransmission();  
   delay(100);  
}
void clearInterrupt()
{
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(CLR_INT);
   Wire.endTransmission(); 
}
void readRGB()
{
  Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.write(REG_BLOCK_READ);
   Wire.endTransmission();
 
   Wire.beginTransmission(COLOR_SENSOR_ADDR);
   Wire.requestFrom(COLOR_SENSOR_ADDR,8);
   delay(500);
   if(8<= Wire.available())    // if two bytes were received 
  { 
    for(i=0;i<8;i++)
    {
      readingdata[i]=Wire.read();
      //Serial.println(readingdata[i],BIN);
     }
  }
  green=readingdata[1]*256+readingdata[0];
  red=readingdata[3]*256+readingdata[2];
  blue=readingdata[5]*256+readingdata[4];
  clr=readingdata[7]*256+readingdata[6];
  Serial.println("The RGB value and Clear channel value are");
  Serial.println(red,DEC);
  Serial.println(green,DEC);
  Serial.println(blue,DEC);
  Serial.println(clr,DEC);  
}
void calculateCoordinate()
{
  X=(-0.14282)*red+(1.54924)*green+(-0.95641)*blue;
  Y=(-0.32466)*red+(1.57837)*green+(-0.73191)*blue;
  Z=(-0.68202)*red+(0.77073)*green+(0.56332)*blue;
  x=X/(X+Y+Z);
  y=Y/(X+Y+Z);
  if((X>0)&&(Y>0)&&(Z>0))
  {
    Serial.println("The x,y value is");
	Serial.print("(");
    Serial.print(x,2);
	Serial.print(" , ");
    Serial.print(y,2);
	Serial.println(")");
	Serial.println("Please reference the figure(Chromaticity Diagram) in the wiki ");
	Serial.println("so as to get the recommended color.");
  }
 else
 Serial.println("Error,the value overflow");
}
  • 选择正确的板卡和COM端口,编译通过后直接下载。
Upload.JPG
  • 打开串口监视器。
    • 获得X、Y结果后,根据下图得到对应的颜色值。

拓展阅读

色彩传感器使用的是TCS3414CS色彩芯片,检测的返回数据包含4个通道:红色(R)、绿色(G)、蓝色(B)、空白(C),然后这4个通道的数据可以转化为色度图上的X、Y值。这个转化是依据Commission Internationale de l’Eclairage (CIE)的标准。

文件:Coordinates transform.png
Chromaticity Calculation Process Overview


通过下面的方程进行转化:
文件:Equations.png
Transformation Equations

视频