这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sDo2025第3期任务-拾色播放器-任务一

共2条 1/1 1 跳转至

Let'sDo2025第3期任务-拾色播放器-任务一

高工
2025-12-14 23:26:25     打赏


实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;

 

一、准备

开发平台:

颜色传感器驱动与按键检测实现方案,基于THONNY平台进行开发。

 

了解传感器:

TCS3200颜色传感器引脚定义

image.png

参数

        工作电压:2.7V-5.5V

        接口:TTL数字接口

        光强度的高精度分辨率转换成频率

        可编程颜色和全面的输出频率

        电源中断特征

        直接和微控制器交互

        尺寸:28.4x28.4mm

 

TCS3002有四种滤波类型:红,蓝,绿和清除全部光信息,以最大限度地降低入射光幅射的不均匀性,从而增加精确度和简化光学。

当入射光投射到TCS3200D上时,通过光电二极管控制引脚S2S3的不同组合,可以选择不同的滤波器。

image.png

TCS3200D输出不同频率的方波(占空比50%),不同的颜色和光强对应不同的频率的方波,输出频率与光强度成线性关系。

该转换器典型输出频率范围为2Hz~500kHz,用户可通过两个可编程引脚来选择100%、20%或2%的输出比例因子。

image.png

ESP32定义

image.png

二、连接示意图

image.png

三、代码

初始化NeoPixel

pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)

pixel.brightness = 0.3

 

-----------------------

TCS3200 传感器类

-----------------------

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)

 

-----------------------

频率测量

-----------------------

NUM_CYCLES = 10

 

def measure_frequency(out_pin):

    timestamps = []

    last = out_pin.value

    while len(timestamps) < NUM_CYCLES:

        current = out_pin.value

        if current != last:

            timestamps.append(time.monotonic_ns())

            last = current

 

    periods = []

    for i in range(2, len(timestamps), 2):

        period = timestamps[i] - timestamps[i-2]

        periods.append(period)

 

    avg_period = sum(periods) / len(periods)

    return 1_000_000_000 / avg_period

 

四、输出结果

 

image.png


院士
2025-12-15 23:24:06     打赏
2楼

话说这个频率测量性能如何?


共2条 1/1 1 跳转至

回复

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