基于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发射机。
评论