继上一篇帖子4x4x4光立方:http://bbs.mydigit.cn/read.php?tid=1872486 本光立方的亮点在于不使用锁存器,只利用单片机的24个引脚和64个三极管完成8x8x8的光立方控制。结构简单易懂,好焊接,没有过多连线,美观性强,具体结构原理请看上一篇帖子。
当我有光立方这个概念的时候,我就在想它的原理。当然,平面上的led灯阵是通过行列两个方向的交叉控制,能过实现两列引脚控制所有灯,但立体的灯阵光立方不同,它不仅有平面的两个方向的控制,还要有立体的层控制,也就是说最简化的状态就是通过“行”“列”“层”三个组线控制一个灯,也就相当于xyz立体坐标系中的一个点可以由三个数表示一样,光立方中的一个灯就由xyz的一个坐标点来表示,通电的灯亮,不通电的灯不亮,只要能实现控制每一个灯单独亮起就成功了。但是跟平面灯阵不同,一个led灯有两个引脚,平面上通过两列的控制非常方便,对对应的灯通能够亮起的电,但立体的光立方不能这样做,一个led由三个部分控制,对应一个led的电平会有8种情况,但一个led只有两个引脚,最多有4种电平情况,所以我设计了通过一个三极管将一个控制端分为两列控制,从而达到一个led有8种情况,能够通过三端控制。具体原理我在上一篇文章中已经详细介绍了,这里不再复述。 上回的4x4x4的光立方只是在我焊接这个8x8x8光立方之前的准备工作,以实验验证三极管的控制方案可行。这次我给大家带来8x8x8的光立方,并在光立方中加入了重力感应器,红外接收器,串口上位机,立体贪吃蛇小游戏。这里主要讲述制作过程和经验。成品展示: 我的主要制作材料:1、蓝色方形雾状led灯 512只 30元2、STC12C5A60S2单片机 1片 6元3、SS8050贴片三极管 64粒 5元4、12*18cm数控万能洞洞板 1片 7元5、10mm铜柱 4个 1.6元6、2.54mm杜邦簧片 64个 1元7、27mhz晶振 1颗 0.3元8、红外接收器 1颗 0.3元9、ADXL345加速度模块 1块 6元 制作这个光立方的成本大约也就50多元,主要贵在了led灯上,毕竟512不是个小数目。 我的制作过程: 第一步当然是焊接led了,先从一个焊接成一排,再从一排焊成一面,最终面组合成立体的。 为了节省成本,底座我选择的是裸露的杜邦端子,能够直接插拔的同时方便焊接,在跟板子接触的地方用弯排针连接,先把对应底座的点用弯排针固定起来。 正面用另一块洞洞板固定位置,到背面焊接固定好然后焊接正面的杜邦端子至此,底座的部分已经完工了,为了方便,先焊接背面电路,再进行led的组合ss8050三极管的集电极接底座,基极和发射极并联引出两列排线。我这里基极横着穿到正面引出,发射极直接竖着引出。完工之后的样子:然后是led的焊接组装:焊接成排焊接成面,我没有专用的光立方模版,只有用排针简易搭了一个固定架,最终感觉还是挺整齐的。组装成体,至此耗时3个晚上,总共超过24小时 然后就是接线的过程,这个过程没有拍照,也没有什么技术要求,只要把对应的三组引脚共24跟线接到单片机的P0,P1,P2接口上就可以了。我充分利用了洞洞板的特性,引线在板子上穿来穿去,始终不允许出现飞线的情况,原谅我有点强迫症。 同样我也充分利用了这个单片机的接口,共36个io,除去接光立方的24个,还剩12个,其中有两个外接串口,一个红外中断,三个按键中断,4个加速度计的spi接口。还剩下两个io供以后扩展使用。其中三个按键共用了一个中断,使用二极管隔离可以做到同样的中断效果。 第二步就是最具有挑战力的程序编写了,我最开始采用软件扫描的方法,但是发现单片机在计算其他东西的时候亮度会变很低,效果并不好,后来我采用定时器扫描的方式就稳定多了。由于跟网上流行的光立方结构不同,他们的光立方同时可以有一个面的灯亮起,然后8个面进行扫描,我的是同时最多8个灯亮起,然后64列进行扫描,每个灯亮起的平均时间是他们的八分之一,亮度也应该是八分之一,但实际观测来看区别并不大,64分之一的时间所产生的亮度还是可以亮的接受。 下面是扫描显示的驱动,仅供参考- /***********************************************
- 刷新显示的工作全部放到定时器0中断函数
- 8位自动重载 定时间隔10us
- P0为层控制,每一层的的正极,强推挽高电位使亮
- P1为三极管基极,高电位使亮
- P2为三极管发射极,低电位使亮
- 由于是三维控制,同时最多可以8个灯亮,所以可以有3种扫描方式,下面只是其中一种
- ***********************************************/
- void timer0_isr(void) interrupt 1
- {
- P0=0x00;
- P2=0xff;
- if(layer_x<7)
- layer_x++;
- else
- {
- layer_x=0;
- if(layer_y<7)
- layer_y++;
- else
- layer_y=0;
- P1=1<<layer_y;
- }
- P2=~(1<<layer_x);
- P0=display[layer_x][layer_y];
- }
自己光立方的显示驱动写完了,就可以编写动画程序了,但是8x8x8的动画实在太多,一时间也设计不出好看的,所以就借鉴了网上的动画程序,同时把网上的一款设计很不错的上位机编写接口,结果非常完美,在这里我要非常感谢@Agu's Mill 古作坊 的软件和源码,感谢他的程序方便我,也方便了大家。 自己预先计划设计的加速度计也要写程序了,本想设计一个能模拟水在立方体中随重力变化的程序,恕我愚笨,没能有好的程序设计,最后只能写了个简单的重力点程序,只亮一个点,这个点随重力移动,始终保持在最下面,刚开始感觉挺好玩的,但由于供电线的阻碍,也没有很有趣。 然后是计划中的贪吃蛇,在原先4x4x4的光立方中就想加入这个游戏,但分辨率太小,不能愉快玩耍,只做了个简易动画。这次8x8x8的我想就完全可以写这个游戏,可以通过串口和红外进行输入,有前后左右上下共6个方向,所以需要6个按键,跟传统贪吃蛇多了一个维度,刚开始时很容易找不到方向,慢慢就好了,然后就是当贪吃蛇走到光立方中间的时候,蛇和食物具体的位置不能很好的判断,需要换好几个方向进行观察,一局下来眼都花了。不过结果还是蛮成功的,玩的挺有意思。(强烈简易取消图片上传的300k限制,好多大图都得压缩,动图压缩的都看不见了)全文完,上面就是本次独自制作的8x8x8光立方的过程介绍,下面是作品展示。 [ 此帖被zhangzhi297在2016-11-13 00:02重新编辑 ]