16x16x16光立方(裸眼3D顯示器)把妹神器!

隨著電子產業的發展,LED把我們的生活變得多姿多彩。本次設計主題為LED的3D立方體顯示器,旨在將我們的視覺重新定義。3D立方體可顯示英文漢字,絢麗的立體動畫,音樂頻譜顯示,時鐘顯示,還配置了娛樂功能。

  • 光立方
  • LED顯示器
  • 電子DIY
Image placeholder
蟲子先生 2020-12-18 12:52

人們對生活質量要求的提高,越來越多的人不滿足于物質上的享受,開始追求精神上的享受。隨著電子產業的發展,LED把我們的生活變得多姿多彩。本次設計主題為LED的3D立方體顯示器,旨在將我們的視覺重新定義。3D立方體可顯示英文漢字,絢麗的立體動畫,音樂頻譜顯示,時鐘顯示,還配置了娛樂功能,當然,這一切都歸功于強大的HT32F1765單片機,3D立方體顯示器必將是LED應用的一次革命。

本設計采用單片機HT32F1765作為檢測和控制的核心,以實現按鍵,自動控制,自動記錄,查閱數據記錄等功能。

我們生活中隨處可見LED產品,點陣顯示動畫,點陣顯示頻譜,通過點陣顯示時鐘,點陣游戲等等。但他們功能比較分散,而且我們生活在3D的世界里面,看到的卻是2D的顯示效果。

《阿凡達》引領電影走向3D,把我們的視覺重新定義,讓虛假的電影效果感覺就發生在我們眼前,感覺我們親身經歷著電影里面的故事,從此,3D風靡了電影界。相信《鋼鐵俠3》小羅伯特.唐尼工作室被炸的那一刻,你肯定被“飛石“擊中了。

試想,能不能有一款LED顯示產品,不僅能做到平常LED點陣能做到的事情,還能把我們的視覺帶到3D世界,這是一種怎樣的效果?一個全是LED的3D顯示器可以音樂頻譜顯示,可以顯示漢字,顯示英文,可以顯示一些絢麗的動畫,可以顯示時鐘,并且還可以回味80后們童年許多經典的游戲,諸如貪吃蛇,超級瑪麗?

基于以上的原因,我們團隊決定制作一個基于盛群公司HT32F1765芯片的“wall.e cube dancer”。他實際上是一個3D立方體顯示器。

2.1 作品工作原理

HT32F1755/1765/2755 系列 Holtek 單片機是一款基于 ARM? CortexTM -M3 處理器內核的 32 位高性能低功耗單片機。CortexTM -M3 是把嵌套向量中斷控制器 (NVIC),系統節拍定時器(SysTick Timer) 和先進的調試支持緊緊結合在一起的新一代處理器內核。在本產品中作為主控單元和模擬信號采集部分,提供時鐘信號等。

音頻采集模塊將輸入信號傳入單片機的PA口,經過AD轉換得到AD值,再把AD值通過快速傅里葉變換得到各頻率的頻譜值。再把頻譜值發送給3D立方體顯示器。

3D立方體顯示器采用獨特的算法,將十多種動畫存儲在單片機內部,諸如曲面旋轉,正方體變換,平面推移,雨滴下落等動畫。并且,他可以顯示立體式的漢字,英文字母和數字。顯示器存儲了部分漢字和英文字母的數據,當然,后期也可以通過上位機直接輸入想顯示的字,隨時改變你想要的效果。

不僅如此,我們團隊還利用了盛群單片機的RTC實時顯示時鐘的功能,將時間也交給顯示器。

搖桿模塊將搖桿的數據傳給HOLTEK MCU,

經過MCU處理后把數據傳輸給立方體顯示器,從而達到“超級瑪麗”效果。當然,其他類的游戲也可以采用類似方法實現。

3D立方體顯示器提供人機交互界面,每0.014秒掃描4096次,所有的控制量以及鍵盤操作結果都會顯示在液晶上,直觀而又大方。

2.2基本功能

音樂頻譜,動畫顯示以及中英漢字顯示是我們的基本功能,下面我們將詳細為您介紹:

(1) 音樂頻譜

在“頻譜顯示的模式”下,盛群單片機的PA口將分配到一個AFIO時鐘,作為ADC的標準,同時,將AD模式設置為連續轉換模式,開啟外部中斷,AD 128次后將得到的128個數存儲在FFT的輸入數組里面(也就是采樣128個點),通過快速傅里葉變換,得到128個頻譜值,再將頻譜值處理,使得頻譜值高低錯落,顯示出來的時候才有節奏感,顯示的時候有多個模式,能量柱的數量也不斷增多,當然,隨著音樂的律動帶給你的都是不一樣的震撼。

