ChoirBot,桌子上的迷你机械乐队

2016-03-147.6万
精华项目
AI 快速预览详细 收起
ChoirBot是一个基于步进电机和Arduino的迷你机械乐队项目,能够通过MIDI文件控制四个步进电机发出不同声部的音乐。该项目需要准备材料包括步进电机、Pro Mini或Nano单片机、12V开关电源、7805稳压器、电机驱动板等。通过宏定义myChannel,每个电机可以接收不同的MIDI通道内容,从而实现多电机同步演奏。此外,使用74HC04反相器可以解决不同电压信号兼容的问题。ChoirBot不仅适合STEM教育和编程启蒙,还能为孩子们提供有趣的动手实践机会。
ChoirBot,桌子上的迷你机械乐队图8





步进电机,作为一种相当普遍使用的机电设备,具有相当灵活的调速性能,工作时也会产生转动的嗡嗡声。既然这种电机的声音可以被控制,那就一定有变成乐器的潜质:lol

其实不光是步进电机,各种电机都可以变成乐器。曾经在YouTube上看见歪果仁将音频信号送入电机驱动,直流电机直接像扬声器似的唱了起来。再比如,玩过四轴的朋友们一定听过无刷电调、电机上电的铃声。甚至还有人利用闭环控制,让摩托车发动机奏响了星球大战主题曲…让在场观众长跪不起…..
于是我决定做个小项目,让四枚步进电机分别担当主音、贝司、节奏、弦乐的角色,随时可以在办公桌上来一场小型音乐会----听起来就像机器人组成的唱诗班,命名为
ChoirBot

-->点这里,传送到Bilibili视频专辑<--




想看更多~请往下翻~~


1,科普在先
它是怎么出声音的?
骑过摩托车没?设想你正在一条长长的路上骑行,突然将油门拧到底!脑补一下发动机的声音,是不是某种频率逐渐上升的音调?要是你忽大忽小地拧油门,控制得足够快、足够准确,你也可以用摩托车的发动机来演奏一曲,哈哈。这和步进电机演奏乐曲的道理是差不多的,只不过这回是Arduino在骑摩托车:lol

为什么用步进电机?
有两种方法让电机唱歌。
   --->  一种是将音频信号经过某种放大,直接送给电机。
   --->  另一种是用传感器获取电机的转动声,通过快速傅里叶变换(FFT)算出声音的频率,再通过比例、微分、积分(PID)计算,控制电机加速、减速到匹配的频率。
直流电机也是可以的,若是使用上述第一种方法,驱动电路非常简单,成本也低。但是电机不是处于正常(直流)的工作状态,电机轴不转,声音很小,而且没什么机械感。要是采用第二种方法,复杂程度就不用说了,对电机性能、单片机运算速度要求高,而且系统太复杂很容易受干扰,四个电机一起唱就是真的作死啦。
步进电机就不同了,静态时会刹车不受自身惯性影响,而且工业用的电机驱动非常成熟,只要送入一定频率的调速脉冲,就可以随便控制电机以任何步进速率运转,而且声音也富有机械感,像机器人在唱歌。

我喜欢的歌曲都可以直接播放吗?
不一定都可以。首先你要找到这首歌的MIDI格式文件(.mid)。这种文件跟我们平常听的mp3有很大不同,MIDI文件中存储的是一行行的指令,比如
第一秒,选择第8通道,启动A5这个音符,用小提琴的音色,力度127;第1秒半踩下延音踏板;第二秒关闭所有音符……
就是一连串这些指令构成了MIDI音乐文件,一般一首歌只有十几至一百多KB,而且在不同的声卡上,播放效果有很明显的区别。
一些吉他谱的格式,比如gp5,实际上也是midi文件,可以互相转换。要是在网上找不到你喜欢的Midi文件,你又恰巧懂乐理,可以用编曲软件自己制作。



2,准备材料
有请主角出场——步进电机四枚
ChoirBot,桌子上的迷你机械乐队图9

控制板,开关等。每个电机需要一枚Pro Mini,或者Nano也可以。我还额外用了一个Bluno,既可以用作蓝牙接收装置,也可以用作液晶屏界面的控制器。
ChoirBot,桌子上的迷你机械乐队图10ChoirBot,桌子上的迷你机械乐队图16ChoirBot,桌子上的迷你机械乐队图11

12V开关电源,和7805三端稳压器。我用7805给5个单片机供电的时候,发现管子的温度相当高,所以又用了一个开关稳压模块,将输入电压降至9V左右,再均匀分配给独立7805和Bluno上的稳压管,减少了电源部分的发热量。
ChoirBot,桌子上的迷你机械乐队图17ChoirBot,桌子上的迷你机械乐队图18

电机驱动,要选择这种带脉冲输入的。这种黑盒驱动比较贵,我用的是不带外壳的板子,带有电流、细分调节、刹车电流设置等不少功能。
ChoirBot,桌子上的迷你机械乐队图15

螺丝、扎带(大量)等辅助材料,画板一块
ChoirBot,桌子上的迷你机械乐队图14ChoirBot,桌子上的迷你机械乐队图12

74HC04 六通道反相器一片,后面我会说明用途
ChoirBot,桌子上的迷你机械乐队图13


3,问题与构思

ChoirBot,桌子上的迷你机械乐队图1
正式开始制作之前我进行了一些测试,发现了一些问题。我会写出解决方法供参考。
ChoirBot,桌子上的迷你机械乐队图2
一开始我想用1片Bluno控制全部四个电机,结果无论程序代码怎么调整、优化,都表现得非常不稳定,发出异常响声或者直接卡死。这个问题至今无解,怀疑是ATMega328P的RAM不够。
于是买了5片DF的Cheapduino,8MHz的芯片,又发现无法使用tone()函数(后来搜索了一下,Arduino NG上执行tone()函数确实有问题)。
最终也是为了便于安装,使用了Pro Mini,与Uno相同是ATMega328的芯片,所有功能都正常。
ChoirBot,桌子上的迷你机械乐队图4ChoirBot,桌子上的迷你机械乐队图3ChoirBot,桌子上的迷你机械乐队图6
调试阶段遇到的另一个问题是,当我把Romeo的RX与4片Nano并起来的时候,发现它们都不工作了,但是将Romeo与Mega的RX相连是可以正常工作的。不知原因,用示波器观察RX上的波形,BLE芯片给328P的是3.3v的电平。连接Nano后电平被直接拉到了5V。简单的解决方法是,用一片74HC04反相器(Vcc=5V)将3.3v的信号反相两次,即可变成5V电平。
ChoirBot,桌子上的迷你机械乐队图5ChoirBot,桌子上的迷你机械乐队图7


4,开工

ChoirBot,桌子上的迷你机械乐队图23
写这个固件的时候参考了Arduino官方社区的 greg-kennedy的帖子 http://forum.arduino.cc/index.php?topic=79326.0,他提出了Arduino制作简易合成器的方法。
为四片Pro Mini烧写固件。在这个项目中,4片芯片的串口RX是连在一起的,为什么能够发出不同声部的音乐呢?
秘密在此处:程序开头的地方有一个myChannel的宏定义,它定义的是芯片将会接收哪一个MIDI通道上的内容。(一般最多有16个通道)
明白了吧?比如下载第一个芯片时,设置成0x00,第二片设置成0x01............第四片设置成0x03。只有这里需要手动改一下。


ChoirBot,桌子上的迷你机械乐队图24

先组装电机的控制板。取4片Pro Mini,焊上侧面的所有排针,用芯片座将它们固定在洞洞板上。
LZ没有正好一样大的,只好将更长的芯片座剪开。
ChoirBot,桌子上的迷你机械乐队图19ChoirBot,桌子上的迷你机械乐队图21
将所有芯片的RX引脚连在一起,并与Vcc,Gnd一起引出。并将D6引脚(程序中可设置) 引出到电路板正面,作为信号输出。
ChoirBot,桌子上的迷你机械乐队图22
将电机和驱动也连接好,固定在画板上。可以参考购买的电机驱动的说明书。
每个板子上都有安装螺丝的孔。但我觉得扎带比较方便,就没有用螺丝。
ChoirBot,桌子上的迷你机械乐队图20

当你固定完四个电机后,如果你不需要蓝牙和液晶屏的部分,这个程序已经可以让你的乐队试着演奏一曲了。具体怎么演奏请往后看。
ChoirBot,桌子上的迷你机械乐队图25

如果用Bluno作为蓝牙接收器就需要一片74HC04六非门,来转换一下BLE芯片的逻辑电平。
将RX信号输入任意一个非门A,再将A的输出连接B的输入,B的输出引出,相当于将信号翻转了两次,3.3V的电平就变成5V了。
(此处明天补充一个电路图)


ChoirBot,桌子上的迷你机械乐队图26
接着是自由发挥部分,液晶屏、开关可以随便接,DIY一个可以显示信息、调试电机的东西。这个代码LZ写得仓促,很乱,就不发上来迷惑大家了

ChoirBot,桌子上的迷你机械乐队图28

全部完成的效果,可以上12V电试一下了。LZ用的电机驱动和稳压器可以输入9V~24V,所以接各种航模电池也没问题。
ChoirBot,桌子上的迷你机械乐队图27
板子上指示灯特别多,晚上开启会有意外惊喜
ChoirBot,桌子上的迷你机械乐队图29


说一下电脑端的设置,LZ用的是Linux系统,上面有一款超级强大的MIDI工作站软件,叫Rosegarden,而且是免费的。
  1. sudo apt-get install rosegarden
复制代码
要实现串口到MIDI转换,还需要一个非常小巧但非常实用的工具:Hairless MidiSerial.可以在这里下载
  1. http://projectgus.github.io/hairless-midiserial/
