在自動化展時曾看過有條輸送帶,旁邊有個機械手臂,當通過的小方塊是哪一種顏色,就會被機械手臂夾起,相同顏色的放在一堆。心想應該有個感測器是偵測顏色的,TCS3200 顏色感測器就是這樣的功能,用來判斷紅、綠、藍(RGB)三原色,以下實作就來看一下如何運用濾光片來測得物體的顏色。
根據三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。TCS3200就是使用這個原理,來辨別物體的顏色。透過一個陣列的光電檢測器,每個都有紅色,綠色或藍色濾光片,或沒有濾光片(透明)。
在感測一個物體的顏色時,需輪流讓三個顏色通過濾波器檢測,分析投射到TCS3200感測器上的光來判斷顏色,分別得到三個值後,才知道是哪種顏色。以S2和S3設置為低電位和高電位為例,此時僅允許藍色光通過,此時接收藍色光的數值,依此類推,最後蒐集三個顏色的數值,所組成的就是該物體的顏色。
接腳說明
當S0與S1各自的HIGH與LOW組合會影響輸出頻率。對於Arduino,通常使用20%的頻率縮放。因此,將S0引腳設置為高電平,將S1引腳設置為低電平。
要感測器讀取的顏色時,可透過控制接腳 S2和S3來達成。下表是S2跟S3設定高低電位時過濾的顏色表。
• GY-31 TCS3200顏色感測器模組
• 連接線 x 7 條
因每個感測器的靈敏度不同,第一個程式先讀取紅藍綠三個顏色值,找到最大跟最小的感測範圍,再由第二個程式判斷檢測值落在哪個範圍來判斷物體的顏色。
以下是程式二,直接列出物體顏色:
• Randomnerdtutorials:Guide for TCS230/TCS3200 Color Sensor with Arduino
• How to mechatronics:Arduino Color Sensing Tutorial – TCS230 TCS3200 Color Sensor
[TCS3200檢測原理]
TCS3200色彩傳感器是一個完整的色彩檢測器,包括一個TAOS TCS3200 RGB傳感器芯片和4個白色LED。TCS3200可以檢測和測量幾乎無限範圍的可見顏色。應用包括測試條讀取,顏色分類,環境光感測和校準以及顏色匹配。根據三原色理論可知,各種顏色是由不同比例的三原色(紅、綠、藍)混合而成的。TCS3200就是使用這個原理,來辨別物體的顏色。透過一個陣列的光電檢測器,每個都有紅色,綠色或藍色濾光片,或沒有濾光片(透明)。
在感測一個物體的顏色時,需輪流讓三個顏色通過濾波器檢測,分析投射到TCS3200感測器上的光來判斷顏色,分別得到三個值後,才知道是哪種顏色。以S2和S3設置為低電位和高電位為例,此時僅允許藍色光通過,此時接收藍色光的數值,依此類推,最後蒐集三個顏色的數值,所組成的就是該物體的顏色。
[TCS3200 特性]
- 晶片:TCS3200
- 電源:2.7V至5.5V
- 具備 LED 燈
- 抗光干擾、白色LED,可控制亮或滅、可檢測不發光物體顏色
- 最佳檢測距離:1 cm
接腳說明
接腳名稱
|
描述
|
GND(4)
|
電源接地
|
OE(3)
|
輸入,啟用輸出頻率(低電位有效)
|
OUT(6)
|
輸出頻率
|
S0,S1(1,2)
|
輸入,選擇輸出頻率縮放
|
S2,S3(7,8)
|
選擇輸入光電二極管類型
|
VDD(5)
|
電壓供應
|
S0
|
S1
|
輸出頻率級距
|
LOW
|
LOW
|
沒有電源
|
LOW
|
HIGH
|
2%
|
HIGH
|
LOW
|
20%
|
HIGH
|
HIGH
|
100%
|
S2
|
S3
|
過濾顏色
|
LOW
|
LOW
|
紅色 RED
|
LOW
|
HIGH
|
藍色 BLUE
|
HIGH
|
LOW
|
不過濾 (清除)
|
HIGH
|
HIGH
|
綠色 GREEN
|
[材料]
• Arduino Leonardo x 1• GY-31 TCS3200顏色感測器模組
• 連接線 x 7 條
[接線]
Arduino
|
GY-31 TCS3200
|
5V (VCC)
|
VCC
|
GND
|
GND
|
Pin 4
|
S0
|
Pin 5
|
S1
|
Pin 6
|
S2
|
Pin 7
|
S3
|
Pin 8
|
OUT
|
[程式]
因每個感測器的靈敏度不同,第一個程式先讀取紅藍綠三個顏色值,找到最大跟最小的感測範圍,再由第二個程式判斷檢測值落在哪個範圍來判斷物體的顏色。#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// 儲存由光電二極體讀取的值
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// 設定S0~S4為輸出
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// 設定 sensorOut 為輸出
pinMode(sensorOut, INPUT);
// 設定頻率尺度(frequency scaling)為 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// 開始串列通訊
Serial.begin(9600);
}
void loop() {
// 設定光電二極體讀取濾過的紅色值
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// 讀取輸出頻率
redFrequency = pulseIn(sensorOut, LOW);
// 列出紅色值
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// 設定光電二極體讀取濾過的綠色值
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// 讀取輸出頻率
greenFrequency = pulseIn(sensorOut, LOW);
// 列出綠色值
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);
// 設定光電二極體讀取濾過的藍色值
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// 讀取輸出頻率
blueFrequency = pulseIn(sensorOut, LOW);
// 列出藍色值,並換行
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}
以下是程式二,直接列出物體顏色:
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// 儲存由光電二極體讀取的值
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
// 儲存紅、藍、綠色的值
int redColor = 0;
int greenColor = 0;
int blueColor = 0;
void setup() {
// 設定S0~S4為輸出
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// 設定 sensorOut 為輸出
pinMode(sensorOut, INPUT);
// 設定頻率尺度(frequency scaling)為 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// 開始串列通訊
Serial.begin(9600);
}
void loop() {
// 設定光電二極體讀取濾過的紅色值
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// 讀取輸出頻率
redFrequency = pulseIn(sensorOut, LOW);
// 重新對應讀取的紅色值範圍從 0 到 255
// 以下的 min 及 max 是前一個程式讀取的最大跟最小值的範圍,需依感測模組而調整
// redColor = map(redFrequency, min, max, 255,0);
redColor = map(redFrequency, 332, 1280, 255,0);
// 列出紅色值
Serial.print("R = ");
Serial.print(redColor);
delay(100);
// 設定光電二極體讀取濾過的綠色值
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// 讀取輸出頻率
greenFrequency = pulseIn(sensorOut, LOW);
// 重新對應讀取的綠色值範圍從 0 到 255
// 以下的 min 及 max 是前一個程式讀取的最大跟最小值的範圍,需依感測模組而調整
// greenColor = map(greenFrequency, min, max, 255, 0);
greenColor = map(greenFrequency, 850, 1498, 255, 0);
// 列出綠色值
Serial.print(" G = ");
Serial.print(greenColor);
delay(100);
// 設定光電二極體讀取濾過的藍色值
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// 讀取輸出頻率
blueFrequency = pulseIn(sensorOut, LOW);
// 重新對應讀取的藍色值範圍從 0 到 255
// 以下的 min 及 max 是前一個程式讀取的最大跟最小值的範圍,需依感測模組而調整
blueColor = map(blueFrequency, 178, 459, 255, 0);
// 列出藍色值
Serial.print(" B = ");
Serial.print(blueColor);
delay(100);
// 檢查目前測得的顏色值,並顯示物體顏色在串列 Console
if(redColor > greenColor && redColor > blueColor){
Serial.println(" - RED detected!");
}
if(greenColor > redColor && greenColor > blueColor){
Serial.println(" - GREEN detected!");
}
if(blueColor > redColor && blueColor > greenColor){
Serial.println(" - BLUE detected!");
}
}
[實作結果]
[參考資料]
• Randomnerdtutorials:Guide for TCS230/TCS3200 Color Sensor with Arduino• How to mechatronics:Arduino Color Sensing Tutorial – TCS230 TCS3200 Color Sensor

如果要發出聲音講調感測到的顏色要怎麼改程式
回覆刪除張貼留言