1.jpg

2.jpg

(2)動畫顯示

我們團隊在盛群單片機內存儲了十幾種動畫,先取出一些簡單的模。利用算法實現多次應用,移位,替換,等等,利用指針將數據傳輸的顯示子函數里面 ,系統給PB,PC口分配時鐘,指定IO口輸入輸出狀態。單片機的PC0,PC1,PC2,PC3分別作為MBI5026的輸入端口SDI,CLK,LE,OE。PB0,PB1,PB2,PB3作為譯碼器的A0,A1,A2,A3。當所有數據發送給MBI5026和譯碼器的時候,打開OE,每0.0147秒單片機就會動態掃描4096個LED的狀態,從而得到絢麗的動畫。

3.jpg

4.png

(3)時鐘顯示

盛群單片機集成了實時時鐘的功能,單片機3.3V供電,保證時鐘的正常運行。首先開啟RTC中斷,通過串口通信設置時間,設置完畢后將每次RTC中斷后的值存入顯示數組,后續和動畫顯示的步驟相同。

?5.jpg

(4)時間校正

RTC如果出現不準確的情況,可通過串口通信矯正,或者后期的上位機直接更正。但原理都是發送正確的時間信息給單片機,經過處理后給發送函數,然后再顯示在立方體上。

2.3? HT32F1765主要核心功能

本設計方案適用到HT46F49E芯片的核心功能有:

1. 時鐘控制單元(CKCU)。分配系統時鐘,ADC時鐘,IO口時鐘。

2. 串口通信(USART),實現串口通信控制以及上位機支持。

3. 通用IO口和復用IO口(GPIO,AFIO)。

4.模數轉換器(ADC),PA口復用功能,在72MHZ的頻率下工作,每執行一次AD轉換只需要1.17US

5.定時器控制單元。用于給ADC中斷定時,提供參數給延時程序。

6.實時時鐘單元,利用內置的RTC功能,串口通信設置參數,再通過芯片顯示。

7.作品結構

“Wall.e? Cube? Dancer ”主要由主控MCU,音頻模擬信號采集模塊,搖桿控制模塊,按鍵控制模塊等組成。

6.png?

(?圖1:系統總體框圖)

7.png

?(圖2:音樂頻譜顯示框圖)

8.png

(圖3:時鐘顯示框圖)

9.png?

(圖4:模式切換框圖)

10.png?

?(圖5:游戲模式框圖)

3.1硬件部分:

“Wall.e? Cube? Dancer”的硬件部分主要由四個大部分構成:一是電源電路;二是顯示器層選電路,1個74HC154譯碼器,1個74HC245信號功率放大,6個獨立按鍵,,8個APM4953功率管;三是顯示器列選電路,16個MBI5026恒流LED驅動器;四是信號功率放大電路,1個74HC245;五是3D立方體顯示器,由4096個LED組成;六是主控包括:一個HT32F1765單片機,8M晶振,紐扣電池。

(1)電源電路?

11.png

電源電路可同時滿足5V和3.3V(采用AMS1117-3.3)輸出,并且有電源指示燈。

(2)層選電路

12.png

層選電路主要由1個74HC154譯碼器,8個AMP4953功率放大管構成。譯碼器輸出低電平有效,另外,APM4953只有輸入為低電平時,輸出才為高電平。這樣,也就是說,每次掃描,只有一層有高電平,其他都是低電平。

(3)列選電路

13.png

列選電路主要由16個MBI5026 16位恒流驅動器組成,有socker1和socker2兩個通訊端口,分別接前一級和后一級,級聯共16個。最后一個后一級不級聯,第一個前一級接主控的IO口。從而獲得數據。

