CUBE8光立方教程

合集下载

CUBE8光立方制作教程

CUBE8光立方制作教程

CUBE8光立方制作教程我们的单色和双色都采用时同一块PCB板,制作单色或是双色都可以在同一块板子上完成,只是有部分需要注意一下,下面我会介绍到。

控制方案:单色8片74HC573 + 1片UN2803+STC12C5A60S2单片机双色16片74HC573 +1片UN2803+STC12C5A60S2单片机如上图,CUBE8 共8个面,也就是8层。

每一层64个LED负极接到一起,这样8面,就8个负极,这8个负极接到UN2803上,单片机通过控制UN2803来选中每一面。

实际过程中。

而LED的正极通过74HC573选择。

我们光立方组成我们CUBE8光立方组成由底板+主控板构成,之所以分开设计,是因为方便扩展模块独立,而且主控板通过排针从底下插到底板上。

焊接好后的底板加主控板,主控板子插到底板一定要IO口对上,焊接前请仔细核对。

主控板上留有下载接口,用于下载更新程序。

下面介绍下我们的原理图设计方式。

拿到我们的底板后,你可以看到我们板子一些标号。

P1----P8 P9----P16 P17----P24 P25----P32 P33----P40 P41----P48 P49----P56 P57----P64将光立方从上到到下分为8面,那么从左到右分别为8排。

P1---P8为一排,这几个是接在一个573上面,其他以此类推。

P1---P8共有16个孔,这时候如果你制作单色只需要选中最左边8个孔或者最右边8个孔。

最左边8个孔接在U1的573上,最右边8个孔接在U3的573上,其余P9--P16等依次类推,可以根据原理图了解。

板子上标号M1-----M8分别为8面,也就是每一层分别接到这8面上。

74HC573标号分别为U1----U16对于573如果你是制作单色的CUBE8便只需要用到其中8个,也就是你只需要焊接8个就可以了。

如果制作双色便需要同时用到16个。

U1,U2,U5,U6,U9,U10,U13,U14 这8个573接在P2口U3,U4,U7,U8,U11,U12,U15,U16这8个573接在P4口如果制作单色的光立方你用选择P2口那几个573 或者P4口那几个573如果制作的双色的光立方则选择P2 P4这16个全部需要选中。

第2章八阶光立方实现蓝牙控制项目设计

第2章八阶光立方实现蓝牙控制项目设计

第2章八阶光立方实现蓝牙控制项目设计2.2.1 主程序模块2.相关代码//蓝牙功能代码如下:#ifndef LightCube_h#define LightCube_h#include "Arduino.h"#define u8 unsigned char#define s8 signed char#define u16 unsigned shortclass LightCube{public:LightCube(int SER0 ,int SCK0 ,int RCK0 );void storey(u8 *a);void frame(u8 *a,u8 v); //表示一帧,a是一帧编码起始地址// v表示一帧画面扫描的次数// 可以看作这帧显示的时间void AllOff(void); //光立方512个灯全关—清屏void AllOn(u8 v); //光立方512个灯全开void LtoRScan(u8 v); //侧面从左向右依次点亮void RtoLScan(u8 v); //侧面从右向左依次点亮void FtoBScan(u8 v); //从前排向后排依次点亮void BtoFScan(u8 v); //从后排向前排依次点亮void UtoDScan(u8 v); //从上向下依次点亮void DtoUScan(u8 v); //从下向上依次点亮void Anticlockwise(s8 num,s8 v); //Anticlockwise表示逆时针旋转 num:表示旋转周数, v表示速度void Clockwise(s8 num,s8 v); //Clockwise表示顺时针旋转,num表示旋转周数, v表示速度void RightClockwise(s8 num,s8 v); //从右侧看顺时针旋转,num表示旋转周数, v 表示速度void Cube(u8 empty,u8 kind,u8 v); //立方体动画;empty=0表示空,empty=1表示实//kind=0表示左上角,/kind=1表示右上角,/kind=2表示左下角,/kind=3表示右下脚;v 表示速度void Rain(s8 down, s8 cycle _index, u8 speed); //下雨效果//cycle_index为旋转周数;speed为速度void Up(s8 num,s8 v); //上移;num为旋转周数;v为速度void RotateFace(s8 empty,s8 Clockwise,s8 turns,u8 speed);//面中心旋转//empty=1表示空心旋转,否则表示实心旋转 //Clockwise=1表示顺时针,否则表示逆时针 //turns为执行次数;speed为速度void RotateFaceC(s8 num,s8 v); //面侧边旋转,num执行次数;v速度void RotateHookFace(s8 Clockwise,s8 turns,u8 speed); //曲面旋转;Clockwise=1表示逆时针旋转,否则表示顺时针旋转,turns为执行次数;speed为速度void Sandglass(s8 v); //沙漏;v表示速度void WaterOne(s8 x,s8 y,u8 speed); //一个水滴void WaterTwo(s8 x1,s8 y1,s8 x2,s8 y2,u8 speed); //二个水滴void WaterThr(s8 x1,s8 y1,s8 x2,s8 y2,s8 x3,s8 y3,u8 speed); //三个水滴void Animation(const u8 *ARRAY_tab,u8 frame_num,u8 cycle_index,u8 speed); //*动画,ARRAY_tab,array.h中数组;//frame_num表示帧数;cycle_index表示循环次数,speed表示滚动速度void PrintOpen(u8 speed);void Print(const u8 *ARRAY_tab);void FanOne(s8 turns, u8 speed); //fan表示扇形void FanTwo(s8 turns, u8 speed);void ConnectThree(u8 speed);void ConnectFour(u8 speed);void ConnectFive(u8 speed);void ConnectSix(const u8 *ARRAY_tab,u8 frame_num,u8 cycle_index,u8 speed);//cycle_index表示循环次数,speed表示滚动速度void ConnectSeven(u8 speed);private:int _SER0;int _SCK0;int _RCK0;};#endif#include "Arduino.h"#include "LightCube.h"#define u8 unsigned char#define s8 signed char#define u16 unsigned short//初始化函数LightCube::LightCube(int SER0 ,int SCK0 ,int RCK0 ){pinMode(SER0,OUTPUT);_SER0 = SER0;pinMode(SCK0,OUTPUT);_SCK0 = SCK0;pinMode(RCK0,OUTPUT);_RCK0 = RCK0;}const u8 flash_tab[]={0X03,0X07,0X06,0X08,0X10,0X20,0X40,0X80,//00X07,0X07,0X0F,0X1C,0X18,0X20,0X40,0X80,0X0F,0X0F,0X1F,0X3F,0X3C,0X78,0X60,0X80,0X1F,0X1F,0X3F,0X3F,0X7F,0X7C,0X70,0X80,0X3F,0X3F,0X3F,0X7F,0X7F,0X7F,0XF8,0XC0,0X7F,0X7F,0X7F,0X7F,0XFF,0XFF,0XFF,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF//6};void LightCube::storey(u8 *a)//层填充函数,控制某层灯点亮方式{u8 i,j,num;for(i=0;i<8;i++){num=a[i]; //将数组中数输入寄存器for(j=0;j<8;j++) //串行数据输入{if(num&0x80)digitalWrite(_SER0,HIGH); // SER串行输入端口elsedigitalWrite(_SER0,LOW);digitalWrite(_SCK0,LOW); //上升沿,输入到移位寄存器delayMicroseconds(1);digitalWrite(_SCK0,HIGH);num<<=1;}}}void LightCube::frame(u8 *a,u8 v) //表示一帧,a是一帧编码起始地址// v表示一帧画面扫描的次数// 可以看作这帧显示的时间{s8 i,j,num; //s8 有符号定义while(v--){num=0x01;for(i=0;i<8;i++) //层数控制{num<<=i;digitalWrite(_RCK0,LOW);for(j=0;j<8;j++) //串行数据输入{digitalWrite(_SER0,LOW);delayMicroseconds(1);digitalWrite(_SCK0,LOW); //上升沿,输入到移位寄存器delayMicroseconds(1);digitalWrite(_SCK0,HIGH);}for(j=0;j<8;j++) //串行数据输入{if(num&0x80)digitalWrite(_SER0,HIGH); // SER串行输入端口elsedigitalWrite(_SER0,LOW);digitalWrite(_SCK0,LOW); //上升沿,输入到移位寄存器delayMicroseconds(1);digitalWrite(_SCK0,HIGH);num<<=1;}storey(a+i*8); //层填充函数,控制某层灯点亮方式 digitalWrite(_RCK0,HIGH);num=0x01;delayMicroseconds(2); // 层显示时间}}}//全局清屏void LightCube::AllOff(void){u8 i,j;for(i=0;i<9;i++) //层数控制{digitalWrite(_RCK0,LOW);for(j=0;j<8;j++) //串行数据输入{digitalWrite(_SER0,LOW);delayMicroseconds(1);digitalWrite(_SCK0,LOW); //上升沿,输入到移位寄存器delayMicroseconds(1);digitalWrite(_SCK0,HIGH);delayMicroseconds(1);}}digitalWrite(_RCK0,HIGH);delay(2);}// 光立方全点亮void LightCube::AllOn(u8 v){u8 k[65]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF };frame(k,v);}//侧面从左向右依次点亮void LightCube::LtoRScan(u8 v){u8 b[64]={0 };s8 x,z;for(z=0;z<8;z++){b[z*8]=0xff;}frame(b,v);for(x=1;x<8;x++){for(z=0;z<8;z++){b[z*8+x]=0xff;b[z*8+(x-1)]=0;}frame(b,v);}}//侧面从右向左依次点亮void LightCube::RtoLScan(u8 v){u8 b[64]={0};s8 x,z;for(z=0;z<8;z++){b[z*8+7]=0xff;}frame(b,v);for(x=6;x>=0;x--){for(z=0;z<8;z++){b[z*8+x]=0xff;b[z*8+(x+1)]=0;}frame(b,v);}}//从前排向后排依次点亮void LightCube::FtoBScan(u8 v) {u8 b[64]={0};s8 i,y;for(i=0;i<64;i++)b[i]=0x01;frame(b,v);for(y=0;y<7;y++){for(i=0;i<64;i++)b[i]<<=1;frame(b,v);}}//从后排向前排依次点亮void LightCube::BtoFScan(u8 v) {u8 b[64]={0};s8 i,y;for(i=0;i<64;i++)b[i]=0x80;frame(b,v);for(y=0;y<7;y++){for(i=0;i<64;i++)b[i]>>=1;frame(b,v);}}//从上向下依次点亮void LightCube::UtoDScan(u8 v){u8 b[64]={0};s8 x,z;for(x=0;x<8;x++){b[x]=0xff;}frame(b,v);for(z=1;z<8;z++){for(x=0;x<8;x++){b[z*8+x]=0xff;b[(z-1)*8+x]=0;}frame(b,v);}}//从下向上依次点亮void LightCube::DtoUScan(u8 v){u8 b[64]={0};s8 x,z;for(x=0;x<8;x++){b[7*8+x]=0xff;}frame(b,v);for(z=6;z>=0;z--){for(x=0;x<8;x++){b[z*8+x]=0xff;b[(z+1)*8+x]=0;}frame(b,v);}}//Anticlockwise表示逆时针选好转num表示旋转周数,v表示速度void LightCube::Anticlockwise(s8 num,s8 v){s8 i,k;u8 b[64]={0};for(i=0;i<64;i++) b[i]=0x80;frame(b,v);while(num--)for(i=0;i<28;i++){if(i<7){for(k=0;k<8;k++){b[k*8]|=(0x80>>(i+1));b[k*8+7-i]=0;}}else if(i<14){for(k=0;k<8;k++){b[k*8+i-6]=0x01;b[k*8]>>=0x01;}}else if(i<21){for(k=0;k<8;k++){b[k*8+i-14]=0;b[k*8+7]|=(0x01<<(i-13));}}else if(i<28){for(k=0;k<8;k++){b[k*8+27-i]=0x80;b[k*8+7]<<=1;}}frame(b,v);}AllOff(); //清屏}//Clockwise表示顺时针旋转,num表示旋转周数,v表示速度void LightCube::Clockwise(s8 num,s8 v){s8 i,k;u8 b[64]={0};for(i=0;i<64;i++) b[i]=0x80;frame(b,v);while(num--)for(i=0;i<28;i++){if(i<7)for(k=0;k<8;k++){b[k*8+7]|=(0x80>>(i+1));b[k*8+i]=0;}else if(i<14)for(k=0;k<8;k++){b[k*8+13-i]=0x01;b[k*8+7]>>=0x01;}else if(i<21)for(k=0;k<8;k++){b[k*8+21-i]=0;b[k*8]|=(0x01<<(i-13));}else if(i<28)for(k=0;k<8;k++){b[k*8+i-20]=0x80;b[k*8]<<=1;}frame(b,v);}AllOff(); //清屏}//从右侧看顺时针旋转void LightCube::RightClockwise(s8 num,s8 v) {s8 i,k;u8 a[64]={0};for(i=0;i<8;i++)a[7*8+i]=0xff;frame(a,v);while(num--)for(i=0;i<28;i++){if(i<7)for(k=0;k<8;k++){a[(6-i)*8+k]=0x01;a[7*8+k]>>=1;}else if(i<14)for(k=0;k<8;k++){a[k]|=0x01<<(i-6);a[(14-i)*8+k]=0;}else if(i<21)for(k=0;k<8;k++){a[(i-13)*8+k]=0x80;a[k]<<=1;}elsefor(k=0;k<8;k++){a[7*8+k]|=0x80>>(i-20);a[(i-21)*8+k]=0;}frame(a,v);}AllOff();}//在X、Y、Z轴上任意方向和位数移动s8 X_AXIS=0;s8 Y_AXIS=1;s8 Z_AXIS=2;s8 MINUS=0; //负向s8 PULS=1; //正向// kind=0表示 x轴,kind=1表示y轴,kind=2表示z轴;direction=0表示负向, direction=1表示正向;length表示移动位数,不能为8void moveXYZ(u8 *a,s8 kind,s8 direction,s8 length){s8 i,x,z;if(kind==0) //x轴{if(direction==1) //正向for(z=0;z<8;z++){for(x=7;x>=length;x--)a[z*8+x]=a[z*8+(x-length)]; for(x=0;x<length;x++)a[z*8+x]=0;}else // 负向for(z=0;z<8;z++){for(x=length;x<8;x++)a[z*8+(x-length)]=a[z*8+x]; for(x=(8-length);x<8;x++)a[z*8+x]=0;}}else if(kind==1) //y轴{if(direction==1) //正向for(i=0;i<64;i++)a[i]<<=length;else //负向for(i=0;i<64;i++)a[i]>>=length;}else //z轴{if(direction==1) //正向for(x=0;x<8;x++){for(z=7;z>=length;z--)a[z*8+x]=a[(z-length)*8+x]; for(z=0;z<length;z++)a[z*8+x]=0;}else //负向for(x=0;x<8;x++){for(z=length;z<8;z++)a[(z-length)*8+x]=a[z*8+x];for(z=(8-length);z<8;z++)a[z*8+x]=0;}}}//正方体轮廓,outline表示轮廓,length表示边长,范围为0<leng<=8,注意n不能为0void cubeLine(u8 *a,s8 n){s8 i,j;for(i=0;i<64;i++)a[i]=0;j=0xff>>(8-n);a[0]=j;a[n-1]=j;a[(n-1)*8]=j;a[(n-1)*8+n-1]=j;for(i=0;i<n;i++){j=(0x01|(0x01<<(n-1)));a[i*8]|=j;a[i*8+n-1]|=j;a[i]|=j;a[(n-1)*8+i]|=j;}}//实心正方体,fill表示充满,length表示边长,范围为0<leng<=8,注意n不能为0void CubeFill(u8 *a, s8 length){s8 x, z;for(z = 0;z < 8; z++)for(x = 0; x < 8; x++){if(z < length && x < length)a[ z * 8 + x] = 0xff >> (8 - length);elsea[z * 8 + x] = 0;}}//立方体动画,empty=0表示空心,empty=1表示实心; kind=0表示左上角, kind=1表示右上角, kind=2表示左下角, kind=3表示右下脚;num表示旋转周数;v表示速度void LightCube::Cube(u8 empty,u8 kind,u8 v){u8 a[64]={0};s8 i;for(i=1;i<=8;i++)//生成{if(empty==0)cubeLine(a,i);elseCubeFill(a,i);if(kind==0){;}else if(kind==1)moveXYZ(a,0,1,8-i);else if(kind==2)moveXYZ(a,2,1,8-i);else{moveXYZ(a,0,1,8-i);moveXYZ(a,2,1,8-i);}frame(a,v);}for(i=7;i>0;i--) //退出{if(empty==0)cubeLine(a,i);elseCubeFill(a,i);if(kind==0)moveXYZ(a,0,1,8-i);else if(kind==1){moveXYZ(a,0,1,8-i);moveXYZ(a,2,1,8-i);}else if(kind==2){;}elsemoveXYZ(a,2,1,8-i);frame(a,v);}}const u8 rain_tab[]={0X00,0X84,0X01,0X00,0X00,0X01,0X02,0X44, 0X84,0X00,0X24,0X08,0X04,0X20,0X80,0X00, 0X00,0X20,0X00,0X00,0X20,0X00,0X40,0X00, 0X00,0X04,0X00,0X40,0X00,0X00,0X08,0X00, 0X40,0X00,0X10,0X00,0X00,0X04,0X04,0X11, 0X00,0X41,0X00,0X00,0X80,0X00,0X40,0X00,0X00,0X00,0X00,0X24,0X01,0X18,0X00,0X00,0X22,0X10,0X02,0X00,0X40,0X00,0X02,0X00};//下雨效果void LightCube::Rain(s8 down, s8 cycle_index, u8 speed) {u8 b[64] = {0};s8 x, z;if(down == 1) //落下{for(x = 0; x < 8; x++)b[x] = rain_tab[x];frame(b, speed);for(z = 1; z < 8; z++){moveXYZ(b, Z_AXIS, PULS, 1);for(x = 0; x < 8; x++)b[x] = rain_tab[z * 8 + x];frame(b, speed);}while(cycle_index--){for(z = 0; z < 8; z++){moveXYZ(b, Z_AXIS, PULS, 1);for(x = 0; x < 8; x++)b[x] = rain_tab[z * 8 + x];frame(b, speed);}}}else //上升{for(x = 0; x < 8; x++)b[56 + x] = rain_tab[x];frame(b, speed);for(z = 1; z < 8; z++){moveXYZ(b, Z_AXIS, MINUS, 1);for(x = 0; x < 8; x++)b[56 + x] = rain_tab[z * 8 + x];frame(b, speed);}while(cycle_index--){for(z = 0; z < 8; z++){moveXYZ(b, Z_AXIS, MINUS, 1);for(x = 0; x < 8; x++)b[56 + x] = rain_tab[z * 8 + x];frame(b, speed);}}}}//光立方上移void LightCube::Up(s8 num,s8 v){u8 a[64]={0};s8 X,Z;while(num--){for(X=0;X<8;X++)a[56+X]=0xff;frame(a,v);for(Z=1;Z<8;Z++){moveXYZ(a,2,0,1);for(X=0;X<8;X++)a[56+X]=0xff;frame(a,v);}for(Z=0;Z<8;Z++){if(num==0&&Z==7)continue; //结束本次循环,而不是终止整个语句的循环 moveXYZ(a,2,0,1);frame(a,v);}}for(Z=0;Z<7;Z++){moveXYZ(a,2,1,1);frame(a,v+0);}}//旋转条const u8 rotate_tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//00x00,0x01,0x06,0x08,0x10,0x60,0x80,0x00,0x00,0x00,0x01,0x0e,0x70,0x80,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0x0e,0x01,0x00,0x00,0x00,0x80,0x60,0x10,0x08,0x06,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x40,0x20,0x20,0x10,0x08,0x04,0x04,0x02,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x04,0x08,0x08,0x08,0x10,0x10,0x10,0x20,0x02,0x04,0x04,0x08,0x10,0x20,0x20,0x40//13};//面旋转,empty=1表示空心旋转,否则表示实心旋转 ,Clockwise=1表示顺时针旋转,否则表示逆时针旋转void LightCube::RotateFace(s8 empty, s8 Clockwise, s8 turns, u8 speed){u8 b[64] = {0};s8 i, x, z;while(turns--){if(Clockwise == 1)for(i = 13; i >= 0; i--){for(z = 0; z < 8; z++){for(x = 0; x < 8; x++){if(x>1 && x<6 && z>1 && z<6 && empty==1)b[z * 8 + x] = rotate_tab[i * 8 + x] & 0xc3;elseb[z * 8 + x] = rotate_tab[i * 8 + x];}}frame(b, speed);}elsefor(i = 0; i < 14; i++){for(z = 0; z < 8; z++){for(x = 0; x < 8; x++){if(x>1 && x<6 && z>1 && z<6 && empty==1)b[z * 8 + x] = rotate_tab[i * 8 + x] & 0xc3; elseb[z * 8 + x]=rotate_tab[ i * 8 + x];}}frame(b, speed);}}}const u8 tab_xuanzhuantiao[]={ //旋转条0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//00x00,0x01,0x06,0x08,0x10,0x60,0x80,0x00,0x00,0x00,0x01,0x0e,0x70,0x80,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0x0e,0x01,0x00,0x00,0x00,0x80,0x60,0x10,0x08,0x06,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x40,0x20,0x20,0x10,0x08,0x04,0x04,0x02,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x04,0x08,0x08,0x08,0x10,0x10,0x10,0x20,0x02,0x04,0x04,0x08,0x10,0x20,0x20,0x40//13};//旋转条const u8 tab_xuanzhuantiao2[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,//00X02,0X04,0X08,0X00,0X10,0X20,0X40,0X80,//0X04,0X08,0X00,0X10,0X20,0X20,0X40,0X80,//0X08,0X10,0X10,0X20,0X20,0X40,0X40,0X80,//0X10,0X10,0X20,0X20,0X20,0X40,0X40,0X80,//0X20,0X20,0X40,0X40,0X40,0X80,0X80,0X80,//0X40,0X40,0X40,0X40,0X80,0X80,0X80,0X80,//0X80,0X80,0X80,0X80,0X80,0X80,0X80,0X80,//70X80,0X80,0X80,0X80,0X40,0X40,0X40,0X40,//0X80,0X80,0X00,0X40,0X40,0X40,0X20,0X20,//90X80,0X80,0X40,0X40,0X20,0X20,0X10,0X10,//0X80,0X40,0X20,0X20,0X10,0X10,0X08,0X04,//0X80,0X40,0X20,0X10,0X08,0X08,0X04,0X02,//0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01,//14 0X80,0X40,0X20,0X10,0X0C,0X02,0X01,0X00,//15 0X80,0X40,0X30,0X0C,0X02,0X01,0X00,0X00,//0X80,0X60,0X18,0X06,0X01,0X00,0X00,0X00,//17 0XC0,0X30,0X0E,0X01,0X00,0X00,0X00,0X00,//0XE0,0X1C,0X03,0X00,0X00,0X00,0X00,0X00,//19 0XF0,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,//0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,//21 0X0F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,//22 0X07,0X38,0XC0,0X00,0X00,0X00,0X00,0X00,0X03,0X0C,0X20,0XC0,0X00,0X00,0X00,0X00,0X01,0X02,0X0C,0X30,0XC0,0X00,0X00,0X00,0X01,0X02,0X04,0X08,0X30,0XC0,0X00,0X00,0X01,0X02,0X04,0X08,0X10,0X60,0X80,0X00,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X01,0X02,0X04,0X08,0X10,0X20,0X20,0X40,0X01,0X02,0X04,0X08,0X08,0X10,0X20,0X20,0X01,0X02,0X04,0X04,0X08,0X08,0X10,0X10,0X01,0X01,0X02,0X02,0X04,0X04,0X08,0X08,0X01,0X01,0X01,0X02,0X02,0X02,0X04,0X04,0X01,0X01,0X01,0X01,0X02,0X02,0X02,0X02,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,//35 0X02,0X02,0X02,0X02,0X01,0X01,0X01,0X01,//36 0X04,0X04,0X02,0X02,0X02,0X01,0X01,0X01,0X08,0X08,0X04,0X04,0X02,0X02,0X01,0X01,0X10,0X10,0X08,0X08,0X04,0X04,0X02,0X01,0X20,0X10,0X00,0X08,0X08,0X04,0X02,0X01,0X40,0X20,0X10,0X08,0X08,0X04,0X02,0X01,0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01,0X00,0X80,0X40,0X20,0X18,0X04,0X02,0X01,0X00,0X00,0X80,0X40,0X38,0X04,0X02,0X01,0X00,0X00,0X00,0X80,0X60,0X1C,0X02,0X01,0X00,0X00,0X00,0X00,0X80,0X70,0X0E,0X01,0X00,0X00,0X00,0X00,0X00,0XC0,0X3C,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,//49 0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XF0,//50 0X00,0X00,0X00,0X00,0X00,0X03,0X1C,0XE0,0X00,0X00,0X00,0X00,0X03,0X0C,0X30,0XC0,0X00,0X00,0X00,0X01,0X06,0X18,0X20,0XC0,0X00,0X00,0X01,0X02,0X0C,0X30,0X40,0X80,};//面中心旋转,empty=1表示空心旋转,否则表示实心旋转,Clockwise=1表示顺时针旋转,否则表示逆时针旋转//turns执行次数; speed速度void LightCube::RotateFaceC(s8 num,s8 v){u8 a[64]={0};s8 i,j,k;while(num--)for(i=0;i<56;i++){for(j=0;j<8;j++)for(k=0;k<8;k++)a[j*8+k]=tab_xuanzhuantiao2[i*8+k];frame(a,v);}}//曲面旋转;Clockwise=1表示逆时针旋转,否则表示顺时针旋转void LightCube::RotateHookFace(s8 Clockwise, s8 turns, u8 speed){u8 b[64] = {0};s8 i, x, z;for(z = 0;z < 8; z++)for(x = 0;x < 8; x++)b[z * 8 + x] = rotate_tab[x];frame(b, 1);while(turns--) //主循环{if(Clockwise == 1)for(i = 13; i >= 0; i--){moveXYZ(b, Z_AXIS, PULS, 1);for(x = 0; x < 8; x++)b[x] = rotate_tab[i * 8 + x];frame(b, speed);}elsefor(i = 0; i < 14; i++){moveXYZ(b, Z_AXIS, PULS, 1);for(x = 0; x < 8; x++)b[x] = rotate_tab[i * 8 + x];frame(b, speed);}}for(i = 0;i < 7;i++){moveXYZ(b, Z_AXIS, PULS, 1);for(x = 0; x < 8; x++)b[x] = rotate_tab[x];frame(b, speed);}}//沙漏const s8 sandglass_tab00[]={ //从下往上0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,7,7,7,7,7,7,7,6,5,4,3,2,1,//281*8+1,1*8+1,1*8+1,1*8+1,1*8+1,1*8+1,1*8+2,1*8+3,1*8+4,1*8+5,1*8+6,1*8+6,1*8+6,1*8+6,1*8+6,1*8+6,1*8+5,1*8+4,1*8+3,1*8+2, //202*8+2,2*8+2,2*8+2,2*8+2,2*8+3,2*8+4,2*8+5,2*8+5,2*8+5,2*8+5,2*8+4,2*8+3, //123*8+3,3*8+3,3*8+4,3*8+4, //4+44*8+3,4*8+3,4*8+4,4*8+4,5*8+2,5*8+2,5*8+2,5*8+2,5*8+3,5*8+4,5*8+5,5*8+5,5*8+5,5*8+5,5*8+4,5*8+3, //126*8+1,6*8+1,6*8+1,6*8+1,6*8+1,6*8+1,6*8+2,6*8+3,6*8+4,6*8+5,6*8+6,6*8+6,6*8+6,6*8+6,6*8+6,6*8+6,6*8+5,6*8+4,6*8+3,6*8+2, //2056+0,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+1,56+2,56+3,56+4,56+5,56+6,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+6,56+5,56+4,56+3,56+2,56+1, //28};const s8 sandglass_tab10[]={ //从上往下 56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+1,56+2,56+3,56+4,56+5,56+6,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+6,56+5,56+4,56+3,56+2,56+1, //286*8+1,6*8+1,6*8+1,6*8+1,6*8+1,6*8+1,6*8+2,6*8+3,6*8+4,6*8+5,6*8+6,6*8+6,6*8+6,6*8+6,6*8+6,6*8+6,6*8+5,6*8+4,6*8+3,6*8+2, //20 5*8+2,5*8+2,5*8+2,5*8+2,5*8+3,5*8+4,5*8+5,5*8+5,5*8+5,5*8+5,5*8+4,5*8+3, //124*8+3,4*8+3,4*8+4,4*8+4,3*8+3,3*8+3,3*8+4,3*8+4, //4+4 2*8+2,2*8+2,2*8+2,2*8+2,2*8+3,2*8+4,2*8+5,2*8+5,2*8+5,2*8+5,2*8+4,2*8+3, //121*8+1,1*8+1,1*8+1,1*8+1,1*8+1,1*8+1,1*8+2,1*8+3,1*8+4,1*8+5,1*8+6,1*8+6,1*8+6,1*8+6,1*8+6,1*8+6,1*8+5,1*8+4,1*8+3,1*8+2, //20 0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,7,7,7,7,7,7,7,6,5,4,3,2,1, //28 };//移动距离const s8 sandglass_tab01[]={//移动距离0,1,2,3,4,5,6,7,7,7,7,7,7,7,7,6,5,4,3,2,1,0,0,0,0,0,0,0, //28 1,2,3,4,5,6,6,6,6,6,6,5,4,3,2,1,1,1,1,1, //202,3,4,5,5,5,5,4,3,2,2,2, //123,4,4,3,3,4,4,3, //4+42,3,4,5,5,5,5,4,3,2,2,2, //121,2,3,4,5,6,6,6,6,6,6,5,4,3,2,1,1,1,1,1, //200,1,2,3,4,5,6,7,7,7,7,7,7,7,7,6,5,4,3,2,1,0,0,0,0,0,0,0, //28};//沙漏void LightCube::Sandglass(s8 v){u8 b[64]={0};u16 i;for(i=0;i<128;i++) //点{b[sandglass_tab00[i]]=(0x01<<sandglass_tab01[i]);frame(b,v);b[sandglass_tab00[i]]=0;}for(i=0;i<128;i++)//8点{b[sandglass_tab10[i]]|=(0x01<<sandglass_tab01[i]);if(i>=8)b[sandglass_tab10[i-8]]^=(0x01<<sandglass_tab01[i-8]);//^表示异或 frame(b,v);}b[7]|=0x01;b[0]=0x01;frame(b,v);for(i=1;i<128;i++) //线{if(i<8)b[8-i]=0;b[sandglass_tab00[i]]|=(0x01<<sandglass_tab01[i]);frame(b,v);}frame(b,100);for(i=0;i<128;i++) //线{b[sandglass_tab10[i]]^=(0x01<<sandglass_tab01[i]);//^表示异或frame(b,v);}}const u16 water_tab[]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0080,0x0000,0x0000 ,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0220,0x0140,0x0080,0x0000 ,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01c0,0x0220,0x0410,0x0410,0x0410,0x0220,0x01c0 ,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03e0,0x0410,0x0808,0x0808,0x0808,0x0808,0x0808,0x0410 ,0x03e0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07f0,0x0808,0x1004,0x1004,0x1004,0x1004,0x1004,0x1004,0x1004 ,0x0808,0x07f0,0x0000,0x0000,0x0000,0x0000,0x0ff8,0x1004,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002 ,0x2002,0x1004,0x0ff8,0x0000,0x0000,0x1ffc,0x2002,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001 ,0x4001,0x4001,0x2002,0x1ffc,0x0000};//一个水滴void LightCube::WaterOne(s8 x, s8 y, u8 speed){u8 b[64]={0};s8 i, r;b[0 * 8 + x] = 0x01<<y;frame(b, speed);for(i = 0; i < 7; i++) //下落{b[(i + 1) * 8 + x] = b[i * 8 + x];b[i * 8 + x] = 0;frame(b, speed);}for(r= 0; r < 7; r++){for(i = 0; i < 8; i++)b[ 7 * 8 + i] = water_tab[r * 16 + 7 - x + i] >> (7 - y);frame(b, speed + 5);}//扩散}//两个水滴void LightCube::WaterTwo(s8 x1, s8 y1, s8 x2, s8 y2, u8 speed){u8 b[64] = {0};s8 i, r;b[0 * 8 + x1] = 0x01 << y1;frame(b, speed);for(i = 0; i < 7; i++){moveXYZ(b, Z_AXIS, PULS, 1);if(i == 1){b[0 * 8 + x2] = 0x01<<y2;}frame(b, speed);}for(r = 0; r < 9; r++){if(r < 2)moveXYZ(b, Z_AXIS, PULS,1);elsefor(i = 0; i < 8; i++)b[7 * 8 + i]=water_tab[(r - 2) * 16 + 7 - x2 + i] >> (7 -y2);if(r < 7)for(i = 0; i < 8; i++)b[7 * 8 + i]|=(water_tab[r * 16 + 7 - x1 + i] >> (7 - y1));frame(b, speed + 5);}}//三个水滴void LightCube::WaterThr(s8 x1, s8 y1, s8 x2, s8 y2, s8 x3, s8 y3, u8 speed) {u8 b[64] = {0};s8 i, r;b[0 * 8 + x1] = 0x01 << y1;frame(b, speed);for(i = 0;i < 7; i++){moveXYZ(b, Z_AXIS, PULS, 1);if(i == 1)//第二点b[0 * 8 + x2] = 0x01 << y2;if(i == 3)b[0 * 8 + x3] = 0x01 << y3; //第三点frame(b, speed);}for(r = 0; r < 11; r++)//扩散{if(r < 4)moveXYZ(b, Z_AXIS, PULS, 1);if(r < 11 && r >= 4)for(i = 0; i < 8; i++)b[7 * 8 + i] = water_tab[(r - 4) * 16 + 7 - x3 + i] >> (7 -y3);if(r<9 && r>=2)for(i = 0; i<8; i++)b[7 * 8 + i] |= water_tab[(r - 2) * 16 + 7 - x2 + i] >> (7 - y2);if(r < 7)for(i = 0; i<8; i++)b[7 * 8 + i] |= (water_tab[r * 16 + 7 - x1 + i] >> (7 - y1));frame(b, speed + 5);}}//动画驱动函数Animation,)//num表示帧数,n表示循环次数void LightCube::Animation(const u8 *ARRAY_tab,u8 frame_num,u8 cycle_index,u8 speed){s8 i, j;u8 b[64]={0};for(j = 0; j<64; j++)b[j] = ARRAY_tab[j] ;frame(b,speed);while(cycle_index--){for(i=1;i<frame_num;i++){for(j = 0; j<64; j++)b[j] = ARRAY_tab[i*64 + j] ;frame(b,speed);}}}void LightCube::PrintOpen(u8 speed){u8 x, y;u8 b[64] = {0};for(y = 0; y<8; y++){b[0] |= 0x01<<y;frame(b,speed-3);}for(x = 1; x<8;x++){b[x]=0xff;frame(b,speed);}//从上向下打印void LightCube::Print(const u8 *ARRAY_tab) {u8 p;s8 x, y, z;u8 b[64] = {0}, c[8] = {0};for(x = 0; x<8; x++)b[x] = 0xff;for(x = 0; x<8; x++) //行切换 {c[x] = ARRAY_tab[x];for(y = 0; y<8; y++) //点的确定 {p = c[x] & (0x01<<y);if(p){for(z = 1; z<7; z++){if(z==1){b[8 * z + x] = p;frame(b, 1);}else{b[8 * (z - 1) + x] = 0;b[8 * z + x] = p;frame(b, 1);}}b[48 + x] = 0;b[56 + x] |= p;frame(b, 4);}}}frame(b, 40);for(y = 0; y<8; y++){for(x = 0; x<8; x++)b[56 + x] = b[56 + x]>>1;frame(b, 10);}const u8 fan_tab[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, //0 0x40,0x40,0x40,0x40,0x80,0x80,0x80,0x80,0x20,0x20,0x40,0x40,0x40,0x40,0x80,0x80,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x08,0x08,0x10,0x20,0x20,0x40,0x80,0x80,0x04,0x08,0x08,0x10,0x20,0x40,0x40,0x80,0x02,0x04,0x08,0x10,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, //7 0x00,0x01,0x02,0x04,0x18,0x20,0x40,0x80,0x00,0x00,0x01,0x06,0x08,0x10,0x60,0x80,0x00,0x00,0x00,0x01,0x06,0x18,0x60,0x80,0x00,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0x00,0x00,0x03,0x3c,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff, //14 };const u8 connect_one_tab[]={0XFF,0X81,0X81,0X81,0X81,0X81,0X81,0XFF,0XFF,0XFF,0Xc3,0Xc3,0Xc3,0Xc3,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0X1F,0X3F,0X7F,0XFF,0XFF,0XFE,0XFC,0XF8,0X0F,0X1F,0X3F,0X7E,0XFE,0XFC,0XF8,0XF0,0X07,0X0F,0X1F,0X3E,0X7C,0XF8,0XF0,0XE0,0X03,0X07,0X0E,0X1C,0X38,0X70,0XE0,0XC0,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,//10 };void LightCube::ConnectThree(u8 speed){u8 b[64] = {0};u8 i, x, z;for(z = 0; z < 8; z++)for(x = 0; x < 8; x++)b[z*8 + x] = 0X80;frame(b, 2);for(i = 0; i<3; i++){for(x = 0; x < 8; x++){b[i*8 + x] = 0X00;b[(7-i)*8 + x] = 0X00;}frame(b, speed);}for(x = 0; x < 8; x++)b[4 * 8 + x] = 0X00;frame(b, speed);for(x = 0; x < 3; x++){b[3 * 8 + x] = 0X00;b[3 * 8 + (7 - x)] = 0X00;frame(b, speed);}b[3 * 8 + 3] = 0X00;frame(b, speed);b[3 * 8 + 4] = 0X00;frame(b, speed + 10);}void LightCube::ConnectFour(u8 speed) {u8 b[64] = {0};u8 x, z;s8 i = 7, j;for(z = 0; z < 8; z++)for(x = 0; x < 8; x++)b[z*8 + x] = rain_tab[z*8+x];frame(b, 1);while(i--){for(x = 0; x < 8; x++)b[x] = (b[x] | b[8 + x]);for(z = 1; z < 8; z++)for(x = 0; x < 8; x++)b[z*8 + x] = b[(z + 1) * 8 + x]; for(x = 0; x < 8; x++)b[56 + x] = 0x00;frame(b, speed);}for(j = 0; j < 8; j++){for(x = 0; x < 8; x++)b[x] |= 0x01<<j;frame(b, speed);}for(j = 0 ;j < 13; j++){if(j < 7)for(x = 0;x < 8; x++){b[(j + 1) * 8 + x] = 0x80;b[x] <<= 1;}elsefor(x = 0 ; x < 8 ; x++){b[ 7 * 8 + x] |= 0x80>>(j-6);b[( j - 7 ) * 8 + x] = 0;}frame(b, speed);}}void LightCube::ConnectFive(u8 speed){u8 b[64] = {0};u8 i;s8 x;for(x = 0;x < 8; x++)b[7 * 8 + x] = 0xFF;for(i = 0 ;i < 7; i++){for(x = 0;x < 8; x++){b[(6-i) * 8 + x] = 0x80;b[56 + x] <<= 1;}frame(b, speed);}}//frame_num表示帧数,cycle_index表示循环次数,speed表示速度void LightCube::ConnectSix(const u8 *ARRAY_tab,u8 frame_num,u8 cycle_index,u8 speed){s8 i, j;u8 b[64]={0};for(j = 0; j<64; j++)。

