最近在朋友圈看到了一个这样的东西,当它发光的时候会看到一个好像没有尽头的隧道,不发光的时候就是一个普通的镜子。觉得很有意思就把它做了出来。
原理
这个装置的核心是半反半透膜(以下简称半反膜),目前一个很主要的应用是贴在门窗上面,可以在白天的时候防止暴晒,和外面看到屋内(当然晚上是不可以的,你可以理解为可以让亮度比较低的一侧能看到比较亮的一侧,但是亮的是看不到暗的一侧的)。另外一个应用是手机的镜面膜,息屛的时候可以让手机的屏幕变成一个镜子,点亮的时候作为一个正常的屏幕使用(当然亮度是有很大损失的-_-)
把半反膜和一个镜子放在一起,那么如果这两者之间有一个东西,就会在两者之间不停地反射,光路会是像下面的样子。如果这个东西恰好亮度比较高,那么现象就会非常的明显。
于是你在外面看到就是所有透射过来的光线的叠加。之所以你看到光线越靠近中心就越暗,还没有到中心就看不到了主要是因为没经过一次这样的折返光就损失一半以上(因为还有一些镜面和半反膜上的损失),所以损失是指数级的。
制作过程
主要物料清单如下:
- 5050灯条(长度和大小有关)
- 一个盒子和一个镜子
- 一个能放到盒子里面的镜子
- Arduino和杜邦线
- 半反半透膜
结构部分
大致的过程是把镜子放在盒子里面,在盒子的侧面贴上灯带。最后在最上面覆上半反膜就可以了,但是这里有几点。
首先是我们常见的金属盒子内侧都是银白色的,这会导致它的反光会很高,如果最终的成品有大面积暴露出来的话,会导致LED发出的光纤把整个盒子都照亮,效果会大打折扣。所以如果是这样的话你就要想办法把盒子涂黑,丙烯、标记笔、墨汁都可以。。。
其次是盒子和镜子的大小最好是恰好匹配的,也就是说镜子恰好能放到镜子里面,这样的话灯带围成圆就不会比镜子大很多,才可以从正面看到一整圈的的灯光。如果不行的话就和我一样,用材料把直径缩小,我用的是泡沫塑料,你也可以用任何柔软的不透光的长条状东西围成一个圈来做。
然后是镜子距离半透膜的最好近一点,最好是刚刚能把灯带放进去。因为这样最后圈和圈之间的距离会比较近一点。
最后是形状,理论上一个匹配的方形的盒子和镜子是可以做出一个方形的隧道的,但是我们通常理解的科幻里的隧道大部分都是圆形,所以我做了一个圆形的,你也可以尝试下不同的作品。
电路
电路部分其实很简单的,我用的是5050,因为亮度会比较大一些并且因为5050是RGB可编程的,所以能够实现的功能会比较多些,后面可能还能做一些交互的功能,但是带来的问题就是因为5050需要用驱动器驱动,所以可能需要一些编程的知识,所以如果你不了解这部分的话,用普通的二极管也是可以的,但是记得要选择一些功率比较大的型号。
把Arduino的6号引脚、5V和GND分别连接到灯带的Din、Vcc和GND上,然后用导线把灯带另一端的VCC和GND引出来,然后焊到一个5.5-2.1的接头上,最后买一个这种接头的5V 1A的电源接上就可以了。这个电源会同时给Arduino和灯带供电。
代码
我的代码功能是不断的产生一个随机颜色环绕灯圈,如果你喜欢也可以做自己的效果。我调用了adafruit的NEO pixel的库,如果你以前没有用过这个库的话需要先下载(地址是https://github.com/adafruit/Adafruit_NeoPixel),作用是控制5050的灯带。
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6 //引脚要连到一个可以输出PWM信号的引脚,在Arduino上数字前面标有波浪线的引脚上可以输出PWM的
Adafruit_NeoPixel strip = Adafruit_NeoPixel(38, PIN, NEO_GRB + NEO_KHZ800); //第一个参数是你使用的灯条包含灯珠的个数
//第二个参数为Din连接到Arduino的引脚
//第三个参数是灯条的型号,通常写这个就可以
void setup() {
strip.begin();
strip.show();
randomSeed(analogRead(0));
}
void loop() {
colorWipe(strip.Color(random(255), random(255), random(255)), 20);
colorWipe(strip.Color(0, 0, 0), 20);
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
要注意的几点
其实这个东西不管是制作还是编程还是电路都还挺简单的,我最初觉得半个小时可能就做完了,然而事实上并不是这样。。
首先是如果你最终只能从侧面看到一条一条的灯光,而正面却看不到一圈一圈的光,那么就说明你的LED围成的灯带太大了,或者镜子离半反膜太远了,这时候缩小灯带和下沉镜子都能实现类似的功能,但是如果这两者都不能的话,有一个神器提供给你:凸面镜。他比平面镜反射的范围会大一些,原理请参考高中(也许是初中)物理书中的相关原理。淘宝30多的7寸或者8寸的镜子一般都是双面的,一边是平面镜,另一边就是凸面镜,你可以买一个回来拆开,把凸面镜拆下来放到盒子里。如果你做的是一个其他尺寸的,可以淘宝买一个镜面PC的凸面镜,我没试过,不过应该效果是一样的。
其次如果你不想在最终的东西里面看到Arduino什么的话,最好是用东西吧镜子垫起来,这样在盒子里面就有一个空隙,可以把Arduino和一些导线藏进去。但是如果你是像我一样的话,记得在Arduino的下面做绝缘,因为盒子内部的镀膜是可以导电的,如果直接放进去的有可能会短路。
最后最后要注意的一点就是,因为这种接头一般常见的都是9-12v的,而我们用的是5V的电源。所以如果你没有搞清楚就把一个大小正好的插头插到留出来的孔上的话,是会把Arduino烧了的。。切记切记。。。我已经因为这个原因损失了4个arduino了。。。或者还是用USB的接头吧。。
总之做什么东西基本上都会碰到这样那样的问题,不过不断摸索的过程也是乐趣的一部分吧。