2018年2月20日 星期二

{Arduino} TCS34725 顏色感測器取色與 WS2812B / APA102 RGB LED 顯色測試

網頁最後修改時間:2018/02/27

早前在部落格有一篇關於顏色辨識的網頁 "{ Arduino } TCS3200 顏色辨識感測模組的校正、取色與顯色說明";使用之前要先進行白平衡校正,放置欲取色的物體之後,每隔一段時間取色完成後會輸出取色之後的 RGB 值並由 WS2812B 全彩 LED 顯示結果。

而此篇網頁改用 TCS34725 做為取色的感測器,加入一個開始取色的按鈕,經 Gamma 校正後使用 WS2812B (或 APA102) 全彩 LED 顯色,取色後的原始數據與 Gamma 校正後的數據可輸出至 Serial Moitor 或 (和) 整合型 LCD 上。實際測試後的結果顯示,效果更佳、更快!可自行參考網頁中測試的影片。

TCS34725 是一顆顏色感測器 (可看賣場裡的說明),除了可取回 RGBC (紅、綠、藍和透明光) 值之外,根據官方釋出的文件也說明了計算亮度和色溫的方法 (Calculating Color Temperature and Illuminance),但在這裡只是提出,其計算方式與範例,可參考相關的 Arduino 函式庫。

接下來,先由電路圖看起!

硬體參考接線圖:
因為使用兩種不同的可定址全彩 LED 來顯示取得的顏色值,所以有兩個接線圖;基本上,兩者的電路沒多大差異!

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
*WS2812B 做為顯示 LED:
TCS34725-with-WS2812B-RGB-LED 接線圖
/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* APA102 做為顯示 LED:
TCS24725-with-APA102-RGB-LED 接線圖
/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 實際接好線的電路:

下面是將 WS2812B 和 APA102 兩個 LED 的電路全部接在一起的電路,使用的時候只能選擇插上其中一款 LED 做顯示;即便兩個一起裝上,也只有一個會正確顯示!

另外,電源的使用上要注意不要直接使用 Arduino UNO 上面的 5V 電源給全部電路用,要使用外接電源;如下圖最右邊插在電路板電源處的紅黑兩條線,就是外接電源線用的。
實際接好線的電路
*********************************************************************************
網頁所使用的零件可至下面分類網頁購買:
上面只列出重點元件,其餘請搜尋賣場或向其他賣場購買
*********************************************************************************

測試結果影片:
錄影畫面
影片中的畫面如上面所示。右上畫面是實際操作的畫面,相對應的 RGBC 取值、壓縮和 Gamma 校正相關的數據輸出到左下畫面的 Serial Monitor 中;其中,LCD 第一行顯示的是原始數據的 Clear 值,第二行顯示的是輸出到 LED 的 RGB 值。右下畫面顯示的是 Arduino 程式碼與編譯上傳的結果;而左上畫面是 TCS34725 的光電二極體光譜響應圖。

從響應圖並對照影片中取值的結果可以清楚看到,取值的時候會伴隨著其他部分的數據;例如,藍色紙卡取色時,也會有綠色值,但紅色值則會相對很低。

下面是實測的兩則影片,請觀賞!

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* WS2812B 做為顯示 LED:
影片中 Arduino IDE 的 Serial Monitor 輸出如下圖所示:
Serial Monitor Log, TCS34725+WS2812B
/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* APA102 做為顯示 LED:
影片中 Arduino IDE 的 Serial Monitor 輸出如下圖所示:
Serial Monitor Log, TCS34725+APA102
程式撰寫需要的資料:

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
有購買 TCS34725 的使用者,網頁中所需相關資料已放置於雲端硬碟,請自行下載使用!
其餘的使用者,請根據說明自行修改,相關需要的資料請參考網頁最下方的連結,不再另外提供!
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

影片中所使用的程式碼,是從下載的 TCS34725 函式庫裡的範例程式 {TCS34725} / colorview 所修改,Arduino IDE v1.8.5 編譯 (Arduino UNO 開發板),修改與增加的部分有:
  • 加入一個取色啟動的按鈕
  • 加入整合型 LCD 的支援
  • 移除原先程式裡使用的 RGB LED,改用可大量串接使用的可定址全彩 LED ( WS2812B / APA102 )
完成上面項目之後,就可以開始進行測試。不過有一點需要注意,那就是環境光源的種類與強弱會影響檢測的結果。若結果因為這樣的關係造成誤差,可以改變 TCS34725 在程式 ( line:19 ) 一開始宣告實體裡的兩個引數值:積分時間 (Integration Time)和增益 (Gain)。

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
積分時間跟暫存器 ( 0x01 (7:0) ) 的 ATIME 有關,公式為:

