8*8*8光立方的制作

网友投稿 2019-10-06 12:35

8*8*8光立方的制作


还记得不久之前在比赛上大放光彩的旋转光立方吗,这么漂亮的东西是怎么做出来的呢,这里我们从基础的8*8*8光立方讲起:

准备材料:

1.         Led小灯512个(可多准备,替换坏灯)

2.         单片机一个(io口20个以上)

3.         电阻(220Ω)64个

4.         圆排母64个

5.         74hc573锁存器8个以上

6.         74hc595锁存器1个(单片机io口有24个以上可用573代替)

7.         Uln2803反相器1个(灌电流)

8.         线材若干(杜邦线粗细即可)

光立方的搭建:

鞋盒或硬纸板上画(2*7)*(2*7)cm的方格图每个灯间隔2cm在方格的交点处钻孔,使其可刚好放下一个led灯的大小。

掰led灯,把led的负极掰打横,正极打竖。(led灯引脚长正短负)

https://cdn.china-scratch.com/timg/191008/123524B36-0.jpg

为了光立方的规整,我采用了一层一层焊好后再把每层接起来的方式。

先把led灯头朝下插进鞋盒开的洞里,一层64个led灯,把每个灯每个灯的负极按下图方式接起来。 

https://cdn.china-scratch.com/timg/191008/12352449A-1.jpg

当做好8层灯后,再搭个简易脚手架,把每两层灯的正级焊在一起,尽量保证每层的高度是一样的(这里我用的方法是使用排针卡住,大概每两层隔9个排针的距离)。

焊接的全程灯都是倒过来的,都是灯头往下,正级引脚往上,负极打横。

焊好的效果图

https://cdn.china-scratch.com/timg/191008/1235242Z6-2.jpg

https://cdn.china-scratch.com/timg/191008/1235241018-3.jpg

电路的原理和制作:

Led的亮灭无非就是控制灯正极有高电平负极有低电平。那么单片机就只有一个,io口也就这么几十个,怎么控制这512个灯的亮灭呢?

这里我们就要先了解一下锁存器这个东西。

74HC573

在这我就先介绍一下74HC573锁存器,这是一个并行输入,并行输出的锁存器。

https://cdn.china-scratch.com/timg/191008/123524DD-4.jpg

VCC是电源正级,GND是电源负极,D0~7为输入口,接单片机8个io口;Q0~7为输出口,接8竖灯;OUTPUT ENABLE为输出使能接口,低电平时Q口才能输出,因为我们Q口是一直需要输出的,所以这里我们OUTPPUT ENABLE接GND;LATCH ENBALE是锁存使能口,也是整个锁存器的灵魂,LATCH ENABLE给高电平时,锁存器打开,当单片机发送一个电平信号从D口进入锁存器,对应得Q口也会把D口的数据发送给小灯。如:单片机给一个1(1就是高电平,0就是低电平)的信号给D0,Q0就会把1的信号发送给小灯的正极,此时小灯的正极为高电平,若小灯负极有低电平信号,小灯产生正向电压差,则小灯就会发光;重点来了,如果此时把573的锁存使能给低电平,则锁存器的D口被关闭,此时不管单片机给锁存器发送什么信号,锁存器都不会理会,Q口发送的是锁存关闭前最后给D口的信号。如:此时锁存打开给了D0一个1的信号,此时Q0发给小灯就是1的信号,若此时把锁存使能关闭,并给D0发送一个0的信号,Q0口给小灯的是什么信号呢?没错,还是1的信号,因为锁存使能被关闭,D口就不再接受单片机的信号。此时数据就被锁在锁存器里了。锁存器的这个功能,使得我们控制512个灯成为可能。

74HC595

595是一个串行输入,并行输出的锁存器

https://cdn.china-scratch.com/timg/191008/1235251H5-5.jpg

VCC接电源正极;GND接电源负极;Q0~7依旧是输出口;DS为串行数据接口,接单片机,595数据输入就像羽毛球桶一样,只有一个口,数据一个一个往里面装,每装一个往里面退一格。最后再同时从Q口并行发出去;ST_CP,接单片机,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器,接单片机;SH_CP,接单片机,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit%20数据整体后移,并接受新的bit(从DS输入)。OE为锁存使能口,高电平锁住数据,低电平打开,接受数据。接单片机。

ULN2803

这是一个反相器,并不是锁存器,没有锁存功能,主要作用是增加电流,同时电平信号会发生反相。

https://cdn.china-scratch.com/timg/191008/123525A01-6.jpg

1~8是输入端,接单片机;11~18是输出端,接每一层的负极;9为电源负极;10是电源正极。反相器需要注意的是,输出口接的是灯的负极,所以想灯亮,则需要输出低电平,而因为反相器会反相,单片机应该给对应的输入口高电平的信号。

电路设计

小东西都介绍完了,该说说怎么接线了,以下是光立方的三视图

灯架中,黑线为负极,红线为正极。

https://cdn.china-scratch.com/timg/191008/1235255226-7.jpg

由正视图可以看出,每层灯的负极都是连在一起的,由此可以看出,只有这层灯的负极是低电平(因为有反相器,单片机io口应该给高电平),这层灯才会亮起来,共8层灯,每一个接了uln2803的io口可以控制一层灯的亮灭,为什么这么接呢?因为我们这里使用到的几乎所有显示器的控制方式——扫描。利用人类视觉残留的特性,第一层灯亮几毫秒,灭了后第二层灯亮同样的时间,同理8层灯都单独亮一轮,如此循环,因为亮灭的时间间隔太短,人脑无法反应,会以为是同时亮起的。所以程序里应该在一个循环内写f1~8逐层给高电平(反相后是低电平)并延时几毫秒。以实现扫描效果。

https://cdn.china-scratch.com/timg/191008/1235254302-8.jpg

如图可看到一个595控制8个573锁存使能开关,再由每个573控制8竖灯的正极灯的高低电平。(595是因为我使用的arduino nano单片机,只有20个io口,为了省io口才用的595,如果单片机io口够多,完全可以用第9片573代替)

这个图中,需要注意的是8片573的输入是并联的。既8个573的D0连一起,接一个io口,8个D1连一起,接一个io,8个D3.。。。。。。为什么可以这样连呢?因为573的锁存功能,当573锁存使能关闭时,即使D口连一起了,可是数据无法输入锁存器中。而595的作用就是控制8个573锁存的开关。当我使用595控制第一个573打开,别的关闭,那么8个灯正极数据只会输入到第一个573的锁存器内,此时关闭第一个573,打开第二个573再把新的数据通过同样的io口传输,这样新的数据就会进入第二个573,此时再把第二个573锁存关闭,打开第三个573.。。。。。。,当然如果你想两个或多个573数据一致,则只需要通过595把这几个573的锁存使能同时打开,即可输入同样的数据至多个573. (如果你学到微机原理,你会发现这个就是地址线(595)和数据总线(573的输入端)的工作原理)

https://cdn.china-scratch.com/timg/191008/123525OA-9.jpg

这个是一个573能控制的小灯。只要给对应一竖灯正极高电平,对应一层负极给低电平,则就可以精确控制到每一颗灯的亮灭了。

程序控制流程

① 使用595控制你需要开的那片灯的573使能打开。

② 找到你想开灯的灯接573哪个输出口,在对应的输入口输入高电平数据,别的口输入低电平。

③ 使用595关闭该573锁存使能。

④ 层控制io口输出高电平(反相后变低电平),并延时几毫秒。

⑤ 结束后记得清空锁存器数据,否则数据可能会被前一次控制影响。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com