制作一個“看不到底”的鏡子

最近在朋友圈看到了一個這樣的東西,當它發光的時候會看到一個好像沒有盡頭的隧道,不發光的時候就是一個普通的鏡子。覺得很有意思就把它做了出來。

效果圖

原理

這個裝置的核心是半反半透膜(以下簡稱半反膜),目前一個很主要的應用是貼在門窗上面,可以在白天的時候防止暴曬,和外面看到屋內(當然晚上是不可以的,你可以理解為可以讓亮度比較低的一側能看到比較亮的一側,但是亮的是看不到暗的一側的)。另外一個應用是手機的鏡面膜,息屛的時候可以讓手機的屏幕變成一個鏡子,點亮的時候作為一個正常的屏幕使用(當然亮度是有很大損失的-_-)

把半反膜和一個鏡子放在一起,那么如果這兩者之間有一個東西,就會在兩者之間不停地反射,光路會是像下面的樣子。如果這個東西恰好亮度比較高,那么現象就會非常的明顯。

原理圖

于是你在外面看到就是所有透射過來的光線的疊加。之所以你看到光線越靠近中心就越暗,還沒有到中心就看不到了主要是因為沒經過一次這樣的折返光就損失一半以上(因為還有一些鏡面和半反膜上的損失),所以損失是指數級的。

制作過程

主要物料清單如下:

  1. 5050燈條(長度和大小有關)
  2. 一個盒子和一個鏡子
  3. 一個能放到盒子里面的鏡子
  4. Arduino和杜邦線
  5. 半反半透膜

結構部分

內部的結構
側面視圖

大致的過程是把鏡子放在盒子里面,在盒子的側面貼上燈帶。最后在最上面覆上半反膜就可以了,但是這里有幾點。

首先是我們常見的金屬盒子內側都是銀白色的,這會導致它的反光會很高,如果最終的成品有大面積暴露出來的話,會導致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的接頭吧。。

總之做什么東西基本上都會碰到這樣那樣的問題,不過不斷摸索的過程也是樂趣的一部分吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容