这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【拾色播放器DIY活动】成果帖 252642555

共1条 1/1 1 跳转至

【拾色播放器DIY活动】成果帖 252642555

菜鸟
2025-12-14 21:04:42     打赏

这次成果帖的主题是在完成拾色基础任务后,利用扬声器(数字蜂鸣器模块)播放经典游戏音乐,实现一个“会听颜色、也会唱歌”的拾色播放器进阶版。整个系统以 Adafruit ESP32-S3 Reverse TFT Feather 为核心控制板,搭配 DFRobot 颜色传感器、Littelfuse 接近传感器和 Gravity 数字蜂鸣器模块,共同完成颜色采集、交互触发和旋律播放功能。系统框图与硬件设计系统框图可以概括为:颜色传感器采集物体表面的 RGB 信息传给 ESP32-S3 主控,主控根据颜色或模式选择对应的旋律,再通过数字蜂鸣器模块输出声音,接近传感器则作为启动/暂停或模式切换的输入,同时板载 TFT 屏可用于显示当前颜色值、当前曲目名和播放进度等信息。 主控板采用 Adafruit ESP32-S3 Reverse TFT Feather,内置双核 240 MHz 处理器、4 MB Flash 和 2 MB PSRAM,既能跑 CircuitPython,又能驱动 240×135 彩屏,正好适合这种“界面 + 传感 + 音频”的小型互动项目。电路原理上,本次重点是数字蜂鸣器连接细节及其与主控 IO 的对应关系。

DFRobot Gravity 数字蜂鸣器模块(DFR0032,1738-1142-ND)支持 3.3–5 V 供电,内部通过改变驱动频率发出不同音高,适用于 Arduino/ESP32 等平台。 模块自带 3 线 Gravity 排线,原始顺序为黑-红-绿,对应 GND、VCC、信号;而这块 Adafruit Feather 的插针排列附近恰好是 3V、GND 和一个 A0 IO 脚,因此需要先用镊子调整排线顺序为红-黑-绿,使红线对应 3.3 V、电源,黑线对应 GND,绿线接到 A0(或 D2 等可用数字口),实现“旁边一排直接插上就能用”的简洁布线。

52c0b3ad9d1dd45d985369058796cfd8.jpg


主要参数与软件环境主控板关键参数:ESP32-S3 双核 240 MHz,4 MB Flash + 2 MB PSRAM,1.14 寸 240×135 IPS 彩屏,板载 USB-C、LiPo 充电、NeoPixel 以及 STEMMA QT 接口,可在低功耗模式下降到百微安级别,非常适合电池供电的随身播放器应用。 数字蜂鸣器模块供电范围 3.3–5 V,数字高低电平即可控制响或不响,通过调整输出频率可以发出不同音高,用逻辑简单但足够完成 8 位风格的游戏音乐。软件方面,首先在 CircuitPython 官方页面为 ESP32-S3 Reverse TFT Feather 下载 CircuitPython 10.0.3 稳定固件,刷入后开发板在电脑上以 CIRCUITPY 盘出现,同时可以预先配置 Wi-Fi 信息,为后续联网拓展留下空间。 然后访问 Thonny 官网下载 Thonny 4.x,并通过“选择解释器”为 ESP32-S3 板卡建立 CircuitPython 调试会话,便于查看 REPL、直接编辑与保存代码文件。 为了能方便调用各类外设,再从 CircuitPython Libraries 页面下载与当前版本匹配的库 Bundle,将需要的库复制到 CIRCUITPY 盘下的 lib 目录,为显示、定时、按键处理等提供现成模块支持。实现步骤与项目代码思路实现流程可以分为四步:

  • 环境与驱动验证:完成固件更新和库部署后,先编写简单测试脚本,验证颜色传感器能输出稳定的 RGB 数值,接近传感器能正确检测靠近/离开事件,蜂鸣器在不同频率下可以发出不同音高。

  • 音符表构建:在 CircuitPython 代码中定义一个音符频率表,例如用字典将 C、D、E、F、G、A、B 等音名映射到对应频率值,结合简单的时值参数(四分音符、八分音符等),封装成 play_note(note, duration) 函数,由主控通过 PWM 或定时切换数字口高低电平来驱动蜂鸣器。

  • 乐谱编码与播放引擎:将魂斗罗主题旋律拆分成音符序列 + 节奏数组(如 [("E",4),("E",8),...] 形式),在主循环中遍历序列,调用 play_note 函数逐个播放,并在 TFT 屏上实时显示当前播放到的音符或小节号,提高互动感。

  • 模式与交互逻辑:用接近传感器作为模式切换或播放控制,例如第一次靠近启动拾色播放器基础模式(根据颜色播放简单提示音),再次靠近则切换为“魂斗罗 BGM 模式”,长按或保持靠近一段时间则暂停或停止播放,同时在屏幕上显示当前模式和颜色/曲目信息。

  • 开启运行与效果演示整机装配完成后,运行步骤非常简单:

    • 通过 USB-C 接入电脑或电池,开发板上电后自动运行 code.py,TFT 屏显示主界面和模式提示。

    • 用磁铁或设计好的触发方式激活 Littelfuse 接近传感器,系统切换到音乐播放模式,蜂鸣器开始按预先编码的节奏播放 FC 魂斗罗主题音乐,每个小节之间可短暂停顿,既有识别度,又兼顾单片机的处理余量。

    • 若加入拾色逻辑,则可以在“拾色模式”下用颜色传感器读取不同色块,把色相或亮度映射到不同调式或速度参数,实现“不同颜色触发不同段魂斗罗音乐”的玩法,配合屏幕显示当前颜色和状态,整个体验非常贴合“DIY拾色播放器”的活动主题。


  • 通过这次进阶任务,不仅完成了基础拾色任务,还把项目扩展为一个兼具怀旧游戏音乐和颜色交互的迷你播放器,充分发挥了 ESP32-S3、CircuitPython 和 Gravity 模块的可玩性,也为后续继续加上 Wi-Fi 控制、在线曲库或更多音效预留了空间。



  • import time  

    import board  

    import pwmio


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


    note_freq = {  

        " ": 1,  

        "do": 131,   # 低音do  

        "re": 147,   # 低音re  

        "mi": 165,    # 低音mi  

        "fa": 175,    # 低音mi  

        "so": 180,    # 低音mi  

        "la": 220,    # 低音mi  

        "1": 262,   # do  

        "2": 294,   # re  

        "3": 330,   # mi  

        "4": 349,   # fa  

        "5": 360,   # so  

        "6": 440,   # la  

        "7": 494,   # xi  

        "1'": 523,  # 高音do  

        "2'": 587,  # 高音re  

        "3'": 659,  # 高音mi  

        "4'": 698,  # 高音fa  

        "5'": 784,  # 高音so  

    }  

      


    music_notes = [

    #版权原因不显示

    ]

      


      

    def play_note(note, duration):  

        frequency = note_freq.get(note, 440)  

        pwm.frequency = frequency  

        if note.strip() == " ":  

            time.sleep(duration)  

        else:  

          pwm.duty_cycle  = 2 ** 15

        time.sleep(duration*2)  

        pwm.duty_cycle = 0  

        time.sleep(0.05)  

      

    def play_music():  

        for note, dur in music_notes:  

            play_note(note, dur)  

        time.sleep(1)  

      

    while True:  

        play_music()  



共1条 1/1 1 跳转至

回复

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