今天來學習使用顏色辨識模組
開發環境 Arduino IDE
材料有
1.
Arduino NANO
2.
Arduino NANO 擴展板
3.
TCS3200
4.
杜邦線若干條
首先看一下資料手冊,說明一下規格
腳位特性及功能說明
資料手冊的部分這裡是描述關於設定不同顏色的PhotoDiode
根據設定S2,S3可以得到不同的頻率,來當作辨識顏色的依據,但今天會使用CLEAR PHITIDIODE
頻率的Scaling設定
接線說明
TCS3200 |
Arduino |
Vcc |
5V |
GND |
GND |
S0 |
D2 |
S1 |
D3 |
S2 |
D6 |
S3 |
D7 |
OUTPUT |
D5 |
OE |
D4 |
這邊給大家看一下,調整Scaling 來看波形變化,這邊是設定為CLEAR(S2 = H,S3=L)並且量測白色
SCALING |
量測 |
0 |
|
2 |
|
20 |
|
100 |
|
這幾張圖我們可以發現齁,設定不同的SCALING它的頻率與週期也會跟著不同
觀察Scaling=2% 量測 CLEAR RED BLUE GREEN的頻率
Scaling |
CLEAR |
RED |
BLUE |
GREEN |
0 |
0 |
0 |
0 |
0 |
2 |
設定為CLEAR |
|||
量測綠色 量測紅色 量測藍色 這邊會變成需要透過自己去轉換數值來判定量測的顏色 |
||||
設定為RED 量測紅色 |
||||
|
||||
設定為BLUE 量測藍色 |
||||
|
||||
設定為GREEN 量測綠色 |
||||
|
這邊先來比對一下資料手冊與我們量測到的數據
目前是Scaling為2%那就是S0 = L, S1=H
量測到的綠色為5.422KHz
12KHz*0.22=2.64KHz (Min~TYP 之間)
12KHz*0.43=5.16KHz (Type~MAX就不知道了)
這邊要根據你的量測去定義,手冊的測試條件及數據目前手邊無工具進行確認,所以需要自己去定義一些量測數值範圍是否為判定的該顏色,如果你在做一些實驗時,發些數據有所偏差,不用太擔心。
簡單了解TCS3200的腳位與功能特性後,接下來開始寫程式碼
起手勢
定義腳位
#define
TCS3200_OE 4
#define
TCS3200_OUT 5
#define
TCS3200_S0 2
#define
TCS3200_S1 3
#define
TCS3200_S2 6
#define
TCS3200_S3 7
enum
{
CLEAR,
BLUE,
GREEN,
RED,
};
接著替晶片的功能撰寫函式,這邊我們定義兩個函式,分別為
設定頻率的倍率
void
SetFreqSCALING(int SCALING)
{
switch(SCALING)
{
case 0://OUTPUT FREQUENCY SCALING Power
down
digitalWrite(TCS3200_S0,LOW);
digitalWrite(TCS3200_S1,LOW);
break;
case 2://OUTPUT FREQUENCY SCALING 2%
digitalWrite(TCS3200_S0,LOW);
digitalWrite(TCS3200_S1,HIGH);
break;
case 20://OUTPUT FREQUENCY SCALING 20%
digitalWrite(TCS3200_S0,HIGH);
digitalWrite(TCS3200_S1,LOW);
break;
case 100://OUTPUT FREQUENCY SCALING 100%
digitalWrite(TCS3200_S0,HIGH);
digitalWrite(TCS3200_S1,HIGH);
break;
}
}
設定濾鏡種類
void
setDetermine(int Color)
{
switch(Color)
{
case CLEAR:
digitalWrite(TCS3200_S2,HIGH);
digitalWrite(TCS3200_S3,LOW);
break;
case RED:
digitalWrite(TCS3200_S2,LOW);
digitalWrite(TCS3200_S3,LOW);
break;
case GREEN:
digitalWrite(TCS3200_S2,HIGH);
digitalWrite(TCS3200_S3,HIGH);
break;
case BLUE:
digitalWrite(TCS3200_S2,LOW);
digitalWrite(TCS3200_S3,HIGH);
break;
}
}
接下來,我們來進行顏色的採樣,這邊我畫了紅綠藍三種顏色,讀取不同顏色的數值,接下來先使用下面的程式進行顏色的取樣吧
void
setup() {
pinMode(TCS3200_OE,OUTPUT);
pinMode(TCS3200_OUT,INPUT);
pinMode(TCS3200_S0,OUTPUT);
pinMode(TCS3200_S1,OUTPUT);
pinMode(TCS3200_S2,OUTPUT);
pinMode(TCS3200_S3,OUTPUT);
Serial.begin(9600);
setDetermine(CLEAR);//這邊我們設定為CLEAR
SetFreqSCALING(2);
}
void
loop() {
long freq = pulseIn(TCS3200_OUT,LOW);
Serial.println(freq);
delay(1000);
}
燒錄完後,把感測器對準顏色中心,如下圖,開啟COMPORT分別量測綠/藍/紅的數值
量測一段時間,找出各個顏色的範圍,這邊透過excel來找出,這邊的數值根據你的顏色決定,用我的不一定會辨識成功喔,記得要重新量測並記錄顏色的最大最小值ㄝ
設定CLEAR 之後需要自己去辨識讀回來的值約略在哪個範圍為甚麼顏色,這邊加入程式碼
前面#define 的地方記得加入定義顏色的範圍喔
#define RED_MAX 188
#define RED_MIN 170
#define BLUE_MAX 165
#define BLUE_MIN 150
#define GREEN_MAX 129
#define GREEN_MIN 97
加入顏色辨識函式。
bool IsColor(int COLOR)
{
long freq = pulseIn(TCS3200_OUT,LOW);
bool flag = false;
//
Serial.println(freq);
switch(COLOR)
{
case RED:
if(freq>RED_MIN && freq<RED_MAX)flag = true;
else flag = false;
break;
case BLUE:
if(freq>BLUE_MIN && freq<BLUE_MAX)flag = true;
else flag = false;
break;
case GREEN:
if(freq>GREEN_MIN && freq<GREEN_MAX)flag = true;
else flag = false;
break;
}
return flag;
}
完整程式碼放在這裡
看結果啦啦啦
參考資料
pulseIn() 解釋
https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/
Ex. pulseIn(TCS3200_OUT,HIGH); 代表讀取TCS3200_OUT 腳位兩次由LOW變成HIGH到HIGH變成LOW的時間,下圖紅色區段
部落格參考
https://atceiling.blogspot.com/2019/08/arduino58tcs3200-gy-31.html
TCS3200 資料
https://www.mouser.com/catalog/specsheets/tcs3200-e11.pdf
arduino 專題參考
沒有留言:
發佈留言