(MBI5026是一種16位LED恒流驅動器。采用先進的Bi_CMOS工藝生產,其恒流值可以通過外接電阻調節。MBI5026含有16位移位寄存器,16位鎖存器,1.2V基準源,以及16位高精度恒流驅動器等模塊構成。

(4)信號功率放大電路

14.png

???? 信號功率放大電路主要由2個74HC245組成,一個用于傳輸層信號,一個用于傳輸面列信號。

(5)LED立方體顯示器?

光立方由4096個LED組成,XYZ三軸,16X16X16,每個平面256個LED,16層就是4096個。

(6)獨立按鍵電路

15.png

????? 按鍵電路由6個按鍵和一個上拉電阻組成。代表不同的模式,根據程序調節,實際上模式數量少于6個,方便后期完善的時候增加模式數。

(7)搖桿模塊

16.png?

搖桿模塊由一個搖桿電位器,和四個電阻組成。

(8)主控電路

17.png

如圖,主控由一片HT32F1765(最小系統已忽略,引腳較多,只畫出用到的電路),一片MAX232,一個音頻采集模塊,六個按鍵(切換模式用),還有搖桿接口,譯碼器接口以及恒流驅動接口組成。

3.2軟件部分:

??? 本設計軟件部分采用C語言編寫。其大致流程圖如下:

18.png

(圖22:系統總體流程圖)

3D立方體顯示器開機進入時間顯示模式,通過三個按鍵進入不同的模式,分別是頻譜顯示模式,動畫模式,游戲模式,頻譜模式需要接入音頻采集模塊,游戲模式需要接入搖桿模塊。3D立方體顯示器的顯示程序基本上都是在中斷中完成的,比如AD轉換中斷128次后進入FFT,再如時鐘顯示,每一秒訪問一次寄存器,這種顯示模式,使得控制十分的方便。

時鐘顯示部分程序:

?temp0?=?THH/10;
????temp1?=?THH%10;
????for(i?=?0;i?{
????a[32*i+30]?=?time_0_9[16*temp0+i];
????a[32*i+28]?=?time_0_9[16*temp0+i];
????a[32*i+31]?=?time_0_9[16*temp1+i];
????a[32*i+29]?=?time_0_9[16*temp1+i]?
}
temp0?=?TMM/10;
temp1?=?TMM%10;
for(i?=?0;i{
for(k?=?0;k{
????a[32*i+2*k+1]?=?((time_0_9[16*temp1+i]>>k)&0x1);
????a[32*i+2*k+1]?=?((a[32*i+2*k+1]?
????a[32*i+2*k+16+1]?=?((time_0_9[16*temp0+i]>>(k+1))&0x1);
????a[32*i+2*k+16+1]?=?((a[32*i+2*k+16+1]?
????}}
temp0?=?TSS%10;
????a[32*(4+temp0)+31]=(0x1|a[32*(4+temp0)+31]);
????a[32*(12-temp0)+31]=(0x1|a[32*(12-temp0)+31]);
????temp1=THH%10;
????for(i=0;i?
????a[32*i+29]=time_0_9[16*temp1+i]?
????ZHEN(a,94?);

頻譜顯示部分程序:

?1.AD值的提取:

void?ADC_IRQHandler(void)
{
?ADC_ClearIntPendingBit(ADC,?ADC_FLAG_SINGLE_EOC);
??gPotentiometerLevel?=?(((ADC->DR[0]&0x0FFF)*100)/4095);
????ad_result[interrupt_times]=(int)gPotentiometerLevel;
????interrupt_times++;
????if(interrupt_times>128)
????????interrupt_times=0;
?}//128個點的AD轉換。

2.FFT應用到的雷德算法:

for(i=0;i?{
????if(i{?t=xin[j];xin[j]=xin[i];xin[i]=t;}
????k=nv2;????????????????????
????while(k{?j=j-k;k=k/2;?}
???j=j+k;???????????????????
??}

動畫顯示部分程序:

(配置MBI5026子函數)

void?FUN(?u8?*a?)
{??u8?i,m;
?? CKCU_APBPerip0ClockConfig(CKCU_APBEN0_PC,?ENABLE);?????????????????????
???GPIO_DirectionConfig(LE.iox?,?LE.pin,?GPIO_DIR_OUT);
???GPIO_DirectionConfig(OE.iox?,OE.pin,?GPIO_DIR_OUT);
???GPIO_WriteOutBits(LE.iox?,?LE.pin,?RESET);
???GPIO_WriteOutBits(OE.iox?,?OE.pin,?SET);
???for(?i?=?0;?i????{
????m?=?a[?2?*?i?];
????MBI5026(?m?);
????m?=?a[?2?*?i?+?1?];
????MBI5026(?m?);}
????GPIO_WriteOutBits(LE.iox?,?LE.pin,?SET);
????DelayMs(?1?);
????GPIO_WriteOutBits(LE.iox?,?LE.pin,?RESET);
????GPIO_WriteOutBits(OE.iox?,?OE.pin,?RESET);
????DelayMs(50);
????GPIO_WriteOutBits(?OE.iox?,?OE.pin,?SET?);
????for(?i?=?0;?i ? ?MBI5026(?0?);
????GPIO_WriteOutBits(LE.iox?,?LE.pin,?SET);?DelayMs(?1?);
? ?GPIO_WriteOutBits(LE.iox?,?LE.pin,?RESET);
????GPIO_WriteOutBits(OE.iox?,?OE.pin,?RESET);}

評論1

Image placeholder

超級大可愛

02-20 17:49
這么好的文章第一次看到,學到了,以后也會經常來逛下的,一定能學到很多東西,感謝小編