【测评TCS3472】使用 TCS3472 实现色控电子琴-Arduino中文社区 - Powered by Discuz! Archiver

t3486784401 发表于 2020-4-22 01:53

【测评TCS3472】使用 TCS3472 实现色控电子琴

首先感谢 M5Stack 团队这次给试用 TCS3472 颜色识别模块!
在接下来的日子中我会逐步发表测评帖子,记录项目“色控电子琴”的开发历程。

本帖是第 3 篇测评,内容为色控电子琴(v1)的实现,含全部软硬件资料。

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

【背景】
按着之前申请 TCS3472 试用时的约定,需要我实现一套色控电子琴项目,并公开全部资料。
基于前几个测评帖子的技术积累,今天已可以完成整个色控电子琴的搭建、编程,故记录之。

测评帖子#1,发现 RGB 转 XYZ 颜色矩阵有误:https://www.arduino.cn/thread-96922-1-1.html
测评帖子#2,测试 TCS3472 高分辨时丝滑程度:https://www.arduino.cn/thread-96923-1-1.html
测评帖子#3,即本帖子。


【运行原理】
所谓“色控电子琴”是我对这个项目的戏称,相对于传统键盘琴而言,色控电子琴的琴键是颜色。
TCS3472 颜色识别模块可以区分出物体的不同颜色,通过算法将颜色映射为音高,即为“色控电子琴”。

实际操作过程中,颜色的原始表达为 CIE-RGB 分量形式,是一个三维的空间;
通过变换(见测评帖子#1)可去除亮度,得到色度即 CIE-XYZ,降维为二维空间;
然而实际音高是一维线性的,因此需要通过算法将 CIE-XYZ 再次降维,获得一维空间对应音高。


【硬件搭建】
首先来张整个系统的大合照,含“色控电子琴”、待测物品,以及寂寞的 M5Stack 包装盒。


近看色控电子琴,就是个插了 ①TCS3472;②蜂鸣器;③外置电源 的 UNO 主机。
所有的矩阵变换、空间降维、颜色处理、浮点计算都嵌入在 UNO 处理器中,PC不参与任何计算。


考虑到 TCS3472 逻辑电平为 3.3V,在转接板上特地搭棚 1K 电阻串在模块和 UNO 之间,
避免 5V 逻辑电压损坏模块,实测工作稳定可靠。


接下来细看每个工作单元。

首先是 TCS3472,自带白色照明,可以直接识别不发光的物体颜色,使用简便:


之后使蜂鸣器,我直接用主板蜂鸣器插在转接板上,最大程度简化接线:


最后是供电,使用两节 10440 锂电池给 VIN 供电,实际 8.0V 左右非常可靠:



【软件算法】
硬件搭建完以后,就开始软件编程,程序主框架是 Arduino UNO,
使用 Adafruit_TCS34725 类访问传感器,使用 tone/noTone 产生音高。

这里着重介绍一下 CIE-XYZ 空间到音高的算法,如下图所示。


CIE-XYZ 颜色空间中相对于白色点的 (x,y) 坐标被我转为极坐标 ρ∠φ,即:

x= ρcosφ
y= ρsinφ

转换以后 ρ对应按键力度,φ对应按键音高。规定:
当 ρ 接近零时不发声,即灰白色对应无声,只有色彩足够鲜艳才能“弹奏”音高。
当 ρ 足够大时 φ(0-360) 查表对应一维音高,不同颜色将弹奏出不同音高的音符。

由于 TCS3472 比较丝滑(见测评帖子#2),因此可以细调出很多不同的音高来。
软件中内嵌了串口调试信息,工作时串口可直接查看ρ、φ数据,用于细调音高。


【测试视频】
测试视频总计录制了两段,都是 HEIC/H265 高压格式,若打不开请升级播放器。

#1-整机测试:

#2-简单旋律:


【附件】
最后附上项目的工程文件,包括:

#A-项目源码(Arduino IDE 1.8.3 编译通过):

#B-项目电路图(仅示意 UNO 外接线):


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

以上,使用 TCS3472 颜色识别模块,实现了一套“色控电子琴”,并进行了简单弹奏。
这个琴稍微弹快点就手忙脚乱的,看来以后要去打印个彩色色条才能优雅。

当然由于声音只是简单方波,不比和弦悦耳,回头有精力了搞个和弦版本的再来分享。

再次感谢 M5Stack 团队!
最后祝大家 DIY 愉快,万事如意!

plasticplant 发表于 2020-4-22 22:57

大佬大佬,非常佩服
页: [1]
查看完整版本: 【测评TCS3472】使用 TCS3472 实现色控电子琴