(SKU:RB-02S035)TCS3200顏色傳感器

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航、 搜索
02S03501.png

目錄

產(chǎn)品概述

TCS3200顏色傳感器是全彩的顏色檢測(cè)器,是一款簡(jiǎn)單易用、小巧輕便、性價(jià)比較高的顏色識(shí)別、檢測(cè)傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉(zhuǎn)換芯片 TCS3200D RGB感應(yīng)芯片和4個(gè)白色LED燈,TCS3200能在一定的范圍內(nèi)檢測(cè)和測(cè)量幾乎所有的可見光。TCS3200有大量的光檢測(cè)器,每個(gè)都有紅綠藍(lán)和清除4種濾光器。每6種顏色濾光器均勻地按數(shù)組分布來清除顏色中偏移位置的顏色分量。內(nèi)置的振蕩器能輸出方波,其頻率與所選擇的光的強(qiáng)度成比例關(guān)系。

規(guī)格參數(shù)

  1. 顏色識(shí)別芯片:TCS3200D
  2. 輸出頻率范圍:10kHz - 12kHz,占空比50%
  3. 工作電壓:+2.7v - +5.5v
  4. 工作電流:1.4 mA
  5. 檢測(cè)狀態(tài):靜態(tài)檢測(cè)
  6. 最佳檢測(cè)距離:10mm
  7. 工作溫度:-40°C - +85°C
  8. 尺寸大小:35.8mm * 35.8mm * 10.8mm
  9. 重量大?。?.7g
  10. 固定孔:3mm * 4個(gè)
  11. 對(duì)角固定孔間距:16.60 mm
  12. 相鄰固定孔間距:11.74 mm
  13. 發(fā)光顏色:高亮白光

接口定義

  • S0:輸出頻率選擇輸入腳
  • S1:輸出頻率選擇輸入腳
  • OE:低電壓使能端
  • GND:接電源地
  • Vcc:接電源正
  • OUT:輸出端
  • S2:輸出頻率選擇輸入腳
  • S3:輸出頻率選擇輸入腳

使用方法

工作原理

三原色感應(yīng)原理

通常所看到的物體的顏色,實(shí)際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應(yīng)。白色是由各種頻率的可見光混合在一起構(gòu)成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍(lán)B、紫P)。根據(jù)德國(guó)物理學(xué)家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍(lán))混合而成的。所以,如果知道構(gòu)成各種顏色的三原色的值,就能夠知道所測(cè)試物體的顏色。

TCS3200 顏色識(shí)別原理

對(duì)于TCS3200 來說,當(dāng)選定一個(gè)顏色濾波器時(shí),它只允許某種特定的原色通過,阻止其它原色的通過。例如:當(dāng)選擇紅色濾波器時(shí),入射光中只有紅色可以通過,藍(lán)色和綠色都被阻止,這樣就可以得到紅色光的光強(qiáng);同理,選擇藍(lán)色濾波器或綠色濾波器時(shí),就可以得到藍(lán)色光和綠色光的光強(qiáng)。通過這三個(gè)值,就可以分析投射到 TCS3200 傳感器上的光的顏色。

白平衡原理

白平衡就是告訴系統(tǒng)什么是白色。從理論上講,白色是由等量的紅色、綠色和藍(lán)色混合而成的;但實(shí)際上,白色中的三原色并不完全相等,并且對(duì)于 TCS3200 的光傳感器來說,它對(duì)這三種基本色的敏感性是不相同的,導(dǎo)致TCS3200 的 RGB 輸出并不相等,因此在測(cè)試前必須進(jìn)行白平衡調(diào)整,使得 TCS3200 對(duì)所檢測(cè)的“白色”中的三原色是相等的。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。

在本裝置中,白平衡調(diào)整的具體步驟和方法如下:

  • 將傳感器至于一張白紙上,使用產(chǎn)品上的發(fā)光二極管照射到白紙上,使入射光能夠通過反射傳到 TCS3200 上,然后根據(jù)前面所介紹的方法,依次選通紅色、綠色和藍(lán)色濾波器,分別測(cè)得紅色、綠色和藍(lán)色的值,然后就可計(jì)算出需要的三個(gè)調(diào)整參數(shù)。