光立方制作+程序讲解

光立方制作+程序讲解

光立方教程今天,给大家带来光立方的制作教程,基于本人制作的经验,给各位想要做的朋友分享制作过程。

对于第一次制作的朋友,我们要先制作好一个日程表,如下图:我们要弄好一个计划,就好像单片机运行程序一样。

当然,废话少说。

接下来,我们需要一份购买材料的清单如上图所示,我们需要购买的万能板需要购买18*30的规格。

这样子才有足够的空间去安装我们的电子元件。

首先,我们需要用万能板作为骨架,每2cm*2cm就要焊接一个排针,上下左右间隔一样。

不过对于初学者来说,一次性焊接64颗排针有点困难,所以我们需要用胶布把每一颗排针固定好,然后上焊,当然这是一个快捷的方法,也适合所有的初学者当我们把排针固定好后,我们只需要把板子翻过来焊接就可以了。

接下来,我们要把每一颗led灯折弯后侧着放置在排针中。

从左到右,从上至下的安放,安放好后,我们只需要把他们的脚焊接即可。

折弯时记住使用镊子折弯。

效果图如下图所示显而易见,这是非常需要考焊功的活,各位制作时候要注意节点与节点之间的间距,并且注意焊点不要点太多的锡,会影响做出来的效果与美观。

接下来,我们把弄好的8排led插在万能板上,注意:我们要注意每排之间的间隔。

下一步,我们需要在把每排led的共阴极连接在一起,一共8层,每层都要连接好,当我们把每层连接好后,我们要在每层的末端或者初始端接一条输出线,作为共阴极连接UNL2803。

当然,我们连接UNL2803的前提是先把芯片接好。

小编我直接把芯片焊接在板子上,这种方法对于初学者来说不可取,需要弄芯片底座,不然芯片烧掉了就很难拆下来了。

接下来我们要按照电路图接线路了(是不是很开心,终于可以接线路了,好戏在后头),下面是74HC573集成电路的接法:首先我们先分析一下原理图:74HC573的1D~8D都连接在一起,然后再接到单片机的P0.0~P0.7端口;1Q~8Q分别连接每排的共阳里,就是焊接在电路板上的光立方引脚;至于LE要分别接到单片机的P2.0~P2.7。

光立方教程(含HEX烧录文件)

光立方教程(含HEX烧录文件)

先上效果图首先,准备材料和工具。

材料:1, 雾面蓝色(喜欢其他色的随意)LED (3MM 或者5MM 都行),最好是雾面LED ,不懂得购买的时候跟老板说清楚就ok~2,STC12C5A60S2单片机一片3,DIP-40的插座一个4,22.1184MHZ晶振一个5,单排圆孔插针座20个(建议多准备些)6,单排插针4个7,USB母座一个8,0.3--0.8镀锡铜线一米左右,没有的也行,根据自己的焊接习惯。