Integration Time (ms) = ( 256 - ATIME ) * 2.4

Max RGBC Count  = ( 256 - ATIME ) * 1024

Max RGBC Count 最大值只能到 65535;函式庫預設的選項有下面幾個可以選擇:
  • TCS34725_INTEGRATIONTIME_2_4MS
  • TCS34725_INTEGRATIONTIME_24MS
  • TCS34725_INTEGRATIONTIME_50MS
  • TCS34725_INTEGRATIONTIME_101MS
  • TCS34725_INTEGRATIONTIME_154MS
  • TCS34725_INTEGRATIONTIME_700MS
增益跟暫存器 0x0F (1:0) 有關,可選擇的選項有:
  • TCS34725_GAIN_1X
  • TCS34725_GAIN_4X
  • TCS34725_GAIN_16X
  • TCS34725_GAIN_60X
積分時間與增益類似於照相機的快門速度與 ISO 設定;在低光線環境下增加 ISO (增益) 設定值 (但會增加雜訊) 或是延長快門速度 (增加積分時間)設定值 (但會增加量測時間),來改善測量準確性與精確度。程式設計者可藉由調整這兩個參數設定值,在寬範圍的照明條件下進行測量。
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* Arduino 函式庫:
程式碼裡所使用的函式庫,可點擊下面連結下載壓縮檔自行安裝

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* Arduino 燒錄 Hex 檔:
雖然沒有在網頁中提供原始程式碼,但是在這裡提供 APA102 和 WS2812B 兩種全彩 LED 兩個的 Arduino Hex 燒錄檔案;硬體線路不需要使用整合型 LCD。

Hex 檔案下載之後,使用下面提供的燒錄軟體,操作方式與 Arduino IDE 一樣,選擇好 Hex 檔和通訊埠,就能上傳。

結論:
實際使用過 TCS3200 與 TCS34725 發現;TCS34725 接線用的比較少,測量速度快,支援積分時間與增益調整,能夠在低光源或是不同照明條件下的測量,而且能夠用來輔助量測色溫與照度 ... 等,在需要用到顏色檢測的應用場合中,是現今市場上一款非常好的顏色感測器,值得選用。

結束之前,讓我們一起來看看這款顏色感測器實際的應用:分類 M&M 巧克力的顏色

<< 部落格相關文章 >>

13 則留言:

  1. 大大您好, 請問您是否有試過
    串接多顆TCS34725 RGB sensor 在一塊Arduino 版上
    是否若要使用TCS34725就必須要一對一的Arduino 版
    謝謝

    回覆刪除
    回覆
    1. TCS34725 只有一個通訊地址,不能做切換,所以如果要一次跟多顆 TCS34725 做 I2C 通訊,可以考慮 TCA9548A(8 通道 IIC / I2C 擴充)模組,只要在原程式多加入切換欲讀寫的 I2C 通道的程式碼,就能讀取最多八個 TCS34725;要更多,就再多買。

      刪除
  2. 請問如果想寫一個辨色後控制led燈的開關要怎麼做呢~
    例如辨色為綠色的時候黃光的LED燈亮起,橘色的時候白光的LED燈亮起之類的
    不同的顏色設定不同的LED燈亮起,共有三顆LED燈分別為黃光、白光、暖白光
    謝謝!!!

    回覆刪除
    回覆
    1. 先取得同一顏色輸出多次的 RGB 值做運算得到一個平均值,然後設定一個合理的範圍值,當取得的數值或在這個範圍內稱之為該種顏色,然後對應條件是做輸出就可以了。
      網頁裡面的影片也是用這樣的方式下去分類各種顏色的糖果的,可以上它網站去看看程式是怎麼寫的。

      刪除
  3. 大大您好,請問使用此顏色感測器後,還需要作白平衡校正嗎?

    回覆刪除
    回覆
    1. TCS34725 支持輸出RGB顏色數據,不需要白平衡;但沒人阻止你做,如果你覺得需要。

      程式是由下面的範例做修改的,可看到裡面是沒有白平衡校正
      https://github.com/adafruit/Adafruit_TCS34725/blob/master/examples/colorview/colorview.ino

      刪除
  4. 請問拿這個去量螢幕上的顏色,不知可不可行?
    看到有些sensor說明裡,註明了是量測非發光體.

    回覆刪除
    回覆
    1. 沒這樣用過!但應該有專用於螢幕量測的感測器。

      刪除
    2. 謝謝!
      目前好像沒看到像您介紹的這個,好入手也易上手,能給螢幕用的sensor.

      刪除
  5. 對丫, 我也正在找能夠檢測螢幕的感測器

    回覆刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !