用簡單的發光二極體,做不簡單的事,8*8*8光立方詳細製作過程

光立方由若干個二極管led燈以立方體形式搭建,4*4*4、8*8*8、16*16*16甚至更多,又由單片機、鎖存器、譯碼器等電器元件驅動,形成立體動畫效果。其中8*8*8光立方最為常見。

例如:8*8*8光立方是由512個發光二極管按照立方體的方式搭建焊接起來的,有層共陰束共陽和層共陽束共陰兩種方案,每一層有8*8個發光二極管,共8層。用c語言編譯單片機程序使自定義動畫效果得以實現。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

光立方工作原理

光立方簡單講就是用單片機控制很多規則排列的LED的亮和滅。

1、單個LED的控制方式

先了解單個LED的控制方式,可以是將正極接電源,負極通過一個限流電阻連接至單片機的某個IO口。IO口輸出低電平時,LED就亮,反之,LED滅。

如果我們想驅動任意位置的led,我們只需要在該位置led所使用的列線接地,行線接上+V即可。

學過單片機的朋友們,都知道數碼管是怎麼點亮的,其中有位選和段選之分,通過掃描來實現所有數碼管能正常工作以實現顯示我們想要的數字。

點陣也一樣,儘管是8*8的點陣,如果我們讓整體能隨意顯示圖案,那也需要用掃描的方式才能夠實現,否則,無法實現對其精準的控制。

所謂掃描,就是說,我們一次只能讓一行排或者一豎排的燈亮。每次只能這麼點,8次為一個週期,從左至右依次點一次,那麼循環起來,我們看到的就是完整的圖像了。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

2、每一層LED的控制方式

若按照單個LED的控制方式,每個LED需要佔用單片機的一個IO口,控制100個LED就需要100個IO口。那麼,有沒有一種方式,可以用較少的IO口,控制較多的LED呢?答案是肯定的,這種方法,就是掃描驅動電路。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

2*2掃描驅動電路

所以一般情況下,光立方的每一層雖然有64個燈,但是我們會有64跟線分別連接到這些燈上,從而實現一次性的對64個燈進行控制,通常單片機引腳較少,一般將採用74hc573,74hc595等芯片進行拓展。

3、(基於74hc573的)8*8*8光立方LED的控制方式

數據通過並行的方式,分別打入每一個74hc573中,再控制器儲存這些數據,從而實現一層64個燈同時的點亮。下面描述一下一個固定畫面的顯示,所需要硬件執行的過程。

1)將第一層64個點的數據傳入8個74hc573中,控制uln2803層控制芯片打開第一層開關,使第一層點亮,這個時候,其他層是滅的。

2)等待時間t。

3)熄滅第一層,開始向74hc573中傳輸第二層的數據,鎖存,開啟第二層總控制開關,點亮第二層。

4)等待時間t。

。。。

熄滅第一層,將第八層的的數據傳進所有74hc573中,鎖存,開啟第八層總開關,點亮第八層。

再回到第一步,循環下去。。

這樣,便實現了一個週期畫面的顯示,由於人眼的視覺暫留的特性,只要刷新的夠快,我們看到的就是光立方整體都在亮。便實現了我們想要的效果。為了畫面的穩定,上面間隔點亮t要保持一致,否則會出現亮度不均的情況。

在實際使用上述電路的時候,最好給74hc573輸出的64個引腳分別加一個限流電阻,這樣能起到很好的二極管保護作用和整體功耗的限制以及亮度的調節。

仔細分析上述控制過程,可以發現進一步節約IO口的數量方法。

以16&TImes;16的整列為例,若限定16列中,每次只亮一列,就可以用4根IO線加一個4~16譯碼器替代。這樣,就變為16+4只有20個IO口了。而行還是保留16根,因為這樣做,可以一次控制1列中的多個LED同時亮。加快掃描進度。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

基於74hc573的8*8*8光立方電路圖

以上原理有了,可以開始動手了

(圖片很多 ,打開需要時間 請耐心等待。。。)

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