當(dāng)用 TCS3200 識(shí)別顏色時(shí),就用這三個(gè)參數(shù)對(duì)所測(cè)顏色的R 、G 和B 進(jìn)行調(diào)整。這里有兩種方法來計(jì)算調(diào)整參數(shù):

  • 依次選通三種顏色的濾波器,然后對(duì) TCS230的輸出脈沖依次進(jìn)行計(jì)數(shù)。當(dāng)計(jì)數(shù)到255 時(shí)停止計(jì)數(shù),分別計(jì)算每個(gè)通道所用的時(shí)間。這些時(shí)間對(duì)應(yīng)于實(shí)際測(cè)試時(shí) TCS3200 每種濾波器所采用的時(shí)間基準(zhǔn),在這段時(shí)間內(nèi)所測(cè)得的脈沖數(shù)就是所對(duì)應(yīng)的 R 、G 和 B 的值。
  • 設(shè)置定時(shí)器為一固定時(shí)間( 例如10ms ),然后選通三種顏色的濾波器,計(jì)算這段時(shí)間內(nèi) TCS3200 的輸出脈沖數(shù),計(jì)算出一個(gè)比例因子,通過這個(gè)比例因子可以把這些脈沖數(shù)變?yōu)?55。在實(shí)際測(cè)試時(shí),使用同樣的時(shí)間進(jìn)行計(jì)數(shù),把測(cè)得的脈沖數(shù)再乘以求得的比例因子,然后就可以得到所對(duì)應(yīng)的 R 、G 和B 的值。

編程原理

TCS3200 模塊與 Arduino UNO 的實(shí)驗(yàn)接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測(cè)試前必須進(jìn)行白平衡的調(diào)整,使 TCS3200 對(duì)所檢測(cè)的白色中的三原色相等。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。因此在本例程中,首先需要點(diǎn)亮 LED 燈,延時(shí) 4s,通過白平衡測(cè)試,計(jì)算得到白色物體的 RGB 值 255 與 1s 內(nèi)三色光脈沖數(shù)的 RGB 比例因子,那么:

  • 紅、綠、藍(lán)三色光分別對(duì)應(yīng)的 1s 內(nèi) TCS3200 輸出脈沖數(shù) * 相應(yīng)的比例因子 = RGB 標(biāo)準(zhǔn)值

然后,通過調(diào)用定時(shí)器中斷函數(shù),每 1s 產(chǎn)生中斷后,計(jì)算出該時(shí)間內(nèi)的紅、綠、藍(lán)三種光線通過濾波器時(shí)產(chǎn)生的脈沖數(shù),再將 TCS3200 輸出的信號(hào)脈沖個(gè)數(shù)分別存儲(chǔ)到相應(yīng)的顏色的數(shù)組變量中,本例程設(shè)置了輸出該數(shù)組的值,其代表了 RGB 三種顏色的值。

硬件接線圖

Yansejiexian.jpg
  • 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數(shù)字接口6號(hào))
  • 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數(shù)字接口5號(hào))
  • 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數(shù)字接口4號(hào))
  • 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數(shù)字接口3號(hào))
  • 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數(shù)字接口2號(hào))
  • 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND)
  • 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc)

例子程序

完成硬件連接后,將 TimerOne庫(kù)文件粘貼到 Arduino IDE 軟件的 libraries 文件中(庫(kù)文件可以直接在此點(diǎn)擊下載),無庫(kù)文件或?qū)?kù)文件放錯(cuò)位置代碼編譯可能將會(huì)出現(xiàn)錯(cuò)誤提示,將代碼編譯后下載到Arduino里。

