10715| 4
|
[项目] 变色小云灯 |
本帖最后由 durobot 于 2017-5-11 23:46 编辑 最近,在淘宝上上看到了一个叫月球灯的玩意儿,确实很漂亮啊。我于是有点手痒。嘿嘿,我不是要加入购物车,我是要自己动手做一个。 最终,我做了一盏会变色的小云灯。这期间,我可是遇到了很多问题,代待我慢慢道来。。。 月球灯大概是这么会儿事:长的和月球一模一样、会根据因转动而变色、还有就是网上卖得很贵。下面有图。 那么要做这玩意儿,①我应该先3D打印一个外壳,②再弄一个可以感知位置变化的模块,最好是能够感知三维x-y-z的那种传感器,③然后通过Arduino把上述模块的输出数据转换为④RGBLED灯的红绿蓝三种颜色比例⑤另外我隐约觉得我还要专门弄一个可充电的电源(搞不好还要个什么变压模块之类的)。 解决①对于我来说真的很不容易。首先,我没有能够好好打印一个球形的3D打印机,其次,我不会用非机械类三维软件,不能在球面上弄出月球纹理。好吧,办法总是有的。方案一:买一个小巧漂亮的玻璃杯当灯罩。方案二上网找别人的模型,打印一个简单点的灯罩。(大部分3D打印网站都要注册,有个叫 ( http://www.dayinhu.com ) 打印虎的网站上面下载模型挺方便的)于是我在网上找到了下面这个让我一见钟情的模型。 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(); } 最后的效果应该是这样 (感觉这个灯罩打印的时候应该放大个两三倍才好) 感谢能看完我的第一帖,我会继续努力。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed