[项目]变色小云灯 精华

9054浏览
查看: 9054|回复: 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
  看看它的纹理我不禁想起的《火影忍者》。再加上即将附加的变色属性,这不那片“七彩祥云”吗!好就是它了!!!
   变色小云灯图3
  这个是我打印出来的,底板还没去除。
  ②有几种选择我最后选的是三轴电子罗盘经济实惠。

        下载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();

}
  最后的效果应该是这样变色小云灯图1变色小云灯图2 (感觉这个灯罩打印的时候应该放大个两三倍才好)

  感谢能看完我的第一帖,我会继续努力。
  

hnyzcj  版主

发表于 2017-5-12 08:18:41

不错,放大2,3倍你的打印时间就不是放大2,3倍了,哈哈哈
回复

使用道具 举报

dsweiliang  初级技神

发表于 2017-5-12 08:25:18

hnyzcj 发表于 2017-5-12 08:18
不错,放大2,3倍你的打印时间就不是放大2,3倍了,哈哈哈

还有机器能打这么大才行啊~
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-13 06:17:25

好创意,赞一个
回复

使用道具 举报

俺是胡胡  初级技师

发表于 2022-7-27 10:34:11

棉花效果好一点,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail