跟着音乐跳舞的光立方.docx
- 文档编号:4518276
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:13
- 大小:1.68MB
跟着音乐跳舞的光立方.docx
《跟着音乐跳舞的光立方.docx》由会员分享,可在线阅读,更多相关《跟着音乐跳舞的光立方.docx(13页珍藏版)》请在冰豆网上搜索。
跟着音乐跳舞的光立方
基金项目结题报告
项目名称:
跟着音乐“跳舞”的光立方
起止年月:
2012.10~2013.05
摘要..............................................2
第1章光立方的制作...............................3
1.1光立方概述............................................3
1.2LED灯的选用...........................................3
1.3光立方的焊接...........................................4
第2章模块设计...................................8
2.1 总体方案选择..........................................8
2.2 主控的最小系统........................................8
2.3 光立方控制模块........................................9
2.4 OTL音频功放模块......................................10
2.5 串口通信模块.........................................10
第三章软件开发...........................................12
3.1 光立方的动态显示.....................................12
3.2 上位机...............................................13
3.3 FFT运算..............................................13
第四章结束语..............................................17
摘要
一般的LED点阵都是平面的,比如一个字就是16*16点阵,而光立方属于LED立体阵列,是在多个等间距的平面再组合成一个立方体。
其一般都是由一个长、宽、高为8*8*8或16*16*16的LED灯组成的立体显示器,属于3D显示技术的一种。
其最大的特点就是超炫的显示效果给人一种真实的视觉冲击效果,带给你未来3D技术的科技体验,让我们的生活充满了美感。
本项目通过打造一个8*8*8的光立方,使用Atmega16单片机通过控制不同立体位点的LED灯的亮灭,实现各种立体显示效果。
而立体显示效果是通过对音乐的采集,经过快速傅里叶运算FFT得到的不同音高和频率来控制的,随着音乐的不同旋律,就会显示相应的各种效果,给人一种光立方在随着音乐“舞动”的视觉享受,是家居装饰和送人礼物的很好选择。
本项目要求显示效果要求能依音乐的改变而改变,给人一种随着音乐“跳舞”的感觉。
通过设计多种多样的显示效果,给人一种绚丽多彩的效果。
而LED数量的巨大和空间立体的布局以及对显示效果的整齐划一,都对单片机的编程提出了较高的要求。
关键词:
光立方,FFT,Atmega16
第一章 光立方的制作
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所示:
图2.1 选用的LED灯
1.3光立方的焊接
为了保持整体的通透性、立体感,3D8光立方没有设计额外的LED支架,所有搭接直接使用LED自身的管脚。
注意:
正负引脚的夹角一定是90°。
弯折后的LED灯如图1.2所示:
图1.2 弯折后的LED
首先,要进行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),使我们感觉看到的东西是一起再亮的。
这样我们就看到了一个完整的个体。
图1.4 光立方层结构示意图
图1.5 光立方每层结构示意图
整个光立方焊接完后如图1.6所示:
图1.6 焊接完后的光立方
第二章 模块设计
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串行接口
–具有独立片内振荡器的可编程看门狗定时器
–片内模拟比较器
–片内经过标定的RC振荡器
–32个可编程的I/O口
Atmega16的最小系统主要包括复位电路、外部振荡器电路和AD模块电源等,电路原理图如图2.2所示:
图2.2 Atmega16最小系统
2.3光立方控制模块
光立方的扫描控制使用了两片74HC238译码器和8片74HC573锁存器,其中一片74HC238通过地址译码实现光立方的层选,另外一片74HC238用来实现光立方的列选,LED灯的亮灭通过74HC573暂存器暂存的方法,每片74HC573分别用来控制一列LED灯,通过层选和列选信号的切换来实现每个LED灯的扫描,通过不同的扫描顺序实现不同的动态效果。
光立方控制的电路原理图如图2.3所示:
图2.3 光立方控制原理图
2.4 OTL音频功放模块
OTL是英文OutputTransformerless的简写,意思是无输出变压器,其采用推挽方式而不用输出变压器的功率放大器。
OTL体积小,电路简单,易于集成,是常用的简便型音频功放。
本项目设计的OTL如图2.4所示:
图2.4 OTL音频功放
2.5 串口通信模块
为使MCU与上位机通信,可以使用串口通信。
为此需要设计串口通信模块。
串行通信被广泛用于数据交换中。
Atmega16单片机通过复用的PD0和PD1两个管脚与其他设备实现串行数据交换。
当设计好串行口工作模式和波特率后,在发送数据时,只要把数据载入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 串口通信电路原理图
第三章 软件开发
3.1光立方的动态显示
光立方虽然不同于平时常见的LED点阵屏,但其原理还是一样的,都是通过对LED的快速扫描,利用人眼视觉暂留效应,以达到动态显示的效果。
只不过设计3D图形,需要有新的思维方式,发现三维空间中点、线、
面、体的算法规律。
在程序中运用循环、判断语句、参数逻辑运算等方法,用最少的语句达到最佳的显示效果。
要实现光立方的动态扫描,那么首先得先点亮一个灯,然后通过快速依次点亮想显示图形的每一个灯,即可得到动态显示图形。
本项目中的光立方为层共阳型的,那么束为低电平点亮,那么点亮一个灯的程序如下所示:
#defineP0PORTB
#defineP1PORTC
voidlight(charceng,charshu) //点亮一个灯
{
P1=ceng;
P0=~(1< for(m=0;m<200;m++); //灯点亮的时间 P0=0xff; } 为了程序可以方便地移植到51单片机,程序里使用的I/O端口为51单片机的输入/输出寄存器名,只用在程序的前面使用宏定义指向Atmega16的I/O寄存器即可放到Atmega16上使用。 末尾的一句P0=0xff;必不可少,因为使用了锁存器来进行数据锁存,如果在末尾不进行LED的熄灭操作,那么会在点亮下一个点时有余晖效果,影响其他LED的正常显示。 实现了单个LED灯的点亮后,就可以开始构思光立方上显示什么样的动态效果,然后依次快速扫描即可。 本项目中依次设计了面移动、层移动、旋转、烟花、下雨、金字塔、波浪、伸缩、骰子、升腾等动态效果,只要在主函数中调用相应的函数,即可显示相应的动态效果出来。 各效果函数简写如下: Voidmian(); //面移动 Voiddceng(); //层移动 VoidXuanZhuan(); //旋转 VoidYanHua(); //烟花 Voidrain(); //下雨 Voidpyramid(); //金字塔 VoidBoLang(); //波浪 Voidflex(); //伸缩 Voiddice(); //骰子 VoidGetUp(); //升腾 3.2 上位机 为减轻MCU负担,促进FFT频谱显示的实时性,本项目开发了一个上位机,把FFT运算的过程转移到上位机中进行。 MCU使用自带的模数转换器进行音频采集,把采集得到的音频幅值通过串口发送给上位机,上位机根据采样值进行FFT运算,再把运算结果发送回MCU中,并在上位机的界面中以柱状图形实时显示当前音乐的频率分布和其幅度值。 上位机的界面如图3.1所示: 图3.1 FFT频谱显示界面 3.3 FFT运算 FFT(FastFourierTransformation),即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。 它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。 关于FFT的论述,书本和网上都有很多的介绍,在此不再进行说明,而是描述FFT运算在本项目中的具体实现过程。 本项目中使用的MCU为ATmega16单片机,采用外部晶振11.0592MHz,选用AD时钟分频因子为16,则AD时钟=691.2KHz。 因为差分AD转换需要15个AD时钟,则采样频率最大为691.2KHz/15=46.08KHz。 人耳的听觉范围大概为20Hz~20KHz,根据采样定理,在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>=2fmax),采样之后的数字信号才能完整地保留了原始信号中的信息。 46.08KHz>2*20KHz,符合采样定理的要求。 AD结果寄存器采用左对齐方式,因为正常情况ATMEGA16的AD采样频率最大为15KHz,现采样频率至少为声音频率(20KHz)的两倍, 即40KHz,所以结果精度不高,也为了有充裕时间进行AD采样,所以只读取ADCH寄存器的值,舍去结果寄存器的末两位。 注意在差分模式下,最高位为符号位,所以结果范围为-128~+127。 参考电压采用内部2.56V参考电压(因为耳机的差分输出电压最高为2V)。 现令采样频率为40KHz,则AD转换间隔为t=25us,使用定时器触发方式,每隔25us触发一次AD。 采样样本为32个,则频率间隔为40KHz/(32-1)=1.3KHz。 FFT运算后,取前面的17(32/2+1)个值,其中第一个值代表直流电压值,亦去掉。 最终取结果的 X[1~16]。 本项目中的上位机使用VB开发,上位机的处理频率最大只为1KHz(1ms),而声音的采样频率为40KHz,且AD中如果采用连续转换模式的话,在采样频率为40KHz时,则波特率至少为: BUAD=40K*32(采样点数)*8(每个数的位数)=10240000bps,Atmega16的串口通信根本无法达到如此速率。 故应该间隔发送,不能采用连续发送。 现如果每5ms(200Hz)发送一次,一次采样32个点,那么波特率为: 200*32*8=51200bps,那么可以设计AVR的串口通信速率为115200bps。 串口初始化的函数如下所示: voidUART_Init(unsignedintbaud) { /*默认设置帧格式: 异步模式8个数据位,1个停止位*/ UCSRC&=~(1< UBRRH=(unsignedchar)(baud>>8);/*设置波特率*/ UBRRL=(unsignedchar)baud; UCSRB=(1< /*接收中断使能,接收器与发送器使能*/ } 当为UART_Init(5)时,串口通信速率为115200bps。 串口通信的发送和接收函数分别为: voidwrite(chardata) { while(! (UCSRA&(1< UDR=data;/*将数据放入缓冲器,发送数据*/ } unsignedcharread(void) { while(! (UCSRA&(1< returnUDR;/*从缓冲器中获取并返回数据*/ } 采样后的AD值采用统一发送方式,其函数如下所示: voidsend() { for(i=0;i { write(value[i]); } } AD转换使用定时器促发方式,其函数为: voidTC0_Init(void) { TCCR0|=0x1a; //CTC模式,溢出时OC0取反,8分频 TCCR0&=0xcf; TCNT0=0; OCR0=16; //采样频率为40.66KHz,注意P72页的频率计算公式 TIMSK|=2; //T/C0输出比较匹配中断使能 } AD模块初始化为: voidAD_Init(void) { DDRA&=~0x03; //AD0、AD1作为AD输入端 ADMUX=0xf0; //2.56V的片内基准电压作为参考电压,结果 //左对齐输出,ADC0(正差分输入)、ADC1(负差分输入),增益为1 ADCSRA=0xbc; //使能AD,自动触发使能,写1清除标志位,使能AD中断,时钟16分频 SFIOR|=0x60; //自动触发源选定时/计数器0比较比配 ADCSRA|=BIT(ADSC);//开始AD转换 } 第四章 结束语 通过半年的学习和努力,终于成功实现了本项目要求。 在本项目的过程中,光立方的制作对焊接和布局提出了一定要求,其次是FFT的学习与应用。 经过本次制作,进一步加深了点阵的扫描控制,也学会了如何将理论联系实际,把所学的书本知识应用到实际运用中去。 每一次的项目制作,都让自己有一种新的收获,这便是经验逐步积累的过程。 希望以后能够参与更多的项目中去,学习更多的知识和经验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 跟着 音乐 跳舞 立方