50579| 49
|
ChoirBot,桌子上的迷你机械乐队 |
步进电机,作为一种相当普遍使用的机电设备,具有相当灵活的调速性能,工作时也会产生转动的嗡嗡声。既然这种电机的声音可以被控制,那就一定有变成乐器的潜质:lol 其实不光是步进电机,各种电机都可以变成乐器。曾经在YouTube上看见歪果仁将音频信号送入电机驱动,直流电机直接像扬声器似的唱了起来。再比如,玩过四轴的朋友们一定听过无刷电调、电机上电的铃声。甚至还有人利用闭环控制,让摩托车发动机奏响了星球大战主题曲…让在场观众长跪不起….. 于是我决定做个小项目,让四枚步进电机分别担当主音、贝司、节奏、弦乐的角色,随时可以在办公桌上来一场小型音乐会----听起来就像机器人组成的唱诗班,命名为 ChoirBot -->点这里,传送到Bilibili视频专辑<-- 想看更多~请往下翻~~ 1,科普在先 它是怎么出声音的? 骑过摩托车没?设想你正在一条长长的路上骑行,突然将油门拧到底!脑补一下发动机的声音,是不是某种频率逐渐上升的音调?要是你忽大忽小地拧油门,控制得足够快、足够准确,你也可以用摩托车的发动机来演奏一曲,哈哈。这和步进电机演奏乐曲的道理是差不多的,只不过这回是Arduino在骑摩托车:lol 为什么用步进电机? 有两种方法让电机唱歌。 ---> 一种是将音频信号经过某种放大,直接送给电机。 ---> 另一种是用传感器获取电机的转动声,通过快速傅里叶变换(FFT)算出声音的频率,再通过比例、微分、积分(PID)计算,控制电机加速、减速到匹配的频率。 直流电机也是可以的,若是使用上述第一种方法,驱动电路非常简单,成本也低。但是电机不是处于正常(直流)的工作状态,电机轴不转,声音很小,而且没什么机械感。要是采用第二种方法,复杂程度就不用说了,对电机性能、单片机运算速度要求高,而且系统太复杂很容易受干扰,四个电机一起唱就是真的作死啦。 步进电机就不同了,静态时会刹车不受自身惯性影响,而且工业用的电机驱动非常成熟,只要送入一定频率的调速脉冲,就可以随便控制电机以任何步进速率运转,而且声音也富有机械感,像机器人在唱歌。 我喜欢的歌曲都可以直接播放吗? 不一定都可以。首先你要找到这首歌的MIDI格式文件(.mid)。这种文件跟我们平常听的mp3有很大不同,MIDI文件中存储的是一行行的指令,比如 第一秒,选择第8通道,启动A5这个音符,用小提琴的音色,力度127;第1秒半踩下延音踏板;第二秒关闭所有音符…… 就是一连串这些指令构成了MIDI音乐文件,一般一首歌只有十几至一百多KB,而且在不同的声卡上,播放效果有很明显的区别。 一些吉他谱的格式,比如gp5,实际上也是midi文件,可以互相转换。要是在网上找不到你喜欢的Midi文件,你又恰巧懂乐理,可以用编曲软件自己制作。 2,准备材料 有请主角出场——步进电机四枚 控制板,开关等。每个电机需要一枚Pro Mini,或者Nano也可以。我还额外用了一个Bluno,既可以用作蓝牙接收装置,也可以用作液晶屏界面的控制器。 12V开关电源,和7805三端稳压器。我用7805给5个单片机供电的时候,发现管子的温度相当高,所以又用了一个开关稳压模块,将输入电压降至9V左右,再均匀分配给独立7805和Bluno上的稳压管,减少了电源部分的发热量。 电机驱动,要选择这种带脉冲输入的。这种黑盒驱动比较贵,我用的是不带外壳的板子,带有电流、细分调节、刹车电流设置等不少功能。 螺丝、扎带(大量)等辅助材料,画板一块 74HC04 六通道反相器一片,后面我会说明用途 3,问题与构思 正式开始制作之前我进行了一些测试,发现了一些问题。我会写出解决方法供参考。 一开始我想用1片Bluno控制全部四个电机,结果无论程序代码怎么调整、优化,都表现得非常不稳定,发出异常响声或者直接卡死。这个问题至今无解,怀疑是ATMega328P的RAM不够。 于是买了5片DF的Cheapduino,8MHz的芯片,又发现无法使用tone()函数(后来搜索了一下,Arduino NG上执行tone()函数确实有问题)。 最终也是为了便于安装,使用了Pro Mini,与Uno相同是ATMega328的芯片,所有功能都正常。 调试阶段遇到的另一个问题是,当我把Romeo的RX与4片Nano并起来的时候,发现它们都不工作了,但是将Romeo与Mega的RX相连是可以正常工作的。不知原因,用示波器观察RX上的波形,BLE芯片给328P的是3.3v的电平。连接Nano后电平被直接拉到了5V。简单的解决方法是,用一片74HC04反相器(Vcc=5V)将3.3v的信号反相两次,即可变成5V电平。 4,开工 写这个固件的时候参考了Arduino官方社区的 greg-kennedy的帖子 http://forum.arduino.cc/index.php?topic=79326.0,他提出了Arduino制作简易合成器的方法。 为四片Pro Mini烧写固件。在这个项目中,4片芯片的串口RX是连在一起的,为什么能够发出不同声部的音乐呢? 秘密在此处:程序开头的地方有一个myChannel的宏定义,它定义的是芯片将会接收哪一个MIDI通道上的内容。(一般最多有16个通道) 明白了吧?比如下载第一个芯片时,设置成0x00,第二片设置成0x01............第四片设置成0x03。只有这里需要手动改一下。 先组装电机的控制板。取4片Pro Mini,焊上侧面的所有排针,用芯片座将它们固定在洞洞板上。 LZ没有正好一样大的,只好将更长的芯片座剪开。 将所有芯片的RX引脚连在一起,并与Vcc,Gnd一起引出。并将D6引脚(程序中可设置) 引出到电路板正面,作为信号输出。 将电机和驱动也连接好,固定在画板上。可以参考购买的电机驱动的说明书。 每个板子上都有安装螺丝的孔。但我觉得扎带比较方便,就没有用螺丝。 当你固定完四个电机后,如果你不需要蓝牙和液晶屏的部分,这个程序已经可以让你的乐队试着演奏一曲了。具体怎么演奏请往后看。 如果用Bluno作为蓝牙接收器,就需要一片74HC04六非门,来转换一下BLE芯片的逻辑电平。 将RX信号输入任意一个非门A,再将A的输出连接B的输入,B的输出引出,相当于将信号翻转了两次,3.3V的电平就变成5V了。 (此处明天补充一个电路图) 接着是自由发挥部分,液晶屏、开关可以随便接,DIY一个可以显示信息、调试电机的东西。这个代码LZ写得仓促,很乱,就不发上来迷惑大家了 全部完成的效果,可以上12V电试一下了。LZ用的电机驱动和稳压器可以输入9V~24V,所以接各种航模电池也没问题。 板子上指示灯特别多,晚上开启会有意外惊喜 说一下电脑端的设置,LZ用的是Linux系统,上面有一款超级强大的MIDI工作站软件,叫Rosegarden,而且是免费的。 要实现串口到MIDI转换,还需要一个非常小巧但非常实用的工具:Hairless MidiSerial.可以在这里下载
简单介绍一下配置方法。 插入DFRobot BLE Link,然后打开Rosegarden和Hairless,首次运行Hairless要设置波特率,如下图。 在Rosegarden打开的情况下,将MIDI端口和串口设置好,MIDI In要选择Rosegarden:3 ,这个是默认的输出端口。 然后就可以在Rosegarden中加载一个你喜欢的MIDI文件了,以GodFather为例。 按下Alt-K ,再按M,使所有音轨静音。这时音轨前面的蓝灯会熄灭。 找到你认为要演奏的通道,比如贝斯。先点亮蓝灯,然后按鼠标右键,通用MIDI设备,在1,2,3,4中可以任意选择,分别对应1,2,3,4号步进电机。 然后切记要在Rosegarden的左下角将通道设置从auto改成fixed。LZ调试的时候在这一步卡了两天多,才发现 然后以此类推,将其余3个通道设置好,每个通道都要将auto改成fixed。 如果电机连接正确,并可以发出上电铃声,就可以等待BLE连接好后,点击播放按钮试试了:lol 要是没反应,检查Bluno的收发指示灯有没有闪烁。也许是Hairless的端口没有选对。有时关闭Hairless桥重新打开可以解决问题。 建议勾上Debug MIDI messages来看看有没有数据送出。 5,演出开始! 在你将这个装置搬上舞台之前,也许需要仔细调试才能确保电机发出最好的声音。比如,负责贝斯的电机很有可能声音太大,并导致桌子上的东西共振,甚至跳起来。你可以拨动驱动板上的开关来取消贝斯电机的细分设置,或者减小电流。 Tocatta and Fugue GodFather 歌唱祖国 Country Roads In the Hall of the Mountain King 时间太晚了,LZ没能一天赶出所有视频和更加详细的说明,请待我明天继续补充,谢谢大家! |
本帖最后由 charlesshi 于 2016-4-20 21:55 编辑 视频: 【技术帝】only my railgun马达演奏版 视频: 技术宅! 机械硬盘演奏only my railgun 好多年前看过,日本技术宅坐的,这次终于在arduino实现了,话说,51都能做出来的,arduino肯定没问题,哈哈 arduino让电脑可以控制外界的输出,或者让外部的输入能控制电脑,算是给PC加了个可自定AD,DA吧,哈哈 以前电脑只能玩软件编程,现在可以通过arduino开发,自由与外界交互啦,哈哈,做硬件的也能玩电脑啦,哈哈 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed