8阶光立方的制作
手把手教你光立方取模软件的使用(以字符R为例)

手把手教你光立方取模软件的使用
(以字符R为例)
1、3D8光立方取模软件的视图分为:正视图,侧视图和俯视图,取模时只需要在你想要的视图上操作即可,不必管其他视图的变化
代表光立方的三视图分别是:正视图,侧视图和俯视图
2、用鼠标点击8*8的小方格,白色代表点亮,灰色代表熄灭,数据会显示在下面的hex显示区内
3、将R顺时针旋转180度,将旋转后的图形以白点的形式绘制在正视图的第一个8*8方框内(旋转是为了使图形数据与程序一致)
在正视图中点亮一个“R”的字符
4、找到hex文本框里第八行的第三到六的数据,这四个数据即为有效数据。
(图形不同获得的数据大小不同,总之除零以外的数据都是有效的)
”R”的数据显示在hex数据区内
5、用keil打开程序,找到名为ZIMO.H的文件。
在ZIMO.H里定义了一个名为table_id的数组,用hex文本框里的四个数据替换其中一组,点击保存并编译。
6、打开stc下载软件,如stc-isp-15xx-v6.61。
单片机型号选择stc12c5a60s2,点击“打开程序文件”到你程序文件夹得hex文件里添加后缀为.hex的文件。
7、将下载线一端插在电脑上一端用杜邦线插在spi下载口上(注意:上有标号不要差错)打开电源,点击下载软件的“下载”然后再重启一次电源,当提示操作成功时程序就下载完成了,。
光立方毕业设计

基于STC12C5A60S2的光立方设计【摘要】本次设计使用512个LED灯制作8*8*8的LED立方体,命名为光立方。
采用STC12C5A60S2芯片作为主控,8个74HC573锁存器和一个ULN2803芯片扩展I/O口,作为外围控制。
通过编程控制I/O口,点亮指定的LED灯,使得显示不同的画面。
8*8*8光立方因点亮LED灯将会形成各种图形,如爱心、数字、雨滴、正方体等十几种画面。
整个立体呈现不同的造型和图案,动画衔接完美,使其变得美轮美奂、绚丽多彩,立体感十足。
此外,我们还可以外接音频输入,通过AD采样,快速傅里叶变换FFT,可以让光立方显示音频频谱。
经过系统测试,最终达到设计要求。
【关键词】光立方 STC12C5A60S2 74HC573 ULN2803Based on STC12C5A60S2 of the Light Cube Design【Abstract】:The 8*8*8 LED cube is made of 512 LED lights,named Light Cubewhich used STC12C5A60S2 as main control chip,it has 8 74HC573 latches extended I/O ports,and a ULN2803 chip as out control. Through programming control I/O port, the LED light. 8 * 8 * 8 cubic light for light leds will form a variety of graphics, such as love heart,numbers,rain,cube and so on. animation, cohesion is perfect, stereo sense is dye-in-the-wood. In addition, we also can external audio input, through the AD sampling, fast Fourier transform FFT, can let light cube display audio spectrum. After the system test, finally to meet the design requirements.【Keywords】:The Light Cube STC12C5A60S2 74HC573 ULN2803目录【摘要】 (1)【Abstract】 (1)目录 (2)第一章引言 (1)1.1光立方的研究意义 (1)1.2发展历程和现状 (1)1.3 光立方的功能和特点 (1)1.4 光立体的优越性以及主要应用 (2)第二章控制模块设计 (3)2.1 系统总框图 (3)2.2 总体方案的选择 (3)2.2.1主控芯片 (3)2.2 总体方案的选择 (3)2.2.1主控芯片 (3)2.2.2 电源选择 (4)2.2.3 元件选择 (4)第三章光立方显示部分概述 (7)3.1 光立方的制作 (7)3.1.1 光立方的原理 (7)3.1.2 LED灯的选用 (7)3.1.3 LED灯的焊接 (9)3.2显示部分检测 (10)第四章硬件设计 (13)4.1最小系统 (13)4.2 按键模块 (13)4.3功放模块 (14)4.3.1 功放原理图 (14)4.4呼吸指示灯 (15)4.5 竖排控制电路 (15)4.6 光立方层控制电路 (16)4.7 硬件电路焊接 (17)4.8 元件清单 .......................................................................................................... 错误!未定义书签。
888光立方制作教程

虽说光立方教程早已烂大街了,但是做出来成就感还是不错的,不发帖就
太亏了,个人建议是能别做就别做,应为这玩意没多大难度,考验的就是耐
心了。废话不说了,下面请看教程。
/*************************************分割线
**********************************/
材料:
5mm雾装led 512个(个人建议用蓝色,效果好一些)共47元;
洞洞板15x18cm 2块(买大一点的好些)共6元;
stc单片机12a5c60s2一片(此款内存较大)共5元;
焊锡自备;
下载器自备;
排针多买几片备用自备;
排插多买几片备用自备;
uln2803达林顿管一个共0.5元;
74hc573 8个共6元;
然后就烂了,我也就呵呵呵了。。如果大家有什幺不明白的,就回复向我
提问吧!乐意解答!!!注意了,大家一定要把烙铁接地,不要问我为什幺
(这样可以防静电),我犹豫没有接地,然后,就成了上面这个样子了,这是
痛苦。有点悲哀。完了。。
导线方式
然后就是链接起来通电测试。。。。。。。。
然而现实并不是这样美好,没错,led被静电击穿了不少,太难修理了,
所以我放弃了!!!!!
能算上半成功,晶振大家用24mhz的吧,程序跑起来能快些。程序是能
跑的!
本来打算上视频的,然而,,,,,,,,,大风崔掉了他的锐气,没错,他被大
风崔到了地上!!!!!
奈。
附上点阵电路,网上抄的,随便看一下,你高兴就行。
把板子喷了,好看一些。(瞬间高大上了,有没有!!)
按照点阵方式焊吧,一共要64片,焊到吐。(注意焊的时间)
八面八轴三阶魔方还原

