“SKU:RB-02S035 TCS3200顏色傳感器”的版本間的差異
(→?例子程序) |
(→?資料下載) |
||
(未顯示1個(gè)用戶的3個(gè)中間版本) | |||
第2行: | 第2行: | ||
==產(chǎn)品概述== | ==產(chǎn)品概述== | ||
TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價(jià)比較高的顏色識(shí)別、檢測傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉(zhuǎn)換芯片 TCS3200D RGB感應(yīng)芯片和4個(gè)白色LED燈,TCS3200能在一定的范圍內(nèi)檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個(gè)都有紅綠藍(lán)和清除4種濾光器。每6種顏色濾光器均勻地按數(shù)組分布來清除顏色中偏移位置的顏色分量。內(nèi)置的振蕩器能輸出方波,其頻率與所選擇的光的強(qiáng)度成比例關(guān)系。 | TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價(jià)比較高的顏色識(shí)別、檢測傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉(zhuǎn)換芯片 TCS3200D RGB感應(yīng)芯片和4個(gè)白色LED燈,TCS3200能在一定的范圍內(nèi)檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個(gè)都有紅綠藍(lán)和清除4種濾光器。每6種顏色濾光器均勻地按數(shù)組分布來清除顏色中偏移位置的顏色分量。內(nèi)置的振蕩器能輸出方波,其頻率與所選擇的光的強(qiáng)度成比例關(guān)系。 | ||
? | == | + | |
+ | ==產(chǎn)品參數(shù)== | ||
# 顏色識(shí)別芯片:TCS3200D | # 顏色識(shí)別芯片:TCS3200D | ||
# 輸出頻率范圍:10kHz - 12kHz,占空比50% | # 輸出頻率范圍:10kHz - 12kHz,占空比50% | ||
第16行: | 第17行: | ||
# 相鄰固定孔間距:11.74 mm | # 相鄰固定孔間距:11.74 mm | ||
# 發(fā)光顏色:高亮白光 | # 發(fā)光顏色:高亮白光 | ||
? | + | 14.接口定義 | |
? | + | : S0:輸出頻率選擇輸入腳 | |
? | + | : S1:輸出頻率選擇輸入腳 | |
? | + | : OE:低電壓使能端 | |
? | + | : GND:接電源地 | |
? | + | : Vcc:接電源正 | |
? | + | : OUT:輸出端 | |
? | + | : S2:輸出頻率選擇輸入腳 | |
? | + | : S3:輸出頻率選擇輸入腳 | |
? | + | ||
? | + | ==工作原理== | |
? | + | ||
+ | ===三原色感應(yīng)原理=== | ||
:通常所看到的物體的顏色,實(shí)際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應(yīng)。白色是由各種頻率的可見光混合在一起構(gòu)成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍(lán)B、紫P)。根據(jù)德國物理學(xué)家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍(lán))混合而成的。所以,如果知道構(gòu)成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/> | :通常所看到的物體的顏色,實(shí)際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應(yīng)。白色是由各種頻率的可見光混合在一起構(gòu)成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍(lán)B、紫P)。根據(jù)德國物理學(xué)家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍(lán))混合而成的。所以,如果知道構(gòu)成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/> | ||
? | + | ||
+ | === TCS3200 顏色識(shí)別原理=== | ||
:對(duì)于TCS3200 來說,當(dāng)選定一個(gè)顏色濾波器時(shí),它只允許某種特定的原色通過,阻止其它原色的通過。例如:當(dāng)選擇紅色濾波器時(shí),入射光中只有紅色可以通過,藍(lán)色和綠色都被阻止,這樣就可以得到紅色光的光強(qiáng);同理,選擇藍(lán)色濾波器或綠色濾波器時(shí),就可以得到藍(lán)色光和綠色光的光強(qiáng)。通過這三個(gè)值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/> | :對(duì)于TCS3200 來說,當(dāng)選定一個(gè)顏色濾波器時(shí),它只允許某種特定的原色通過,阻止其它原色的通過。例如:當(dāng)選擇紅色濾波器時(shí),入射光中只有紅色可以通過,藍(lán)色和綠色都被阻止,這樣就可以得到紅色光的光強(qiáng);同理,選擇藍(lán)色濾波器或綠色濾波器時(shí),就可以得到藍(lán)色光和綠色光的光強(qiáng)。通過這三個(gè)值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/> | ||
? | + | ||
+ | ===白平衡原理=== | ||
:白平衡就是告訴系統(tǒng)什么是白色。從理論上講,白色是由等量的紅色、綠色和藍(lán)色混合而成的;但實(shí)際上,白色中的三原色并不完全相等,并且對(duì)于 TCS3200 的光傳感器來說,它對(duì)這三種基本色的敏感性是不相同的,導(dǎo)致TCS3200 的 RGB 輸出并不相等,因此在測試前必須進(jìn)行白平衡調(diào)整,使得 TCS3200 對(duì)所檢測的“白色”中的三原色是相等的。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。<br/> | :白平衡就是告訴系統(tǒng)什么是白色。從理論上講,白色是由等量的紅色、綠色和藍(lán)色混合而成的;但實(shí)際上,白色中的三原色并不完全相等,并且對(duì)于 TCS3200 的光傳感器來說,它對(duì)這三種基本色的敏感性是不相同的,導(dǎo)致TCS3200 的 RGB 輸出并不相等,因此在測試前必須進(jìn)行白平衡調(diào)整,使得 TCS3200 對(duì)所檢測的“白色”中的三原色是相等的。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。<br/> | ||
在本裝置中,白平衡調(diào)整的具體步驟和方法如下: | 在本裝置中,白平衡調(diào)整的具體步驟和方法如下: | ||
第38行: | 第42行: | ||
* 依次選通三種顏色的濾波器,然后對(duì) TCS230的輸出脈沖依次進(jìn)行計(jì)數(shù)。當(dāng)計(jì)數(shù)到255 時(shí)停止計(jì)數(shù),分別計(jì)算每個(gè)通道所用的時(shí)間。這些時(shí)間對(duì)應(yīng)于實(shí)際測試時(shí) TCS3200 每種濾波器所采用的時(shí)間基準(zhǔn),在這段時(shí)間內(nèi)所測得的脈沖數(shù)就是所對(duì)應(yīng)的 R 、G 和 B 的值。 | * 依次選通三種顏色的濾波器,然后對(duì) TCS230的輸出脈沖依次進(jìn)行計(jì)數(shù)。當(dāng)計(jì)數(shù)到255 時(shí)停止計(jì)數(shù),分別計(jì)算每個(gè)通道所用的時(shí)間。這些時(shí)間對(duì)應(yīng)于實(shí)際測試時(shí) TCS3200 每種濾波器所采用的時(shí)間基準(zhǔn),在這段時(shí)間內(nèi)所測得的脈沖數(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í)際測試時(shí),使用同樣的時(shí)間進(jìn)行計(jì)數(shù),把測得的脈沖數(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í)際測試時(shí),使用同樣的時(shí)間進(jìn)行計(jì)數(shù),把測得的脈沖數(shù)再乘以求得的比例因子,然后就可以得到所對(duì)應(yīng)的 R 、G 和B 的值。 | ||
? | + | ||
+ | ==編程原理== | ||
TCS3200 模塊與 Arduino UNO 的實(shí)驗(yàn)接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進(jìn)行白平衡的調(diào)整,使 TCS3200 對(duì)所檢測的白色中的三原色相等。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。因此在本例程中,首先需要點(diǎn)亮 LED 燈,延時(shí) 4s,通過白平衡測試,計(jì)算得到白色物體的 RGB 值 255 與 1s 內(nèi)三色光脈沖數(shù)的 RGB 比例因子,那么: | TCS3200 模塊與 Arduino UNO 的實(shí)驗(yàn)接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進(jìn)行白平衡的調(diào)整,使 TCS3200 對(duì)所檢測的白色中的三原色相等。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。因此在本例程中,首先需要點(diǎn)亮 LED 燈,延時(shí) 4s,通過白平衡測試,計(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)值 | * 紅、綠、藍(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 三種顏色的值。 | 然后,通過調(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 三種顏色的值。 | ||
? | === | + | |
+ | ==使用方法== | ||
+ | ===example1_Arduino=== | ||
+ | |||
+ | * 硬件接線圖 | ||
[[文件:yansejiexian.jpg|700px|有框|居中]] | [[文件:yansejiexian.jpg|700px|有框|居中]] | ||
? | * 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數(shù)字接口6號(hào)) | + | * 接線說明 |
? | * 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數(shù)字接口5號(hào)) | + | :* 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數(shù)字接口6號(hào)) |
? | * 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數(shù)字接口4號(hào)) | + | :* 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數(shù)字接口5號(hào)) |
? | * 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數(shù)字接口3號(hào)) | + | :* 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數(shù)字接口4號(hào)) |
? | * 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數(shù)字接口2號(hào)) | + | :* 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數(shù)字接口3號(hào)) |
? | * 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND) | + | :* 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數(shù)字接口2號(hào)) |
? | * 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc) | + | :* 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND) |
? | + | :* 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc) | |
+ | |||
+ | * 示例程序 | ||
'''* 說明:'''顏色傳感器使用了 Arduino 的外部中斷功能,所以此程序適用于 Arduino UNO 控制器(外部中斷 0 為數(shù)字引腳 2 號(hào)),如果要使用其他型號(hào)的 Arduino 控制器,只需對(duì)應(yīng)修改中斷標(biāo)號(hào)或者連接的引腳即可。<br/> | '''* 說明:'''顏色傳感器使用了 Arduino 的外部中斷功能,所以此程序適用于 Arduino UNO 控制器(外部中斷 0 為數(shù)字引腳 2 號(hào)),如果要使用其他型號(hào)的 Arduino 控制器,只需對(duì)應(yīng)修改中斷標(biāo)號(hào)或者連接的引腳即可。<br/> | ||
? | + | ||
+ | 例:結(jié)合 Leonardo 控制器來使用 TCS3200 顏色傳感器,則需要將 setup 中的外部中斷語句修改,其他接線方法一致<br/> | ||
原語句為:attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0 <br/> | 原語句為:attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0 <br/> | ||
修改后語句為:attachInterrupt(1, TSC_Count, RISING);//外部中斷口初始1 <br/> | 修改后語句為:attachInterrupt(1, TSC_Count, RISING);//外部中斷口初始1 <br/> | ||
? | 原因: Leonardo 的數(shù)字 2 號(hào)接口為外部中斷 1,而 UNO 控制器的數(shù)字 2 號(hào)接口為外部中斷 | + | 原因: Leonardo 的數(shù)字 2 號(hào)接口為外部中斷 1,而 UNO 控制器的數(shù)字 2 號(hào)接口為外部中斷 0,具體可以查閱Arduino官網(wǎng)相應(yīng)產(chǎn)品說明:https://www.arduino.cc/ <br/> |
+ | |||
<pre style='color:blue'> | <pre style='color:blue'> | ||
#include <TimerOne.h> // 引用 TimerOne.h 庫文件 | #include <TimerOne.h> // 引用 TimerOne.h 庫文件 | ||
第179行: | 第192行: | ||
</pre> | </pre> | ||
? | + | * 程序效果 | |
如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當(dāng)前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示: | 如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當(dāng)前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示: | ||
[[文件:02S03502.png|500px|有框|居中]] | [[文件:02S03502.png|500px|有框|居中]] | ||
? | === | + | ===example2_Arduino=== |
? | + | * 硬件設(shè)備 | |
# [http://gharee.com/goods-546.html Carduino UNO R3 控制器] * 1個(gè) | # [http://gharee.com/goods-546.html Carduino UNO R3 控制器] * 1個(gè) | ||
# [http://gharee.com/goods-147.html Arduino 傳感器擴(kuò)展板V5.0] * 1個(gè) | # [http://gharee.com/goods-147.html Arduino 傳感器擴(kuò)展板V5.0] * 1個(gè) | ||
第194行: | 第207行: | ||
# 色板 * 1個(gè) | # 色板 * 1個(gè) | ||
? | + | * 接線說明 | |
* 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同 | * 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同 | ||
* 將各種顏色食人魚燈連接到 Arduino傳感器擴(kuò)展板上,連接方式:<br/> | * 將各種顏色食人魚燈連接到 Arduino傳感器擴(kuò)展板上,連接方式:<br/> | ||
第202行: | 第215行: | ||
(4)藍(lán)色燈接數(shù)字口 11號(hào) <br/> | (4)藍(lán)色燈接數(shù)字口 11號(hào) <br/> | ||
(5)白色燈接數(shù)字口 12號(hào) <br/> | (5)白色燈接數(shù)字口 12號(hào) <br/> | ||
? | + | ||
? | + | * 示例程序 | |
? | + | ||
<pre style='color:blue'> | <pre style='color:blue'> | ||
#include <TimerOne.h> // 引用 TimerOne.h 庫文件 | #include <TimerOne.h> // 引用 TimerOne.h 庫文件 | ||
第382行: | 第394行: | ||
</pre> | </pre> | ||
? | + | * 程序效果 | |
:在以上步驟完成后,我們首先需要在其程序啟動(dòng)后白平衡(白平衡在上文中已介紹),下圖為Arduino實(shí)驗(yàn)代碼的白平衡實(shí)驗(yàn)現(xiàn)象: | :在以上步驟完成后,我們首先需要在其程序啟動(dòng)后白平衡(白平衡在上文中已介紹),下圖為Arduino實(shí)驗(yàn)代碼的白平衡實(shí)驗(yàn)現(xiàn)象: | ||
[[文件:hih6.jpg|500px|有框|居中]] | [[文件:hih6.jpg|500px|有框|居中]] | ||
第396行: | 第408行: | ||
[[File:yan se 01.png|400px|居中|link=http://v.youku.com/v_show/id_XMzU0NzEyNDg4.html?from=y1.7-2]] | [[File:yan se 01.png|400px|居中|link=http://v.youku.com/v_show/id_XMzU0NzEyNDg4.html?from=y1.7-2]] | ||
<br/> | <br/> | ||
? | == | + | ==資料下載== |
[[文件:erweima.png|230px|無框|右]] | [[文件:erweima.png|230px|無框|右]] | ||
? | + | * 產(chǎn)品資料 | |
? | + | 下載鏈接:https://pan.baidu.com/s/11PXJOobOvOubcp1-bpTbbg | |
? | + | 提取碼:72bg | |
? | + | * 產(chǎn)品購買鏈接:http://gharee.com/goods.php?id=73 | |
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + | ||
? | + |
2021年12月9日 (四) 17:06的最后版本
目錄 |
產(chǎn)品概述
TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價(jià)比較高的顏色識(shí)別、檢測傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉(zhuǎn)換芯片 TCS3200D RGB感應(yīng)芯片和4個(gè)白色LED燈,TCS3200能在一定的范圍內(nèi)檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個(gè)都有紅綠藍(lán)和清除4種濾光器。每6種顏色濾光器均勻地按數(shù)組分布來清除顏色中偏移位置的顏色分量。內(nèi)置的振蕩器能輸出方波,其頻率與所選擇的光的強(qiáng)度成比例關(guān)系。
產(chǎn)品參數(shù)
- 顏色識(shí)別芯片:TCS3200D
- 輸出頻率范圍:10kHz - 12kHz,占空比50%
- 工作電壓:+2.7v - +5.5v
- 工作電流:1.4 mA
- 檢測狀態(tài):靜態(tài)檢測
- 最佳檢測距離:10mm
- 工作溫度:-40°C - +85°C
- 尺寸大?。?5.8mm * 35.8mm * 10.8mm
- 重量大?。?.7g
- 固定孔:3mm * 4個(gè)
- 對(duì)角固定孔間距:16.60 mm
- 相鄰固定孔間距:11.74 mm
- 發(fā)光顏色:高亮白光
14.接口定義
- S0:輸出頻率選擇輸入腳
- S1:輸出頻率選擇輸入腳
- OE:低電壓使能端
- GND:接電源地
- Vcc:接電源正
- OUT:輸出端
- S2:輸出頻率選擇輸入腳
- S3:輸出頻率選擇輸入腳
工作原理
三原色感應(yīng)原理
- 通常所看到的物體的顏色,實(shí)際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應(yīng)。白色是由各種頻率的可見光混合在一起構(gòu)成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍(lán)B、紫P)。根據(jù)德國物理學(xué)家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍(lán))混合而成的。所以,如果知道構(gòu)成各種顏色的三原色的值,就能夠知道所測試物體的顏色。
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 輸出并不相等,因此在測試前必須進(jìn)行白平衡調(diào)整,使得 TCS3200 對(duì)所檢測的“白色”中的三原色是相等的。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。
在本裝置中,白平衡調(diào)整的具體步驟和方法如下:
- 將傳感器至于一張白紙上,使用產(chǎn)品上的發(fā)光二極管照射到白紙上,使入射光能夠通過反射傳到 TCS3200 上,然后根據(jù)前面所介紹的方法,依次選通紅色、綠色和藍(lán)色濾波器,分別測得紅色、綠色和藍(lán)色的值,然后就可計(jì)算出需要的三個(gè)調(diào)整參數(shù)。
當(dāng)用 TCS3200 識(shí)別顏色時(shí),就用這三個(gè)參數(shù)對(duì)所測顏色的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í)際測試時(shí) TCS3200 每種濾波器所采用的時(shí)間基準(zhǔn),在這段時(shí)間內(nèi)所測得的脈沖數(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í)際測試時(shí),使用同樣的時(shí)間進(jìn)行計(jì)數(shù),把測得的脈沖數(shù)再乘以求得的比例因子,然后就可以得到所對(duì)應(yīng)的 R 、G 和B 的值。
編程原理
TCS3200 模塊與 Arduino UNO 的實(shí)驗(yàn)接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進(jìn)行白平衡的調(diào)整,使 TCS3200 對(duì)所檢測的白色中的三原色相等。進(jìn)行白平衡調(diào)整是為后續(xù)的顏色識(shí)別作準(zhǔn)備。因此在本例程中,首先需要點(diǎn)亮 LED 燈,延時(shí) 4s,通過白平衡測試,計(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 三種顏色的值。
使用方法
example1_Arduino
- 硬件接線圖
- 接線說明
- 顏色傳感器 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)
- 示例程序
* 說明:顏色傳感器使用了 Arduino 的外部中斷功能,所以此程序適用于 Arduino UNO 控制器(外部中斷 0 為數(shù)字引腳 2 號(hào)),如果要使用其他型號(hào)的 Arduino 控制器,只需對(duì)應(yīng)修改中斷標(biāo)號(hào)或者連接的引腳即可。
例:結(jié)合 Leonardo 控制器來使用 TCS3200 顏色傳感器,則需要將 setup 中的外部中斷語句修改,其他接線方法一致
原語句為:attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0
修改后語句為:attachInterrupt(1, TSC_Count, RISING);//外部中斷口初始1
原因: Leonardo 的數(shù)字 2 號(hào)接口為外部中斷 1,而 UNO 控制器的數(shù)字 2 號(hào)接口為外部中斷 0,具體可以查閱Arduino官網(wǎng)相應(yīng)產(chǎn)品說明:https://www.arduino.cc/
#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,用于存儲(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í)長為 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 ,以等待被測試物體紅、綠、藍(lán)三色在 1s 內(nèi)的 TCS3200 輸出信號(hào)脈沖計(jì)數(shù) //通過白平衡測試,計(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)值 //打印被測物體的RGB值 for(int i=0; i<3; i++) Serial.println(int(g_array[i] * g_SF[i])); } //主程序 void loop() { g_flag = 0; //每獲得一次被測物體RGB顏色值需時(shí)4s delay(4000); //打印出被測物體RGB顏色值 for(int i=0; i<3; i++) Serial.println(int(g_array[i] * g_SF[i])); }
- 程序效果
如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當(dāng)前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示:
example2_Arduino
- 硬件設(shè)備
- Carduino UNO R3 控制器 * 1個(gè)
- Arduino 傳感器擴(kuò)展板V5.0 * 1個(gè)
- Color Sensor顏色傳感器模塊 * 1個(gè)
- 3P傳感器連接線 * 5個(gè)
- 4P傳感器連接線 * 2個(gè)
- IR&LED Modue * 5個(gè) (紅、白、藍(lán)、黃、綠色各一個(gè))
- USB 數(shù)據(jù)通信線 * 1個(gè)
- 色板 * 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)
- 示例程序
#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,用于存儲(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 秒
- 程序效果
- 在以上步驟完成后,我們首先需要在其程序啟動(dòng)后白平衡(白平衡在上文中已介紹),下圖為Arduino實(shí)驗(yàn)代碼的白平衡實(shí)驗(yàn)現(xiàn)象:
- 在完成白平衡后(上圖實(shí)驗(yàn)現(xiàn)象即白色食人魚燈亮起,也是其系統(tǒng)在檢測到白色后的現(xiàn)象)就可以檢測其他顏色了。白平衡只是系統(tǒng)對(duì)白色的一種數(shù)值反饋(即告訴系統(tǒng)什么是白色),本模塊識(shí)別、檢測后讀出的只是 R 、G、B 的值,對(duì)應(yīng)其檢測到的顏色R、G、B 值,該測試程序編寫者特編寫了一段應(yīng)用五種顏色食人魚燈來顯示其檢測到的顏色。判斷語句中的范圍為程序編寫者在實(shí)驗(yàn)室環(huán)境下所測得的R 、G、B 值。更換環(huán)境后應(yīng)予以更改其對(duì)應(yīng)顏色判斷的R、G、B 值范圍。測試程序( 顏色檢測程序)中涉及到了紅、黃、綠、藍(lán)、白五種顏色,而色板上為六種顏色,多出一種顏色黑色是為了做出對(duì)比 :在檢測中遇到非該檢測顏色時(shí)(即不滿足判斷語句的條件時(shí))應(yīng)只在串口打印"->Other Color" ,而無其他現(xiàn)象產(chǎn)生。下圖為Arduino實(shí)驗(yàn)代碼在檢測到其他顏色時(shí)的實(shí)驗(yàn)現(xiàn)象
視頻演示
資料下載
- 產(chǎn)品資料
下載鏈接:https://pan.baidu.com/s/11PXJOobOvOubcp1-bpTbbg 提取碼:72bg
- 產(chǎn)品購買鏈接:http://gharee.com/goods.php?id=73