跟着音乐“跳舞”的光立方--结题报告.doc_第1页
跟着音乐“跳舞”的光立方--结题报告.doc_第2页
跟着音乐“跳舞”的光立方--结题报告.doc_第3页
跟着音乐“跳舞”的光立方--结题报告.doc_第4页
跟着音乐“跳舞”的光立方--结题报告.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录摘要.2第1章 光立方的制作.3 1.1 光立方概述.3 1.2 LED灯的选用.3 1.3光立方的焊接.4第2章 模块设计.8 2.1 总体方案选择.82.2 主控的最小系统.82.3 光立方控制模块.92.4 OTL音频功放模块.102.5 串口通信模块.10第三章 软件开发.123.1 光立方的动态显示.123.2 上位机.133.3 FFT运算.13第四章 结束语.17附件.18 下位机程序清单.18 上位机程序清单.35 摘要 一般的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.2 LED灯的选用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位精度的模数转换器。因此,整体功能结构可表示如下:音频功放Atmega16主控芯片光立方控制 音频 上位机 图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是英文Output Transformerless的简写,意思是无输出变压器,其采用推挽方式而不用输出变压器的功率放大器。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 图形,需要有新的思维方式,发现三维空间中点、线、面、体的算法规律。在程序中运用循环、判断语句、参数逻辑运算等方法,用最少的语句达到最佳的显示效果。要实现光立方的动态扫描,那么首先得先点亮一个灯,然后通过快速依次点亮想显示图形的每一个灯,即可得到动态显示图形。本项目中的光立方为层共阳型的,那么束为低电平点亮,那么点亮一个灯的程序如下所示:#define P0 PORTB#define P1 PORTCvoid light(char ceng,char shu)/点亮一个灯P1=ceng; P0=(1shu); for(m=0;m=2fmax),采样之后的数字信号才能完整地保留了原始信号中的信息。46.08KHz2*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)个值,其中第一个值代表直流电压值,亦去掉。最终取结果的X116。本项目中的上位机使用VB开发,上位机的处理频率最大只为1KHz(1ms),而声音的采样频率为40KHz,且AD中如果采用连续转换模式的话,在采样频率为40KHz时,则波特率至少为:BUAD=40K*32(采样点数)*8(每个数的位数)=10240000bps,Atmega16的串口通信根本无法达到如此速率。 故应该间隔发送,不能采用连续发送。现如果每5ms(200Hz)发送一次,一次采样32个点,那么波特率为:200*32*8=51200bps,那么可以设计AVR的串口通信速率为115200bps。串口初始化的函数如下所示:void UART_Init(unsigned int baud) /*默认设置帧格式:异步模式 8 个数据位, 1个停止位*/UCSRC &= (18);/* 设置波特率*/ UBRRL = (unsigned char)baud; UCSRB = (1RXCIE)|(1RXEN)|(1TXEN); /*接收中断使能,接收器与发送器使能*/ 当为UART_Init(5)时,串口通信速率为115200bps。串口通信的发送和接收函数分别为: void write(char data) while(!(UCSRA & (1UDRE);/* 等待发送缓冲器为空 */ UDR=data;/* 将数据放入缓冲器,发送数据 */ unsigned char read(void) while(!(UCSRA & (1RXC); /* 等待接收数据*/ return UDR;/* 从缓冲器中获取并返回数据*/ 采样后的AD值采用统一发送方式,其函数如下所示: void send() for(i=0;i= J Then GoTo L1190 TR = REX(J) TI = IMX(J) REX(J) = REX(i) IMX(J) = IMX(i) REX(i) = TR IMX(i) = TIL1190: K = ND2L1200: If K J Then GoTo L1240 J = J - K K = K / 2 GoTo L1200L1240: J = J + KNext iFor L = 1 To M LE = CInt(2 L) LE2 = LE / 2 UR = 1 UI = 0 SR = Cos(PI / LE2) SI = -Sin(PI / LE2) For J = 1 To LE2 JM1 = J - 1 For i = JM1 To NM1 Step LE IP = i + LE2 TR = REX(IP) * UR - IMX(IP) * UI TI = REX(IP) * UI + IMX(IP) * UR REX(IP) = REX(i) - TR IMX(IP) = IMX(i) - TI REX(i) = REX(i) + TR IMX(i) = IMX(i) + TI Next i TR = UR UR = TR * SR - UI * SI UI = TR * SI + UI * SR Next JNext L 第四章 结束语 通过半年的学习和努力,终于成功实现了本项目要求。在本项目的过程中,光立方的制作对焊接和布局提出了一定要求,其次是FFT的学习与应用。经过本次制作,进一步加深了点阵的扫描控制,也学会了如何将理论联系实际,把所学的书本知识应用到实际运用中去。每一次的项目制作,都让自己有一种新的收获,这便是经验逐步积累的过程。希望以后能够参与更多的项目中去,学习更多的知识和经验。 附件下位机程序清单:/*主控为ATMEGA16单片机,采用外部晶振11.0592MHz,选用AD时钟分频因子为16,则AD时钟=691.2KHz。因为差分AD转换需要15个AD时钟,则采样频率最大为691.2KHz/15=46.08KHz(=2*20KHz)。结果寄存器采用左对齐方式,因为正常情况下ATMEGA16的AD采样频率最大为15KHz,现采样频率至少为声音频率(20KHz)的两倍,即40KHz,所以结果精度不高,也为了有充裕时间进行AD采样,所以只读取ADCH寄存器的值,舍去结果寄存器的末两位。注意在差分模式下,最高位为符号位,所以结果范围现为-128+127。参考电压采用内部2.56V参考电压(因为耳机的差分输出电压最高为2V)。现令采样频率为40KHz,则AD转换间隔为t=25us,使用定时器触发方式,每隔25us触发一次AD。采样样本为32个,则频谱的频率间隔为20KHz/(16-1)=1.3333KHz。FFT运算后,取前面的17(32/2+1)个值,其中第一个值代表直流电压值,亦去掉。最终取结果的X116。*/#include #include #include /p1高位:层 P1低位:面 p0:束#define P0 PORTB#define P1 PORTC#define N 32/#define delay 200unsigned char delay=200;unsigned char m;unsigned char i;char count=0,num=0,flag=0,index=0;char ad_data=0,valueN=0,resultN/2+1=0;char const spin1416=0x07,0,0x06,1,0x05,2,0x04,3,0x03,4,0x02,5,0x01,6,0x00,7, 0x06,0,0x06,1,0x05,2,0x04,3,0x03,4,0x02,5,0x01,6,0x01,7, 0x05,0,0x05,1,0x05,2,0x04,3,0x03,4,0x02,5,0x02,6,0x02,7, 0x04,0,0x04,1,0x04,2,0x04,3,0x03,4,0x03,5,0x03,6,0x03,7,0x03,0,0x03,1,0x03,2,0x03,3,0x04,4,0x04,5,0x04,6,0x04,7,0x02,0,0x02,1,0x02,2,0x03,3,0x04,4,0x05,5,0x05,6,0x05,7,0x01,0,0x01,1,0x02,2,0x03,3,0x04,4,0x05,5,0x06,6,0x06,7,0x00,0,0x01,1,0x02,2,0x03,3,0x04,4,0x05,5,0x06,6,0x07,7,0x00,1,0x01,1,0x02,2,0x03,3,0x04,4,0x05,5,0x06,6,0x07,6,0x00,2,0x01,2,0x02,2,0x03,3,0x04,4,0x05,5,0x06,5,0x07,5,0x00,3,0x01,3,0x02,3,0x03,3,0x04,4,0x05,4,0x06,4,0x07,4,0x00,4,0x01,4,0x02,4,0x03,4,0x04,3,0x05,3,0x06,3,0x07,3,0x00,5,0x01,5,0x02,5,0x03,4,0x04,3,0x05,2,0x06,2,0x07,2,0x00,6,0x01,6,0x02,5,0x03,4,0x04,3,0x05,2,0x06,1,0x07,1;char const angle16=0x22,0x23,0x24,0x25,0x33,0x34;char const angle220=2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,3,4,3,4;void delayms(unsigned int n) int j; while(n-) for(j=0;j1140;j+);void UART_Init(unsigned int baud) /*默认设置帧格式:异步模式 8 个数据位, 1个停止位*/UCSRC &= (18);/* 设置波特率*/ UBRRL = (unsigned char)baud; UCSRB = (1RXCIE)|(1RXEN)|(1TXEN);/*接收中断使能,接收器与发送器使能*/void write(char data) while(!(UCSRA & (1UDRE);/* 等待发送缓冲器为空 */ UDR=data;/* 将数据放入缓冲器,发送数据 */unsigned char read(void) while(!(UCSRA & (1RXC); /* 等待接收数据*/ return UDR;/* 从缓冲器中获取并返回数据*/void send(void)for(i=0;iN;i+) write(valuei);void TC0_Init(void) TCCR0|=0x1a; /CTC模式,溢出时OC0取反,8分频 TCCR0&=0xcf; TCNT0=0; OCR0=16; /采样频率为40.66KHz,注意P72页的频率计算公式 TIMSK|=2; /T/C0输出比较匹配中断使能void AD_Init(void) DDRA&=0x03; /AD0、AD1作为AD输入端ADMUX=0xf0; /2.56V的片内基准电压作为参考电压,结果左对齐输出,ADC0(正差分输入)、ADC1(负差分输入),增益为1ADCSRA=0xbc; /使能AD,自动触发使能,写1清除标志位,使能AD中断,时钟16分频/ADCSRA=0xbb; /使能AD,自动触发使能,写1清除标志位,使能AD中断,时钟8分频/使用该条语句,采样频率似乎大了一倍SFIOR|=0x60; /自动触发源选定时/计数器0比较比配ADCSRA|=BIT(ADSC);/开始AD转换void light(char ceng,char shu)/点亮一个灯P1=ceng;P0=(1shu); for(m=0;m=0;x-) for(k=70;k0;k-) for(y=7;y=0;y-) for(z=7;z=0;z-) light(y4)|x,z); void ceng(void) /层移动 signed char x,y,z,k; for(x=0;x0;k-) for(y=7;y=0;y-) for(z=7;z=0;z-) light(x0;k-) for(k=5;k0;k-) for(x=0;x0;temp-) /延时 for(y=0;y8;y+) for(z=0;z16;z=z+2) light(spinxz|(y0;y-) / for(x=3;x0;i-) light(x,3);for(i=300;i0;i-) light(0x72,2);light(0x74,2);light(0x74,4);light(0x72,4);for(i=300;i0;i-) light(0x61,1);light(0x61,3);light(0x61,5);light(0x63,1);light(0x63,5);light(0x65,1);light(0x65,3);light(0x65,5);for(i=300;i0;i-) for(x=0;x0;y-)/ for(x=112;x=0;x=x-16) for(i=500;i0;i-) light(x+1,1); for(x=112;x=0;x=x-16) for(i=500;i0;i-) light(x+3,2); for(x=112;x=0;x=x-16) for(i=500;i0;i-) light(x+1,4); for(x=112;x=0;x=x-16) for(i=500;i0;i-) light(x+4,5); for(x=112;x=0;x=x-16) for(i=500;i0;i-) light(x+5,2); / void pyramid(void) /金字塔 signed char y,z,k,temp;int i;delay=100;/ for(x=2;x0;x-)/ for(k=50;k0;k-) for(y=7;y=0;y-) temp=y+112; for(z=7;z=0;z-) light(y,z); /0层 light(temp,z); /7层 for(k=70;k0;k-) for(y=22;y16;y-) temp=y+80; for(z=6;z0;z-) light(y,z); /1层 light(temp,z); /6层 for(k=100;k0;k-) for(y=0;y2,angle2y);/2层 light(angle1y2+48,angle2y);/5层 for(i=400;i0;i-) for(y=16;y0;k-) for(y=7;y=0;y-) temp=y+112; for(z=7;z=0;z-) light(y,z); light(temp,z); for(y=22;y16;y-) temp=y+80; for(z=6;z0;z-) light(y,z); light(temp,z); for(y=0;y2,angle2y);light(angle1y2+48,angle2y);for(y=16;y0;temp-) /how many times for(temp=3;temp0;temp-) /how many times for(z=0;z14;z+) /one time need 14 changes for(k=5;k!=0;k-)/delay for(x=0;x=0;y-)/scan Mian light(angz+x|y,x); void flex(void) /伸缩 signed char x=3,y=10,z,k,temp; while(y-) switch(x) case 3: for(k=70;k!=0;k-) for(z=7;z=0;z-) light(0x00,z);light(0x07,z);light(0x70,z);light(0x77,z);light(z,0x00);light(z,0x07);light(0x70|z,0x00);light(0x70|z,0x07); temp=1; break; case 2: for(k=120;k!=0;k-) for(z=6;z0;z-) light(0x11,z);light(0x16,z);light(0x61,z);light(0x66,z);light(0x10|z,0x01);light(0x10|z,0x06);light(0x60|z,0x01);light(0x60|z,0x06); break; case 1: for(k=170;k!=0;k-) for(z=5;z1;z-) light(0x22,z);light(0x25,z);light(0x52,z);light(0x55,z);light(0x20|z,0x02);light(0x20|z,0x05);light(0x50|z,0x02);light(0x50|z,0x05); break; case 0: for(k=250;k!=0;k-) light(0x33,3);light(0x34,3);light(0x33,4);light(0x34,4);light(0x43,3);light(0x44,3);light(0x43,4);light(0x44,4); temp=0; break; default:break; if(temp) x=x-1; else x=x+1; void dice(v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论