个人比较喜欢镀锡铜线。

工具1,剪线钳2,尖嘴钳3,电烙铁4,焊丝5,松香6,镊子7,其他(总之就是焊接用的那些了,根据个人情况。

)———————————分割线———————————首先,电路图很简单了电路图很简单,稍微有点单片机基础都可以做。

然后呢,开动你灵活的小左和小右吧~准备绘制焊接图纸。

首先,确定你要做多大尺寸的光立方,4*4*4也就是64个灯,个人感觉做成7厘米见方左右就差不多了。

根据个人喜好调节吧~大小具体怎样确定呢,二少在这里简单说明一下,每一边是4个灯,也就是三个灯距,灯距的三倍加两个灯宽就是边长了。

灯距的确定,不是随便确定的,必须是2.54毫米的整数倍,为什么呢,因为洞洞板的孔距就是2.54,最后的灯是插在洞洞板上的。

本教程所定的灯距是4倍的孔距,也就是10毫米挂点,小误差这里就可以忽略了。

OK~根据灯的情况,确定洞洞板的大小,最少得是20孔,因为单片机用的是DIP40的,所以至少要保证单片机可以安装,当然高手还可以立式安装单片机,二少在这里就不多介绍了。

确定以上参数后,好了,开始制作吧~我这边手头有的洞洞板是19*23孔的,所以嘛~单片机就有俩引脚是悬空的,不过不影响。

