“(SKU:RB-02S035)TCS3200顏色傳感器”的版本間的差異

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導航、 搜索
第29行: 第29行:
 
====三原色感應原理====
 
====三原色感應原理====
 
:通常所看到的物體的顏色,實際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應。白色是由各種頻率的可見光混合在一起構成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍B、紫P)。根據(jù)德國物理學家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。所以,如果知道構成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/>
 
:通常所看到的物體的顏色,實際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應。白色是由各種頻率的可見光混合在一起構成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍B、紫P)。根據(jù)德國物理學家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。所以,如果知道構成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/>
?
=== TCS3200 顏色識別原理===
+
==== TCS3200 顏色識別原理====
 
:對于TCS3200 來說,當選定一個顏色濾波器時,它只允許某種特定的原色通過,阻止其它原色的通過。例如:當選擇紅色濾波器時,入射光中只有紅色可以通過,藍色和綠色都被阻止,這樣就可以得到紅色光的光強;同理,選擇藍色濾波器或綠色濾波器時,就可以得到藍色光和綠色光的光強。通過這三個值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/>
 
:對于TCS3200 來說,當選定一個顏色濾波器時,它只允許某種特定的原色通過,阻止其它原色的通過。例如:當選擇紅色濾波器時,入射光中只有紅色可以通過,藍色和綠色都被阻止,這樣就可以得到紅色光的光強;同理,選擇藍色濾波器或綠色濾波器時,就可以得到藍色光和綠色光的光強。通過這三個值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/>
 
====白平衡原理====
 
====白平衡原理====
第38行: 第38行:
 
* 依次選通三種顏色的濾波器,然后對 TCS230的輸出脈沖依次進行計數(shù)。當計數(shù)到255 時停止計數(shù),分別計算每個通道所用的時間。這些時間對應于實際測試時 TCS3200 每種濾波器所采用的時間基準,在這段時間內(nèi)所測得的脈沖數(shù)就是所對應的 R 、G 和 B 的值。
 
* 依次選通三種顏色的濾波器,然后對 TCS230的輸出脈沖依次進行計數(shù)。當計數(shù)到255 時停止計數(shù),分別計算每個通道所用的時間。這些時間對應于實際測試時 TCS3200 每種濾波器所采用的時間基準,在這段時間內(nèi)所測得的脈沖數(shù)就是所對應的 R 、G 和 B 的值。
 
* 設置定時器為一固定時間( 例如10ms ),然后選通三種顏色的濾波器,計算這段時間內(nèi) TCS3200 的輸出脈沖數(shù),計算出一個比例因子,通過這個比例因子可以把這些脈沖數(shù)變?yōu)?55。在實際測試時,使用同樣的時間進行計數(shù),把測得的脈沖數(shù)再乘以求得的比例因子,然后就可以得到所對應的 R 、G 和B 的值。
 
* 設置定時器為一固定時間( 例如10ms ),然后選通三種顏色的濾波器,計算這段時間內(nèi) TCS3200 的輸出脈沖數(shù),計算出一個比例因子,通過這個比例因子可以把這些脈沖數(shù)變?yōu)?55。在實際測試時,使用同樣的時間進行計數(shù),把測得的脈沖數(shù)再乘以求得的比例因子,然后就可以得到所對應的 R 、G 和B 的值。
?
====編程原理====
+
===編程原理===
 
TCS3200 模塊與 Arduino UNO 的實驗接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進行白平衡的調(diào)整,使 TCS3200 對所檢測的白色中的三原色相等。進行白平衡調(diào)整是為后續(xù)的顏色識別作準備。因此在本例程中,首先需要點亮 LED 燈,延時 4s,通過白平衡測試,計算得到白色物體的 RGB 值 255 與 1s 內(nèi)三色光脈沖數(shù)的 RGB 比例因子,那么:
 
TCS3200 模塊與 Arduino UNO 的實驗接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進行白平衡的調(diào)整,使 TCS3200 對所檢測的白色中的三原色相等。進行白平衡調(diào)整是為后續(xù)的顏色識別作準備。因此在本例程中,首先需要點亮 LED 燈,延時 4s,通過白平衡測試,計算得到白色物體的 RGB 值 255 與 1s 內(nèi)三色光脈沖數(shù)的 RGB 比例因子,那么:
 
* 紅、綠、藍三色光分別對應的 1s 內(nèi) TCS3200 輸出脈沖數(shù) * 相應的比例因子 = RGB 標準值
 
* 紅、綠、藍三色光分別對應的 1s 內(nèi) TCS3200 輸出脈沖數(shù) * 相應的比例因子 = RGB 標準值

2015年12月25日 (五) 11:15的版本

02S03501.png

目錄

產(chǎn)品概述

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

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

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

接口定義

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

使用方法

工作原理

三原色感應原理

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

TCS3200 顏色識別原理

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

白平衡原理

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

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

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

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

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

編程原理

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

  • 紅、綠、藍三色光分別對應的 1s 內(nèi) TCS3200 輸出脈沖數(shù) * 相應的比例因子 = RGB 標準值

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

硬件接線圖

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

例子程序

完成硬件連接后,將 TimerOne 庫文件粘貼到arduino軟件的libraries 中(如需庫文件請與我們聯(lián)系),無庫文件或?qū)煳募佩e位置代碼編譯可能將會出現(xiàn)錯誤提示。 將代碼編譯后下載到Arduino里。

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

程序效果

通過串口監(jiān)視器可以查看當前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示:

02S03502.png

應用例程

硬件設備

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

接線說明

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

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

應用例程

例子程序

#include <TimerOne.h>       // 引用 TimerOne.h 庫文件 
#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,用于存儲計數(shù)頻率 
int   g_array[3];    //定義整型數(shù)組變量 g_array[3],用于存儲RGB的值 
int   g_flag = 0;   	 //定義整形變量 g_flag 并賦初值為0,用于過濾器排列 
float g_SF[3];       //定義浮點型數(shù)組變量g_SF[3],用于存儲RGB比例因子 
int   value[3];      //定義定義整型數(shù)組變量value[3],用于判斷顏色 
//  初始化tsc230 和設置頻率 
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 ++ ;                  // 自動計算頻率 
} 
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);       // 沒有過濾藍色 
         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);           //設置一秒周期 
} 
void setup() 
{ 
  pinMode(Rs,OUTPUT);               //設定Rs引腳為輸出狀態(tài) 
  pinMode(Ys,OUTPUT);               //設定Ys引腳為輸出狀態(tài) 
  pinMode(Gs,OUTPUT);               //設定Gs引腳為輸出狀態(tài) 
  pinMode(Bs,OUTPUT);               //設定Bs引腳為輸出狀態(tài) 
  pinMode(Ws,OUTPUT);              //設定Ws引腳為輸出狀態(tài) 
  TSC_Init();                         //初始化tcs230 
  Serial.begin(9600);                   //打開串口并設置通信波特率為 9600 
  Timer1.initialize();                      //初始化默認是一秒 
  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] ;           // 藍色的比例因子 
  
  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ù)值滿足為藍色值范圍則執(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 秒
 

應用程序效果

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

視頻演示

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


產(chǎn)品相關推薦

Erweima.png

購買地址

TCS3200D 顏色傳感器

周邊產(chǎn)品推薦

Carduino UNO R3 控制器
灰度傳感器
Arduino ColorPAL Color Sensor 進口顏色傳感器 顏色識別
Arduino 高亮LED食人魚燈

相關問題解答

Arduino 顏色傳感器評測

相關學習資料

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