这可能是最详细的Arduino制作4*4光立方教程(原创)
近期同事給我看了一下網上各路大神展示的用Arduino制作的8x8x8光立方,效果可謂酷炫奪目,自己也想動手制作一個,但無奈時間有限,無法動手焊接這么多的LED燈(8x8x8=512),于是花了兩個晚上做了個縮水版本的4x4x4光立方,具體過程在此記錄一下,以便給各位看官一點參考。
一、材料準備
(1)首先要準備的東西毫無疑問的就是LED小燈了,這東西老便宜了,幾塊錢一大堆,理論上只需444=64個就可以了,但為了防止制作過程中的損壞,還是買了100個。
(2)其次要準備的當然是Arduino主板,我用的是國產的UNO,也是便宜貨。通過其I/O接口輸出電信號來控制LED的明暗。
(3)由于Arduino上的接口不多,以一個接口控制一個LED的方式來控制光立方64個LED燈是不可能的。因此,還必須要使用鎖存器,把串行的信號轉化為并行,才能對正個光立方進行控制。我這里使用的是74HC595N電位信號鎖存器(也是幾毛錢一個),這里理論上只需要2顆就足夠了。(如果是8階光立方需要用10個)
(4)面包板和導線若干,這個就沒什么好說的了,驗證階段,先把線路接好和調試程序,試驗成功后條件成熟了再制作PCB板。
二、工作原理和焊接步驟
由于4x4x4的光立方也有64盞燈,因此要用64個I/O口控制64盞燈也是不可能的,因此,制作光立方采用了取巧的辦法,就是快速地切換立方中的每一行的顯示內容,利用人的肉眼的視覺殘留,錯覺光立方的四行是在同時被控制。例如下圖,用極快的速度播放圖1-4,人的肉眼就會看成是5的樣子(我在程序中設定的是15毫秒切換)。
焊接階段,把LED正極掰彎,然后如法炮制4個作為一列,把一列的LED燈的正極焊接在一起,保證每一列的LED共陽。(注意千萬別離LED負極太近,以免短接)。本人在實物中焊接得實在夠差的,因此畫了一些示意圖來表示:
如法炮制4個一模一樣的。
適當地把陰極截短,然后把每一行的陰極焊接在一起。
說白了就是在一個立面上,列方向共陽極,橫方向共陰極。然后再如法炮制上圖結構4個,再把每個橫面的16盞燈的陰極再連接在一起。如下圖所示:
剛好形成了4層共陰極的結構(如下圖),為了方便觀看,已經標注不同顏色,藍紅綠黃分別對應連接了每一層的LED的陰極,這四層可以分別引線接到Arduino的4個I/O接口:
此時,一共產生了16個LED的共陽極接口,和4個共陰極的接口,為了方便觀看,我標注了一些編號:
這其中的邏輯關系很明顯了,當D1-D16中,任意一個接口為高電平的時候,該接口所在的列只要有某一層的陰極為F1-F4為低電平時候,他們相交的點上的LED燈就會發亮。例如,D1為高電平,F3為低電平,F1、F2、F4為高電平的時候,D1所在的列從上至下的第二盞LED就會亮起來。
這樣,我們的立方結構就準備完畢了!!!以下是本人做的,因為經歷了一些意外和材料不足,十分丑陋。
三、74HC595N鎖存器的使用
74HC595N鎖存器經過查閱了一些文檔之后,發現很適合結合Arduino來進行電位的輸出。以下是74HC595的示意圖:
VCC和GND沒什么好說的,電源的輸入端和接地;MR端用于重置鎖存器電位(低電位時候重置,因此一直保持為1就可以了);OE是使能端,沒必要用,一直保持為0;Q7‘用于串接,不必理會。Q0、Q1、Q2、Q3、Q4、Q5、Q6、Q7分別是鎖存器的8個輸出接口。本實例關鍵用到的輸入控制端口為DS、ST_CP和SH_CP。
當ST_CP為低電位時,整個鎖存器處于電位推入狀態,此時,Q0-Q7還未能輸出任何想要的電位。當SH_CP從低電位轉變成高電位的時候,DS所在的電位會按照Q7、Q6、Q5、Q4、Q3、Q2、Q1、Q0的順序推入。當Q0-Q7這8個電位已經被推入了目標電位之后,把ST_CP置為高電位即可把目標電位進行輸出。
假設我們要讓Q0-Q7輸出10011100的話,整個工作的流程是:
(1)把ST_CP置為0。
(2)把SH_CP置為0,把DS置為0,把SH_CP置為1。
(3)把SH_CP置為0,把DS置為0,把SH_CP置為1。
(4)把SH_CP置為0,把DS置為1,把SH_CP置為1。
(5)把SH_CP置為0,把DS置為1,把SH_CP置為1。
(6)把SH_CP置為0,把DS置為1,把SH_CP置為1。
(7)把SH_CP置為0,把DS置為0,把SH_CP置為1。
(8)把SH_CP置為0,把DS置為0,把SH_CP置為1。
(9)把SH_CP置為0,把DS置為1,把SH_CP置為1。
(10)把ST_CP置為1。(把10011100倒過來)
由于兩個74HC595N的ST_CP和SH_CP的步調其實是一致的,因此可以只用一個Arduino的I/O來控制兩個74HC595N的ST_CP,只用一個Arduino的I/O來控制兩個74HC595N的SH_CP。(其他接口不是接VCC就是GND,不再畫了)
通過Arduino的2號I/O接口來控制兩個74HC595N的ST_CP,通過Arduino的3號I/O接口來控制兩個74HC595N的SH_CP,通過Arduino的4號I/O接口對第一塊74HC595N的電位進行輸入,通過Arduino的5號I/O接口對第二塊74HC595N的電位進行輸入。
因此,通過在Arduino IDE中使用以下程序,可以對兩個鎖存器進行數據輸入,由于兩個鎖存器都可以保存8位(一個字節的數據)因此可以通過兩個十進制數字的方式來為兩個鎖存器錄入數據:
int ST_CP = 2; //設置兩塊鎖存器用同一個ST_CP位 int SH_CP = 3; //設置兩塊鎖存器用同一個SH_CP位 int DATA1 = 4; //設置第一塊鎖存器的DS位 int DATA2 = 5; //設置第二塊鎖存器的DS位 void setup(){Serial.begin(9600);//設置串口輸出波特率pinMode(ST_CP, OUTPUT);pinMode(SH_CP, OUTPUT);pinMode(DATA1, OUTPUT);pinMode(DATA2, OUTPUT);//對以上定義的io口設置為輸出狀態 }void loop(){put_byte(240,211);//第一個鎖存器輸入11110000,第二個鎖存器輸入11010011 }void put_one(int num1, int num2) {digitalWrite(SH_CP, LOW);digitalWrite(DATA1, num1);digitalWrite(DATA2, num2);digitalWrite(SH_CP, HIGH); }//設定往兩個鎖存器分別輸入一個數位的函數,先將SH_CP設定低位,傳入數據后再將SH_CP設定低位。void put_byte(int d1, int d2) {digitalWrite(ST_CP, LOW);//把ST_CP置為低位put_one(d1 & 1, b & 1);//通過位移運算獲得兩個數字的第一位put_one(d1 >> 1 & 1, d2 >> 1 & 1);//通過位移運算獲得兩個數字的第二位put_one(d1 >> 2 & 1, d2 >> 2 & 1);//通過位移運算獲得兩個數字的第三位put_one(d1 >> 3 & 1, d2 >> 3 & 1);//通過位移運算獲得兩個數字的第四位put_one(d1 >> 4 & 1, d2 >> 4 & 1);//通過位移運算獲得兩個數字的第五位put_one(d1 >> 5 & 1, d2 >> 5 & 1);//通過位移運算獲得兩個數字的第六位put_one(d1 >> 6 & 1, d2 >> 6 & 1);//通過位移運算獲得兩個數字的第七位put_one(d1 >> 7 & 1, d2 >> 7 & 1);//通過位移運算獲得兩個數字的第八位digitalWrite(ST_CP, HIGH);//把ST_CP置為高位,把8個數位推出到Q0-Q7 }四、電位輸出
把電位鎖存器1號Q0-Q7連接已經焊接好的光立方的D1-D8位置,把電位鎖存器2號Q0-Q7連接光立方的D9-D16位置。
把Arduino中的7,8,9,10號引腳分別接入光立方的共陰層F1,F2,F3,F4。添加以下代碼進行控制:
此時,所有初始化工作已經完成,可以在Arduino的loop函數中設定動畫播放內容。
五、輸出動畫
下面就以“口”字型動畫為例,分析一下這個動畫的程序應該怎么編寫。
我們可以看到,動畫一共分為四幀,每一幀又分為四層,每一層又分為兩個鎖存器所對應的八位,因此,第一幀的第一層的第一個鎖存器的內容是1111 0000,第二幀為0000 0000。
由此可以得到,第一幀第一層的數字為1111 0000 0000 0000,第一幀第二層的數字為1001 0000 0000 0000,第一幀第三層的數字為1001 0000 0000 0000,第一幀第四層的數字為1111 0000 0000 0000。
第二幀第一層的數字為0000 1111 0000 0000,第二幀第二層的數字為0000 1001 0000 0000,第二幀第三層的數字為0000 1001 0000 0000,第二幀第四層的數字為0000 1111 0000 0000。
第三幀第一層的數字為0000 0000 1111 0000,第二幀第二層的數字為0000 0000 1001 0000,第二幀第三層的數字為0000 0000 1001 0000,第二幀第四層的數字為0000 0000 1111 0000。
第四幀第一層的數字為0000 0000 0000 1111,第二幀第二層的數字為0000 0000 0000 1001,第二幀第三層的數字為0000 0000 0000 1001,第二幀第四層的數字為0000 0000 0000 1111。
因此,第一幀鎖存器中的數字分別是第一層(240,0),第二層(144,0),第三層(144,0),第四層(240,0)。
第二幀鎖存器中的數字分別是第一層(15,0),第二層(9,0),第三層(9,0),第四層(15,0)
第三幀鎖存器中的數字分別是第一層(0,240),第二層(0,144),第三層(0,144),第四層(0,240)。
第四幀鎖存器中的數字分別是第一層(0,15),第二層(0,9),第三層(0,9),第四層(0,15)。
因此,在loop函數中應該這樣書寫動畫效果:
通過上述代碼,可以實現一個口字型的點陣從前排一直播放到后排的效果,其實從理論上來說,只要仔細分析出動畫效果中的每一幀,就都可以用這種方法,來一幀幀地輸出動畫。
雖然被重物壓得東倒西歪,但最后效果還是實現了。
總結
以上是生活随笔為你收集整理的这可能是最详细的Arduino制作4*4光立方教程(原创)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 破解软件下载网站100个
- 下一篇: 工作104:vuex很强大