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

共1条 1/1 1 跳转至

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

助工
2025-12-14 18:21:04     打赏
# TCS3200颜色传感器驱动实现
## 硬件连接TCS3200传感器通过数字引脚连接,S0/S1/S2/S3/OUT连接到开发板的任意GPIO引脚:
**引脚接入方式:**- TCS3200 S0引脚连接到开发板的GPIO引脚(如D12),用于频率缩放控制- TCS3200 S1引脚连接到开发板的GPIO引脚(如D11),用于频率缩放控制- TCS3200 S2引脚连接到开发板的GPIO引脚(如D10),用于颜色滤波器选择- TCS3200 S3引脚连接到开发板的GPIO引脚(如D9),用于颜色滤波器选择- TCS3200 OUT引脚连接到开发板的GPIO引脚(如D6),用于频率输出- TCS3200 VCC引脚连接到开发板的3.3V或5V电源引脚- TCS3200 GND引脚连接到开发板的GND引脚
**连接注意事项:**- 传感器工作电压为2.7V-5.5V,可根据开发板选择3.3V或5V供电- OUT引脚输出为方波信号,频率与检测光强成正比- S0/S1引脚组合控制输出频率缩放比例(2%、20%、100%或关闭)- S2/S3引脚组合选择颜色滤波器(红、绿、蓝、透明)- 建议使用中断或计数器功能测量OUT引脚频率,提高测量精度- 传感器需要白平衡校准以提高颜色识别准确性## 代码
import time
import board
import digitalio
# TCS3200传感器类
class TCS3200:
    def __init__(self, s0_pin, s1_pin, s2_pin, s3_pin, out_pin):
        # 初始化控制引脚
        self.s0 = digitalio.DigitalInOut(s0_pin)
        self.s1 = digitalio.DigitalInOut(s1_pin)
        self.s2 = digitalio.DigitalInOut(s2_pin)
        self.s3 = digitalio.DigitalInOut(s3_pin)
        self.out = digitalio.DigitalInOut(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
        
        # 设置频率缩放比为100%(最高精度)
        self.set_frequency_scaling(100)
        
        # 白平衡校准系数(初始值为1,需要实际校准)
        self.r_scal = 1.0
        self.g_scal = 1.0
        self.b_scal = 1.0
        
        print("TCS3200传感器初始化完成")
    
    def set_frequency_scaling(self, scaling):
        """设置传感器的频率缩放比例"""
        if scaling == 2:       # 2%
            self.s0.value = False
            self.s1.value = True
        elif scaling == 20:    # 20%
            self.s0.value = True
            self.s1.value = False
        elif scaling == 100:   # 100%
            self.s0.value = True
            self.s1.value = True
        else:                  # 关闭
            self.s0.value = False
            self.s1.value = False
        time.sleep(0.02)       # 短暂延时稳定频率缩放比例
    
    def set_color_filter(self, filter_type):
        """设置传感器的颜色滤波器"""
        if filter_type == "Red":
            self.s2.value = False
            self.s3.value = False
        elif filter_type == "Green":
            self.s2.value = True
            self.s3.value = True
        elif filter_type == "Blue":
            self.s2.value = False
            self.s3.value = True
        else:  # "Clear"
            self.s2.value = True
            self.s3.value = False
        time.sleep(0.01)       # 短暂延时稳定滤波器
    
    def measure_frequency(self):
        """测量频率,并转换单位为Hz"""
        timestamps = []
        last_state = self.out.value
        
        while len(timestamps) < 10:  # 测试10个周期
            current_state = self.out.value
            if current_state != last_state:  # 发生边缘变化
                timestamps.append(time.monotonic_ns())
                last_state = current_state
        
        # 计算平均周期
        periods = []
        for i in range(2, len(timestamps), 2):
            period_ns = timestamps[i] - timestamps[i - 2]  # 一个完整周期
            periods.append(period_ns)
        
        avg_period_ns = sum(periods) / len(periods)
        frequency = 1000000000 / avg_period_ns  # 转换为 Hz
        return frequency
    
    def read_rgb_freq(self):
        """读取RGB三个通道的频率值"""
        # 读取红色分量
        self.set_color_filter("Red")
        time.sleep(0.02)
        red_freq = self.measure_frequency()
        
        # 读取绿色分量
        self.set_color_filter("Green")
        time.sleep(0.02)
        green_freq = self.measure_frequency()
        
        # 读取蓝色分量
        self.set_color_filter("Blue")
        time.sleep(0.02)
        blue_freq = self.measure_frequency()
        
        return red_freq, green_freq, blue_freq
    
    def calibrate_white_balance(self):
        """白平衡校准 - 将传感器对准白色参考物后调用此方法"""
        print("正在进行白平衡校准...")
        print("请将传感器对准白色参考物")
        
        # 读取白色参考物的原始频率
        red, green, blue = self.read_rgb_freq()
        
        # 计算校准系数
        self.r_scal = 255.0 / red if red > 0 else 1.0
        self.g_scal = 255.0 / green if green > 0 else 1.0
        self.b_scal = 255.0 / blue if blue > 0 else 1.0
        
        print(f"校准完成 -> R:{self.r_scal:.3f}, G:{self.g_scal:.3f}, B:{self.b_scal:.3f}")
# 创建TCS3200传感器实例
try:
    color_sensor = TCS3200(
        s0_pin=board.D12,
        s1_pin=board.D11,
        s2_pin=board.D10,
        s3_pin=board.D9,
        out_pin=board.D6
    )
    print("TCS3200实例创建成功")
except Exception as e:
    print(f"初始化TCS3200失败: {e}")
    color_sensor = None
# 主循环
while True:
    if color_sensor is not None:
        try:
            # 读取RGB频率值
            red_freq, green_freq, blue_freq = color_sensor.read_rgb_freq()
            
            # 输出频率值
            print(f"RGB频率值 -> R:{red_freq:.3f}Hz, G:{green_freq:.3f}Hz, B:{blue_freq:.3f}Hz")
            
        except Exception as e:
            print(f"读取颜色传感器错误: {e}")
    
    time.sleep(1)

共1条 1/1 1 跳转至

回复

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