基于AT90S2313-4PC的MP3無線遙控自動點播機 (上)
小型MP3播放機正在和CD、磁帶隨身聽爭奪移動應用方面的霸主地位。隨著計算機用戶對網絡訪問的不斷推動和上網人數的增多,要是我的計算機能成為MP3 無線遙控自動點播機的服務器那該多好啊。
下面讓我慢慢給你介紹我的實現方案吧。該方案可以讓你在家中任何有FM|0">FM收音機(例如一個WALKMAN隨身聽)的地方欣賞MP3音樂。具體就是通過在計算機的音頻輸出口接上一個小功率FM發射機來實現,另外用一個移動單元用來顯示服務器上MP3文件夾的內容,以便你可以從頭至尾瀏覽你收藏的音樂。
為使用方便起見,你可以向上滾動瀏覽最多4個包含不同歌曲列表的文件夾。選曲、開始、停止和跳曲用一般的紅外線遙控器控制。紅外遙控指令通過433MHz無線連接送到作為MP3服務器的計算機。
服務器端我設計了兩個模塊, 433MHz接收機和FM發射機。接收機接收遙控器發過來的指令通過串行端口輸入到計算機,後臺運行的專用應用程序接收指令把它們分送到 Windows Media Player, Windows Media Player收到指令後播放點播的曲目,第二個模塊FM發射機從計算機聲卡輸出取得音頻信號把它發射出去。
為了降低成本簡化設計,433MHz無線連接僅以單工方式工作。也就是說,在你選定一個功能後相應指令通過無線連接發送到MP3計算機服務器上,如果發射機沒有把它發送到服務器,你將什么也聽不到可再次發命令。為了避免假指令中斷操作,設計中使用了專用的編解碼芯片,該芯片實現所有必需的功能,確保只有合法的數據包才能傳輸到MP3服務器。
為了使遙控單元能顯示服務器上的MP3文件夾的內容,使用前必須先把文件夾的內容下載到遙控單元。這可以通過MP3服務器上的串行端口用同樣的應用軟件把無線輸入的指令送到Windows Media Player實現。遙控單元內的固件可控制多達4個不同的音樂文件夾。
為了避免頻繁地更新遙控單元的閃存,建議選定4個穩定的文件夾來進行遙控播放,其它文件夾用來存放新下載的音樂或者經常變動的收藏。遙控單元有32K×8 閃存,每個文件夾可以保存200個歌名(總共800個歌名)。因為閃存是非易失性存儲器,所以即使遙控單元電源關掉,歌名數據也會保存下來,對于用電池供電的遙控單元來說這點很重要。
遙控單元
系統的核心是遙控單元,如圖1所示。遙控單元主要由Atmel AT90S2313-4PC組成,Atmel AT90S2313-4PC提供15條I/O(使用了其中12條)內置一個硬件UART。因為該單元耗電很小,所以我用4節AA電池經過 LM2936CZ5低壓差整流器為其供電。
圖1 MP3遙控器單元
很明顯,如果不能顯示整個歌名和演唱者的名字,歌名顯示就沒有什么用處了。由于可能會有很多歌曲讓你瀏覽,因此定同時顯示4個歌名,選用4×40 LCD面板作為顯示屏。與大多數常見LCD相比,該LCD的控制方式不大一樣,用2片HD44780 LSI控制器進行控制,其中一片控制LCD上面兩行字符,另一片控制下面兩行。
LCD通過B端口的7根以普通4位數據接口方式與微控制器連接。控制由一根RS和兩根ENABLE組成,其中兩根ENABLE?每個LSI控制器一根。因為LCD只接收指令不需要讀出狀態,所以R/*W接低電平。
在用戶接口方面,我沒有采取在面板上安置按鍵和開關來控制的方法,而是用一個紅外解碼模塊和一個通用的紅外遙控器代替。紅外遙控器采用普通而且容易買到的RCA CRCU410型號,它的遙控編碼跟Quasar牌電視機(編碼054)一樣。我之所以選擇這個編碼是因為它簡單,用軟件解碼比較容易。各個鍵和相應功能如表1所示。
表1、遙控器各個鍵和相應功能
歌名列表的非易失性存儲使用連續的閃存EEPROM。我選用Mcrochip的24LC256I/P8EA,因為它比較常見容易買到。該芯片I2C器件,因此與微控制器AT90S2313連接僅需雙接口。不過AT90S2313沒有內置I2C端口的硬件電路,因此必須用軟件實現I2C功能。然而幸運的是,Atmel公司提供了一個AT90S2313作為主控芯片時的I2C讀/寫時序應用筆記。
必須注意的地方是,I2C規格中SDA和SCL均需要用2.2KΩ上拉電阻。根據A0~A2設定的不同,24LC256I可以被設定成8種不同的 I2C地址,因而閃存可以擴展到256KB。本設計中因為僅用了一個芯片,所以3根地址都設定為低電平。
由24LC256I的使用手知道該器件需要5ms閃存寫入時間,數據從AT90S2313 UART接收部分寫入閃存。我設計的下載協議只有從服務器PC到遙控單元一個方向,因此不用“握手”方式工作,所以我選用1200bps數據傳輸率,每隔 8.3ms處理一次輸入的數據字符。這個間隔可以提供足的時間把數據發送到I2C閃存,即使使用軟件實現I2C功能,仍然有5ms的空馀時間來寫 EEPROM。
我沒有采用諸如MAX232之類成熟的RS-232接口,而是用一個2N3904 NPN三極管和一些無源器件將主機的RS-232電平轉換成TTL電平。
選用Abacom公司AM-RT5-433作為無線發射機模塊,其小型SIP封裝很容易裝配。Abacom公司慷慨地寄給我一對發射機和接收機的樣品。這些廉價的模塊是針對100碼左右距離應用的,采用簡單的載波開關調制來實現數據的發射。
我使用小型無線傳輸模塊的其它經驗來自價格較貴的Linx HP-II系列(900 MHz)。Linx HP-II系列采用FSK調制,發射機可直接由UATR驅動。
Abacom公司的技術人員說我選用的廉價模塊不能直接與UART端口接口,然而Abacom公司設計了一個復合芯片NKM2401-N,該芯片根據mode的連接不同可以充當編碼器或者解碼器來用。本設計中我在每個無線數據連接末端均用了這個器件。
遙控單元中NKM2401從AT90S2313 UART端口接收8字節的數據包(以2400 bps數據率),加上同步、預緩沖/後緩沖字節和CRC後再對最終數據進行Manchester編碼。因為NKM2401的數據包格式8個字節,但我的指令僅有2字節長,因此我自己加上同步字節和補充字節成了一個8字節的數據包。NKM2401的數據輸出直接連接到AM-RT5-433發射機上。至于天線,我使用了1/4波長的鞭狀天。
我想在遙控單元中取消NKM2401而改用AT90S2313固件程序實現相應的功能。遙控單元的固件是用匯編語言寫的,僅用了AT90S2313 2KB閃存中大約1/3大小的空間,因此可留下很多的空間供其它有需要的程序用。然而在接收端我不打算使用微控制器,因此必須用NKM2401來解碼。我未能從Abacom公司取得詳細的通信協議(他們的協議比較容易看懂)因此我無法編寫程序實現數據包的編碼。給我點時間的話我可能會用示波器或者計算機上的程序捕捉到數據流對它進行反向工程最後實現這個編碼過程,遺憾的是沒時間了。
在繼續進行之前我補充幾點。AT90S2313使用陶瓷振蕩器工作在4MHz,這對于比較低的串行數據通信速率來說是足了的。我必須把UART的速率設定在1200bps(數據下載期間)來接收數據,但發射時把速率設定在2400bps(通過NKM2401和發射機發送命令)。我不得不這做,因為 NKM2401僅工作在2400bps速率,1200bps是可用于下載的最高速率(考慮串行閃存的寫入時間)。
最後遙控單元上有一個標著J1 Link Test的跳。如果裝上跳NMK2401-N將會不斷地發送“ABACOM”信息,該信息可以用來檢測無線連接。
無線接收機模塊
無線接收機的作用是接收MP3遙控單元發射的433MHz信號?把信號轉換成RS-232電平送到服務器PC。
Abacom公司的AM-HRR3-433接收機如圖2所示。接收機模塊跟發射機一樣使用同樣的1/4波長鞭狀天。
圖2 Abacom公司的AM-HRR3-433接收機
在沒有接收信號的時候,接收機模塊的輸出滿是毛刺和噪音。我用示波器觀察發現一點信號都沒有,因為我住在鄉村地區。正因為這個原因必須使用Abacom公司的NKM2401-N芯片。接收機中NKM2401-N的模式(第4)接地,使其工作于解碼模式。用一個普通PNP三極管反相器向服務器PC提供虛擬 RS232電平信號。
LM2936CZ5低壓差整流器接收機提供5V直流電。大多數時間接收機模塊都連在MP3服務器計算機的串行端口上,然而出于工作需要,有時遙控單元必須連接到PC(例如下載歌名列表的時候),因此我制作一根短電纜把PC上的DB9插座接到一個5pin DIN插頭上,接收機和遙控單元均用配對的5pin DIN插座,這樣你就可以按需要把設備連起來了。
Abacom公司的接收機/發射機模塊與NKM2401-N配合使用非常可靠。無線發送指令是本設計的一個亮點。唯一覺得不足的是不能把433MHz接收機和FM發射機模塊裝在同一個機箱內。當把FM發射機放在接收機旁邊時,發射機的RF輸出會對接收 機靈敏度有輕微影響,造成無線連接僅能在20碼范圍內工作,跟我的預期目標相比發射距離太近了。然而當我把FM發射機裝進機箱里把它放到離433MHz接收機幾碼遠的地方時,發射距離近的問題解了,這時發射距離增加到約50碼(注意這仍然在室內)。
FM發射機
我構想這個設計的時候就預料到一定會有一些設計中的難點或者編程上的問題。開始我總認為制作一個小型FM發射機是很容易的事,所以我把這項工作留到最後完成。然而正如墨菲定律所說的一樣,當初我認為最簡單的事情到最後成為整個設計中最棘手和最耗費時間的部分。
曾經謠傳基于Rohm BA1404 IC的FM立體聲發射機套件經常會因為工作不穩定而導致無法使用,不過我還是鬼使神差地買了這個套件。唉,謠傳是真的──它的頻率穩定性實在是太差了,以致不能和現代數字調諧FM接收機配合工作。即使我用高質量的RF調諧元件替換了原來的便宜貨,問題依然存在。了取得心理平衡我只能這想∶這個IC是在數字FM接收機發明前設計的,其不能與數字調諧FM接收機配合工作情有可原。老式模擬FM接收機具備自動頻率控制電路,有可能會克服這個發射機套件的頻飄吧。
我找到了一個PLL穩頻的FM發射機套件,但其高達200美元的價格對本設計來說太不合算了。幾年前我曾經做過幾個10-400MHz范圍的PLL頻率發生器,因此我想嘗試自己制作FM發射機。
不過那是惡夢的開始。我過去所用的PLL芯片現在買不到了。目前大多數的PLL IC是專門用于移動電話之類的,它們在低于100MHz下不能穩定工作。雖然我也找到了一些針對FM發射用的IC,但它們的封裝形式太小以致不能焊接。
在這種情況下我決定另辟蹊蹺。因此我必須用微控制器來控制PLL芯片,為什么我不完全丟掉PLL芯片而用微控制器測量和控制振蕩頻率?我所想的可以認?是一個自動穩頻器。
我的想法可以用圖3描述。振蕩頻率主要由電感和可變電容設定。本設計中我把調諧范圍大概定在88~92MHz,這兩方面的原因∶第一,FM波段低端商業電臺較少;更重要的是96MHz是該電路能測量的最高頻率。
圖3 FM發射機框圖
確了穩定性和FM調制兩個目的,振蕩器由一個變容二極管控制頻率微調。變容二極管的電容量由加在它上面的偏置電壓定。這個偏置電壓由兩個分量控制。12位 DAC提供的直流電平和一個交流信號雙重作用在變容二極管上以實現頻率調制。DAC的輸出電壓初始值設置在中間值(2V),通過手動調整可變電容(微調)把振蕩器調到指定的頻率,其後微控制器會稍微上下調整DAC的輸出電壓來穩定這個頻率。
要用微控制器測量振蕩器的頻率必須先把它進行16預分頻。這可由普通的74F161 4位分頻器完成。預分頻輸出大概在5~6MHz頻率范圍,這個頻率可以用微控制器的16位計數器/定時器進行計數。
確了確定振蕩頻率,先把16位計數器清零,經過設定的時間間隔之後再把它的值讀出來。設定時間間隔由微控制器中另一個計數器/定時器編程控制,每5.461ms周期中斷一次。這樣16位計數器中的值可以這樣計算∶
Counter/timer Value=(fosc/16)×(5.461×10-3)
實際操作時微控制器讀出16位定時器的值把它與用你選擇的頻率代人上述方程計算出來的一個常數進行比較。如果振蕩頻率太低了DAC的值就會向上加1再試;相反地如果振蕩頻率太高了,DAC值就1。如此反復直到振蕩器的頻率落在你所選頻點附近的很窄的帶寬內。
這個電路一般來說可能會一直處于搜索狀態,有兩個原因∶第一,因為在采樣時間內振蕩器信號的變化會使計數器/定時器總會出現1次計數誤差;第二,由于振蕩器被音頻信號進行頻率調制,其頻率會隨著這個調制電壓而變化。
我們是不希望出現一直搜索的情的,因為這會導致接收機收到的音樂中夾著調制聲。避免這種情發生,微控制器一旦把頻率調定,就進入期10分鐘的 “休眠”狀態,10分鐘過後再檢測一次頻率。除非室內溫度出現較大變化,否則振蕩器就幾乎不用修正,本電路就可保證正常工作。
AVR AFC
在我詳細描述怎樣實現自動頻率控制FM發射機前,請先看一下圖4以有一個感性認識。首先我需要一個可以對6MHz頻率進行計數的微控制器且該微控制器還必須具備另外一個定時器,用來發出讀計數器和清零計數器的中斷沖。我選用Atmel AT90S2313-10PC,因它內部含有我所需要的功能。然而我必須讓它在超出它額定頻率10MHz的12MHz頻率下工作以獲得6MHz頻率的計數能力。順便說一下,這樣適當對Atmel AT90S2313“超頻”到目前為止還沒有出現過什么問題。
圖4 自動微調的發射機單元
當發射機制作完成設定在某個信道之後FM振蕩器頻率就可確定。因此,簡化操作,在程序開頭我輸入了所需的發射頻率作為常數,程序經編譯以後下載到AT90S2313做成一個固定頻率的FM發射機。
評論