变色小云灯
本帖最后由 durobot 于 2017-5-11 23:46 编辑最近,在淘宝上上看到了一个叫月球灯的玩意儿,确实很漂亮啊。我于是有点手痒。嘿嘿,我不是要加入购物车,我是要自己动手做一个。
最终,我做了一盏会变色的小云灯。这期间,我可是遇到了很多问题,代待我慢慢道来。。。
月球灯大概是这么会儿事:长的和月球一模一样、会根据因转动而变色、还有就是网上卖得很贵。下面有图。
http://img.weiot.net/portal/201702/20/111118j2h1u25l2l61klzh.jpeg
那么要做这玩意儿,①我应该先3D打印一个外壳,②再弄一个可以感知位置变化的模块,最好是能够感知三维x-y-z的那种传感器,③然后通过Arduino把上述模块的输出数据转换为④RGBLED灯的红绿蓝三种颜色比例⑤另外我隐约觉得我还要专门弄一个可充电的电源(搞不好还要个什么变压模块之类的)。
解决①对于我来说真的很不容易。首先,我没有能够好好打印一个球形的3D打印机,其次,我不会用非机械类三维软件,不能在球面上弄出月球纹理。好吧,办法总是有的。方案一:买一个小巧漂亮的玻璃杯当灯罩。方案二上网找别人的模型,打印一个简单点的灯罩。(大部分3D打印网站都要注册,有个叫( http://www.dayinhu.com) 打印虎的网站上面下载模型挺方便的)于是我在网上找到了下面这个让我一见钟情的模型。
http://www.dayinhu.com/data/pic/preview/112/112051.jpg
http://www.dayinhu.com/model/25660.html
看看它的纹理我不禁想起的《火影忍者》。再加上即将附加的变色属性,这不那片“七彩祥云”吗!好就是它了!!!
这个是我打印出来的,底板还没去除。
②有几种选择我最后选的是三轴电子罗盘经济实惠。
下载HMC5883L库文件。下载地址:http://soft2.wmzhe.com/download/AnsifaArduino/HMC5883L.zip
解压HMC5883L库文件到arduino文件夹:arduino-0022\libraries下面。
将罗盘的SDA和SCL分别和arduino的SDA和SCL对应连接,其余的VCC、GND就直接连(如果还有一个就不用管了)。
测试程序:
#include <Wire.h>
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.write(0x02); //select mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
}
void loop(){
int x,y,z; //triple axis data
Wire.beginTransmission(address);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.read()<<8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()<<8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()<<8; //Y msb
y |= Wire.read(); //Y lsb
}
Serial.print(x);
Serial.print(" ");
Serial.print(y);
Serial.print(" ");
Serial.println(z);//change the line
delay(1000);
}
你会发现串口不停的蹦出三个一组的数据,这就是电子罗盘测得的地磁数据。
③有了这xyz,接下来我们可以先将这些数据用map()(https://www.arduino.cc/en/reference/map)这个函数映射到0~255这一区间上。然后作为红绿蓝三色的比例输出到RGBLED上(https://item.taobao.com/item.htm?spm=2013.1.0.0.oaSi1D&id=531492992964)。这种灯很好玩,就是你想让谁量什么颜色谁就亮什么颜色。
具体程序如下:
#include <Adafruit_NeoPixel.h>//包含专门为这种灯设计的库,可以上github(https://github.com/adafruit/Adafruit_NeoPixel)下载
#define LED_COUNT 3//这里我们以三个灯为例,它们的编号是被默认为0、1、2,多个灯依次类推。
#define LEDPIN 7 //将7号引脚设置为控制灯的引脚
//接下来都是套路
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT ,LEDPIN ,NEO_GRB + NEO_KHZ800)
void setup(){
strip.begin();
strip.show();
}
void loop
{
strip.setPixelColor(0,200,0,0);//将0号,即第一个灯设置为红色。下面依此类推。
strip.setPixelColor(0,0,200,0);
strip.setPixelColor(0,0,0,200);
strip.show();//这一句是点亮灯的关键,和setup()里面的相同语句对应。
while(1);
}
好了,剪下三颗灯,将数字脚接到D7上,其余的VCC、GND就直接连。下载程序后大家可以看到三个灯分别亮三种颜色红绿蓝。
接下来我们将②③两步融合起来,把处理后的xyz(处理数据就交给大家了,这里我直接将取绝对值后的xyz代入函数中setPixelColor())作为RGB三个参数代入函数setPixelColor()中。就可以达到转动电子罗盘而改变RGBLED颜色的效果啦!
⑤这电源要小巧轻便才好,你说弄个纽扣电池吧老是要换,挺麻烦,不如直接到废品上拆卸一个可充电的电源下来。我有一盏已经作废的台灯,记得是当初花15块从淘宝上买回来的
我真的不打广告,一分钱一分活,这灯虽然不怎么样,但电源这一块拆下来还是够用了。(https://item.taobao.com/item.htm ... 626516002.56.RVu8gj)对于我这种对电源神秘力量一无所知的小白来说还不错。我的代码:
#include <Wire.h>
#include <Adafruit_NeoPixel.h>//red-A5 Gre-A4 yew-gnd
#define LED_COUNT 3
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
#define LED 7
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT ,LED ,NEO_GRB + NEO_KHZ800);
void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.write(0x02); //select mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
strip.begin();
strip.show();
}
void loop(){
int x,y,z; //triple axis data
Wire.beginTransmission(address);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.read()<<8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()<<8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()<<8; //Y msb
y |= Wire.read(); //Y lsb
}
strip.setPixelColor(0,abs(x),abs(y),abs(z));
strip.setPixelColor(1,abs(x),abs(y),abs(z));
strip.setPixelColor(2,abs(x),abs(y),abs(z));
strip.show();
}
最后的效果应该是这样 (感觉这个灯罩打印的时候应该放大个两三倍才好)
感谢能看完我的第一帖,我会继续努力。
不错,放大2,3倍你的打印时间就不是放大2,3倍了,哈哈哈 hnyzcj 发表于 2017-5-12 08:18
不错,放大2,3倍你的打印时间就不是放大2,3倍了,哈哈哈
还有机器能打这么大才行啊~ 好创意,赞一个 棉花效果好一点,学习了
页:
[1]