#include <TimerOne.h>   // 引用 TimerOne.h 庫(kù)文件 
#define S0 6            // 定義 S0為引腳6 
#define S1 5            // 定義 S1為引腳5 
#define S2 4            // 定義 S2為引腳4 
#define S3 3            // 定義 S3為引腳3 
#define OUT 2           // 定義 OUT為引腳2 
int   g_count = 0;      //定義整型變量 g_count并賦初值為0,用于存儲(chǔ)計(jì)數(shù)頻率 
int   g_array[3];       //定義整型數(shù)組變量 g_array[3],用于存儲(chǔ)RGB的值 
int   g_flag = 0;       //定義整形變量 g_flag 并賦初值為0,用于過濾器排列 
float g_SF[3];          //定義浮點(diǎn)型數(shù)組變量g_SF[3],用于存儲(chǔ)RGB比例因子 
int   value[3];        //定義定義整型數(shù)組變量value[3],用于判斷顏色 
//  初始化 tsc3200 和設(shè)置內(nèi)置振蕩器方波頻率與其輸出信號(hào)頻率的比例因子為2% 
void TSC_Init() 
{                                                                   
  pinMode(S0, OUTPUT);      // 定義S0為輸出狀態(tài) 
  pinMode(S1, OUTPUT);      // 定義S1為輸出狀態(tài) 
  pinMode(S2, OUTPUT);      // 定義S2為輸出狀態(tài) 
  pinMode(S3, OUTPUT);      // 定義S3為輸出狀態(tài) 
  pinMode(OUT, INPUT);      // 定義OUT為輸入狀態(tài)  
  digitalWrite(S0, LOW);    //定義S0為低電平 
  digitalWrite(S1, HIGH);   // 定義 S1為高電平 
                            //輸出頻率縮放 2% 
}  
//  選擇濾波模式,決定讓紅、綠、藍(lán)哪一種光線通過濾波器
void TSC_FilterColor(int Level01, int Level02) 
{ 
  if(Level01 != 0)             // 如果Level01  不等于0   
     Level01 = HIGH;         //則Level01  為高電平 
  if(Level02 != 0)             // 如果Level02  不等于0 
     Level02 = HIGH;         //則Level02  為高電平 
  digitalWrite(S2, Level01);       // 將Level01值送給S2 
  digitalWrite(S3, Level02);       // 將Level02值送給S3 
                              // 選擇過濾器顏色 
} 
//中斷函數(shù),計(jì)算 TCS3200 輸出信號(hào)的脈沖數(shù)
void TSC_Count() 
{ 
  g_count ++ ;                  
} 
/*定時(shí)器中斷函數(shù),每 1s 中斷后,把該時(shí)間內(nèi)的紅、綠、藍(lán)三種廣信通過濾波器時(shí),
 * TCS3200 輸出信號(hào)脈沖個(gè)數(shù)分別儲(chǔ)存到數(shù)組 g_array[3] 的相應(yīng)元素變量中
 */
void TSC_Callback() 
{ 
  switch(g_flag) 
  { 
    case 0:  
         Serial.println("->WB Start");// 串口打印字符串"->WB Start" 
         TSC_WB(LOW, LOW);// 選擇讓紅色光線通過濾波器的模式 
         break; 
    case 1: 
         Serial.print("->Frequency R=");  // 串口打印字符串"->Frequency R=" 
         Serial.println(g_count);// 串口打印 1s 內(nèi)的紅光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù) 
         g_array[0] = g_count;//儲(chǔ)存 1s 內(nèi)的紅光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù)           
         TSC_WB(HIGH, HIGH);// 選擇讓綠色光線通過濾波器的模式
         break; 
    case 2: 
         Serial.print("->Frequency G=");  // 串口打印字符串"->Frequency G=" 
         Serial.println(g_count);// 串口打印 1s 內(nèi)的綠光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù) 
         g_array[1] = g_count;//儲(chǔ)存 1s 內(nèi)的綠光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù)  
         TSC_WB(LOW, HIGH);//選擇讓藍(lán)色光線通過濾波器的模式  
         break; 
    case 3: 
         Serial.print("->Frequency B=");  // 串口打印字符串"->Frequency B=" 
         Serial.println(g_count);// 串口打印 1s 內(nèi)的藍(lán)光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù)
         Serial.println("->WB End");     // 串口打印字符串"->WB End" 
         g_array[2] = g_count;//儲(chǔ)存 1s 內(nèi)的藍(lán)光通過濾波器時(shí),TCS3200 輸出的脈沖個(gè)數(shù) 
         TSC_WB(HIGH, LOW); // 選擇無濾波器模式                                                                     
         break; 
   default: 
         g_count = 0;//計(jì)數(shù)器清零 
         break; 
  } 
} 
//設(shè)置反射光中紅、綠、藍(lán)三色光分別通過濾波器時(shí)如何處理數(shù)據(jù)的標(biāo)志
//該函數(shù)被 TSC_Callback( )調(diào)用
void TSC_WB(int Level0, int Level1)      
{ 
  g_count = 0;//計(jì)數(shù)值清零 
  g_flag ++;//輸出信號(hào)計(jì)數(shù)標(biāo)志
  TSC_FilterColor(Level0, Level1);//濾波器模式 
  Timer1.setPeriod(1000000);//設(shè)置輸出信號(hào)脈沖計(jì)數(shù)時(shí)長(zhǎng)為 1s 
} 
//初始化
void setup() 
{  
  TSC_Init(); 
  Serial.begin(9600);//打開串口并設(shè)置通信波特率為 9600 
  Timer1.initialize();//定時(shí)器初始化,默認(rèn)觸發(fā)值為 1s
  Timer1.attachInterrupt(TSC_Callback);     
  // 設(shè)置定時(shí)器1的中斷,中斷調(diào)用函數(shù)為 TSC_Callback()
  //設(shè)置 TCS3200 輸出信號(hào)的上升沿觸發(fā)中斷,中斷調(diào)用函數(shù)為 TSC_Count()   
  attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0 
  delay(4000);// 延遲 4s ,以等待被測(cè)試物體紅、綠、藍(lán)三色在 1s 內(nèi)的 TCS3200 輸出信號(hào)脈沖計(jì)數(shù)
 //通過白平衡測(cè)試,計(jì)算得到白色物體 RGB 值 255 與 1s 內(nèi)三色光脈沖數(shù)的 RGB 比例因子
  for(int i=0; i<3; i++) 
  Serial.println(g_array[i]);             //串口打印 g_array[i] 變量值 
  g_SF[0] = 255.0/ g_array[0];     //紅色光比例因子
  g_SF[1] = 255.0/ g_array[1] ;    //綠色光比例因子
  g_SF[2] = 255.0/ g_array[2] ;    //藍(lán)色光比例因子
  //打印白平衡后的紅、綠、藍(lán)三色的 RGB 比例因子
  Serial.println(g_SF[0],5);
  Serial.println(g_SF[1],5);
  Serial.println(g_SF[2],5);
  //紅、綠、藍(lán)三色光分別對(duì)應(yīng)的1s內(nèi)TCS3200輸出脈沖數(shù)乘以相應(yīng)的比例因子就是RGB標(biāo)準(zhǔn)值
 //打印被測(cè)物體的RGB值
  for(int i=0; i<3; i++)
    Serial.println(int(g_array[i] * g_SF[i]));  
}
//主程序 
void loop() 
{ 
  g_flag = 0;
   //每獲得一次被測(cè)物體RGB顏色值需時(shí)4s
   delay(4000);
   //打印出被測(cè)物體RGB顏色值
   for(int i=0; i<3; i++)
   Serial.println(int(g_array[i] * g_SF[i])); 
   } 

