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

來自ALSROBOT WiKi
跳轉至: 導航搜索
(以“ ==產品概述== TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價比較高...”為內容創(chuàng)建頁面)
 
?資料下載
 
(未顯示1個用戶的8個中間版本)
第2行: 第2行:
 
==產品概述==
 
==產品概述==
 
TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價比較高的顏色識別、檢測傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉換芯片 TCS3200D RGB感應芯片和4個白色LED燈,TCS3200能在一定的范圍內檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個都有紅綠藍和清除4種濾光器。每6種顏色濾光器均勻地按數組分布來清除顏色中偏移位置的顏色分量。內置的振蕩器能輸出方波,其頻率與所選擇的光的強度成比例關系。
 
TCS3200顏色傳感器是全彩的顏色檢測器,是一款簡單易用、小巧輕便、性價比較高的顏色識別、檢測傳感器。包括了一塊TAOS公司最新退出的顏色到頻率轉換芯片 TCS3200D RGB感應芯片和4個白色LED燈,TCS3200能在一定的范圍內檢測和測量幾乎所有的可見光。TCS3200有大量的光檢測器,每個都有紅綠藍和清除4種濾光器。每6種顏色濾光器均勻地按數組分布來清除顏色中偏移位置的顏色分量。內置的振蕩器能輸出方波,其頻率與所選擇的光的強度成比例關系。
?
==規(guī)格參數==
+
 
 +
==產品參數==
 
# 顏色識別芯片:TCS3200D
 
# 顏色識別芯片:TCS3200D
 
# 輸出頻率范圍:10kHz - 12kHz,占空比50%
 
# 輸出頻率范圍:10kHz - 12kHz,占空比50%
第16行: 第17行:
 
# 相鄰固定孔間距:11.74 mm
 
# 相鄰固定孔間距:11.74 mm
 
# 發(fā)光顏色:高亮白光
 
# 發(fā)光顏色:高亮白光
?
==接口定義==
+
14.接口定義
?
* S0:輸出頻率選擇輸入腳
+
: S0:輸出頻率選擇輸入腳
?
* S1:輸出頻率選擇輸入腳
+
: S1:輸出頻率選擇輸入腳
?
* OE:低電壓使能端
+
: OE:低電壓使能端
?
* GND:接電源地
+
: GND:接電源地
?
* Vcc:接電源正
+
: Vcc:接電源正
?
* OUT:輸出端
+
: OUT:輸出端
?
* S2:輸出頻率選擇輸入腳
+
: S2:輸出頻率選擇輸入腳
?
* S3:輸出頻率選擇輸入腳
+
: S3:輸出頻率選擇輸入腳
?
==使用方法==
+
 
?
===工作原理===
+
==工作原理==
?
====三原色感應原理====
+
 
 +
===三原色感應原理===
 
:通常所看到的物體的顏色,實際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應。白色是由各種頻率的可見光混合在一起構成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍B、紫P)。根據德國物理學家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。所以,如果知道構成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/>
 
:通常所看到的物體的顏色,實際上是物體表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反應。白色是由各種頻率的可見光混合在一起構成的,也就是說白光中包含著各種顏色的色光(如紅R、黃Y、綠G、青V、藍B、紫P)。根據德國物理學家赫姆霍茲(Helinholtz)的三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。所以,如果知道構成各種顏色的三原色的值,就能夠知道所測試物體的顏色。<br/>
?
==== TCS3200 顏色識別原理====
+
 
 +
=== TCS3200 顏色識別原理===
 
:對于TCS3200 來說,當選定一個顏色濾波器時,它只允許某種特定的原色通過,阻止其它原色的通過。例如:當選擇紅色濾波器時,入射光中只有紅色可以通過,藍色和綠色都被阻止,這樣就可以得到紅色光的光強;同理,選擇藍色濾波器或綠色濾波器時,就可以得到藍色光和綠色光的光強。通過這三個值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/>
 
