基金项目结题报告□自然科学□社会科学项目名称:跟着音乐“跳舞”的光立方起止年月:2012.10~2013.05目录-1-摘要..............................................2第一章光立方的制作...............................31.1光立方概述............................................31.2LED灯的选用...........................................31.3光立方的焊接...........................................4第二章模块设计...................................82.1总体方案选择..........................................82.2主控的最小系统........................................82.3光立方控制模块........................................92.4OTL音频功放模块......................................102.5串口通信模块.........................................10第三章软件开发...........................................123.1光立方的动态显示.....................................123.2上位机...............................................133.3FFT运算..............................................13第四章结束语..............................................17摘要-2-一般的LED点阵都是平面的,比如一个字就是16*16点阵,而光立方属于LED立体阵列,是在多个等间距的平面再组合成一个立方体。其一般都是由一个长、宽、高为8*8*8或16*16*16的LED灯组成的立体显示器,属于3D显示技术的一种。其最大的特点就是超炫的显示效果给人一种真实的视觉冲击效果,带给你未来3D技术的科技体验,让我们的生活充满了美感。本项目通过打造一个8*8*8的光立方,使用Atmega16单片机通过控制不同立体位点的LED灯的亮灭,实现各种立体显示效果。而立体显示效果是通过对音乐的采集,经过快速傅里叶运算FFT得到的不同音高和频率来控制的,随着音乐的不同旋律,就会显示相应的各种效果,给人一种光立方在随着音乐“舞动”的视觉享受,是家居装饰和送人礼物的很好选择。本项目要求显示效果要求能依音乐的改变而改变,给人一种随着音乐“跳舞”的感觉。通过设计多种多样的显示效果,给人一种绚丽多彩的效果。而LED数量的巨大和空间立体的布局以及对显示效果的整齐划一,都对单片机的编程提出了较高的要求。关键词:光立方,FFT,Atmega16第一章光立方的制作-3-1.1光立方概述我们通过平时常见的LCD1602、LCD12864和LED点阵屏等的学习,懂得了2D平面图形的设计、生成和编程,这一过程会让我们受到启发,在光立方的制作当中,把我们的2D思维提升到3D的思维方式。3D图形的编程也是很巧妙的事情,并不只是简单地把几个2D的图形叠加起来这么简单。设计3D图形,需要有新的思维方式,发现三维空间中点、线、面、体的算法规律。在程序中运用循环、判断语句、参数逻辑运算等方法,用最少的语句达到最佳的显示效果。一改以往的平面显示效果,采用全新的立体显示,展示3D的超炫表现力,让人享受各种视觉上的冲击,迎合3D显示时代的到来。光立方为一个立体LED点阵。本项目制作并实现了一个8*8*8的光立方,较之平时常见的LED点阵屏,其拥有独特的特点:1、8*8*8的LED阵列立体显示器;2、连贯的图形显示效果,浑然一体,一气呵成;3、超炫的立体动态显示,多种显示样式;4、FFT运算,能随着音乐不断变化模式,给人一种“舞动”的美感。1.2LED灯的选用LED发光体的体积越小,光立方整体的通透性就越好,也就是说后排的LED就越不容易被前排的LED挡住;而另一方面,发光体越大,越容易看到光点,例如使用直径更大的LED或是使用雾面而非光面的LED。这二者是有一定的相互矛盾的关系。此外还要注意LED光点的可视角度,雾面LED要比光面LED要大,而草帽头LED的可视角度又比普通窄体的LED要大。另外,一样可以根据摆放位置,角度,将LED的朝向进行改变(默认是朝天的),以获得更好的观感。本项目使用的LED为台湾产的3MM、圆头、蓝色、雾状散光LED,其最大电流为20mA,电压范围3.0-3.5V,波长460-465nm,亮度,1000mcd,发光角度120度,正极的引脚长度为27mm,负极的为25mm。实物图如图1.1所示:-4-图2.1选用的LED灯1.3光立方的焊接为了保持整体的通透性、立体感,3D8光立方没有设计额外的LED支架,所有搭接直接使用LED自身的管脚。注意:正负引脚的夹角一定是90°。弯折后的LED灯如图1.2所示:图1.2弯折后的LED-5-首先,要进行LED灯立体矩阵的搭建。LED搭接过程还是比较困难的,我们需要8片8*8的LED阵列,8*8*8=512LED,分为8层,每层8列,每列8个LED灯,列内共阴,层内共阳。焊接直接在LED管脚上进行。为使光立方外形的美观,每一片的LED阵列都要求排列整齐,互相看齐。这对焊接的能力有一定的要求。每一束焊接的效果如图1.3所示:图1.3每一列的焊接示意图我们可以把它分为8个层,如图1.4所示;每层含64个LED灯,如图1.4所示。我们只要控制这64个灯使其能够自由变换,然后再通过控制每个层依次点亮即可,由于我们眼睛的视觉暂留(大概50ms至200ms),使我们感觉看到的东西是一起再亮的。这样我们就看到了一个完整的个体。-6-图1.4光立方层结构示意图图1.5光立方每层结构示意图整个光立方焊接完后如图1.6所示:-7-图1.6焊接完后的光立方-8-第二章模块设计2.1总体方案选择本项目首先要实现光立方的立体扫描,产生出特定的显示效果。通过设计多种多样的显示效果,给人一种绚丽多彩的效果。此外还要求显示效果能依音乐的改变而改变,给人一种随着音乐“跳舞”的感觉,这就要求对音乐进行采集。对音乐采集可以采用外部ATD芯片,或者选用内带ATD功能的MCU。本项目使用的主控为Atmega16,其内部自,8路10位精度的模数转换器。因此,整体功能结构可表示如下:图2.1系统结构框图2.2主控的最小系统本项目中使用的主控为Atmega16。Atmega16是一款高性能、低功耗的8位AVR微处理器,采用先进的RISC结构,含16K字节的系统内可编程Flash和512字节的EEPROM。Atmega16的外设特点为:–两个具有独立预分频器和比较器功能的8位定时器/计数器–一个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立振荡器的实时计数器RTC–四通道PWM–8路10位ADC,2个具有可编程增益(1x,10x,或200x)的差分通道–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器Atmega16主控芯片音频光立方控制上位机音频功放-9-–片内经过标定的RC振荡器–32个可编程的I/O口Atmega16的最小系统主要包括复位电路、外部振荡器电路和AD模块电源等,电路原理图如图2.2所示:图2.2Atmega16最小系统2.3光立方控制模块光立方的扫描控制使用了两片74HC238译码器和8片74HC573锁存器,其中一片74HC238通过地址译码实现光立方的层选,另外一片74HC238用来实现光立方的列选,LED灯的亮灭通过74HC573暂存器暂存的方法,每片74HC573分别用来控制一列LED灯,通过层选和列选信号的切换来实现每个LED灯的扫描,通过不同的扫描顺序实现不同的动态效果。光立方控制的电路原理图如图2.3所示:-10-图2.3光立方控制原理图2.4OTL音频功放模块OTL是英文OutputTransformerless的简写,意思是无输出变压器,其采用推挽方式而不用输出变压器的功率放大器。OTL体积小,电路简单,易于集成,是常用的简便型音频功放。本项目设计的OTL如图2.4所示:图2.4OTL音频功放2.5串口通信模块为使MCU与上位机通信,可以使用串口通信。为此需要设计串口通信模块。串行通信被广泛用于数据交换中。Atmega16单片机通过复用的PD0和PD1两个管脚与其他设备实现串行数据交换。当设计好串行口工作模式-11-和波特率后,在发送数据时,只要把数据载入UDR中,串行口就会自动将数据发送出去;在接收数据时,串行口接收下来的数据保存在UDR中以供程序读取。由于电脑串口RS232电平是(-10v+10v),而一般的单片机应用系统的信号电压是TTL电平(0+5v),MAX232就是用来进行电平转换的。MAX232符合TIA/EIA-232-F标准,该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。每一个接收器将TIA/EIA-232-F电平转换成TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。MAX232的主要特点:1、单5V电源工作2、LinBiCMOSTM工艺技术3、两个驱动器及两个接收器4、±30V输入电平5、低电源电流:典型值是8mA串口通信模块的电路原理图如图2.5所示:图2.5串口通信电路原理图-12-第三章软件开发3.1光立方的动态显示光立方虽然不同于平时常见的LED点阵屏,但其原理还是一样的,都是通过对LED的快速扫描,利用人眼视觉暂留效应,以达到动态显示的效果。只不过设计3D图形,需要有新的思维方式,发现三维空间中点、线、面、体的算法规律。在程序中运用循环、判断语句、参数逻辑运算等方法,用最少的语句达到最佳的显示效果。要实现光立方的动态扫描,那么首先得先点亮一个灯,然后通过快速依次点亮想显示图形的每一个灯,即可得到动态显示图形。本项目中的光立方为层共阳型的,那么束为低电平点亮,那么点亮一个灯的程序如下所示:#defineP0PORTB#defineP1PORTCvoidlight(charceng,charshu)//点亮一个灯{P1=ceng;P0=~(1shu);for(m=0;m200;m++);//灯点亮的时间P0=0xff;}为了程序可以方便地移植到51单片机,程序里使用的I/O端口为51单片机的输入/输出寄存器名,只用在程序的前面使用宏定义指向Atmega16的I/O寄存器即可放到Atmega16上使用。末尾的一句P0=0xff;必不可少,因为使用了锁存器来进行数据锁存,如果在末尾不进行LED的熄灭操作,那么会在点亮下一个点时有余晖效果,影响其他LED的正常显示。实现了单个LED灯的点亮后,就可以开始构思光立方上显示什么样的动态效果,然后依次快速扫描即可。本项目中依次设计了面移动、层移动、旋转、烟花、下雨、金字塔、波浪、伸缩、骰子、升腾等动态效果,只要在主函数中调用相应的函数,即可显示相应的动态效果出来。各效果函数简写如下:Voidmian();//面移动Voiddceng();//层移动VoidXuanZhuan();//旋转VoidYanHua();//烟花Voidrain();//下雨Voidpyramid();//金字塔VoidBoLang();//波浪-13-Voidflex();//伸缩Voiddice();//骰子VoidGetUp();//升腾3.2上位