程序效果

如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當(dāng)前檢測(cè)的 RGB 值,從而判斷顏色。白平衡效果如下圖所示:

02S03502.png

應(yīng)用例程

硬件設(shè)備

  1. Carduino UNO R3 控制器 * 1個(gè)
  2. Arduino 傳感器擴(kuò)展板V5.0 * 1個(gè)
  3. Color Sensor顏色傳感器模塊 * 1個(gè)
  4. 3P傳感器連接線 * 5個(gè)
  5. 4P傳感器連接線 * 2個(gè)
  6. IR&LED Modue * 5個(gè) (紅、白、藍(lán)、黃、綠色各一個(gè))
  7. USB 數(shù)據(jù)通信線 * 1個(gè)
  8. 色板 * 1個(gè)

接線說明

  • 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同
  • 將各種顏色食人魚燈連接到 Arduino傳感器擴(kuò)展板上,連接方式:

(1)紅色食人魚燈接數(shù)字口 8號(hào)
(2)黃色燈接數(shù)字口 9號(hào)
(3)綠色燈接數(shù)字口10號(hào)
(4)藍(lán)色燈接數(shù)字口 11號(hào)
(5)白色燈接數(shù)字口 12號(hào)

應(yīng)用例程

例子程序

完成硬件連接后,將 TimerOne庫(kù)文件粘貼到 Arduino IDE 軟件的 libraries 文件中(庫(kù)文件可以直接在此點(diǎn)擊下載),無庫(kù)文件或?qū)?kù)文件放錯(cuò)位置代碼編譯可能將會(huì)出現(xiàn)錯(cuò)誤提示,將代碼編譯后下載到Arduino里。

