这是一个电动的桌上迪斯科音乐球,既适合周末的聚会,即兴的舞蹈,也适合周二时分的下午茶。它包括华丽的外观,响亮的音乐,技术宅喜欢的Arduino,还有覆盖在泡沫塑料外层的闪亮镜面。聚会时总需要什么东西用来燃起气氛,这样一个迪斯科光球就再好不过了。在哈特福德时男孩们会每周聚会,但是我现在住在枯燥的印第安纳州,这里除了教堂联谊之外没有其它的聚会活动。为了带回聚会的好时光,我打算从自制设备开始。
一、 工具和材料

1、 Arduino IDE。
2、 烙铁。
3、 电磨。
4、 热熔胶枪。
5、 手套/口罩和眼部护具。
6、 6英寸发泡塑料球。
7、 8英寸x4英寸x2英寸聚苯乙烯泡沫塑料块(不在照片上)。
8、 许多1英寸见方的镜子。
9、 一些0.25英寸的小镜面。
10、Krylong 闪亮漆,找个大瓶装的。
11、粘合剂/胶水/环氧胶之类,最后发现热熔胶我用起来最顺手。
12、 魔术贴。
13、 Arduino Uno。
14、 Adafruit Wave Shield 。
15、 连续旋转伺服电机。
二、装饰球体



支架上的球体。准备好的纸袋,手套和衣架做的球体支架。开始喷闪亮漆。表面没有空白部分了。翻过来喷涂下边。我想要一个有光泽的反光基体,这样在没有镜子的部位也会有涂的反光效果。整个球几乎都用闪亮漆喷过。可以用铁丝做一个悬空的支架把球体支在空中,这样就可以均匀的给球体的各个表面全部喷上漆。
三、 粘贴镜片
看起来多闪亮!
继续,快完了
用碎镜片填入大小合适的空隙
从中心线开始然后缓慢向四周铺开。滴上一点胶然后贴上镜片。不要担心间隙太大,毕竟我们在往圆球上贴方片,有些空隙在所难免。这就是之前要在球体表面喷上一层光亮漆的原因。在贴完顶部之后我不得不中断工作去睡觉。用的胶好像永远不会干,于是第二天改用了热胶。
四、完成球体
在顶端用一个螺丝刀帮助将球体定位到伺服电机的输出轮上
标记输出轮所占的位置
用拇指压缩发泡材料使输出轮可以嵌入其中,后来我加深了这个槽使输出轮凹进0.5cm
现在镜子们就位了,需要用个好点的方法连接到伺服电机上。魔术贴会是种很好的材料,用它连接不会损坏伺服电机,并且可以很方便的拆除球体。
五、制作基座
记下挖槽的深度。后来我改主意了,将电机挪动了一点
切割之后将零件嵌入看看效果
电机槽需要加深
绝缘用电工胶带,因为这里喷了闪亮漆
有点像泡沫制ipod
开始粘贴镜片
看这反光
最后需要布置扬声器,镜片有助于固定扬声器,因为部分镜片是压在扬声器外圈上的
Arduino 的电源线孔和扬声器的引线孔
背面也贴好镜片
通过在标记好的地方下刀可以切割出自己需要形状的塑料泡沫块。像所有的切割工作一样,多测量多复核,然后再动刀。我用一把电磨磨去多余的泡沫块,可以用泡沫塑料切割机,也可以用一个打火机,还可以直接用手撕开它。无论用哪种方法,伺服电机都要牢牢固定在基座上,好让所有的扭矩和功率传递* 到球上。另外电磨磨下的泡沫塑料渣是很好的假雪,可以带来一些乐趣。但是为了你的肺着想,记得带上适当的护具。在基座周边粘上镜子,注意不要被有腐蚀性的胶水烧伤,或者被玻璃割到自己的手。
六、 引线
伺服电机是唯一需要连接导线的部件。连接5V 电源和地线,并将信号线(白线)连接到9号引脚上。我事先给LED,激光灯,按钮之类留了空间,你可以按自己的需求添加它们。安转另一个伺服电机让激光器也旋转方向,这是我希望的效果,同样你可以自行设计并实现。我没有用Arduino 自带的伺服电机控制库因为它太繁琐了。
七、升级程序
程序:
#include
#include
#include "util.h"
#include "wave.h"
AF_Wave card;
File f;
Wavefile wave; // only one!
uint16_t samplerate;
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Wave test!");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(9, OUTPUT);
if (!card.init_card()) {
putstring_nl("Card init. failed!"); return;
}
if (!card.open_partition()) {
putstring_nl("No partition!"); return;
}
if (!card.open_filesys()) {
putstring_nl("Couldn"t open filesys"); return;
}
if (!card.open_rootdir()) {
putstring_nl("Couldn"t open dir"); return;
}
putstring_nl("Files found:");
ls();
}
void ls() {
char name[13];
int ret;
card.reset_dir();
putstring_nl("Files found:");
while (1) {
ret = card.get_next_name_in_dir(name);
if (!ret) {
card.reset_dir();
return;
}
Serial.println(name);
}
}
uint8_t tracknum = 0;
void loop() {
uint8_t i, r;
char c, name[15];
card.reset_dir();
// scroll through the files in the directory
for (i=0; i
r = card.get_next_name_in_dir(name);
if (!r) {
// ran out of tracks! start over
tracknum = 0;
return;
}
}
putstring(" Playing "); Serial.print(name);
// reset the directory so we can find the file
card.reset_dir();
playcomplete(name);
tracknum++;
}
void playcomplete(char *name) {
uint16_t potval;
uint32_t newsamplerate;
playfile(name);
samplerate = wave.dwSamplesPerSec;
while (wave.isplaying) {
digitalWrite(9, HIGH);
delay(1);
digitalWrite(9, LOW);
delay(1);
// you can do stuff here!
delay(50);
}
card.close_file(f);
}
void playfile(char *name) {
f = card.open_file(name);
if (!f) {
putstring_nl(" Couldn"t open file"); return;
}
if (!wave.create(f)) {
putstring_nl(" Not a valid WAV"); return;
}
// ok time to play!
wave.play();
}
8 大功告成
现在按下开关,开始一场自己的宴会吧!