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

共1条 1/1 1 跳转至

【2025 Let's do 第3期】-- 拾色播放器DIY活动成果帖

菜鸟
2025-12-09 17:36:50     打赏

简介

DIY拾色播放器是一种创新型交互式音乐装置,通过颜色识别技术将视觉信息转化为听觉体验。本项目利用TCS3200颜色传感器识别不同颜色,映射为八阶音符,通过蜂鸣器实时播放,实现“以色谱曲”的交互效果。用户只需将传感器移动至不同颜色的色卡上,即可创作简单的旋律,将色彩艺术与音乐创作有机结合。


功能概览

颜色识别:实时检测TCS3200传感器下方的颜色。

颜色-音符映射:将8种基本颜色映射到八度音阶(Do-Re-Mi-Fa-Sol-La-Si-Do)。

实时音频反馈:检测到颜色变化时立即播放对应音符。

视觉反馈:TFT屏幕显示当前识别颜色和对应音符名称。

交互式作曲:用户通过移动传感器在不同颜色间切换,创作简单旋律。


硬件介绍

1. Adafruit ESP32-S3 Reverse TFT Feather 开发板 1 块

2. TCS3200颜色传感器模块 1 个

3. 数字蜂鸣器模块 1 个

4. 杜邦线 若干

5. 8色色卡(红、橙、黄、绿、青、蓝、紫、粉)


设计思路

本项目的核心设计理念是建立“颜色-音符”的直观映射关系,降低音乐创作门槛。设计考虑以下要点:

1. 映射逻辑:遵循自然联想(红色→Do,橙色→Re,黄色→Mi等),形成直觉化对应关系。

2. 响应实时性:传感器读取频率优化,确保颜色变化时音符播放延迟低于200ms。

3. 用户体验:通过TFT屏幕提供双重反馈(视觉+听觉),增强交互感。

4. 可扩展性:代码模块化设计,便于后续增加更多颜色或复杂音效。


功能实现

1. 软件流程图

mermaid-diagram-2025-12-09-091440.png


2. 实现过程

硬件连接

按下图所示,将各模块连接起来,组成本次项目的演示电路。

TCS3200颜色传感器_bb5.png


核心代码

(1)颜色识别

tcs=TCS3200(
    OUT=board.D9,
    S2=board.D5, 
    S3=board.D6,
    S0=board.D3,
    S1=board.D4,
    LED=board.D10
)
# 设置频率分频为100%
tcs.freq_divider = tcs.HUNDRED_PERCENT
# 校准传感器
tcs.calibrate()
# 获取RGB颜色值
rgb_color = tcs.rgb


(2)音频生成模块

def play_note(self, frequency, duration=None):
  """播放音符
  
  Args:
      frequency: 频率(Hz),0表示停止播放
      duration: 持续时间(秒),None表示使用默认持续时间
  """
  if duration is None:
      duration = self.note_duration
  print(f"play_note({frequency})")
  if frequency > 0:
      self.buzzer.frequency = int(frequency)
      self.buzzer.duty_cycle = 0x7FFF  # 50%占空比
      self.is_playing = True
      self.note_start_time = time.monotonic()
      self.note_duration = duration
  else:
      self.stop()


(3)显示模块

# 显示颜色标题
lbl_color = label.Label(font, text='颜色: ', color=title_color)  # 创建文本标签对象
lbl_color.x = 2  # 设置文本的X坐标
lbl_color.y = 80  # 设置文本的Y坐标
lbl_color.line_spacing = 1  # 设置文本行间距
lbl_color.scale = 1  # 设置文本放大倍数
text_group.append(lbl_color)  # 将文本标签添加到显示组中
# 显示颜色值
lbl_color_value = ScrollingLabel(font, text=f'R: {rgb_color[0]}, G: {rgb_color[1]}, B: {rgb_color[2]}', color=rgb_color, max_characters=24, animate_time=0.3)
# lbl_color_value = label.Label(font, text=f'R: {rgb_color[0]}, G: {rgb_color[1]}, B: {rgb_color[2]}', color=rgb_color)  # 创建文本标签对象
lbl_color_value.x = 50  # 设置文本的X坐标
lbl_color_value.y = 80  # 设置文本的Y坐标
lbl_color_value.line_spacing = 1  # 设置文本行间距
lbl_color_value.scale = 1  # 设置文本放大倍数
text_group.append(lbl_color_value)  # 将文本标签添加到显示组中
text_area = label.Label(font, text="00000000000", color=rgb_color, background_color=rgb_color)
text_area.x = 2
text_area.y = 120
text_area.line_spacing = 1  # 设置文本行间距
text_area.scale = 3  # 设置文本放大倍数
text_group.append(text_area)  # 将文本标签添加到显示组中
# 刷新颜色值
lbl_color_value.text = f'R: {rgb_color[0]}, G: {rgb_color[1]}, B: {rgb_color[2]}'
lbl_color_value.color = rgb_color
# 刷新颜色条
text_area.color = rgb_color
text_area.background_color = rgb_color