焊接电路,(绘制软件,layout)然后,确定单片机和LED灯体的安装位置。

并做简单标注。

用尖嘴钳把插针掰成一个一个的,直接焊接于绿色的焊盘位置,4*4+4个。

如下图效果单片机最好安装在座子上,直接焊接死亡率较高。

制作CUBE8光立方

制作CUBE8光立方

制作CUBE8光立方(3D立方体LED显示器)作者杜洋来源《无线电》杂志浏览2270发布时间2012-04-12何为CUBE8光立方没错,CUBE8光立方,与北京奥运会无关。

如本文题图所示,CUBE8是一个长、宽、高由8×8×8个LED灯组成的真实3D立方体显示器。

其最大的特点,就是带给你未来3D技术的科技体验。

光立方并非我的首创,在网上早有光立方的视频。

许多电子爱好者,看过这些视频之后,都会被其超酷的3D显示效果所震撼,我就是其中之一,于是我也想仿制一个玩玩。

在网上搜索了大量相关资料后,我却发现,网上各种版本的光立方的制作方法都很复杂,不仅需要很强的动手能力来组装512个排列整齐的LED和金属支架,还需要有足够的耐心设计一大堆单片机和驱动芯片,最后还要为硬件成品设计显示程序,好让光立方动起来。

这样看来,不是高级焊接技师兼资深单片机工程师的“小菜”们,想制作出一个拿得出手的光立方,还不如直接购买我精简设计的光立方套件。

对,我要为电子制作爱好者设计一款只许极少元器件、制作简单、能让初学者也可以制作出来的规范、美观的光立方套件。

当我这么想的时候,我那天马行空的大脑开始运转,在想像力的世界里设计着前所未有的光立方。

首先这个光立方必须制作简单,简单到整机只有一个芯片。

然后要保证制作美观,将动手能力导致的美观差异降到最低。

在保证以上两点的情况下,如果还可以让它的功能强大,且有爱好者自由发挥的空间,那么我的光立方将会是一个完美的设计——至少我自己这样认为。

功能方面,它除了要能显示3D图形,还需要有多级亮度和速度调整,最好可以有音频显示功能,像DIS.MUSIC21音乐显示器一样。

当然,还要为单片机爱好者设计一个用户自定义图形功能,连接普通的单片机就可以显示出爱好者自己编写的图形。

这样,不仅让光立方的显示更丰富,而且从中又锻炼了爱好者的3D编程能力。

最后,还要用高质量的设计、材料和生产工艺,让品质对得起硬件的精简设计。

光立方设计

光立方设计
CUBE8
光立方
Include
架构
原理 组装制作
3D编程 实现效果 改进创新
3D光立方原理
8*8*8 3D光立方如右 图所示:每个面64个灯,共有 8层。只要控制这64个灯使其 能够自由变换,然后再通过控 制每层依次点亮即可,由于我 们眼镜的视觉暂留,使我们感 觉看到的东西是一起亮的。这 样我们就可以看到了一个完整 的个体。
3D光立方设计本身技 术并不复杂,但是也不是 很简单,更多的是需要耐 心
64束/每层
设计电路
学过点阵都知道,如果要 控制8*8点阵,需要16个引脚, 那么有8个8*8点阵,就要用8 个引脚来充当各个8*8点阵的 “开关”即可。电路的基本原 理就知道了。那么如何让一个 引脚来当64个灯的“总开关” 呢?
1个
12 音频线 3.5mm 立体声 1 条
13 miniUSB 线
1条
说明 底板、立板各1 片 扁平长引脚式 LQFP48 贴片封装 制作呼吸灯
滤波电容 1.5m 长 MiniUSB 转USB-A,1.5m 长
焊接
需要说的是,一定注 意每个灯的焊接时间和焊 接齐度,焊接整齐度直接 影响整个制作效果。
只要将64个灯阳极或阴极 连在一起,再接到这个引脚上 即可。
还有个问题:那就是如何 用16个引脚来控制这64个等 的另外64个引脚呢?
采用HC573暂存的方法,来 分别把64个灯的亮灭信息储存,然后 再一起输出到灯上,这样通过查询相应 芯片的型号可以确定基本电路。
电路原理
573的64个输出引脚控 制前面所述每一个面的64 个灯。
每一层的二极管是共 阴的。连在一起的是阴极。
焊接如右图所示。
3D编程
CUBE8 两个独特优势:

