这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】+03过程贴:实现颜色传感器的驱动

共1条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】+03过程贴:实现颜色传感器的驱动

高工
2025-12-14 22:36:06     打赏
一:颜色传感器的知识分享:

    Color Sensor 是一块静态识别物体颜色,不同颜色输出不同频率,采用 TCS3200D,所有 I0 口均弓出。TCS3200D是 TA0S (Texas Advanced Optoelectronic Solutions)公司推出的可编程彩色光到频率的转换器。它把可配置的硅光电二极管与电流频率转换器集成在一个单一的 CM0S 电路上,同时在单一芯片上还集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的 RGB 彩色传感器。TCS3200D 的输出信号是数字量,可以驱动标准的 TTL或 CMOS 逻辑输入,因此可直接与微处理器或其它逻辑电路相连接。由于输出的是数字量,并且能够实现每个彩色信道 10 位以上的转换精度,因而不再需要 A/D 转换电路,使电路变得更简单。

二:模块的原理图如下所示:

03-1.png

三:实物连接如下所示:

03-2.png

四:软件代码如下所示:
class TCS3200:
    def __init__(self, s0, s1, s2, s3, out_pin):
        self.s0 = s0
        self.s1 = s1
        self.s2 = s2
        self.s3 = s3
        self.out = out_pin
        
        self.s0.direction = digitalio.Direction.OUTPUT
        self.s1.direction = digitalio.Direction.OUTPUT
        self.s2.direction = digitalio.Direction.OUTPUT
        self.s3.direction = digitalio.Direction.OUTPUT
        self.out.direction = digitalio.Direction.INPUT
        
        # 白平衡校准值
        self.white_r = 1.0
        self.white_g = 1.0
        self.white_b = 1.0
        
        # 颜色校正参数
        self.color_threshold = 0.15

    def set_frequency(self, freq_mode):
        if freq_mode == 0:  # 2%
            self.s0.value = False
            self.s1.value = False
        elif freq_mode == 1:  # 20%
            self.s0.value = False
            self.s1.value = True
        elif freq_mode == 2:  # 100%
            self.s0.value = True
            self.s1.value = False
        else:
            self.s0.value = True
            self.s1.value = True
    
    def set_color_channel(self, color):
        if color == 'R':
            self.s2.value = False
            self.s3.value = False
        elif color == 'G':
            self.s2.value = True
            self.s3.value = True
        elif color == 'B':
            self.s2.value = False
            self.s3.value = True
    
    def calibrate_white(self, out_pin):
        # 测量白色表面的RGB频率
        self.set_color_channel('R')
        time.sleep(0.2)
        self.white_r = measure_frequency(out_pin)
        
        self.set_color_channel('G')
        time.sleep(0.2)
        self.white_g = measure_frequency(out_pin)
        
        self.set_color_channel('B')
        time.sleep(0.2)
        self.white_b = measure_frequency(out_pin)
        
        print(f"白平衡校准完成: R={self.white_r:.1f}, G={self.white_g:.1f}, B={self.white_b:.1f}")
    
    def frequency_to_rgb(self, freq_r, freq_g, freq_b):
        # 避免除以0
        if self.white_r <= 0: self.white_r = 1
        if self.white_g <= 0: self.white_g = 1
        if self.white_b <= 0: self.white_b = 1
        
        # 计算相对值并转换为0-255范围
        r = min(255, int(255 * freq_r / self.white_r))
        g = min(255, int(255 * freq_g / self.white_g))
        b = min(255, int(255 * freq_b / self.white_b))
        
        # 颜色校正
        max_val = max(r, g, b)
        if max_val > 0:
            threshold = max_val * self.color_threshold
            if g < threshold: g = 0
            if b < threshold: b = 0
            if r < threshold: r = 0
        
        return (r, g, b)
五:实物验证如下所示:

03-3.png

这里我测试了一读取,嘉立创的紫色;看起来效果还是可以的。




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]