这可能是最详细的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
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值