3D光立方制作详解

3D光立方制作详解

3D cube 光立方制作详解原理部分LED立方体是一个非常受欢迎的项目,而大小可以从3x3x3上升到10x10x10采用RGB LED。

很早以前,就有相关的视频资料,在国内各大视频网站出现,样式绚丽,也一直有很多玩家想做,对于这个东西来说,本身技术不是很复杂,也不是很简单,更多的是需要耐心。

本资料详细介绍了3D CUBE8 (LED立方体)的制作过程,通过本资料可轻松打造一个属于自己的光立方。

下面我就来详解一下如何打造一个属于自己的光立方。

拿8*8*8的光立方来说:我们可以拆分为8个面每个面64个灯;我只要控制这64个灯使其能够自由变换,然后再通过控制每个层依次点亮即可,由于我们眼睛的视觉暂留,使我们感觉看到的东西是一起再亮的。

这样我们就看到了一个完整的个体。

理解了原理;我们来设计电路;大家都知道,如果要控制8*8点阵,需要16个引脚,那么有8个8*8点阵,我再用8个引脚来当充当各个8*8点阵的“开关”即可。

那么我们的电路设计的基本原理知道了。

如何让一个引脚来当64个灯的“总开关”呢?只要将64个灯阳极或阴极连在一起,在连到这个引脚上即可。

那么如何用16个引脚来控制这64个灯的另外64个引脚呢?我采用了hc573暂存的方法,来分别把64个灯的亮灭信息存到这个上面,然后再一起输出到灯上,这样我们通过查询相应芯片的型号可以确定基本电路。

电路部分立方体的控制器是基于一个单片机ATMega32,573的64个输出引脚控制前面所述每一个面的64个灯;而场效应管控制每一个层,一般的都是用uln2803.焊接部分这里需要说的是,一定注意每个灯的焊接时间,和焊接整齐度,焊接整齐度直接影响整个制作效果。

每一层的二极管是共阴的。

我的方法是用一个木头板按照规则,扎64个孔然后把灯放到上面,一个一个焊接起来这样可以保障每一层的灯位置都是一样的而且各个灯之间排列是规则的。

最后通过架设支撑架的方式把各个层架起来,然后用电烙铁焊接起来。

光立方DIY制作(上篇)实测版

光立方DIY制作(上篇)实测版

光立方的制作——8*8*8,2803+573层共阴,束共阳方案经过近两个月断断续续的整理与制作,自己第一个比较满意的光立方终于出炉了。

回想起这两个月,尽是蛋疼与蛋碎。

闲话少说,直接步入正题。

①【材料准备】首先便是材料的准备,建议去淘宝网上购买(至少我是在淘宝上买的),材料直接影响到光立方的硬件制作,因此一定要细心耐心进行选材。

以下是材料清单:01、LED灯珠,最好选择长脚5mm,雾状(乳状)蓝色的灯珠,效果更好。

记住,长脚的,不要短脚的,3mm的也可以,当然也能自己换喜欢的颜色,仅仅是推荐蓝色。

(话说我就是短脚的,结果效果很不好。

)价格在70-90元一包,一包1000个,店家不会散卖的。

02、74HC573,8个,记得要1-2元左右的,太便宜的可能是用过返新的,IC芯片都是一分钱一分货,便宜的全是旧的,别老想着贪便宜。

(建议买十个,多买两个以备特殊情况。

)03、UNL2803,1个,这个便宜,要0.5-1.5元的就行,同样建议买俩。

04、IC座,9个,不过一般商家不会单卖,一卖就得卖10或15个,这个可以多买点,记得买20P的。

一般0.2-0.6元一个。

05、焊接飞线,自己有导线也行,一定要结实耐用,准备10米,一定要多准备,我仅仅焊接一个9cm*12cm 的驱动板就用了6米的飞线。

06、电阻,基本上100-500欧都可以,我用的是220欧的,用来接在UNL2803上,给LED分压。

不过最好是100欧的,其实2803不加电阻也完全可以。

一般都是卖一包,很稍有单卖的,一包12-18元,买精度低的就行,精度低的便宜,12-15左右。

07、排针,用来焊接,这个就不多说了。

0.5元一排,40个。

08、杜邦线,8p的4个,2p的1个,建议多买点,以备不时之需。

0.25元一根,记得买30cm的,短的不好使,8p的一般0.8-1.2元。

09、3节一体的电池盒,用于装3节5号南孚电池。

1.2-2元。

10、南孚电池,一板,5号的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CUBE8是一个长、宽、高由8×8×8个LED灯组成的真实3D立方体显示器。

其最大的特点,就是带给你未来3D技术的科技体验。

光立方并非我的首创,在网上早有光立方的视频。

许多电子爱好者,看过这些视频之后,都会被其超酷的3D显示效果所震撼,我就是其中之一,于是我也想仿制一个玩玩。

在网上搜索了大量相关资料后,我却发现,网上各种版本的光立方的制作方法都很复杂,不仅需要很强的动手能力来组装512个排列整齐的LED和金属支架,还需要有足够的耐心设计一大堆单片机和驱动芯片,最后还要为硬件成品设计显示程序,好让光立方动起来。

这样看来,不是高级焊接技师兼资深单片机工程师的"小菜"们,想制作出一个拿得出手的光立方,还不如直接购买我精简设计的光立方套件。

对,我要为电子制作爱好者设计一款只许极少元器件、制作简单、能让初学者也可以制作出来的规范、美观的光立方套件。

当我这么想的时候,我那天马行空的大脑开始运转,在想像力的世界里设计着前所未有的光立方。

首先这个光立方必须制作简单,简单到整机只有一个芯片。

然后要保证制作美观,将动手能力导致的美观差异降到最低。

在保证以上两点的情况下,如果还可以让它的功能强大,且有爱好者自由发挥的空间,那么我的光立方将会是一个完美的设计--至少我自己这样认为。

功能方面,它除了要能显示3D图形,还需要有多级亮度和速度调整,最好可以有音频显示功能,像DIS.MUSIC21音乐显示器一样。

当然,还要为单片机爱好者设计一个用户自定义图形功能,连接普通的单片机就可以显示出爱好者自己编写的图形。

这样,不仅让光立方的显示更丰富,而且从中又锻炼了爱好者的3D编程能力。

最后,还要用高质量的设计、材料和生产工艺,让品质对得起硬件的精简设计。

用炫酷、连贯、有节奏的图形效果,让显示效果对得起高品位要求的观众。

这么经典的设计,需要一个简洁、响亮的名字,立方体的英文单词是Cube,又因为我要制作8×8×8的3D显示阵列,所以综合得名--CUBE8光立方。

黑色镜面镀金PCB板和高亮蓝光雾面LED灯【特点介绍】# 8×8×8LED阵列3D光立方体显示器。

# 独家精简设计方案,电路简洁,功能强大。

# 黑色镜面PCB、全镀金焊盘和LOGO,全面高端品质。

# 高亮蓝色雾面LED灯,达到光立方最佳视觉效果。

# 连贯图形显示效果,浑然一体,一气呵成。

# 混合式触摸电源和模式按键,操作更稳定。

# 电源具有常开、常关、光线自动控制方式。

# 显示模块有快速、中速、慢速三挡设置。

# 4挡亮度的夜灯模式,可营造你的室内气氛。

# 2种音频显示模式,可随音频同步显示,给你炫酷体验。

# 具有"精简I2C"接口,全开放式用户自定义操控。

# 创新设计的LED阵列制作模板,让LED阵列制作简单快速。

开始制作把想像变成现实是一个漫长而艰难的过程,我的团队耗时3个月才完成了CUBE8的开发,光设计工作就花了1个月的时间。

当然,哪个产品都是费时费力才完成的,所以我没有必要在文章里大述甘苦。

既然我们已经完成了,那就秀一下成果吧。

在开始阅读和制作之前,请你做好心理准备,因为制作的过程极具创意和启发。

