RGB顏色感測器。感測器晶元不知道是TCS230,或是TCS3200。二者pinout及電氣性能一樣。左邊的模塊有8個引腳,LED常亮。S0, S1 預設上拉為高電平,/OE下拉低電平。S2, S3, OUT 三個引腳供單片機介面。如下: 照片中右邊的模塊有10個引腳,原理與8pin相同,只是多了一 ...
RGB顏色感測器。感測器晶元不知道是TCS230,或是TCS3200。二者pinout及電氣性能一樣。左邊的模塊有8個引腳,LED常亮。S0, S1 預設上拉為高電平,/OE下拉低電平。S2, S3, OUT 三個引腳供單片機介面。如下:
照片中右邊的模塊有10個引腳,原理與8pin相同,只是多了一個LED控制引腳。預設LED點亮,接低電平熄滅:
S2, S3選擇顏色通道,如下表。OUT輸出50% duty方波,方波頻率與光強成比例,規格書給出的範圍為 10-20kHz(周期50-100us):
程式需要us級時鐘。分別選擇R、G、B通道,測量OUT方波周期/頻率,可轉換為 RGB三原色。實測方波周期在10-160us範圍內,並且受環境光照條件等的影響。如下圖,第一行為白色測量值(白平衡),接下來每2行為一種顏色的測量值及RGB轉換值,分別為紅色、綠色、藍色、黃色。最後2行為白色測量值及RGB轉換值:
轉換演算法如下。使用了白色校正,即以白色的RGB通道測量值分別為RGB三原色的上限,將測量值規範化到0-255範圍內。測量值(原始值)為方波周期,單位為us。註意,頻率的比值,等於周期的比值的倒數,因此,下麵代碼中的巨集 _App_GetComponent() 用白色測量值除以待轉換的測量值,而不是相反:
typedef struct { uint32_t red; uint32_t green; uint32_t blue; } _App_Color; #define _App_GetComponent(t, w) ( (t)>(w) ? (255 * (w) / (t)) : 255 ) void _App_ToRGB(_App_Color *raw, _App_Color *white) { raw->red = _App_GetComponent(raw->red, white->red); raw->green = _App_GetComponent(raw->green, white->green); raw->blue = _App_GetComponent(raw->blue, white->blue); }