(4)主控制循环

def detect_and_play(self):
  """检测颜色并播放对应的音符"""
  current_time = time.monotonic()
  
  # 检查是否到了检测时间
  if current_time - self.last_detection_time < self.detection_interval:
      return
  
  # 更新蜂鸣器状态(自动停止)
  self.update()
  
  # 读取颜色
  self.refresh_sensor_color()
  rgb_color = (self._rgb_color[0],self._rgb_color[1],self._rgb_color[2])
  
  # 获取对应的音符
  frequency, color_name, note_name = self.color_mapper.get_note_for_color(
      rgb_color, debounce=not self.continuous_play)
  
  # 播放音符(如果有变化或连续播放模式)
  if frequency > 0:
      print(f"检测到颜色: {color_name} -> 播放音符: {note_name} ({frequency:.1f}Hz)")
      print(f"RGB值: {rgb_color}")
      
      # 在连续播放模式下,只播放较短音符
      duration = 0.2 if self.continuous_play else 0.5
      self.play_note(frequency, duration)
  
  # 更新最后检测时间
  self.last_detection_time = current_time


功能展示

校准过程

出现提示【Calibrating black object, press enter to start】时将传感器放置在黑色区域,等待2秒。当输出提示【Black calibration: [63596.1, 62366.2, 71475.6, 204532.0]】时表示校准完成。此时您有5秒钟的时间将传感器放置在白色区域,等待出现提示语【Calibrating white object, press enter to start】后等待2秒钟,输出提示【White calibration: [63546.1, 62346.2, 71485.6, 204525.0]】校准流程完成。

 2025-12-09_11-03-18.gif


基础演奏

将传感器移至红色色卡 → 播放"Do"音,屏幕显示"Color: RED, Note: Do"

移至绿色色卡 → 播放"Mi"音,屏幕显示"Color: GREEN, Note: Mi"

快速在不同颜色间移动 → 播放简单旋律 

2025-12-09_13-08-19.gif


演示视频


总结

本项目成功实现了基于颜色识别的交互式音乐播放器,完成了从硬件搭建、传感器数据采集、颜色分类到音频输出的完整流程。通过巧妙的颜色-音符映射设计,将抽象的视觉信息转化为可感知的听觉体验,实现了跨感官的艺术表达。


遇到的问题

1. TCS3200传感器受环境光影响较大,加入白平衡校准程序,并在相对稳定的光照环境下使用。

2. 颜色分类边界模糊,采用欧几里得距离算法,设置合理的阈值区分相近颜色。


心得体会

很荣幸参加《Let's do 2025年第3期——DigiKey陪你走过春夏秋冬·DIY拾色播放器》活动,DIY拾色播放器不仅是一个有趣的技术项目,更体现了科技与艺术交叉融合的无限可能。它降低了音乐创作的门槛,让色彩成为表达情感的另一种语言。本项目为后续的智能音乐交互设备开发提供了基础框架,展示了嵌入式系统在创意应用中的强大潜力。

通过这个项目,我们验证了使用低成本硬件实现创意交互系统的可行性,也为STEAM教育提供了一个生动的实践案例,激发学习者对编程、电子技术和音乐艺术的综合兴趣。

最后,感谢电子产品世界联合得捷电子推出的这次活动,期待未来活动能引入更多工业级场景案例(如光伏、智能家居),进一步打通技术到应用的 “最后一公里”。愿我们继续携手走过更多创新旅程,在EEPW社区的陪伴下,让每一次探索都收获技术的春天!


传送门

【2025 Let'sdo 第3期】-- 拾色播放器DIY活动开箱帖  

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


参考资料

https://www.adafruit.com/product/5691

https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/2107/SEN0101_Web.pdf





关键词: Let's do     ESP32     DIY     Circui    

共1条 1/1 1 跳转至

回复

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