2021年6月20日星期日

Arduino TCS3200 顏色辨識模組

 

今天來學習使用顏色辨識模組

 

開發環境 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 量測綠色



 


 

這邊先來比對一下資料手冊與我們量測到的數據
































目前是Scaling2%那就是S0 = L, S1=H ,標準12KHz 這邊假設為12KHz

量測到的綠色為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;

}

完整程式碼放在這裡

Git連結

 

看結果啦啦啦

https://youtu.be/q7bPs3D1coA



參考資料

pulseIn() 解釋

https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/

Ex. pulseIn(TCS3200_OUT,HIGH); 代表讀取TCS3200_OUT 腳位兩次由LOW變成HIGHHIGH變成LOW的時間,下圖紅色區段

部落格參考

https://atceiling.blogspot.com/2019/08/arduino58tcs3200-gy-31.html

TCS3200 資料

https://www.mouser.com/catalog/specsheets/tcs3200-e11.pdf

arduino 專題參考

https://create.arduino.cc/projecthub/ambhatt/frequency-and-duty-cycle-measurement-using-arduino-1e4896







沒有留言:

發佈留言

打賞按讚