szjuliet 发表于 2021-2-25 10:17:06

宅家一起云合奏(MQTT+ESP8266)

本帖最后由 szjuliet 于 2021-2-25 10:17 编辑

https://www.bilibili.com/video/BV1zp4y1n7VQ/







# MELODY - 宅家一起云合奏(MQTT+ESP8266)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614iu4szqz98tyeptim.jpg)

简介:MELODY - 宅家一起云合奏

居家工作有许多优势及技术解决方案,但是同事间制定和创建生活连接的难度仍很大。MELODY是一款数字实体设备,可以创建协作式短音乐节拍。同事之间可以协调时间,设备通过玩家的轮次和不同的随机声音设置韵律节拍。第一个参与者设置特定的节奏,然后每个参与者添加与设置的节奏相对应的自己的音乐片段。为了使没有乐理背景的用户更容易使用,软件通过对用户的点击进行采样并调整为适当的节奏来帮助用户保持节奏一致。约3分钟后,所有参与者都完成自己的录音,音乐节拍结束。

简介:MELODY是如何工作的?

Melody基于ESP2866硬件,该硬件通过MQTT协议与Node-Red服务器通信。设备将玩家的音符转换成字符串并发送到服务器,又将字符串从服务器发送回其他玩家。这样每个人都可以播放和收听音乐,而不会受到网络连接的干扰。

MELODY有两个主要的视觉指示。一个是LED灯带,可让玩家知道音乐节奏循环何时开始及结束,并指示是否轮到自己了。另一个是位于设备中央的LED显示屏,用于可视地显示目前的旋律。从3倒数到1表示倒计时开始播放,并且定时显示指示用户何时以及如何参与合奏。录制的旋律会自动保存到公司的云中,以备将来使用。

这个项目是由位于Herzliya(IDC)跨学科中心的媒体创新实验室(MiLab)的四名学生Shahar Agassy,Eden Bar-Tov,Gal Eshchar和Gad Stern设计的。在Zvika Markfeld,Netta Ofer和Michal Leschinsky的协助及Noa Morag和Oren Zuckerman的指导下完成。