下面我們來搭建 光立方的點陣部分,

步驟:

1,先把512個LED,負級全部彎成90度

2,擺到搭建模版上,進行負極 與 負極間的焊接,一共是8列。

3,歪曲正極90度,進焊接,一共7列。

到這LED的點陣列就焊接完成了,像這樣的陣列一共要8片。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

把LED插的 模具上,將 LED的負極彎成90度,備用等待焊接,一共要512個。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

====》

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

所有的LED全部變成這樣。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

把彎好的 LED 像圖上擺在模具上。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

擺好後,準備進行焊接。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

LED的焊接,把2個LED的 負極焊接在一起。 注意焊接時候速度要快,要不然溫度會損害LED.還有就是LED的負極不要 碰到正極。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

焊接好的 LED 負極 。要焊接這樣的LED,為8列

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

LED 陣列

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

焊接完成,8列LED。下面準備焊接,LED的正極。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用一個高大約,5MM的尺子。用來墊在LED下面方便,彎曲LED正極的引腳。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

把高5MM的尺子插到LED陣列裡,用按住LED 另外一隻手彎曲LED的正極。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

注意的是 彎曲的正極,要和負極間有一定的距離。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

將全部的正極彎曲成 90度,至於負極的上層。 注意!只要彎曲7列就可以了最後一列不用彎曲。(最後用來連接層用的)

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

焊接LED,正極與正極。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

製作好8片,LED陣列。

最後的組裝搭建。

1 測試焊接好的8點陣。

2把點陣插到底板上。

3連接層。

4用導電連接層與底板。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

我這裡把 1步和2步 測試和 插上底板一起完成,

直接把,焊接好的LED點陣,插到底板上,然後上電測試。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

紅色 的向下的箭頭 為 LED的豎 也就是LED的陰極 ,全部插在板上。

圖上示例插了1片, 搭建把剩下的 8片全部插好。 就變成下面圖的樣子。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

剩下的 就全部都是LED陽極了。看下圖

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

綠色的線 表示把層的陽極全部焊接 起來。 (就是 剛剛插好的8片剩下的陽極)

全部焊接後會剩下最左邊的一排 多餘腳剪了就可以了。

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

層全部焊接好後,要進行層 共陽的連接。

底板與層陽極之間的連接。黑色的是我們連接時用的導線,紅色是我們畫的 給大家示意用的 。

層的連接是有順序的 從電源口這邊為最高層,依次向下, 用導線 把底板 和層連接起來。 每個層對應一個 銅柱。

下午是我們連接好層線,和把最後一排多餘剪掉圖:

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

這樣就完成了 整個光立方的搭建了 。

物理層面處理完畢,我們就得開始寫代碼了:

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar display[8][8];

/*rank:A,1,2,3,4,I,心,U*/

uchar code table_cha[8][8]={0x51,0x51,0x51,0x4a,0x4a,0x4a,0x44,0x44,0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0x66,0x30,0x18,0xc,0x6,0xf6,0x3c,0x66,0x60,0x38,0x60,0x60,0x66,0x3c,0x30,0x38,0x3c,0x3e,0x36,0x7e,0x30,0x30,0x3c,0x3c,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x18,0x66,0x66,0x66,0x66,0x66,0x66,0x7e,0x3c};

/*the "ideasoft"*/

uchar code table_id[40]={0x81,0xff,0x81,0x00,0xff,0x81,0x81,0x7e,0x00,0xff,0x89,0x89,0x00,0xf8,0x27,0x27,0xf8,0x00,0x8f,0x89,0x89,0xf9,0x00,0xff,0x81,0x81,0xff,0x00,0xff,0x09,0x09,0x09,0x01,0x0,0x01,0x01,0xff,0x01,0x01,0x00};

/*railway*/

uchar code dat[128]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x93,0x73,0x6f,0x8f,0x93,0x73,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway 2*/

uchar code dat2[28]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway 3*/