八面八轴三阶魔方还原简介:八轴八面体魔方,每个面三个中心块三个棱块三个角块,看起来像金字塔.每个面只能转动120度的倍数,R3即转了一圈。
块分类:角块、棱块、中心块面定义:U、D就不说了, F:与D临边及与U顶角,正对自己。
R:F面右手,与D顶角与U临边。
L:F面左手,与D顶角与U临边。
B:F面正对面,与D顶角与U临边。
RB:R面与B面中间,与D临边及与U顶角。
LB:L面与B面中间,与D临边及与U顶角。
约定:R为R面顺时针转120度,R’为R面顺时针转240度活逆时针转120度,其它类推。
还原方法:第一步:复原底棱块(就是任意一个面的棱块)下图中黄色高亮标出的第二步:复原中层棱块顶棱与R、L面中层棱块交换公式:右手公式(R U R’U’)(R U R’)可以交换下图中黄色高亮标出的两块: 左手公式(L’U’LU)(L’UL)可以交换下图中黄色高亮标出的两块:如果F面的中层两块颠倒了,可以用上面右手公式换走一个棱,再用左手公式,就是费时.还可以用下面公式:F面两中棱互换公式:(ML’U’ML)(MRFMR’F’)或(MR’U MR)(MLF’ML’F)中层棱块复原完,顶层棱块也会复原,不然又是装错了。
第三步:复原中心块四中心块交换为:RB、LB面底层靠近F面两中心块互换及F面中层中心块与UB层中心块互换。
四中心块交换右手公式:(RU’L’U)(R’U’LU)做完之后下图两黄色块会交换,同时两蓝色会交换.四中心块交换左手公式:(L’URU’)(LUR’U’)做完之后下图两黄色块会交换,同时两蓝色会交换. 个人经验:做这步的时候会出现要调整的四个色块循环的情况,可以变换魔方的拿法,先完成一个面,再完成另一个面,把完成的两个面分别当成LB和RB,把F面旋转一下,同U 面的要换下来的中心块做一个同色交换(相当于没有交换F面和U面的不对的色块,只是做了一遍右手公式或左手公式,把LB和RB的色块做了一个交换),再把F面旋转回去,再做一次交换F面和U面的不对的色块,F,U,LB,RB四面中心块会同时还原.按上面公式还原另外四块的时候,只要公式不少步骤,也不会破坏已经完成的四块的中心块.做的过程中会不断变换色面当F面,思路一定要灵活.第四步:复原角块角块三循环(RUFL平移,另两个翻转加移位)下图中黄色标记的色块平移,蓝色标记的色块翻转加移位.右手公式:((RU’L’U)(R’U’LU))2U面三块做顺时针移位. 左手公式:((L’URU’)(LUR’U’))2 U面三块做逆时针移位. 做的过程中会不断变换色面当U面和F面,思路一定要灵活,一步一步完成.. 个人一点体会,不足之处,还请高手斧正,希望能对魔方爱好的朋友有一点用处.,文中所用公式为网上搜寻,有错误之处,还望包涵.。
3D光立方的设计与制作

3D光立方的设计与制作【摘要】本文主要介绍了3D光立方的设计思路和制作流程,3D光立方采用了8X8X8共计512个LED组成的阵列,本次设计制作一个三维的发光二极管立方显示体,能够通过编写程序来实现对每一个LED亮和灭的控制,从而可以显示多种多样的图案,具有很高的观赏性,通过制作3D光立方,能提高动手设计能力和对电路的分析能力。
【关键词】3D光立方;电路制作;LED1.背景与意义随着人们生活水平的不断提高,3D效果的欣赏已经成了人们的追求,美轮美奂的观赏让人醉心不已,给人带来无比宽松舒适的美感。
3D技术已进应用于教学,医学,地下采矿,空中导航等领域。
但就目前的发展,3D还不能够普及到人们的生活中,这也就萌发了人们对于3D的设计。
本次设计制作一个三维的发光二极管立方显示体,能够通过编写程序来实现对每一个LED亮和灭的控制,从而可以显示多种多样的图案。
因此,对发光二极管进行控制,使其显示出不同的花样,带给未来3D技术的科技体验。
2.系统电路设计本电路设计大体上可以分电源、处理系统、输出显示、输入控制四部分组成。
其结构框图如图1所示。
图1 3D光立方电路设计框图电源供电部分采用一块集成稳压器CW7805,把市电经变压器降压输入电路,而后整流送到稳压器稳压输出作为工作电压。
不仅功率上可以满足系统需要,不需要更换电源,并且比较轻便,使用更加安全可靠。
输入控制部分采用按键开关,主要用于切换不同的显示模式。
单片机控制电路是该系统的核心部分,主要控制着LED灯的显示间隔、方式、变换等。
输出控制采用74HC573芯片作为控制光立方的I\O口扩展芯片,以拓展单片机的输出口,采用动态显示模式,按照图文运动的特点又可以分为闪烁、平移、旋转、缩放等多种显示模式。
可以通过一定的算法从原来的显示数据直接生成,再结合输出控制电路,这样程序书写就不会过于繁琐和重复,而且对核心控制器的内存空间要求不高。
LED显示阵列是由8X8X8共计512个LED组成光立方显示屏。
幻方制作方法