:對于TCS3200 來說,當選定一個顏色濾波器時,它只允許某種特定的原色通過,阻止其它原色的通過。例如:當選擇紅色濾波器時,入射光中只有紅色可以通過,藍色和綠色都被阻止,這樣就可以得到紅色光的光強;同理,選擇藍色濾波器或綠色濾波器時,就可以得到藍色光和綠色光的光強。通過這三個值,就可以分析投射到 TCS3200 傳感器上的光的顏色。<br/>
?
====白平衡原理====
+
 
 +
===白平衡原理===
 
:白平衡就是告訴系統(tǒng)什么是白色。從理論上講,白色是由等量的紅色、綠色和藍色混合而成的;但實際上,白色中的三原色并不完全相等,并且對于 TCS3200 的光傳感器來說,它對這三種基本色的敏感性是不相同的,導致TCS3200 的 RGB 輸出并不相等,因此在測試前必須進行白平衡調整,使得 TCS3200 對所檢測的“白色”中的三原色是相等的。進行白平衡調整是為后續(xù)的顏色識別作準備。<br/>
 
:白平衡就是告訴系統(tǒng)什么是白色。從理論上講,白色是由等量的紅色、綠色和藍色混合而成的;但實際上,白色中的三原色并不完全相等,并且對于 TCS3200 的光傳感器來說,它對這三種基本色的敏感性是不相同的,導致TCS3200 的 RGB 輸出并不相等,因此在測試前必須進行白平衡調整,使得 TCS3200 對所檢測的“白色”中的三原色是相等的。進行白平衡調整是為后續(xù)的顏色識別作準備。<br/>
 
在本裝置中,白平衡調整的具體步驟和方法如下:
 
在本裝置中,白平衡調整的具體步驟和方法如下:
第38行: 第42行:
 
* 依次選通三種顏色的濾波器,然后對 TCS230的輸出脈沖依次進行計數。當計數到255 時停止計數,分別計算每個通道所用的時間。這些時間對應于實際測試時 TCS3200 每種濾波器所采用的時間基準,在這段時間內所測得的脈沖數就是所對應的 R 、G 和 B 的值。
 
* 依次選通三種顏色的濾波器,然后對 TCS230的輸出脈沖依次進行計數。當計數到255 時停止計數,分別計算每個通道所用的時間。這些時間對應于實際測試時 TCS3200 每種濾波器所采用的時間基準,在這段時間內所測得的脈沖數就是所對應的 R 、G 和 B 的值。
 
* 設置定時器為一固定時間( 例如10ms ),然后選通三種顏色的濾波器,計算這段時間內 TCS3200 的輸出脈沖數,計算出一個比例因子,通過這個比例因子可以把這些脈沖數變?yōu)?55。在實際測試時,使用同樣的時間進行計數,把測得的脈沖數再乘以求得的比例因子,然后就可以得到所對應的 R 、G 和B 的值。
 
* 設置定時器為一固定時間( 例如10ms ),然后選通三種顏色的濾波器,計算這段時間內 TCS3200 的輸出脈沖數,計算出一個比例因子,通過這個比例因子可以把這些脈沖數變?yōu)?55。在實際測試時,使用同樣的時間進行計數,把測得的脈沖數再乘以求得的比例因子,然后就可以得到所對應的 R 、G 和B 的值。
?
===編程原理===
+
 
 +
==編程原理==
 
TCS3200 模塊與 Arduino UNO 的實驗接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進行白平衡的調整,使 TCS3200 對所檢測的白色中的三原色相等。進行白平衡調整是為后續(xù)的顏色識別作準備。因此在本例程中,首先需要點亮 LED 燈,延時 4s,通過白平衡測試,計算得到白色物體的 RGB 值 255 與 1s 內三色光脈沖數的 RGB 比例因子,那么:
 
TCS3200 模塊與 Arduino UNO 的實驗接線如下圖所示。TCS3200 顏色傳感器能讀取三種基本色(RGB),但 RGB 輸出并不相等,因此在測試前必須進行白平衡的調整,使 TCS3200 對所檢測的白色中的三原色相等。進行白平衡調整是為后續(xù)的顏色識別作準備。因此在本例程中,首先需要點亮 LED 燈,延時 4s,通過白平衡測試,計算得到白色物體的 RGB 值 255 與 1s 內三色光脈沖數的 RGB 比例因子,那么:
 
* 紅、綠、藍三色光分別對應的 1s 內 TCS3200 輸出脈沖數 * 相應的比例因子 = RGB 標準值
 
* 紅、綠、藍三色光分別對應的 1s 內 TCS3200 輸出脈沖數 * 相應的比例因子 = RGB 標準值
 
然后,通過調用定時器中斷函數,每 1s 產生中斷后,計算出該時間內的紅、綠、藍三種光線通過濾波器時產生的脈沖數,再將 TCS3200 輸出的信號脈沖個數分別存儲到相應的顏色的數組變量中,本例程設置了輸出該數組的值,其代表了 RGB 三種顏色的值。
 
然后,通過調用定時器中斷函數,每 1s 產生中斷后,計算出該時間內的紅、綠、藍三種光線通過濾波器時產生的脈沖數,再將 TCS3200 輸出的信號脈沖個數分別存儲到相應的顏色的數組變量中,本例程設置了輸出該數組的值,其代表了 RGB 三種顏色的值。
?
===硬件接線圖===
+
 
 +
==使用方法==
 +
===example1_Arduino===
 +
 
 +
* 硬件接線圖
 
[[文件:yansejiexian.jpg|700px|有框|居中]]
 
[[文件:yansejiexian.jpg|700px|有框|居中]]
?
* 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數字接口6號)
+
* 接線說明
?
* 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數字接口5號)
+
:* 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數字接口6號)
?
* 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數字接口4號)
+
:* 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數字接口5號)
?
* 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數字接口3號)
+
:* 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數字接口4號)
?
* 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數字接口2號)
+
:* 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數字接口3號)
?
* 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND)
+
:* 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數字接口2號)
?
* 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc)
+
:* 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND)
?
===例子程序===
+
:* 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc)
?
完成硬件連接后,將 [http://pan.baidu.com/s/1eRvi7uy TimerOne庫文件]粘貼到 Arduino IDE 軟件的 libraries 文件中(庫文件可以直接在此點擊下載),無庫文件或將庫文件放錯位置代碼編譯可能將會出現錯誤提示,將代碼編譯后下載到Arduino里。
+
 
 +
* 示例程序
 +
'''* 說明:'''顏色傳感器使用了 Arduino 的外部中斷功能,所以此程序適用于 Arduino UNO 控制器(外部中斷 0 為數字引腳 2 號),如果要使用其他型號的 Arduino 控制器,只需對應修改中斷標號或者連接的引腳即可。<br/>
 +
 
 +
例:結合 Leonardo 控制器來使用 TCS3200 顏色傳感器,則需要將 setup 中的外部中斷語句修改,其他接線方法一致<br/>
 +
原語句為:attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0 <br/>
 +
修改后語句為:attachInterrupt(1, TSC_Count, RISING);//外部中斷口初始1 <br/>
 +
原因: Leonardo 的數字 2 號接口為外部中斷 1,而 UNO 控制器的數字 2 號接口為外部中斷 0,具體可以查閱Arduino官網相應產品說明:https://www.arduino.cc/ <br/>
 +
 
 
<pre style='color:blue'>
 
<pre style='color:blue'>
 
#include <TimerOne.h>  // 引用 TimerOne.h 庫文件  
 
#include <TimerOne.h>  // 引用 TimerOne.h 庫文件  
第175行: 第192行:
 
</pre>
 
</pre>
  
?
===程序效果===
+
* 程序效果
 
如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示:
 
如果程序編譯正常,并且正確上傳到 Arduino UNO 控制器中,就可以通過串口監(jiān)視器可以查看當前檢測的 RGB 值,從而判斷顏色。白平衡效果如下圖所示:
 
[[文件:02S03502.png|500px|有框|居中]]
 
[[文件:02S03502.png|500px|有框|居中]]
  
?
===應用例程===
+
===example2_Arduino===
?
====硬件設備====
+
* 硬件設備
 
# [http://lifestyle201.com/goods-546.html Carduino UNO R3 控制器] * 1個  
 
# [http://lifestyle201.com/goods-546.html Carduino UNO R3 控制器] * 1個  
 
# [http://lifestyle201.com/goods-147.html Arduino 傳感器擴展板V5.0] * 1個                 
 
# [http://lifestyle201.com/goods-147.html Arduino 傳感器擴展板V5.0] * 1個                 
第190行: 第207行:
 
# 色板 * 1個
 
# 色板 * 1個
  
?
====接線說明====
+
* 接線說明
 
* 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同
 
* 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同
 
* 將各種顏色食人魚燈連接到 Arduino傳感器擴展板上,連接方式:<br/>
 
* 將各種顏色食人魚燈連接到 Arduino傳感器擴展板上,連接方式:<br/>
第198行: 第215行:
 
(4)藍色燈接數字口 11號 <br/>
 
(4)藍色燈接數字口 11號 <br/>
 
(5)白色燈接數字口 12號 <br/>
 
(5)白色燈接數字口 12號 <br/>
?
====應用例程====
+
 
?
====例子程序====
+
* 示例程序
?
完成硬件連接后,將 [http://pan.baidu.com/s/1eRvi7uy TimerOne庫文件]粘貼到 Arduino IDE 軟件的 libraries 文件中(庫文件可以直接在此點擊下載),無庫文件或將庫文件放錯位置代碼編譯可能將會出現錯誤提示,將代碼編譯后下載到Arduino里。
+
 
<pre style='color:blue'>
 
<pre style='color:blue'>
 
#include <TimerOne.h>      // 引用 TimerOne.h 庫文件  
 
#include <TimerOne.h>      // 引用 TimerOne.h 庫文件  
第378行: 第394行:
 
  </pre>
 
  </pre>
  
?
====應用程序效果====
+
* 程序效果
 
:在以上步驟完成后,我們首先需要在其程序啟動后白平衡(白平衡在上文中已介紹),下圖為Arduino實驗代碼的白平衡實驗現象:
 
:在以上步驟完成后,我們首先需要在其程序啟動后白平衡(白平衡在上文中已介紹),下圖為Arduino實驗代碼的白平衡實驗現象:
 
[[文件:hih6.jpg|500px|有框|居中]]
 
[[文件:hih6.jpg|500px|有框|居中]]
第392行: 第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|無框|右]]
?
===購買地址===
+
* 產品資料
?
[http://www.alsrobot.cn/goods.php?id=73 TCS3200D 顏色傳感器]<br/>
+
下載鏈接:https://pan.baidu.com/s/11PXJOobOvOubcp1-bpTbbg
?
===周邊產品推薦===
+
提取碼:72bg
?
[http://lifestyle201.com/goods-546.html Carduino UNO R3 控制器]<br/>
+
* 產品購買鏈接:http://lifestyle201.com/goods.php?id=73
?
[http://lifestyle201.com/goods-633.html 灰度傳感器]<br/>
+
?
[http://lifestyle201.com/goods-176.html Arduino ColorPAL Color Sensor 進口顏色傳感器 顏色識別]<br/>
+
?
[http://lifestyle201.com/goods-67.html Arduino 高亮LED食人魚燈]<br/>
+
?
===相關問題解答===
+
?
[http://www.makerspace.cn/forum.php?mod=viewthread&tid=5257&fromuid=10780 Arduino 顏色傳感器評測]<br/>
+
?
===相關學習資料===
+
?
[http://v.youku.com/v_show/id_XMzU0NzEyNDg4.html?from=y1.7-2 視頻: 運用顏色傳感器進行多彩顏色識別檢測]<br/>
+
?
[http://v.youku.com/v_show/id_XNDkxNzIzNzM2.html?from=y1.7-2 視頻: 愛上Arduino與愛上Processing互動之顏色過度識別]<br/>
+
?
[http://v.youku.com/v_show/id_XODc4NDc4MTQw.html?from=y1.7-2 視頻: 紅外無線發(fā)射接收之顏色識別系統(tǒng)]<br/>
+
?
[http://www.makerspace.cn/portal.php 奧松機器人技術論壇]<br/>
+

2021年12月9日 (四) 17:06的最后版本

02S03501.png

目錄

產品概述

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

產品參數

  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. 尺寸大?。?5.8mm * 35.8mm * 10.8mm
  9. 重量大?。?.7g
  10. 固定孔:3mm * 4個
  11. 對角固定孔間距:16.60 mm
  12. 相鄰固定孔間距:11.74 mm
  13. 發(fā)光顏色:高亮白光

14.接口定義

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

工作原理

三原色感應原理

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

TCS3200 顏色識別原理

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

白平衡原理

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

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

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

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

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

編程原理

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

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

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

使用方法

example1_Arduino

  • 硬件接線圖
Yansejiexian.jpg
  • 接線說明
  • 顏色傳感器 S0 連接 Arduino UNO 控制器 D6(數字接口6號)
  • 顏色傳感器 S1 連接 Arduino UNO 控制器 D5(數字接口5號)
  • 顏色傳感器 S2 連接 Arduino UNO 控制器 D4(數字接口4號)
  • 顏色傳感器 S3 連接 Arduino UNO 控制器 D3(數字接口3號)
  • 顏色傳感器 OUT 連接 Arduino UNO 控制器 D2(數字接口2號)
  • 顏色傳感器 OE、GND 連接 Arduino UNO 控制器電源地(GND)
  • 顏色傳感器 +5v 連接 Arduino UNO 控制器電源正(Vcc)
  • 示例程序

* 說明:顏色傳感器使用了 Arduino 的外部中斷功能,所以此程序適用于 Arduino UNO 控制器(外部中斷 0 為數字引腳 2 號),如果要使用其他型號的 Arduino 控制器,只需對應修改中斷標號或者連接的引腳即可。

例:結合 Leonardo 控制器來使用 TCS3200 顏色傳感器,則需要將 setup 中的外部中斷語句修改,其他接線方法一致
原語句為:attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0
修改后語句為:attachInterrupt(1, TSC_Count, RISING);//外部中斷口初始1
原因: Leonardo 的數字 2 號接口為外部中斷 1,而 UNO 控制器的數字 2 號接口為外部中斷 0,具體可以查閱Arduino官網相應產品說明: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,用于存儲計數頻率 
int   g_array[3];       //定義整型數組變量 g_array[3],用于存儲RGB的值 
int   g_flag = 0;       //定義整形變量 g_flag 并賦初值為0,用于過濾器排列 
float g_SF[3];          //定義浮點型數組變量g_SF[3],用于存儲RGB比例因子 
int   value[3];        //定義定義整型數組變量value[3],用于判斷顏色 
//  初始化 tsc3200 和設置內置振蕩器方波頻率與其輸出信號頻率的比例因子為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 
                              // 選擇過濾器顏色 
} 
//中斷函數,計算 TCS3200 輸出信號的脈沖數
void TSC_Count() 
{ 
  g_count ++ ;                  
} 
/*定時器中斷函數,每 1s 中斷后,把該時間內的紅、綠、藍三種廣信通過濾波器時,
 * TCS3200 輸出信號脈沖個數分別儲存到數組 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 內的紅光通過濾波器時,TCS3200 輸出的脈沖個數 
         g_array[0] = g_count;//儲存 1s 內的紅光通過濾波器時,TCS3200 輸出的脈沖個數           
         TSC_WB(HIGH, HIGH);// 選擇讓綠色光線通過濾波器的模式
         break; 
    case 2: 
         Serial.print("->Frequency G=");  // 串口打印字符串"->Frequency G=" 
         Serial.println(g_count);// 串口打印 1s 內的綠光通過濾波器時,TCS3200 輸出的脈沖個數 
         g_array[1] = g_count;//儲存 1s 內的綠光通過濾波器時,TCS3200 輸出的脈沖個數  
         TSC_WB(LOW, HIGH);//選擇讓藍色光線通過濾波器的模式  
         break; 
    case 3: 
         Serial.print("->Frequency B=");  // 串口打印字符串"->Frequency B=" 
         Serial.println(g_count);// 串口打印 1s 內的藍光通過濾波器時,TCS3200 輸出的脈沖個數
         Serial.println("->WB End");     // 串口打印字符串"->WB End" 
         g_array[2] = g_count;//儲存 1s 內的藍光通過濾波器時,TCS3200 輸出的脈沖個數 
         TSC_WB(HIGH, LOW); // 選擇無濾波器模式                                                                     
         break; 
   default: 
         g_count = 0;//計數器清零 
         break; 
  } 
} 
//設置反射光中紅、綠、藍三色光分別通過濾波器時如何處理數據的標志
//該函數被 TSC_Callback( )調用
void TSC_WB(int Level0, int Level1)      
{ 
  g_count = 0;//計數值清零 
  g_flag ++;//輸出信號計數標志
  TSC_FilterColor(Level0, Level1);//濾波器模式 
  Timer1.setPeriod(1000000);//設置輸出信號脈沖計數時長為 1s 
} 
//初始化
void setup() 
{  
  TSC_Init(); 
  Serial.begin(9600);//打開串口并設置通信波特率為 9600 
  Timer1.initialize();//定時器初始化,默認觸發(fā)值為 1s
  Timer1.attachInterrupt(TSC_Callback);     
  // 設置定時器1的中斷,中斷調用函數為 TSC_Callback()
  //設置 TCS3200 輸出信號的上升沿觸發(fā)中斷,中斷調用函數為 TSC_Count()   
  attachInterrupt(0, TSC_Count, RISING);//外部中斷口初始0 
  delay(4000);// 延遲 4s ,以等待被測試物體紅、綠、藍三色在 1s 內的 TCS3200 輸出信號脈沖計數
 //通過白平衡測試,計算得到白色物體 RGB 值 255 與 1s 內三色光脈沖數的 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內TCS3200輸出脈沖數乘以相應的比例因子就是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])); 
   } 
  • 程序效果

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

02S03502.png

example2_Arduino

  • 硬件設備
  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 數據通信線 * 1個
  8. 色板 * 1個
  • 接線說明
  • 顏色傳感器與 Arduino UNO 控制器的連接同例子程序相同
  • 將各種顏色食人魚燈連接到 Arduino傳感器擴展板上,連接方式:

(1)紅色食人魚燈接數字口 8號
(2)黃色燈接數字口 9號
(3)綠色燈接數字口10號
(4)藍色燈接數字口 11號
(5)白色燈接數字口 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,用于存儲計數頻率 
int   g_array[3];    //定義整型數組變量 g_array[3],用于存儲RGB的值 
int   g_flag = 0;   	 //定義整形變量 g_flag 并賦初值為0,用于過濾器排列 
float g_SF[3];       //定義浮點型數組變量g_SF[3],用于存儲RGB比例因子 
int   value[3];      //定義定義整型數組變量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]數值滿足為紅色值范圍則執(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]數值滿足為黃色值范圍則執(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]數值滿足為綠色值范圍則執(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]數值滿足為藍色值范圍則執(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]數值滿足為白色值范圍則執(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]數值不滿足上述顏色值范圍則執(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實驗代碼的白平衡實驗現象:
Hih6.jpg
在完成白平衡后(上圖實驗現象即白色食人魚燈亮起,也是其系統(tǒng)在檢測到白色后的現象)就可以檢測其他顏色了。白平衡只是系統(tǒng)對白色的一種數值反饋(即告訴系統(tǒng)什么是白色),本模塊識別、檢測后讀出的只是 R 、G、B 的值,對應其檢測到的顏色R、G、B 值,該測試程序編寫者特編寫了一段應用五種顏色食人魚燈來顯示其檢測到的顏色。判斷語句中的范圍為程序編寫者在實驗室環(huán)境下所測得的R 、G、B 值。更換環(huán)境后應予以更改其對應顏色判斷的R、G、B 值范圍。測試程序( 顏色檢測程序)中涉及到了紅、黃、綠、藍、白五種顏色,而色板上為六種顏色,多出一種顏色黑色是為了做出對比 :在檢測中遇到非該檢測顏色時(即不滿足判斷語句的條件時)應只在串口打印"->Other Color" ,而無其他現象產生。下圖為Arduino實驗代碼在檢測到其他顏色時的實驗現象
Vadrb7.jpg
Vadrb8.jpg
Vadrb9.jpg
Vadrb10.jpg
Vadrb11.jpg

視頻演示

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


資料下載

Erweima.png
  • 產品資料

下載鏈接:https://pan.baidu.com/s/11PXJOobOvOubcp1-bpTbbg 提取碼:72bg