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); }