#include <TimerOne.h>       // 引用 TimerOne.h 庫(kù)文件 
#define S0     6            // 定義 S0為引腳6 
#define S1     5            // 定義 S1為引腳5 
#define S2     4            // 定義 S2為引腳4 
#define S3     3            // 定義 S3為引腳3 
#define OUT    2           // 定義 OUT為引腳2 
#define Rs      8           // 定義 Rs為引腳8 
#define Ys      9           // 定義 Ys為引腳9 
#define Gs      10          // 定義 Gs為引腳10 
#define Bs      11          // 定義 Bs為引腳11 
#define Ws      12         // 定義 Ws為引腳12 
int   g_count = 0;   //定義整型變量 g_count并賦初值為0,用于存儲(chǔ)計(jì)數(shù)頻率 
int   g_array[3];    //定義整型數(shù)組變量 g_array[3],用于存儲(chǔ)RGB的值 
int   g_flag = 0;   	 //定義整形變量 g_flag 并賦初值為0,用于過濾器排列 
float g_SF[3];       //定義浮點(diǎn)型數(shù)組變量g_SF[3],用于存儲(chǔ)RGB比例因子 
int   value[3];      //定義定義整型數(shù)組變量value[3],用于判斷顏色 
//  初始化tsc230 和設(shè)置頻率 
void TSC_Init() 
{                                                                   
  pinMode(S0, OUTPUT);      // 定義S0為輸出狀態(tài) 
  pinMode(S1, OUTPUT);      // 定義S1為輸出狀態(tài) 
  pinMode(S2, OUTPUT);      // 定義S2為輸出狀態(tài) 
  pinMode(S3, OUTPUT);      // 定義S3為輸出狀態(tài) 
  pinMode(OUT, INPUT);      // 定義OUT為輸入狀態(tài) 
 
  digitalWrite(S0, LOW);      //定義S0為低電平 
  digitalWrite(S1, HIGH);     // 定義 S1為高電平 
                           //輸出頻率縮放 2% 
}  
//  選擇過濾器的顏色  
void TSC_FilterColor(int Level01, int Level02) 
{ 
  if(Level01 != 0)             // 如果Level01  不等于0   
     Level01 = HIGH;         //則Level01  為高電平 
  if(Level02 != 0)             // 如果Level02  不等于0 
     Level02 = HIGH;         //則Level02  為高電平 
  digitalWrite(S2, Level01);       // 將Level01值送給S2 
  digitalWrite(S3, Level02);       // 將Level02值送給S3 
                              // 選擇過濾器顏色 
} 
void TSC_Count() 
{ 
  g_count ++ ;                  // 自動(dòng)計(jì)算頻率 
} 
void TSC_Callback() 
{ 
  switch(g_flag) 
  { 
    case 0:  
         Serial.println("->WB Start");    // 串口打印字符串"->WB Start" 
         TSC_WB(LOW, LOW);        // 沒有過濾紅色 
         break; 
    case 1: 
         Serial.print("->Frequency R=");  // 串口打印字符串"->Frequency R=" 
         Serial.println(g_count);         // 串口打印 g_count變量值 
         g_array[0] = g_count;           
         TSC_WB(HIGH, HIGH);       // 沒有過濾綠色 
         break; 
    case 2: 
         Serial.print("->Frequency G=");  // 串口打印字符串"->Frequency G=" 
         Serial.println(g_count);         // 串口打印 g_count變量值 
         g_array[1] = g_count; 
         TSC_WB(LOW, HIGH);       // 沒有過濾藍(lán)色 
         break; 
    case 3: 
         Serial.print("->Frequency B=");  // 串口打印字符串"->Frequency B=" 
         Serial.println(g_count);         // 串口打印 g_count變量值 
         Serial.println("->WB End");     // 串口打印字符串"->WB End" 
         g_array[2] = g_count; 
         TSC_WB(HIGH, LOW);       // 清除(無過濾)                                                                      
         break; 
   default: 
         g_count = 0; 
         break; 
  } 
} 
void TSC_WB(int Level0, int Level1)      // 白平衡 
{ 
  g_count = 0; 
  g_flag ++; 
  TSC_FilterColor(Level0, Level1); 
  Timer1.setPeriod(1000000);           //設(shè)置一秒周期 
} 
void setup() 
{ 
  pinMode(Rs,OUTPUT);               //設(shè)定Rs引腳為輸出狀態(tài) 
  pinMode(Ys,OUTPUT);               //設(shè)定Ys引腳為輸出狀態(tài) 
  pinMode(Gs,OUTPUT);               //設(shè)定Gs引腳為輸出狀態(tài) 
  pinMode(Bs,OUTPUT);               //設(shè)定Bs引腳為輸出狀態(tài) 
  pinMode(Ws,OUTPUT);              //設(shè)定Ws引腳為輸出狀態(tài) 
  TSC_Init();                         //初始化tcs230 
  Serial.begin(9600);                   //打開串口并設(shè)置通信波特率為 9600 
  Timer1.initialize();                      //初始化默認(rèn)是一秒 
  Timer1.attachInterrupt(TSC_Callback);     // 外部中斷為一秒   
  attachInterrupt(0, TSC_Count, RISING);    //外部中斷口初始0 
  delay(4000);                          // 延遲4 秒 
  for(int i=0; i<3; i++) 
     Serial.println(g_array[i]);             //串口打印 g_array[i] 變量值 
  g_SF[0] = 255.0/ g_array[0];            //紅色的比例因子 
  g_SF[1] = 255.0/ g_array[1] ;           // 綠色的比例因子 
  g_SF[2] = 255.0/ g_array[2] ;           // 藍(lán)色的比例因子 
  
  Serial.println(g_SF[0]);               // 串口打印 g_SF[0]變量值 
  Serial.println(g_SF[1]);               // 串口打印 g_SF[1]變量值 
  Serial.println(g_SF[2]);               // 串口打印 g_SF[2]變量值 
} 
void loop() 
{ 
   g_flag = 0; 
   for(int i=0; i<3; i++) 
   {Serial.println(int(g_array[i] * g_SF[i])); //串口打印g_array[i] * g_SF[i]變量值 
    value[i]=int(g_array[i] * g_SF[i]);  //將g_array[i] * g_SF[i]值賦值給value[i] 
   } 
      if (((value[0]>168)  &&  (value[0]<208)) && ((value[1]>66) && (value[1]<106)) && ((value[2]>67) && (value[2]<107)))    
 // 如果變量 value[i]數(shù)值滿足為紅色值范圍則執(zhí)行下面語句 
       { 
Serial.println("->Red");                //串口打印字符串"->Red" 
        digitalWrite(Rs,HIGH);                //Rs定義為高電平 
        digitalWrite(Ys,LOW);                //Ys定義為低電平 
        digitalWrite(Gs,LOW);                //Gs定義為低電平                     
        digitalWrite(Bs,LOW);                //Bs 定義為低電平                                                                  
        digitalWrite(Ws,LOW);               //Ws定義為低電平 
       } 
        else if (((value[0]>235) && (value[0]<275)) && ((value[1]> 198) && (value[1]<238)) && ((value[2]>96) && (value[2]<136)))     
 //如果變量 value[i]數(shù)值滿足為黃色值范圍則執(zhí)行下面語句 
       {
 Serial.println("->Yellow");             //串口打印字符串"->Yellow" 
        digitalWrite(Rs,LOW);                //Rs 定義為低電平 
        digitalWrite(Ys,HIGH);               //Ys 定義為高電平 
        digitalWrite(Gs,LOW);               //Gs 定義為低電平 
        digitalWrite(Bs,LOW);               //Bs 定義為低電平 
        digitalWrite(Ws,LOW);              //Ws 定義為低電平 
       } 
        else if (((value[0]>74) && (value[0]<114)) && ((value[1]>119)  && (value[1]<159)) && ((value[2]>76) && (value[2]<116)))     
 //如果變量 value[i]數(shù)值滿足為綠色值范圍則執(zhí)行下面語句 
       { 
Serial.println("->Green");              //串口打印字符串"->Green" 
        digitalWrite(Rs,LOW);                //Rs 定義為低電平 
        digitalWrite(Ys,LOW);                //Ys定義為低電平 
        digitalWrite(Gs,HIGH);               //Gs 定義為高電平 
        digitalWrite(Bs,LOW);               //Bs 定義為低電平 
        digitalWrite(Ws,LOW);              //Ws 定義為低電平 
       } 
        else  if(((value[0]>46)  &&  (value[0]<86))  &&  ((value[1]>71)  &&  (value[1]<111))  && ((value[2]>117) && (value[2]<157)))   
  //如果變量 value[i]數(shù)值滿足為藍(lán)色值范圍則執(zhí)行下面語句 
       { 
Serial.println("->Blue");               //串口打印字符串"->Blue" 
        digitalWrite(Rs,LOW);                //Rs 定義為低電平 
        digitalWrite(Ys,LOW);               //Ys 定義為低電平 
        digitalWrite(Gs,LOW);               //Gs 定義為低電平 
        digitalWrite(Bs,HIGH);              //Bs定義為高電平 
        digitalWrite(Ws,LOW);             //Ws定義為低電平 
       } 
        else if (((value[0]>230) && (value[0]<280)) && ((value[1]> 230) && (value[1]<280)) && ((value[2]>230) && (value[2]<280)))    
 //如果變量 value[i]數(shù)值滿足為白色值范圍則執(zhí)行下面語句 
       { 
Serial.println("->White");              //串口打印字符串"->White" 
        digitalWrite(Rs,LOW);                //Rs 定義為低電平 
        digitalWrite(Ys,LOW);                //Ys定義為低電平 
        digitalWrite(Gs,LOW);               //Gs 定義為低電平 
        digitalWrite(Bs,LOW);               //Bs 定義為低電平 
        digitalWrite(Ws,HIGH);              //Ws 定義為高電平 
       } 
        else if (value[0]>0 && value[1]>0 && value[2]>0) 
         //如果變量 value[i]數(shù)值不滿足上述顏色值范圍則執(zhí)行下面語句 
       { 
Serial.println("->Other Color");        //串口打印字符串"->Other Color" 
        digitalWrite(Rs,LOW);               //Rs 定義為低電平 
        digitalWrite(Ys,LOW);               //Ys 定義為低電平 
        digitalWrite(Gs,LOW);               //Gs 定義為低電平 
        digitalWrite(Bs,LOW);               //Bs 定義為低電平 
        digitalWrite(Ws,LOW);              //Ws 定義為低電平 
       } 
delay(4000);}                             //延遲4 秒
 