幻方制作方法一、什么是阶数?横竖各3格就是3阶,各4格就是4阶,依此类推。
二、奇数阶幻方的构造方法:把1放在中间,右上行走,上边出头往下落,右边出头往左走,占位或者对角出头往下落三、4×n阶幻方的构造(一)4×1阶幻方的构造方法一第一步:依次填数第二步:对角交换1 2 3 45 6 7 89 10 11 1213 14 15 16(二) 四阶幻方的构造方法二第一步:依次填数 第二步:不是对角的交换1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16总结:基本的四阶幻方的构造,是先依次填数,然后要么是对角的数据都交换,要么是对角的数据都不交换。
(三)4×n 阶幻方的构造我们已经知道了4×1阶幻方的构造方法:然后要么是对角的数据都交换,要么是对角的数据都不交换。
那么4×n 阶幻方的构造方法,完全与4阶幻方的构造一样,也是:要么是对角的数据都交换,要么是对角的数据都不交换。
但是,在构造4×2阶幻方时候,要把每2×2格作为一格,在构造4×3阶幻方时候,要把每3×3格作为一格,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5758 59 60 61 62 63 641 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 575859606162636416 2 3 13 34 5 11 10 8 34 9 7 6 12 34 4 14 15 1 34 34 34 34 341 15 14 4 34 12 6 7 9 34 8 10 11 5 34 13 3 2 16 34 34 34 34 3464 63 3 4 5 6 58 57 56 55 11 12 13 14 50 49 17 18 46 45 44 43 23 24 25 26 38 37 36 35 31 32 33 34 30 29 28 27 39 40 41 42 22 21 20 19 47 48 16 15 51 52 53 54 10 9 8 7 59 60 61 62 2 11 2 62 61 60 59 7 89 10 54 53 52 51 15 1648 47 19 20 21 22 42 4140 39 27 28 29 30 34 3332 31 35 36 37 38 26 2524 23 43 44 45 46 18 1749 50 14 13 12 11 55 5657 58 6 5 4 3 63 641 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18 19 20 21 22 23 2425 26 27 28 29 30 31 32 33 34 35 3637 38 39 40 41 42 43 44 45 46 47 4849 50 51 52 53 54 55 56 57 58 59 6061 62 63 64 65 66 67 68 69 70 71 7273 74 75 76 77 78 79 80 81 82 83 8485 86 87 88 89 90 91 92 93 94 95 9697 98 99 100 101 102 103 104 105 106 107 108109 110 111 112 113 114 115 116 117 118 119 120121 122 123 124 125 126 127 128 129 130 131 132133 134 135 136 137 138 139 140 141 142 143 1441 2 3 141 140 139 138 137 136 10 11 1213 14 15 129 128 127 126 125 124 22 23 2425 26 27 117 116 115 114 113 112 34 35 36108 107 106 40 41 42 43 44 45 99 98 9796 95 94 52 53 54 55 56 57 87 86 8584 83 82 64 65 66 67 68 69 75 74 7372 71 70 76 77 78 79 80 81 63 62 6160 59 58 88 89 90 91 92 93 51 50 4948 47 46 100 101 102 103 104 105 39 38 37109 110 111 33 32 31 30 29 28 118 119 120121 122 123 21 20 19 18 17 16 130 131 132133 134 135 9 8 7 6 5 4 142 143 144(三)如何在纸上快速填写4n阶幻方,参看上图1、我们假设对角不变。
3D8 光立方程序
#include <REG52.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar 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,0x 18,0x3c,0x3c,0x66,0x66,0x30,0x18,0xc,0x6,0xf6,0x3c,0x66,0x60,0x38,0x60,0x60,0x66,0x3c,0x3 0,0x38,0x3c,0x3e,0x36,0x7e,0x30,0x30,0x3c,0x3c,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0xff,0x ff,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,0x 27,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,0 xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc 9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0 xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x93,0x73,0x6f,0x8f,0x93,0x73,0x4a,0x6a,0 x8a,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,0xa 0,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,0 xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};/*railway 3*/uchar codedat3[24]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x65,0x64,0x 63,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,0 x0e,0x18,0x3c,0x7e,0xff,0x18,0x18,0x18,0x18};/*initializtionThat 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){char n;num=num&(1<<b);if (num)n=1;elsen=0;return n;}/*To figure out the round number*/uchar abs(uchar a){uchar b;b=a/10;a=a-b*10;if (a>=5)b++;return b;/*To figure out the absolute value*/uchar abss(char a){if (a<0)a=-a;return a;}/*The function can comparat the character.And remove the big one to the back.*/void max(uchar *a,uchar *b){uchar t;if ((*a)>(*b)){t=(*a);(*a)=(*b);(*b)=t;}}/*The function is to figure out the max number and return it.*/ uchar maxt(uchar a,uchar b,uchar c)if (a<b)a=b;if (a<c)a=c;return a;}void clear(char le){uchar i,j;for (j=0;j<8;j++){for (i=0;i<8;i++)display[j][i]=le;}}void trailler(uint speed){char i,j;for (i=6;i>=-3;i--){if (i>=0){for (j=0;j<8;j++)display[j][i]=display[j][i+1];}if (i<4){for (j=0;j<8;j++)display[j][i+4]=0;}delay(speed);}}void point(uchar x,uchar y,uchar z,uchar le){uchar ch1,ch0;ch1=1<<x;ch0=~ch1;if (le)display[z][y]=display[z][y]|ch1;elsedisplay[z][y]=display[z][y]&ch0;}void type(uchar cha,uchar y){uchar xx;for (xx=0;xx<8;xx++){display[xx][y]=table_cha[cha][xx];}}/*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){uchar a,b,c,cp;if ((cpp<128)&(cpp>=0)){if (dir)cp=127-cpp;elsecp=cpp;a=(dat[cp]>>5)&0x07;b=(dat[cp]>>2)&0x07;c=dat[cp]&0x03;if (cpp>63)c=7-c;point (a,b,c,le);}}void line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le) {char t,a,b,c,a1,b1,c1,i;a1=x2-x1;b1=y2-y1;c1=z2-z1;t=maxt(abss(a1),abss(b1),abss(c1));a=x1*10;b=y1*10;c=z1*10;a1=a1*10/t;b1=b1*10/t;c1=c1*10/t;for (i=0;i<t;i++){point(abs(a),abs(b),abs(c),le);a+=a1;b+=b1;c+=c1;}point(x2,y2,z2,le);}void box(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le) {uchar i,j,t=0;max(&x1,&x2);max(&y1,&y2);max(&z1,&z2);for (i=x1;i<=x2;i++)t|=1<<i;if (!le)t=~t;if (fill){if (le){for (i=z1;i<=z2;i++){for (j=y1;j<=y2;j++)display[j][i]|=t;}}else{for (i=z1;i<=z2;i++){for (j=y1;j<=y2;j++)display[j][i]&=t;}}}else{if (le){display[y1][z1]|=t;display[y2][z1]|=t;display[y1][z2]|=t;display[y2][z2]|=t;}else{display[y1][z1]&=t;display[y2][z1]&=t;display[y1][z2]&=t;display[y2][z2]&=t;}t=(0x01<<x1)|(0x01<<x2);if (!le)t=~t;if (le){for (j=z1;j<=z2;j+=(z2-z1)){for (i=y1;i<=y2;i++)display[i][j]|=t;}for (j=y1;j<=y2;j+=(y2-y1)){for (i=z1;i<=z2;i++)display[j][i]|=t;}}else{for (j=z1;j<=z2;j+=(z2-z1)){for (i=y1;i<=y2;i++){display[i][j]&=t;}}for (j=y1;j<=y2;j+=(y2-y1)){for (i=z1;i<=z2;i++){display[j][i]&=t;}}}}}void box_apeak_xy(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le){uchar i;max(&z1,&z2);if (fill){for (i=z1;i<=z2;i++){line (x1,y1,i,x2,y2,i,le);}}else{line (x1,y1,z1,x2,y2,z1,le);line (x1,y1,z2,x2,y2,z2,le);line (x2,y2,z1,x2,y2,z2,le);line (x1,y1,z1,x1,y1,z2,le);}}void poke(uchar n,uchar x,uchar y){uchar i;for (i=0;i<8;i++){point(x,y,i,judgebit(n,i));}}void boxtola(char i,uchar n){if ((i>=0)&(i<8)){poke(n,0,7-i);}if ((i>=8)&(i<16)){poke(n,i-8,0);}if ((i>=16)&(i<24)){poke(n,7,i-16);}}void rolldisplay(uint speed){uchar j;char i,a;for (i=23;i>-40;i--){for (j=0;j<40;j++){a=i+j;if ((a>=0)&(a<24))boxtola(a,table_id[j]);}delay(speed);}}void roll_apeak_yz(uchar n,uint speed){uchar i;switch(n){case 1:for (i=0;i<7;i++){display[i][7]=0;display[7][6-i]=255;delay(speed);};break;case 2:for (i=0;i<7;i++){display[7][7-i]=0;display[6-i][0]=255;delay(speed);};break;case 3:for (i=0;i<7;i++){display[7-i][0]=0;display[0][i+1]=255;delay(speed);};break;case 0:for (i=0;i<7;i++)display[0][i]=0;display[i+1][7]=255;delay(speed);};}}void roll_apeak_xy(uchar n,uint speed){uchar i;switch(n){case 1:for (i=0;i<7;i++){line(0,i,0,0,i,7,0);line(i+1,7,0,i+1,7,7,1);delay(speed);};break;case 2:for (i=0;i<7;i++)line(i,7,0,i,7,7,0);line(7,6-i,0,7,6-i,7,1);delay(speed);};break;case 3:for (i=0;i<7;i++){line(7,7-i,0,7,7-i,7,0);line(6-i,0,0,6-i,0,7,1);delay(speed);};break;case 0:for (i=0;i<7;i++){line(7-i,0,0,7-i,0,7,0);line(0,i+1,0,0,i+1,7,1);delay(speed);};}}void roll_3_xy(uchar n,uint speed){uchar i;switch(n){case 1:for (i=0;i<8;i++){box_apeak_xy (0,i,0,7,7-i,7,1,1);delay(speed);if (i<7)box_apeak_xy (3,3,0,0,i,7,1,0);};break;case 2:for (i=0;i<8;i++){box_apeak_xy (7-i,0,0,i,7,7,1,1);delay(speed);if (i<7)box_apeak_xy (3,4,0,i,7,7,1,0);};break;case 3:for (i=0;i<8;i++){box_apeak_xy (0,i,0,7,7-i,7,1,1);delay(speed);if (i<7)box_apeak_xy (4,4,0,7,7-i,7,1,0);};break;case 0:for (i=0;i<8;i++){box_apeak_xy (7-i,0,0,i,7,7,1,1);delay(speed);if (i<7)box_apeak_xy (4,3,0,7-i,0,7,1,0);};}}void trans(uchar z,uint speed){uchar i,j;for (j=0;j<8;j++){for (i=0;i<8;i++){display[z][i]>>=1;}delay(speed);}}void tranoutchar(uchar c,uint speed){uchar i,j,k,a,i2=0;for (i=0;i<8;i++){if (i<7)box_apeak_xy (i+1,0,0,i+1,7,7,1,1);box_apeak_xy (i2,0,0,i2,7,7,1,0);a=0;i2=i+1;for (j=0;j<=i;j++){a=a|(1<<j);}for (k=0;k<8;k++){display[k][3]|=table_cha[c][k]&a;display[k][4]|=table_cha[c][k]&a;}delay(speed);}}void transss(){uchar i,j;for (i=0;i<8;i++){for (j=0;j<8;j++)display[i][j]<<=1;}}/*From now on,the function below is to display the flash.*/void flash_1(){clear(0);type(1,0);delay(60000);type(2,0);delay(60000);type(3,0);delay(60000);type(4,0);delay(60000);delay(60000);clear(0);rolldisplay(30000);type(0,7);delay(60000);trailler(6000);delay(60000);}void flash_2(){uchar i;for (i=129;i>0;i--){cirp(i-2,0,1);delay(8000);cirp(i-1,0,0);}delay(8000);for (i=0;i<136;i++){cirp(i,1,1);delay(8000);cirp(i-8,1,0);}delay(8000);for (i=129;i>0;i--) {cirp(i-2,0,1);delay(8000);}delay(8000);for (i=0;i<128;i++)cirp(i-8,1,0);delay(8000);}delay(60000);}void flash_3(){char i;for (i=0;i<8;i++){box_apeak_xy(0,i,0,7,i,7,1,1);delay(20000);if (i<7)box_apeak_xy(0,i,0,7,i,7,1,0);}for (i=7;i>=0;i--){box_apeak_xy(0,i,0,7,i,7,1,1);delay(20000);if (i>0)box_apeak_xy(0,i,0,7,i,7,1,0);for (i=0;i<8;i++){box_apeak_xy(0,i,0,7,i,7,1,1);delay(20000);if (i<7)box_apeak_xy(0,i,0,7,i,7,1,0);}}void flash_4(){char i,j,an[8];for (j=7;j<15;j++)an[j-7]=j;for (i=0;i<=16;i++){for (j=0;j<8;j++){if ((an[j]<8)&(an[j]>=0))line(0,an[j],j,7,an[j],j,1);}for (j=0;j<8;j++){if (((an[j]+1)<8)&(an[j]>=0))line(0,an[j]+1,j,7,an[j]+1,j,0);}for (j=0;j<8;j++){if (an[j]>0)an[j]--;}delay(15000);}for (j=0;j<8;j++)an[j]=1-j;for (i=0;i<=16;i++){for (j=0;j<8;j++){if ((an[j]<8)&(an[j]>=0))line(0,an[j],j,7,an[j],j,1);}for (j=0;j<8;j++){if (((an[j]-1)<7)&(an[j]>0))line(0,an[j]-1,j,7,an[j]-1,j,0);}for (j=0;j<8;j++){if (an[j]<7)an[j]++;}delay(15000);}}void flash_5(){uint a=15000;//a=delaychar i=8,j,an[4];//1for (j=7;j<11;j++)an[j-7]=j;while(i--){for (j=0;j<4;j++){box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]<7)box_apeak_xy(j,an[j]+1,j,7-j,an[j]+1,7-j,0,0);}for (j=0;j<4;j++){if (an[j]>3)an[j]--;}delay(a);}//2i=3;for (j=0;j<4;j++)an[j]=5-j;while(i--){for (j=1;j<4;j++){if (an[j]<4)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);box_apeak_xy(j,an[j]+1,j,7-j,an[j]+1,7-j,0,0);}for (j=0;j<4;j++){if (an[j]>0)an[j]--;}delay(a);}//3i=3;for (j=1;j<4;j++)an[j]=4-j;while(i--){for (j=1;j<4;j++){if (an[j]>=0)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]>0)box_apeak_xy(j,an[j]-1,j,7-j,an[j]-1,7-j,0,0);}for (j=1;j<4;j++){if (an[j]<3)an[j]++;}delay(a);}//4i=3;for (j=0;j<4;j++)an[j]=j+1;while(i--){for (j=1;j<4;j++){if (an[j]>3)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]>3)box_apeak_xy(j,an[j]-1,j,7-j,an[j]-1,7-j,0,0);}for (j=0;j<4;j++)an[j]++;delay(a);}//5i=3;for (j=3;j<6;j++)an[j-2]=j;while(i--){for (j=1;j<4;j++){box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);box_apeak_xy(j,an[j]+1,j,7-j,an[j]+1,7-j,0,0);}for (j=0;j<4;j++){if (an[j]>3)an[j]--;}delay(a);}//6i=3;for (j=0;j<4;j++)an[j]=5-j;while(i--){for (j=1;j<4;j++){if (an[j]<4)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]<3)box_apeak_xy(j,an[j]+1,j,7-j,an[j]+1,7-j,0,0);}for (j=0;j<4;j++){if (an[j]>0)an[j]--;}delay(a);}//7i=3;for (j=0;j<4;j++)an[j]=3-j;an[0]=2;while(i--){for (j=0;j<3;j++){if (an[j]>=0)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]>=0)box_apeak_xy(j,an[j]+1,j,7-j,an[j]+1,7-j,0,0);}for (j=0;j<4;j++){if (j<5-i)an[j]--;}delay(a);}//8i=10;for (j=0;j<4;j++)an[j]=j-2;while(i--){for (j=0;j<4;j++){if (an[j]>=0)box_apeak_xy(j,an[j],j,7-j,an[j],7-j,0,1);if (an[j]>=0)box_apeak_xy(j,an[j]-1,j,7-j,an[j]-1,7-j,0,0);}for (j=0;j<4;j++){if (an[j]<7)an[j]++;}delay(a);}}void flash_6(){uchar i,j,k,z;roll_apeak_yz(1,10000);roll_apeak_yz(2,10000);roll_apeak_yz(3,10000);roll_apeak_yz(0,10000);roll_apeak_yz(1,10000);roll_apeak_yz(2,10000);roll_apeak_yz(3,10000);for (i=0;i<3;i++){for (j=0;j<8;j++){for (k=0;k<8;k++){if ((table_3p[i][j]>>k)&1){for (z=1;z<8;z++){point (j,7-k,z,1);if (z-1)point (j,7-k,z-1,0);delay(5000);}}}}trans(7,15000);}}void flash_7(){uchar i;uint a=3000;roll_apeak_yz(0,10000);roll_apeak_yz(1,10000);roll_apeak_yz(2,10000);roll_apeak_yz(3,10000);roll_apeak_yz(0,10000);roll_apeak_yz(1,10000);roll_apeak_yz(2,10000);roll_apeak_yz(3,10000);roll_apeak_yz(0,10000);roll_apeak_yz(1,10000);roll_apeak_yz(2,10000);roll_apeak_xy(0,10000);roll_apeak_xy(1,10000);roll_apeak_xy(2,10000);roll_apeak_xy(3,10000);roll_apeak_xy(0,10000);roll_apeak_xy(1,10000);roll_apeak_xy(2,10000);roll_apeak_xy(3,10000);for (i=0;i<8;i++){box_apeak_xy (0,i,0,7-i,i,7,1,1);delay(a);}delay(30000);roll_3_xy(0,a);delay(30000);roll_3_xy(1,a);delay(30000);roll_3_xy(2,a);delay(30000);roll_3_xy(3,a);delay(30000);roll_3_xy(0,a);delay(30000);roll_3_xy(1,a);delay(30000);roll_3_xy(2,a);delay(30000);roll_3_xy(3,a);for (i=7;i>0;i--){box_apeak_xy(i,0,0,i,7,7,1,0);delay(a);}}void flash_8(){uchar i;for (i=5;i<8;i++){tranoutchar(i,10000);delay(60000);delay(60000);}}void flash_9(){char i;uchar j,an[8],x,y,t,x1,y1;for (i=0;i<8;i++){box_apeak_xy (i,0,0,i,7,7,1,1);if (i)box_apeak_xy (i-1,0,0,i-1,7,7,1,0);delay(10000);}roll_apeak_xy(3,10000);roll_apeak_xy(0,10000);roll_apeak_xy(1,10000);for (i=0;i<7;i++){line(6-i,6-i,0,6-i,6-i,7,1);line(i,7,0,i,7,7,0);delay(10000);}for (i=0;i<8;i++)an[i]=14;for (i=0;i<85;i++){clear(0);for (j=0;j<8;j++){t=an[j]%28;x=dat2[t]>>5;y=(dat2[t]>>2)&0x07;t=(an[j]-14)%28;x1=dat2[t]>>5;y1=(dat2[t]>>2)&0x07;line(x,y,j,x1,y1,j,1);}for (j=0;j<8;j++){if ((i>j)&(j>i-71))an[j]++;}delay(5000);}for (i=0;i<85;i++){clear(0);for (j=0;j<8;j++){t=an[j]%28;x=dat2[t]>>5;y=(dat2[t]>>2)&0x07;t=(an[j]-14)%28;x1=dat2[t]>>5;y1=(dat2[t]>>2)&0x07;line(x,y,j,x1,y1,j,1);}for (j=0;j<8;j++){if ((i>j)&(j>i-71))an[j]--;}delay(5000);}for (i=0;i<29;i++){clear(0);t=an[0]%28;x=dat2[t]>>5;y=(dat2[t]>>2)&0x07;t=(an[0]-14)%28;x1=dat2[t]>>5;y1=(dat2[t]>>2)&0x07;box_apeak_xy(x,y,0,x1,y1,7,0,1);box_apeak_xy(x,y,1,x1,y1,6,0,1);an[0]++;delay(5000);}for (i=0;i<16;i++){clear(0);t=an[0]%28;x=dat2[t]>>5;y=(dat2[t]>>2)&0x07;t=(an[0]-14)%28;x1=dat2[t]>>5;y1=(dat2[t]>>2)&0x07;box_apeak_xy(x,y,0,x1,y1,7,1,1);an[0]--;delay(5000);}for (i=0;i<8;i++){line(i,i,0,0,0,i,0);delay(5000);}for (i=1;i<7;i++){line(i,i,7,7,7,i,0);delay(5000);}for (i=1;i<8;i++){clear(0);box(7,7,7,7-i,7-i,7-i,0,1);delay(10000);}for (i=1;i<7;i++){clear(0);box(0,0,0,7-i,7-i,7-i,0,1);delay(10000);}for (i=1;i<8;i++){clear(0);box(0,0,0,i,i,i,0,1);delay(10000);}for (i=1;i<7;i++){clear(0);box(7,0,0,i,7-i,7-i,0,1);delay(10000);}for (i=1;i<8;i++){box(7,0,0,7-i,i,i,1,1);delay(10000);}for (i=1;i<7;i++){clear(0);box(0,7,7,7-i,i,i,1,1);delay(10000);}}void flash_10(){uchar i,j,an[4],x,y,t;for (i=1;i<7;i++){clear(0);box(0,6,6,1,7,7,1,1);box(i,6,6-i,i+1,7,7-i,1,1);box(i,6,6,i+1,7,7,1,1);box(0,6,6-i,1,7,7-i,1,1);box(0,6-i,6,1,7-i,7,1,1);box(i,6-i,6-i,i+1,7-i,7-i,1,1);box(i,6-i,6,i+1,7-i,7,1,1);box(0,6-i,6-i,1,7-i,7-i,1,1);delay(30000);}for (i=0;i<4;i++){an[i]=6*i;}for (i=0;i<35;i++){clear(0);for(j=0;j<4;j++){t=an[j]%24;x=dat3[t]>>4;y=dat3[t]&0x0f;box(x,y,0,x+1,y+1,1,1,1);box(x,y,6,x+1,y+1,7,1,1);}for (j=0;j<4;j++)an[j]++;delay(10000);}for (i=0;i<35;i++){clear(0);for(j=0;j<4;j++){t=an[j]%24;x=dat3[t]>>4;y=dat3[t]&0x0f;box(x,y,0,x+1,y+1,1,1,1);box(x,y,6,x+1,y+1,7,1,1);}for (j=0;j<4;j++)an[j]--;delay(10000);}for (i=0;i<35;i++){clear(0);for(j=0;j<4;j++){t=an[j]%24;x=dat3[t]>>4;y=dat3[t]&0x0f;box(x,0,y,x+1,1,y+1,1,1);box(x,6,y,x+1,7,y+1,1,1);}for (j=0;j<4;j++)an[j]++;delay(10000);}for (i=0;i<36;i++){clear(0);for(j=0;j<4;j++){t=an[j]%24;x=dat3[t]>>4;y=dat3[t]&0x0f;box(x,0,y,x+1,1,y+1,1,1);box(x,6,y,x+1,7,y+1,1,1);}for (j=0;j<4;j++)an[j]--;delay(10000);}for (i=6;i>0;i--){clear(0);box(0,6,6,1,7,7,1,1);box(i,6,6-i,i+1,7,7-i,1,1);box(i,6,6,i+1,7,7,1,1);box(0,6,6-i,1,7,7-i,1,1);box(0,6-i,6,1,7-i,7,1,1);box(i,6-i,6-i,i+1,7-i,7-i,1,1);box(i,6-i,6,i+1,7-i,7,1,1);box(0,6-i,6-i,1,7-i,7-i,1,1);delay(30000);}}void flash_11(){uchar i,j,t,x,y;uchar code daa[13]={0,1,2,0x23,5,6,7,6,5,0x23,2,1,0};for (j=0;j<5;j++){for (i=0;i<13;i++){if (daa[i]>>4)。
光立方制作手册V1.0
光立方制作手册(YFRobot Cube8LedDisp)编著:产品部2013年10月10日目录1绪论 (1)2灯的搭建 (2)2.1点 (4)2.2线 (4)2.3面 (5)2.4体 (6)2.5搭建方法二 (7)2.6层控制线 (8)3光立方驱动板 (9)3.1坐标系 (9)3.2控制方式 (10)4程序例解 (11)4.1层填充函数 (11)4.2帧函数 (12)4.3动画 (12)1绪论我们设计了一种全新的焊接方式,不需要额外的模版,只是利用我们的驱动板,和几个单排针,就可以焊接出四方四正的一个面,看完第二章,一定会给你耳目一新的感觉。
设计驱动板的同时,我们还考虑了板子的通用性,可以使不同的控制器来驱动光立方,同时减少控制端口,现在是8个端口,在今后的升级中我们会再次减少控制端口。
驱动板上从左往右依次有3.5mm音频插座,5.5*2.1mmDC插座,电源开关,电源指示灯,红外接收头,两个按键,8个数据控制端,2个按键信号输出端,红外信号输出端,音频模拟信号采集端。
具体的焊接方式、控制方式、程序,会在下面几个章节中详细讲解。
套件清单:1、驱动板;2、一包灯珠(530个);3、15根杜邦线(两头母);4、8mm螺丝,8mm、30mm铜柱各4个;5、20针直排针;6、灰色细导线(80cm)。
(送:1、音频线、一分二音频头,各一个;2、列子。
)2灯的搭建这一章节中我们介绍了两种方法来焊接体,总体的思想是一样的,只是在弯引脚方式中有所不同,建议把这一整章看完后,选择合适方式,再开始灯的搭建。
把搭建的过程分为四个过程,点、线、面、体。
图2.1完整的光立方图2.2右视图(层与驱动板平行)图2.3俯视图(面与驱动板垂直)2.1点“点”就是灯,我们选择的灯是2*3*4高亮蓝色长脚雾灯,参数:VF:3.0~3.2;IV:550~650。
引脚的弯曲非常的重要,它将直接影响线是否直,面是否方正水平。
图2.1.1弯灯引脚(Ⅰ型)弯灯的方式如图2.2.1所示,当你拿起灯看的时候,你看到的只有90度和180度,这是焊接出一个完美光立方的前提。
光立方 单片机控制的小型立方体led灯组
光立方单片机控制的小型立方体led灯组件状态机方案### 一、硬件简介LED Cube(又称立方体LED或多边形LED灯)是一种新型的灯具,它有一系列LED灯以立方体的形式,排列成一个多维数组进行显示,能够产生出各种逼真的3D图形和照明效果,从而创造出炫丽的视觉效果,吸引着众多爱好者。
### 二、硬件原理LED Cube原理是利用8根数线来控制8层的LED灯,每一根数线上接有8个LED灯,分别对应到8*8的矩阵中,每一层的LED灯可以被控制按照设定的顺序显示出3D立方体图案,每一层LED灯通过立方体状态机化算法制定方案,来控制8根数线上的LED灯以达到刷新一层灯的功能,最终形成立方体图案。
### 三、状态机方案由于硬件资源有限,硬件系统中不会有任何复杂的控制算法,此时就需要使用状态机方法来实现立方体的控制。
状态机方案的原理就是把系统的不同状态定义成一系列的状态,并且根据给定的输入,切换不同的状态。
每一个状态都有相应的操作,当系统处在某一个状态时,将会执行这个状态的操作,也就是说,立方体的控制就是把控制LED灯的指令写入到状态机中,并且让状态机根据给定的输入来切换控制LED灯模式。
### 四、控制算法控制LED Cube的流程可以总结为两个步骤:1. 第一步是先通过分层控制,将立方体LED灯的状态分层定义,每一层的LED 灯组成一个8*8的矩阵,也就是每一层的LED灯会视为一个独立的8*8矩阵,由8根数线来控制,然后根据状态机定义该状态下的操作,比如定义每一层灯皆闪,每一层灯以顺时针旋转,每一层灯全部熄灭等等;2. 第二步是根据输入,控制状态机切换状态,也就是作为状态机输入信号,比如按下一个按钮时,将会切换到一个新的状态,比如每一层以顺时针旋转更换到每一层逆时针旋转。
通过以上的控制算法,就可以实现LED Cube的控制,让立方体LED灯形成不同的3D图形和照明效果。
电子信息专业毕业设计3D光立方
摘要光立方是一个长、宽、高由8×8×8 个LED 灯组成的真实3D 立方体显示器。
其最大的特点,就是带给观赏者立体的超酷的3D视觉体验。
因此各大也充斥着各种各样的光立方版本。
但是这各种版本的光立方的制作方法都很复杂,而且成本也很高,而本设计与之相比则制作简单精美,成本低廉。
为保证光立方精美的外形,本设计还提供了一种光立方的制作模板,以确保将动手能力导致的美观差异降到最低。
为降低其成本,本设计采用了STC12C5A60S2单片机,这种单片机自带有A/D转换模块;使用的锁存器是常用的SN74HC573。
这样可以保证在降低制作成本的情况下,毫不影响作品的美观;再加上显示效果极佳的高亮雾面的蓝色方形LED,硬件电路无需添加额外的驱动和上拉电阻,即可实现其强大的功能:除了能显示3D 图形,还可以支持多级亮度和速度调整,允许用户自拓展音频显示功能,就像音乐显示器一样。
用户还可以在不改动硬件电路的情况下设计出自己喜欢的的自定义图形。
这些充分体现了制作成本低、显示效果好、功能完善的特点。
最后,经过软硬件调试,解决了一些硬件电路短路,程序报错的问题,完美地实现了多种图形动态显示,流畅的图形变换和音频显示的多种功能。
关键词:光立方制作模板音频显示 A/D转换ABSTRACTLight-cube is a long, wide, high is composed of 8 x 8 x 8 leds true 3 d volumetric display. Its biggest characteristic, is to bring the viewer stereo cool 3 d visual experience. So each big web site is filled with all kinds of cubic light version.But all versions of this light cubic method is very complex, and the cost is also high, and compared with this design is beautifully simple and low cost.In order to ensure the exquisite cubic shape, this design also provides a light cube production template, to ensure that the ability to appearance difference to a minimum.To reduce its cost, this design USES STC12C5A60S2 MCU, the MCU built-in A/D conversion module; Use the latch is SN74HC573 in common use. So that in the case of lower production costs, not effect the beauty of the works; Plus showed excellent results highlighted square LED fog below in blue, don't need to add additional hardware circuit drive pull up resistance, and its powerful functions can be realized: in addition to display 3 d graphics, can support multiple levels of brightness and speed adjustment, allows the user to expand the audio display function, like music display. Users can also in the case of do not change the hardware circuit design their own custom graphics. These fully reflect the production of low cost, good effect of display, the characteristics of the function is perfect.Finally, after the hardware and software debugging, solve some of the short circuit hardware circuit, program error, perfect the dynamic variety of graphic display, smooth graphics transform and audio display a variety of functions.Key words: light-cube making stencil audio-display A/D conversion目录1、引言01.1研究意义 01.2研究现状 (1)1.3该论文的容安排 (1)2、光立方的设计方案 (1)2.1本设计基本功能和特点 (1)2.2拓展功能 (2)2.3总体设计方案 (2)3、硬件设计 (4)3.1 单片机控制电路设计 (4)3.1.1单片机选型 (4)3.1.2单片机控制电路 (5)3.2 驱动电路设计 (6)3.2.1 负极驱动芯片 (7)3.2.2 正极驱动芯片 (9)3.3显示电路设计 (10)3.3.1各层电路设计 (10)3.3.2 LED地址对照表 (11)3.4实物效果图 (13)4、软件设计 (15)4.1 自定义头文件 (15)4.2电脑端的ISP控制软件 (18)4.3程序流程图 (19)4.4 LED显示核心思想 (20)4.5显示部分测试结果 (22)5、硬件焊接与调试 (23)5.1 本设计所需材料 (23)5.1.1LED灯 (23)5.1.2 74HC573芯片 (23)5.1.3自制双声道音频插头 (23)5.1.4 其他材料 (24)5.2光立方LED灯焊接方法与步骤 (25)5.3调试中的问题和解决方法 (27)5.4调试结果 (28)6、总结 (30)致 (30)参考文献 (31)附录 (32)1、引言1.1研究意义LED射灯是指发出的光线是方向性的(directional)的LED灯泡, 主要类型有MR16,GU10, PAR series.LED球泡灯是指发出的光线为发散性的LED灯泡, 主要类型为:E27 base.按照功率来分, LED灯泡可分为: 小功率(主要为5mm LED生产的)和大功率(主要1 W, 3 W ,甚至5 W LED生产的)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8阶光立方的制作摘要光立方是一个电子工程方面DIY的绝好实例,不管国内国外都有非常多的爱好者。
它同时要求制作者具有软硬件设计及手工制作等多方面的能力,目前youtube上最大的DIY光立方是32阶全彩光立光,引脚数多达131,072个,这对于个人来说绝对算是个大型的工程了。
要制作出一个漂亮的光立方,除了电路设计与程序设计,辅助工具设计也很重要,缺少它甚至是无法完成整个制作的。
另一方面,很多验证性工作也属于辅助设计,理论往往与实际会有很大的出入,这时就需要一步步去验证原始设计。
网络上大多参考资料都只是一个制作记录,并没有详细分析为什么要这么做,是否还有其它的实现方法等等。
因此,在遇到不同的实际环境的时候,出了问题却往往找不到原因在哪里,这就造成很多的困惑。
本文试着从设计原理的角度来分析如何做一个8阶单色光立方,以及记录在制作过程当中遇到的各种问题与解决办法。
控制芯片采用STC MCU,输出为串口转并口,驱动芯片选用东芝16位移位寄存器,3个级联达48位并口输出,512个LED使用16*32矩阵接法。
目录1 准备篇1.1设计框架1.2 主芯片选型1.3 所需工具材料2设计篇2.1 电路设计2.2 程序设计2.3辅助工具设计3 完善篇3.1 迭代3.2 功能扩展1 准备篇光立方,由若干个LED以立方体的形式搭建而成。
最常见的为8*8*8(512个LED),8阶光立方,也叫cube8。
当灯按照一定的规则依次变换点亮的时候,可以产生十分唯美的灯光效果图,现在大多随着动感的音乐节奏一起变化,声色交错,让人赏心悦目。
1-1光立方(蓝光)——cube8效果图1.1 设计框架第一个需要思考的问题是:如何连接这512个灯?有个前提条件需要满足:每个灯都必须可以单独点亮。
那么,任何两个灯都不可以串联。
最直接的办法是并联这512个灯,共阳或者共阴,然后提供512个输出。
但这样做至少有两个非常大的缺点:首先,一般情况下无论是MCU、ARM、FPGA都无法提供这么多输出位,即使是使用多个16位移位寄存器,那么也需要32个,这无论在成本还是在实际焊接都十分不划算;其次,就算512个输出位不是问题,因为是立方体形式,线路之间会存在互相遮挡,所以,必须要求连接线路最少,显然,直接并联是最傻的情况。
现在把问题转换成一个求解题:试求512个灯的最少连接线路,要求每个灯可以单独点亮?这实际是一个求最优解(极值)问题。
回想一个几何问题,在确定面积下,求最小周长?答案是:C(min)=4*S^(1/2)。
这里的关键是对S开平方根,所以对512开根号约等于22.627,很明显,最佳组合应该是相互间距最近,而且都是2的n次方,所以,最优解是16*32矩阵接法,只需要48个输出。
但矩阵接法也有个天然的劣势,无法同时输出多个状态,必须使用动态扫描输出,利用高频特性伪装成同时输出的样子,所以,这就对频率提出了要求。
但同样地,优势除了线路最简外,因为是动态扫描,所以电流也可最小化。
如何提供48个输出,最直接的方法当然是找一个具有48个以上输出的MCU,实际上确实有,STC15W4K16S4就有LQFP64S、LQFP64L、QFN64三种,提供62个IO 口,价格在6元以下。
这种方法是最简单的,但却不是最灵活的,也就是扩展性和变化性不强,假如把8阶升级到16阶就只能换方案了。
如果不直接输出,也就是说不选择并行输出,那么就串行输出吧。
由MCU输出串行信号,再由移位寄存器转换成48位并行输出,控制16*32矩阵电路实现512个LED完全控制。
1.2 主芯片选型由于MCU输出串行信号,一般3位输出即可,这里选用宏晶STC15W401AS-35I-SOP20,市场价2元。
不选用DIP的原因是嫌它太大了,不利于后期制作PCB,选用18个IO的原因是为了后期扩展使用,比如加入红外遥控,按键,光敏,麦克风等,再者串行输出不要与MCU下载线路共用,不方便在线调试及信号测试等,串行输出也要根据后期程序的难易程序决定是否让移位寄存器级联,如果不级联那么就要输出多个串行信号,所以初期不要选太少IO口的MCU。
1-2STC15W401AS-35I-SOP20移位寄存器大多数选择74HC595,这里选用东芝TB62747AFNAG,是一个16位移位寄存器,串行数据输入频率可达25MHz,每位输出最高电流可达45mA,市场价1.65元。
输出48位,须3个同时工作。
1-3TB62747AFNAG1.3 所需工具材料材料:万能板(数量与大小可根据实际需要与个人喜好选择购买),杜邦线若干,排针若干,转接板(转接SOP),焊接线若干,电容电阻若干,5mm方形LED 1000个左右。
工具:电烙铁,热风枪,RS232(USB转TTL,MCU程序下载工具),其它工具(剪刀,镊子等),万能表,电压源,示波器,3D打印机。
软件:Keil C (编写及编译程序),STC-ISP(程序下载软件)。
这里有些工具并不是必须的,而且往往使用到的工具也远不止这些,有了这些工具的帮助将会更容易模拟问题,发现问题,并最终解决问题。
在进行前期设计的时候更多的是用各种软件工具来进行模拟,论证。
如果没有很多工具,那就要学会用其它已有的工具来代替。
2设计篇2.1 电路设计在设计原理图的时候,要先确保芯片的工作确实如你所想。
在本次制作过程中发现TB62747移位寄存器并不如所想那样工作,于是制作测试电路来检测真正的工作方式,发现两点问题,在芯片的数据手册里没有说明。
第一,反向输出,OUT15为第一输出位,OUT0为第十六输出位;第二,移位标志位不会归零,每次刷新都必须更新所有位,即使只需要刷新一位,仍然需要把所有的位全部更新一次。
使用万能表测出LED点亮电压为3V,电流为10mA-15mA。
再根据TB62747的数据手册,设置并验证REXT接1K的电阻到GND可以使电流在10mA左右,另外,此芯片输出必须接上拉电阻,芯片输出为5V,因此接上拉电阻0.2k。
这里采用三片级联,当然也可以不级联,或者只级联两片,可以根据需要做相应调整。
因为是采用动态扫描输出方式,所以每次都只是点亮一个灯,也就是说每次只有一个电流流过LED,其余都流经芯片,所以这里把正极平均分布在级联的三片芯片上。
为了保证在快速刷新的时候芯片电流的稳定,在芯片的电源处并联20uF的电解电容。
电路原理图设计如图2-1。
2-1电路原理图有了原理图,还得具体的引脚焊接图。
按16*32的矩阵方式,把底部焊接的64个引脚分成前后两组,每组32个,对应的前后两组串接在一起,组成32个负极,在左右两边各加一列正极,组成16个正级,如图2-2。
2-2底部焊接图2-3cube8实际外形2.2 程序设计程序设计与电路设计有着非常紧密的关系。
在确定的功能实现下,一般呈现出一种反比关系,电路设计越简单,程序则越复杂,电路设计越复杂,程序则越简单。
通常根据实际情况调整它们让哪个更简单些,有时往往电路上一个小小的改进,程序就会简单很多;同样地,程序进行优化也可以让电路变得更简单些。
程序设计分为两部分,一部分为电路驱动,这部分的设计决定了整个程序的性能,另一部分为变换图形部分,这里只分析驱动部分,图形部分可以各自发挥。
驱动程序与实际电路是完全耦合的,首先要注意的一点是反向输出,因此要定义第三个移位寄存器的最后一位为第一输出位,这里体现在实际电路的连接上,程序则不必须考虑这个问题。
其次,为了保证三个移位寄存器的负载电流一致,把16个正极以6+5+5的形式分配在三个移位寄存器上。
第三,光立方为立方体形状,建模为(x,y,z)三个坐标是最简单的,8阶光立方,所以(x,y,z)的取值范围都为[0,7]。
最后就是如何把(x,y,z)转换成一维线性输出信号,参考如下代码:void Light(uchar x, uchar y, uchar z){uchar idata p[48]={ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0};if(y<4){if(z>3) z=15-z;y=x+(y<<3);}else{if(z<4) z=15-z;y=x+(y-4<<3);}if(z<6) *(p+z) =0;else if(z>5 && z<11) *(p+z+10) =0;else *(p+z+21) =0;if(y<10) *(p+y+6) =1;else if(y>9 && y<21) *(p+y+11) =1;else *(p+y+16) =1;for(x=0;x<48;x++){Sin=*(p+x); Sck=1; Sck=0;}Slat=1; Slat=0;}定义一个无返回函数Light,它接收一个三维坐标(x,y,z)并最终点亮这个坐标指向的LED。
首先定义一个48位数组,初使化为让所以灯全灭的状态,每次传来一个坐标,只需要反转这个坐标对应的正极与负极即可,接下来就是把(x,y,z)转换成代表P与N的坐标,再用P与N的位置(数值)来修改代表输出的48位数组,最后用一个for循环来刷新输出。
这里要注意一点的是,x,y,z这三个数值在本函数的坐标转换过程中不再代表三维坐标,这么做会让程序很难理解,但好处是减少了变量的定义,复用变量对于MCU非常重要,特别是这种驱动函数,在MCU非常有限的计算能力中,少一个变量至少可以提升10%以上的性能。
2.3 辅助工具设计辅助工具就如几何证明中的辅助线,有时是必不可少的。
设计辅助工具是整个项目设计中十分重要的一环。
借助三维建模软件对工具进行建模是最通行的办法,软件设计出来对模型的外观及比例有非常直观的参照,但对于实际大小还是需要生产出来才知道是否真正合适。
之前通用的做法是用木头或是塑料来生产模型,现在得益于科技的进步,3D打印机可以快速高效准确地打印出任何模型,而且3D打印机的价格也不算太贵,最新的iphone都可以买两个入门级的3D打印机了。
512个LED如何进行焊接是个问题,纯手工焊接基本上是无法实现的,必须要借助工具来定位每一个灯互相之间的位置,这样才能保证外表美观。
先用AutoCAD 设计出辅助工具的模型,然后输出stl格式,导入到3D打印机软件制作切片文件,最后用3D打印机打印出来。
2-4辅助工具3完善篇3.1 迭代程序与电路方面都需要进行迭代,才能设计出更好的产品。
上面的驱动程序部分其实性能十分低下,仍然需要进行改进。
低下的原因有两方面,一方面是每点亮一个灯必须刷新所有输出,另一方面是有时可以同时点亮多个灯,只是需要做大量判断来确定这多个灯确实是在同一个输出上,因为输出要比计算花费更多的时间,另外,内部运行频率与输出频率是不对等的。