感谢汤姆·格兰诺特(Tom Granot)制作的[项目](https://www.instructables.com/ForgetMeNot-Smart-Home-Notifcation-Platform/),他的项目帮助我如何在本项目中实现某些步骤(这些步骤是仿照他的项目实现的)。

材料:
+ 3D打印机
+ ESP8266+
+ 7个按钮
+ 8X8 LED矩阵
+ (https://randomnerdtutorials.com/guide-for-ws2812b-addressable-rgb-led-strip-with-arduino/)![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615xo52en8rllnet0e1.png)
+ (https://www.adafruit.com/product/3006) ![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614u6u5ft2hzlti2huk.jpg)
+ (https://tinkersphere.com/audio/2496-female-18-35mm-4-pole-audio-jack-with-screw-terminals.html)![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614c8aewn36fz966ie6.jpg)
+ 1K电阻4个
+ 3K电阻1个

## 步骤1:理解任务流

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614ptprgetaew17tcl7.png)

**这个项目我们要解决以下问题:**

1. 如何实现在线以让玩家可以同时演奏?
2. 如何解决网络延迟问题并创建无缝体验?
3. 如何让没有音乐背景的人演奏出来的音乐也能听起来好听?

**音乐的时间安排和序列化**

为了解决第一个问题,我们研究了MIDI协议并试着用了一下,发现它比我们实际需要的功能更复杂,想简化后构建第一个有效的原型。我们从MIDI中汲取了灵感,并用一串数字(从0-5)乘以循环次数再乘以玩家人数来表示一段音乐循环(我们将在后面解释所有音乐中的数学)。

在音乐中,我们将节奏分成音乐小节。每个小节基本上都是一小段时间,
我们选择使用4分之4节拍(在音乐小节中表示4个节拍)- 最常见的小节。

然后将每个节拍拆分为4个采样窗口,演奏的每个音符将自动对齐以保持整齐,还可以将一首歌曲表示为一串数字发送到服务器。

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614feb77uxbeivhbife.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614muutv7qzs5tmttqs.png)

为了对没有音乐背景的玩家友好,我们做了三件事:

1. 限制键的数量让玩家专注于较少的选项。
2. 选择相同音阶的音符,这些音符可以一起演奏,因此不会有任何不和谐的声音。
3. 每个按键都设置到节奏“窗口”,让玩家的音乐与节奏泾渭分明

**通讯协议**

在了解音乐背后的逻辑之后,如何让玩家进行交流?

我们使用(https://en.wikipedia.org/wiki/MQTT) - 一种在设备之间传输消息的发布-订阅网络协议。

每个玩家都订阅了两个主题:循环loop(获取最新的循环)和轮次turn(获取当前玩家的ID用于同步)。

轮到某个玩家时,当TA演奏完后,按下UP按钮,循环loop(更新后的循环)会发送到MQTT代理,MQTT再将循环传输给所有玩家的循环频道。

旧的循环会保持“休眠”状态,直到新的循环播放完毕并将其替换。这个过程对玩家是透明的。由于新循环保存在当前玩家的本地设备,因此音乐没有网络延迟,故此我们解决了第二个问题。

## 步骤2:设定服务器-Ngrok

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614k6loqqo2voq17o8u.png)

(https://ngrok.com/)是一种隧道服务。它可以将本地运行的服务(示例中为Node-RED)暴露给外界 - 没有设置服务器或处理DNS记录的麻烦。只需在计算机上运行Node-RED,然后在运行Node-RED的同一端口上运行ngrok。

好了-接下来你会得到一个URL,使用这个地址从世界任何地方访问Node-RED。

**安装与配置**

1. 在[此处](https://ngrok.com/)下载适用于自己操作系统的ngrok。
2. 依照下载页面上的步骤操作,直到“Fire it up”步骤。
3. 在“Fire it up”中,将80替换为1883,将http替换为tcp,如./ngrok tcp 1883,依照你自己电脑的的情况替换(译注:我的电脑是64位win10,命令为ngrok.exe http 80。ngrok文档地址为https://ngrok.com/docs)。
4. 保存URL和端口号(如图所示),稍后我们将需要。

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614jdcc55wjg011pcj3.png)

## 步骤3:服务器设置-Node-Red

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614h99zzg1msgzgz6nt.png)

Node-RED项目的服务器逻辑是一个可视化编程环境,它可以连接各种软件(及硬件!)。

这里我们对所有玩家之间的沟通逻辑进行设置(共享及接收循环、协调玩家轮次)

**安装Node-Red**

按照以下步骤在本地计算机上加载Node-RED流:

1. Node-RED需要Node.js,请从[此处](https://nodejs.org/en/download/)安装
2. 按[此处](https://nodered.org/docs/getting-started/local)说明安装Node-RED。

现在已经安装好了Node-RED,按照上述步骤中的说明运行它,在http://127.0.0.1:1880页面下会看到一个空白的画布。

现在需要导入用于该项目的流程,可以在[这里](https://github.com/edenbartov/Melody/blob/master/flows.json)找到它,点击导入import添加JSON文件,点击Deploy分发。

**安装Node-Red:**

查看此步骤所附的图像,则可以看到我们有2个主要的“动作”:从某个玩家那里接收当前循环并传送到其他玩家;向所有玩家广播新的轮次以保持游戏同步。

## 步骤4:设定服务器-MQTT(Mosquitto)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140614wekz4mpz5zy02kme.png)

传感器和激活器需要通过MQTT进行通信,由于Node-RED没有自己的MQTT代理,因此我们使用专用的MQTT代理。我们会使用Node-RED建议的Mosquitto。有关MQTT以及为何在物联网项目中经常使用MQTT等相关信息,参见此处。(译注:原文没有附链接)

**安装与配置**

1. 从[此处](https://mosquitto.org/download/)根据你的操作系统下载Mosquitto并进行安装。
2. 正常情况下要按照[此处](https://cookbook.nodered.org/mqtt/connect-to-broker)的说明将Node-RED连接到Mosquitto。但如果使用本教程的Node-RED流,则已经进行了预配置。只要正确安装Node-RED流和Mosquitrro,并且Mosquitto运行在端口1883(默认情况下在其上运行)上运行,它就可以立即使用。
3. 注意MQTT代理和你的Node-RED服务器在同一台计算机上运行。这对于简化系统内部的通信很有用。有关更多信息,请参见下面的说明。

**监控MQTT流量**

我使用(https://mqttfx.jensd.de/index.php/download)监控流量,这是一个出色的工具,GUI非常简单。

## 步骤5:代码

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615ou6xg1ux6zve1114.png)

代码在(https://github.com/edenbartov/Melody_中(包含所有数据文件和config.h)

**安装依赖库**

在将代码加载到esp2866之前,需要安装一些库:

1. (https://github.com/earlephilhower/libmad-8266)(将音乐从SPIFF中解码到I2S)
2. (https://github.com/plapointe6/EspMQTTClient)
3. (https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi)
4. (https://github.com/adafruit/Adafruit_NeoPixel)

**使用SPIFF将声音上传到ESP:**

1. 参照[ instructable](https://www.instructables.com/id/Using-ESP8266-SPIFFS/)上的帖子。
2. 将数据文件夹添加到源代码目录。
3. 在Arduino IDE的“工具”菜单下,将flash大小更改为“ 4MB(FS:3MB TOA:~512KB)”
4. 同样在“工具”菜单下按ESP2866 Sketch Data上传

**设置参数:**

之后转到config.h文件添加所需的数据,例如WIFI密码及上一步中的ngrok URL和端口(查看图片参考)。

ps-我还添加了自动连接功能,可以从智能手机设置WIFI和ngrok数据。这只是概念的第一个证明,希望有一天能添加这个功能。

设置玩家数量(此游戏最适合2-3个玩家,并且开箱已经加载了2个玩家的声音)。但可以轻松调整更多操作:

每个玩家都可以在 node-red中添加另一个流,以在特定用户的主题下发布循环。

此外还可以通过将以下数组设置为自定义声音来编辑音乐声音:

在这里可以看到有3种乐器(玩家0的Chrods,玩家1的Lead,玩家2的Bass)

const char * path = {“ /blank1.wav"、"/Chords_Am.wav"、"/Chords_F.wav"、"/Chords_C.wav"、"/Chords_G.wav"、"/Chords_Dm.wav” ,“ / blank2.wav”,“ / Lead_C.wav”,“ / Lead_D.wav”,“ / Lead_E.wav”,“ / Lead_G.wav”,“ / Lead_A.wav”,“ / blank0.wav”, “ /Bass_C3.wav”、“/Bass_D3.wav”、“/Bass_F3.wav”、“/Bass_G3.wav”、“/Bass_A3.wav”}};

## 步骤6:打印3D模型

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615kujroqmmgu17zeux.jpg)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615otdei6b60uuxp9wd.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615d7u06qaq29e9b9us.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615kgmt91gwg2z3t4tw.png)

第一步,下载并打印STL。

打印的支架可能需要打磨一下(取决于打印机的精度)

涂成所需的颜色

模型文件在附件中。

## 步骤7:组装和焊接

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615jllam4x6doz8saqx.png)

这一步是真正神奇的地方。

按照以下原理图将所有内容焊接在一起。

注意,你可以更改接的引脚,同时在代码中同步更改。

A0和I2S已经固定好了:

因为A0是电阻桥(我们用电流的差来知道5个按键中哪个被按下了-类似于这个(https://www.instructables.com/id/How-to-Multiple-Buttons-on-1-Analog-Pin-Arduino-Tu/))。

I2S有特定的代码,可以在[这里](https://github.com/bbx10/SFX-I2S-web-trigger)找到

## 第8步:与朋友一起弹奏

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615h7qqc9iimq7cvwy7.jpg)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615z1alallquibqll0l.jpg)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/24/140615tgp6llpg1phkhppk.jpg)

> 原文链接:https://www.instructables.com/Melody/   
> 作者:Eden Bar-Tov   
> 翻译:szjuliet
> ![](https://mc.dfrobot.com.cn/data/attachment/forum/202007/13/092805lv0ln9zmnxplgnrn.png)

hnyzcj 发表于 2021-2-25 12:33:08

这个好玩

发表于 2021-3-15 17:59:29

这个很有趣欸

DFHJM_IpFmV 发表于 2021-6-18 18:11:09

牛批{:5_179:}
页: [1]
查看完整版本: 宅家一起云合奏(MQTT+ESP8266)