只要你是一名狂热的电子爱好者,你的热情将会被CUBE8光立方的创新设计所激发。

所需元器件序号名称型号数量说明1PCB黑色镜面镀金2片底板、立板各1片2LED灯高亮蓝色雾面512个扁平长引脚式3单片机STC12C5A60S21片LQFP48贴片封装4白光LED0805贴片1个制作呼吸灯5转接针孔军品镀金128个63M脚垫6个7双排排孔80PIN1条8双排弯针80PIN1条9MiniUSB接口贴片式1个10光敏电阻5506型1个11电容0.1μF1个滤波电容12音频线3.5mm立体声1条1.5m长13miniUSB线1条MiniUSB转USB-A,1.5m长14音频分线器*一分二1个(选配元器件,可根据实际情况选择或舍去) 15USB电源*5V1个(选配元器件,可根据实际情况选择或舍去)PCB细节第1步:焊接单片机CUBE8采用了精简设计,所以核心电路部分只有一个单片机和一个滤波电容,我想不会有比这再简单的电路设计了吧。

在制作CUBE8的过程中,首先要完成的就是核心电路部分,它的品质直接关系到整个制作。

CUBE8使用的单片机是LQFP48贴片封装的,体积很小,也为焊接带来了一定的难度。

焊好后,用黑色绝缘胶带把芯片和电容包好,即美观又安全。

第2步:焊接排孔把套件中双排排孔插入PCB 底板的正面,PCB 底板的背面焊接引脚。

第3步:焊接LED 呼吸灯这个贴片式呼吸灯也算是CUBE8的一个创新设计了。

在PCB 上打一个孔,然后把贴片LED 塞进去。

不破坏PCB 正面的整洁效果,又可以照亮孔周围的PCB,让它更漂亮。

第4步:焊接光敏电阻和miniUSB 接口第5步:焊接弯排针到立板上在立板上焊接弯排针是需要一些技巧的。

因为我在设计之初就希望立板的正面是不挂锡的,所以必须从背面焊接。

但实际制作中发现,从立板正面焊接也是可以的,对美观的影响不大。

第6步:焊接转接针孔转接针孔是为了方便LED 阵列拆装而设计的,因为是重要的接插件,我特意定做了镀金材质的,正好可以和镀金的PCB 相得益彰。

将立板和底板共128个转接针孔插入正面,在背面加锡焊接。

第7步:贴3M 脚垫这里我选用的是3M 高粘合度透明脚垫。

大家可能感觉脚垫是一个不起眼的东西,可是不好的脚垫容易脱落,有时还会有高低不平的情况。

所以脚垫的质量也要对得起整机的高品质。

第8步:将立板插到底板上贴好了脚垫,就可以组合立板和底板了。

将立板的正面朝前,排针、排孔对齐,插到底板上。

保证两板之间不能有缝隙(或缝隙很小),两板呈90°垂直。

第9步:使用模板制作LED 阵列这是CUBE8最关键的组件。

我们需要8片8×8的LED 阵列,可以按照图上的样式来手工制作,但是这样做出来的LED 阵列很不规范,而且耗费时间。

我之前说过,CUBE8一定要是规范化、简单易制的,为此我开发出一款很有创意的模板(至少用过模板的人都说有创意)。

使用这个创新模板可以在5~8个小时内快速完成制作,而且完成的LED 阵列都是规范统一的样子,几乎不受焊接水平的影响。

第10步:插接LED 阵列纵向把8片LED 阵列插入转接针孔里,插好后适当地调整一下阵列间的距离。

CUBE8主体部分制作完成第11步:制作音频和USB 电源复用线制作完CUBE8的主体部分之后,我们还需要一条混合功能的USB 线。

当然,如果你不想使用音频显示功能,可以直接用一条普通的miniUSB 连接线来给CUBE8供电。

如果想使用音频显示功能,就要跟着我做了。

按照"USB 接口扩展音频功能电路原理图"上的接线方法,把音频线和miniUSB 线焊接在一起,用绝缘胶带包好,最后用热缩管密封。

第12步:插好接口把miniUSB接口接在CUBE8上,USB-A接口插在USB电源适配器或电脑的USB接口上,使用音频分线器将音频线与音响的音频输入线并联。

到此为止,仅12步就完成了CUBE8的所有制作。

接通电源,白色LED灯开始呼吸,轻触呼吸灯下方的电源键,CUBE8闪亮登场。

呼吸灯效果使用简介非常好,CUBE8在运行,一个真实的3D魔方。

我们可以通过2个触摸按键来操作CUBE8,使用方法非常简单。

开机:在待机状态下(呼吸灯状态下)按下电源键(左侧),就可以开机了。

需要注意的是,CUBE8采用了混合式触摸按键技术,即电平式触摸和电容式触摸,同时检测触摸操作。

这样做既解决了电平式触摸抗干扰能力差的问题,又解决了电容式触摸没有碰到就动作的问题。

所以,CUBE8的混合式触摸按键需要用一点力按下去才会动作,有一点像电阻式触摸屏的感觉。

电源键、菜单键、3号键的操作方法功能选择:按电源键开机,系统会先进行简易的三轴坏点扫描,然后就会弹出菜单。

菜单有1(慢速图形)、2(中速图形)、3(快速图形)、A(音频显示)、N(夜灯模式)、U(用户自定义模式)共6个项目。

通过按菜单键循环切换,调到欲进入的菜单项时,等待2秒钟就可以进入了。

在图形显示、音频显示、夜灯模式和用户自定义模式中按菜单键,都可以跳回到菜单选择界面。

需要注意的是,在CUBE8没有连接用户自定义功能板的时候,U 的菜单项是隐藏的。

菜单显示效果图形显示模式:系统自带的图形显示模式有慢、中、快三种速度,分别对应1、2、3这三个菜单项。

慢速显示可以配合一些轻音乐,中速可以配合流行音乐,快速可以配合摇滚乐等。

选择正确的速度、配合正确的背景音乐,可以达到非常炫酷的显示效果。

如果你只是想把CUBE8当作家居的摆设来配合"静音",那我建议你用慢速显示就可以了。

我实验过,效果不错。

CUBE8系统自带的图形可不一般哦,因为长达数分钟的图形都是连续不间断的。

如果把之前网上已有的光立方显示效果比成一张张切换的图片的话,那CUBE8的图形效果就是一部电影(至少是一部小成本DV电影)。

图片是突然切换的,两张之间没有任何联系--刚刚还是一个球,突然就变成方块了。

CUBE8的图形带给你的是一气呵成的效果,每两个效果之间是有巧妙的转场的,使显示的节奏连贯。

另外,CUBE8的显示还是由点到线、由线到面、由简单到复杂的推进过程。

好像电影一样,有前奏、有高潮、有尾声。

图形显示效果音频显示模式:如果你想让CUBE8更直接地配合音乐,那么音频显示模式将是你的不二选择。

接好音频输入线,进入到菜单A项,LED阵列的最下边的一面常亮,这是基准显示。

当音乐响起,LED阵列就会以波形的方式显示音频。

这时可以按3号键来切换到柱形显示方式。

所谓的3号键,就是先按住菜单键不放,再去按电源键。

按3号键可以在波形和柱形显示方式之间切换。

CUBE8的音频显示中同样使用了DIS.MUSIC3音乐显示器程序中所使用的自动增益控制功能,不用担心音量过小而使音柱不能到顶,也不用担心音量过大而使音柱一直在顶端不下来。

CUBE8会监测音量变化,自动呈现最佳显示效果。

夜灯模式:进入到菜单N项即是夜灯模式,夜灯模式就是512个LED灯全亮,在夜间营造一种浪漫的气氛,给你的房间带来一份温馨。

可以通过按3号键切换4挡的夜灯亮度。

用户自定义模式:在连接好用户自定义板的前提下,进入到菜单U项,就可以发挥你的天才想象力,编写属于你自己的图形了。

在本文的最后,我将重点介绍这一功能。

光控模式:在待机状态下按下菜单键(右侧),LED阵列上会流动显示"AUTO"字样,就进入了光控模式。

光控模式的作用是在环境光线较暗的时候,CUBE8自动进入待机状态,而不会打扰你夜间休息。

相关文档
最新文档