复制代码

简单介绍一下配置方法。
插入DFRobot BLE Link,然后打开Rosegarden和Hairless,首次运行Hairless要设置波特率,如下图。
ChoirBot,桌子上的迷你机械乐队图30

在Rosegarden打开的情况下,将MIDI端口和串口设置好,MIDI In要选择Rosegarden:3 ,这个是默认的输出端口。
ChoirBot,桌子上的迷你机械乐队图31

然后就可以在Rosegarden中加载一个你喜欢的MIDI文件了,以GodFather为例。
ChoirBot,桌子上的迷你机械乐队图32
按下Alt-K ,再按M,使所有音轨静音。这时音轨前面的蓝灯会熄灭。

找到你认为要演奏的通道,比如贝斯。先点亮蓝灯,然后按鼠标右键,通用MIDI设备,在1,2,3,4中可以任意选择,分别对应1,2,3,4号步进电机。
ChoirBot,桌子上的迷你机械乐队图33
然后切记要在Rosegarden的左下角将通道设置从auto改成fixed。LZ调试的时候在这一步卡了两天多,才发现
然后以此类推,将其余3个通道设置好,每个通道都要将auto改成fixed。
ChoirBot,桌子上的迷你机械乐队图34
ChoirBot,桌子上的迷你机械乐队图35
如果电机连接正确,并可以发出上电铃声,就可以等待BLE连接好后,点击播放按钮试试了:lol
要是没反应,检查Bluno的收发指示灯有没有闪烁。也许是Hairless的端口没有选对。有时关闭Hairless桥重新打开可以解决问题。
建议勾上Debug MIDI messages来看看有没有数据送出。



5,演出开始!
在你将这个装置搬上舞台之前,也许需要仔细调试才能确保电机发出最好的声音。比如,负责贝斯的电机很有可能声音太大,并导致桌子上的东西共振,甚至跳起来。你可以拨动驱动板上的开关来取消贝斯电机的细分设置,或者减小电流。
Tocatta and Fugue


GodFather


歌唱祖国


Country Roads


In the Hall of the Mountain King


时间太晚了,LZ没能一天赶出所有视频和更加详细的说明,请待我明天继续补充,谢谢大家!

IMG_4210.png (543.32 KB, 下载次数: 13560)

ChoirBot · 桌子上的迷你机械乐队_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(28)
JOVI
JOVI
学习学习
JOVI
JOVI
学习学习
派大星ym
派大星ym
/////
派大星ym
派大星ym
厉害厉害
小马1
小马1
哇啊 我真的好喜欢呀 做的真不错呀 非常棒
qwq2003
qwq2003
求问蜂鸣器可以吗
ABLgle
ABLgle
楼主,你的详细呢,补了吗?~~~ Orz
ExplodingTNT
ExplodingTNT
怎么好的机器,给一个我玩玩,行吗?楼主
lin
lin
那种小的步进电机也可以吗?
彭海猷
彭海猷
楼主,可以教教俺这个小白菜怎么做的吗
yoyojacky
yoyojacky
好赞! v神请收下我的膝盖。。哈哈
砖头墙
砖头墙
好牛掰
charlesshi
charlesshi
[font="]视频: 【技术帝】only my railgun马达演奏版[/font]
[media=swf,500,375]http://player.youku.com/player.php/sid/XMTg4OTExNjI0/v.swf[/media]
[font="]视频: 技术宅! 机械硬盘演奏only my railgun[/font]
[media=swf,500,375]http://player.youku.com/player.php/sid/XNDIxNzMwMTIw/v.swf[/media]
好多年前看过,日本技术宅坐的,这次终于在arduino实现了,话说,51都能做出来的,arduino肯定没问题,哈哈
arduino让电脑可以控制外界的输出,或者让外部的输入能控制电脑,算是给PC加了个可自定AD,DA吧,哈哈
以前电脑只能玩软件编程,现在可以通过arduino开发,自由与外界交互啦,哈哈,做硬件的也能玩电脑啦,哈哈
virtualwiz
virtualwiz
作者
回复charlesshi
有道理~
Augustine_1995
Augustine_1995
楼主去开演唱会吧,我买票。
huajixin
huajixin
大神 ~~~~~~~~~~~~~~~~~~~~~~~~
hnyzcj
hnyzcj
大神作品要顶起
hnyzcj
hnyzcj回复virtualwiz
在我心中你已是大神,大肾,大绳,阿哈哈
virtualwiz
virtualwiz
作者
回复hnyzcj
多谢帮顶:lol
我离真的大神还有好大差距呀
丄帝De咗臂
丄帝De咗臂
步进电机的花式玩法
Ash1
Ash1

v神上首页啦 留影
visionsl
visionsl
看完后只会说一个"牛"字了
凌风清羽
凌风清羽
哇塞,只剩下膜拜了~~~