简介
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. 软件流程图

2. 实现过程
硬件连接
按下图所示,将各模块连接起来,组成本次项目的演示电路。

核心代码
(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]】校准流程完成。

基础演奏
将传感器移至红色色卡 → 播放"Do"音,屏幕显示"Color: RED, Note: Do"
移至绿色色卡 → 播放"Mi"音,屏幕显示"Color: GREEN, Note: Mi"
快速在不同颜色间移动 → 播放简单旋律

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