uchar code dat3[24]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x65,0x64,0x63,0x62,0x61,0x60,0x50,0x40,0x30,0x20,0x10};

/*3p char*/

uchar code table_3p[3][8]={0xff,0x89,0xf5,0x93,0x93,0xf5,0x89,0xff,0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e,0x18,0x3c,0x7e,0xff,0x18,0x18,0x18,0x18};

/*initializtion

That is to initialize the program .

It is write to set the timer in c52 mcu.

So the program can renovate the led_3d_cube in fixed time use the interrupt function.*/

void sinter()

{

IE=0x82;

TCON=0x01;

TH0=0xc0;

TL0=0;

TR0=1;

}

void delay5us(void) //誤差 -0.026765046296us STC 1T 22.1184Mhz

{

unsigned char a,b;

for(b=7;b>0;b--)

for(a=2;a>0;a--);

}

void delay(uint i)

{

while (i--){

delay5us();}//12t的mcu 註釋這個延時即可

}

/*To judge the num bit*/

uchar judgebit(uchar num,uchar b)

{

}

/*To figure out the round number*/

uchar abs(uchar a)

{

}

/*To figure out the absolute value*/

uchar abss(char a)

{

}

/*The function can comparat the character.

And remove the big one to the back.*/

void max(uchar *a,uchar *b)

{

}

/*The function is to figure out the max number and return it.*/

uchar maxt(uchar a,uchar b,uchar c)

{

}

void clear(char le)

{

}

void trailler(uint speed)

{

}

void point(uchar x,uchar y,uchar z,uchar le)

{

}

void type(uchar cha,uchar y)

{

}

/*The first variable is the distance from the midpoint.

The second is the layer.

the third is the flash speed of the time between each two point.

The forth is the enable io,it controls weather draw or claen.*/

void cirp(char cpp,uchar dir,uchar le)

{

}

void line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le)

{

}

void box(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)

{

}

void box_apeak_xy(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)

{

}

void poke(uchar n,uchar x,uchar y)

{

}

void boxtola(char i,uchar n)

{

}

void rolldisplay(uint speed)

{

}

void roll_apeak_yz(uchar n,uint speed)

{

}

void roll_apeak_xy(uchar n,uint speed)

{

}

void roll_3_xy(uchar n,uint speed)

{

}

void trans(uchar z,uint speed)

{

}

void tranoutchar(uchar c,uint speed)

{

}

void transss()

{

}

/*From now on,the function below is to display the flash.*/

void flash_1()

{

}

void main()

{

sinter();

while(1){

// clear(0);

/*play list*/

//flash_1();

clear(0);

flash_2();

flash_3();

flash_4();

flash_4();

flash_5();

flash_5();

flash_6();

flash_7();

flash_8();

flash_9();

flash_10();

clear (0);

flash_11();

flash_9();

flash_5();

flash_7();

flash_5();

flash_6();

flash_8();

flash_9();

flash_10();

}

}

//P0; //573 in

//P1; //uln2803

//P2; //573 LE

void print() interrupt 1

{

uchar i;

static uchar layer=0;

P1=0;

for (i=0;i<8;i++)

{

P2=1<

delay(3);

P0=display[layer][i];

delay(3);

}

P1=1<

if (layer<7)

layer++;

else

layer=0;

TH0=0xc0;

TL0=0;

}

一般不是很喜歡貼代碼,這部分太佔地方,我把代碼簡化了,能看個大概的意思吧,具體有需要的朋友,咱們單獨再發。

有了代碼,後面就可以開始各種測試了

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

當然,對於學技術的我們,更要注重DIY的作品本身的知識。(溫馨提示:焊接的過程中要注意烙鐵的溫度以及焊接時間,LED很容易壞,要不斷的測試,別等全都焊好了卻發現裡面有壞的LED,修起來很費事的)

節選一段高難度的動畫作為收尾

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

用簡單的發光二極管,做不簡單的事,8*8*8光立方詳細製作過程

(注:素材來自網絡,希望整理後對朋友有所幫助。)


分享到:


相關文章: