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

共1条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】--拾色播放器DIY活动过程帖

助工
2025-12-13 19:47:17     打赏
在完成开箱和整体规划后,我的“拾色播放器”项目进入了实质性的硬件连接与模块化调试阶段。以下是几个关键步骤的记录:

1. 硬件连线与电源测试

这是所有工作的物理基础。我首先仔细规划了引脚分配,避免冲突。使用杜邦线和面包板进行了引脚连接,由于该开发板的数字IO引脚很少,因此为了节省IO,将颜色传感器的输出频率scaler进行固定,S0=H;S1=L。

下图为连接框图

image.png

下图为实际电路连接

a825320a6998025dbeee80fe5288223.jpg

2. 基础测试:让LED“眨眼”(Blink)

验证主控板和开发环境是否正常的最佳方式,就是经典的“Blink”程序。测试了板载的led。

spec中的位置和使用方法如下

image.png

image.png

需要注意的点!!!LED与D13引脚也存在冲突。。。所以在使用的过程中一定要避开。

下图为实际LED亮起

30ac2e5d57de0abb0a644e720a3d60b.jpg

代码如下

led = digitalio.DigitalInOut(board.LED)

led.direction = digitalio.Direction.OUTPUT

while True:

    

    led.value   =   True

    time.sleep(0.5)

    led.value   =   False

    time.sleep(0.5)

3. 任务一:驱动颜色传感器与串口打印色彩值

这是实现“拾色”功能的核心。创建了TCS3200的class,区别在于实际连接S0,S1固定,减少了两个GPIO的初始化。class内部有测量RGB值的函数,通过测试将各channel的最大值进行写入,最后转为0-255。

class TCS3200:


    def __init__(self,s2_in,s3_in,out_pin_in):

        self.s2         =   digitalio.DigitalInOut(s2_in)

        self.s3         =   digitalio.DigitalInOut(s3_in)

        self.out_pin    =   digitalio.DigitalInOut(out_pin_in)


        self.s2.direction       =   digitalio.Direction.OUTPUT

        self.s3.direction       =   digitalio.Direction.OUTPUT

        self.out_pin.direction  =   digitalio.Direction.INPUT


    def set_color_filter(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

        else:

            self.s2.value   =   True

            self.s3.value   =   False


    def measure_frequency_one_channel(self,number_of_cycle=10):

        timestamps = []

        last_state = self.out_pin.value

        while len(timestamps) < number_of_cycle:

            current_state   =   self.out_pin.value

            if current_state != last_state:

                timestamps.append(time.monotonic_ns())

                last_state  =   current_state

                time.sleep(0.01)


        periods = []

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

            periods_ns  =   timestamps[i] - timestamps[i-2]

            periods.append(periods_ns)


        avg_period_ns   =   sum(periods)/len(periods)

        freq            =   1_000_000_000 / avg_period_ns

        return  freq

image.png

image.png

image.png

4. 进阶调试:用LED实时显示感知到的色彩

这里调用板载的三色LED,在spec的这个位置

image.png

将采集到的RGB值转化到0-255,给到LED

def get_color_freq(cs):

    color_freq_array = []

    cs.set_color_filter('R')

    color_freq_array.append(cs.measure_frequency_one_channel())

    cs.set_color_filter('G')

    color_freq_array.append(cs.measure_frequency_one_channel())

    cs.set_color_filter('B')

    color_freq_array.append(cs.measure_frequency_one_channel())

    return color_freq_array

    if previous_button_state and not current_button_state:

#task 1:print color

        c_f_a   =   get_color_freq(color_senser)

        display_RGB_freq(c_f_a)

        c_f_a[0] = (c_f_a[0]/48) * 255

        if c_f_a[0] > 255:

            c_f_a[0] = 255

        c_f_a[1] = (c_f_a[1]/44) * 255

        if c_f_a[1] > 255:

            c_f_a[1] = 255

        c_f_a[2] = (c_f_a[2]/42) * 255

        if c_f_a[2] > 255:

            c_f_a[2] = 255

        display_RGB_freq(c_f_a)

#task2: sample color and show in LED

        pixel.fill((c_f_a[0],c_f_a[1],c_f_a[2]))

5. 用蜂鸣器复现Do,Re,Mi

蜂鸣器使用pwm输出,通过音阶相应的频率修改pwm频率,需要注意的点是配置pwm的时候variable_frequency=True才能够对频率进行修改。虽然spec上说要5v驱动,实际3.3v也可以驱动

pwm = pwmio.PWMOut(board.D10,duty_cycle=0, frequency=440, variable_frequency=True)

note_names = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']  

frequencies = [261, 293, 329, 349, 392, 440, 493, 523]  

DEBOUNCE_TIME = 0.2  

NOTE_DURATION = 0.5  

#task3: bibibi

    if d2_current and not last_d2_state:  

        stop_playing()  

        play_note(note_index)  

        note_index = (note_index + 1) % len(note_names)  

        note_start_time = time.monotonic()  

        time.sleep(DEBOUNCE_TIME)  

        stop_playing()  

    last_d2_state = d2_current





关键词: 拾色     播放器     过程    

共1条 1/1 1 跳转至

回复

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