應(yīng)用程序效果

在以上步驟完成后,我們首先需要在其程序啟動(dòng)后白平衡(白平衡在上文中已介紹),下圖為Arduino實(shí)驗(yàn)代碼的白平衡實(shí)驗(yàn)現(xiàn)象:
Hih6.jpg
在完成白平衡后(上圖實(shí)驗(yàn)現(xiàn)象即白色食人魚燈亮起,也是其系統(tǒng)在檢測(cè)到白色后的現(xiàn)象)就可以檢測(cè)其他顏色了。白平衡只是系統(tǒng)對(duì)白色的一種數(shù)值反饋(即告訴系統(tǒng)什么是白色),本模塊識(shí)別、檢測(cè)后讀出的只是 R 、G、B 的值,對(duì)應(yīng)其檢測(cè)到的顏色R、G、B 值,該測(cè)試程序編寫者特編寫了一段應(yīng)用五種顏色食人魚燈來顯示其檢測(cè)到的顏色。判斷語句中的范圍為程序編寫者在實(shí)驗(yàn)室環(huán)境下所測(cè)得的R 、G、B 值。更換環(huán)境后應(yīng)予以更改其對(duì)應(yīng)顏色判斷的R、G、B 值范圍。測(cè)試程序( 顏色檢測(cè)程序)中涉及到了紅、黃、綠、藍(lán)、白五種顏色,而色板上為六種顏色,多出一種顏色黑色是為了做出對(duì)比 :在檢測(cè)中遇到非該檢測(cè)顏色時(shí)(即不滿足判斷語句的條件時(shí))應(yīng)只在串口打印"->Other Color" ,而無其他現(xiàn)象產(chǎn)生。下圖為Arduino實(shí)驗(yàn)代碼在檢測(cè)到其他顏色時(shí)的實(shí)驗(yàn)現(xiàn)象
Vadrb7.jpg
Vadrb8.jpg
Vadrb9.jpg
Vadrb10.jpg
Vadrb11.jpg

視頻演示

Hong wai yan se 01.png
Yan se 01.png


產(chǎn)品相關(guān)推薦

Erweima.png

購(gòu)買地址

TCS3200D 顏色傳感器

周邊產(chǎn)品推薦

Carduino UNO R3 控制器
灰度傳感器
Arduino ColorPAL Color Sensor 進(jìn)口顏色傳感器 顏色識(shí)別
Arduino 高亮LED食人魚燈

相關(guān)問題解答

Arduino 顏色傳感器評(píng)測(cè)

相關(guān)學(xué)習(xí)資料

視頻: 運(yùn)用顏色傳感器進(jìn)行多彩顏色識(shí)別檢測(cè)
視頻: 愛上Arduino與愛上Processing互動(dòng)之顏色過度識(shí)別
視頻: 紅外無線發(fā)射接收之顏色識(shí)別系統(tǒng)
奧松機(jī)器人技術(shù)論壇