无线电的下一代:Radii
当我们寻求风险投资来开发我们称之为 Radii 的互联网设备时,我们多次听到这样一句话:“如果这是 1999 年,您早就拿到钱了。” 不幸的是,当时是 2004 年,尽管我们有引人注目的原型和明确的市场,但像 Radii 这样的高风险消费产品却没有资金。与其让我们的努力付诸东流,我们决定与 Linux 社区分享原型的细节,正是这个社区使它的开发成为可能。在本文中,我们将解释我们如何使用低成本硬件和 Linux 以及一些配套软件(包括 Perl 和 GCC)快速构建 Radii 原型。
Radii 是一台收音机:一个带有按钮和拨盘的盒子,用于以熟悉的方式选择频段和调谐电台。由于这台收音机接收互联网广播,它提供了数百个无噪音的电台和各种各样的收听选项。频段选择拨盘不是 AM 和 FM,而是用于选择诸如新闻、体育和摇滚等类型。电台选择拨盘滚动浏览电台名称,可以通过单击选择按钮进行调谐。
在这个项目开始时,我们三个人每人投入了 100 美元和一些业余时间,同时继续从事我们的日常工作。我们从未将此视为快速原型设计的练习;这一切都是为了尽可能快速且廉价地实现我们的愿景。在我们开发的每一步,我们都在寻找完成任务的最快方法,并权衡其成本。
原型机安装在一个由 National Radio Company 于 1950 年代制造的改装 SW-54 收音机中。改装前,这台收音机状况不佳。作为旧技术的崇拜者和收藏家,我们喜欢认为我们给了它新的生命。
Radii 核心硬件平台是一台运行 Linux 的旧笔记本电脑。操作员界面包括两个旋转编码器、三个瞬时接触按钮、一个 40x2 背光 LCD、一个电源和一个复古收音机外壳。编码器和按钮连接到一个 PIC 微控制器开发板,该开发板又连接到笔记本电脑的串行端口。LCD 连接到笔记本电脑的并行端口。
在我们 300 美元的预算中,成本很重要。因此,eBay 是我们首选的供应商。以下是我们的硬件购物清单
PIC 微控制器开发板 (OOPIC) (70 美元)。
一个 TTL 到 RS-232 芯片 (TI MAX232) 和相关的位,用于将 PIC 连接到 RS-232 (5 美元)。
三个用于选择/特殊功能的瞬时按钮 (3 美元)。
两个旋转编码器,一个用于频段选择,一个用于电台选择 (3 美元)。
一个 40x2 LED 背光 LCD (12 美元,eBay)。
Gateway Solo 5150,300MHz 奔腾笔记本电脑,屏幕损坏 (100 美元,eBay)。
一台 National NC-54 老式收音机 (35 美元,eBay)。
PIC 和 LCD 的电源 (3 个/10 美元,eBay)。
电缆、连接器、泡泡糖、捆扎线等。(25 美元)。
运费、手续费和税费占用了剩余资金的大部分。
PIC 微控制器是 Microchip Technology, Inc. 生产的单芯片计算机。虽然这些微型计算机能够完成许多有用的事情,但我们在这里使用它只是为了处理操作员输入。对于使用 PIC 进行原型设计,通常使用开发板。PIC 开发板通过允许一系列输入电源选项和轻松访问芯片的输入和输出引脚,为 PIC 应用程序的原型设计提供了简便的方法。这不是必须的,但它使创建原型更容易。
我们使用了 Savage Innovations 的 OOPIC 开发板/系统。它价格低廉,并为许多输入和输出设备(包括按钮、编码器和 RS-232 串行通信)提供了简单的对象接口。不幸的是,OOPIC 没有 Linux 开发环境,尽管 SourceForge 项目正在进行中。
硬件由一台带有损坏 LCD 的 Gateway Solo 5150 笔记本电脑完成。类似的笔记本电脑在 eBay 上的售价在 50 美元到 100 美元之间。
从一开始我们就选择 Linux 有很多原因。主要原因是大多数发行版都配置了我们认为可能会使用的许多工具,例如 mpg123、XMMS、Perl 和编译器。它还有助于我们控制预算,因为它是免费的。Linux 使原型设计变得容易,因为许多应用程序和实用程序都保留了其命令行界面,允许从脚本中使用它们,例如为 Radii 编写的脚本,如下所述。
操作系统的安装和配置非常简单,除了音频支持。由于我们的笔记本电脑太旧了,大多数安装程序都无法检测到音频硬件。我们以一种不科学的方式尝试了许多不同的 Linux 发行版,直到我们找到一个可以轻松安装在我们的机器上的发行版。我们最终安装了带有 ALSA(高级 Linux 声音架构)支持的 Fedora Core 2。
为了使您的特定机器的声音工作,最重要的是识别您的声音硬件。在我们的例子中,我们通过在 Google 上搜索这款笔记本电脑的型号来确定声音硬件。一旦我们确定了我们拥有的声音硬件,我们就能够从 ALSA 项目站点找到并安装适用于我们机器的适当 ALSA 驱动程序,即 ES1879 ESS 音频驱动程序。您可能需要使用 alsamixer 实用程序调整一些默认的 ALSA 参数。
硬件到位且操作系统工作后,一切都归结为寻找或创建所需的软件组件。我们有简单的要求
音频流播放器。
LCD 控制器。
一个应用程序,用于处理来自串行端口的操作员诱导信号,并与流播放器和 LCD 交互。
我们需要一种播放流媒体音频的方式,我们可以从我们的应用程序中控制它。我们最初驳回了 XMMS,因为它是一个 GUI 应用程序,但我们稍后重新检查了它,并发现 XMMS 可以从命令行进行操作。
XMMS 应用程序提供了许多方便的选项,可用于控制其自身已运行的实例。可以通过发出 -s 参数来停止它。播放列表可以通过使用-p <播放列表>来更新,并且播放列表参数可以是流的 URL。使用xmms -h以获取完整详细信息。
例如,您要求 XMMS 从当前选择切换到 AM 1710 Antioch 互联网电台(老式广播),通过发出命令
xmms -p http://66.54.65.226:9022
要停止,请使用xmms -s等等。
XMMS 完全满足了我们对播放器的需求,但它也引入了一个问题。XMMS 是一个 GUI 应用程序,因此它需要一个正在运行的 X11 服务器。与其消耗我们低功耗笔记本电脑上的可用资源,我们不如使用 X 虚拟帧缓冲区 Xvfb。Xvfb 提供了一个轻量级的 X11 服务器,可用于为需要 X11 资源的应用程序提供 X11 资源,但它不做任何其他事情 - 它是不可见的。
我们需要一个 CLI 应用程序,它将在我们的并行端口 LCD 上显示一个字符串。在 Google 上搜索后,我们找到了一个名为 lcd-info 的 FOSS 应用程序。lcd-info 在连接到系统并行端口的 HD44780 兼容 LCD 上显示系统性能信息。它与我们需要的略有不同,但在研究其源代码几分钟后,我们发现它可以很容易地适应我们的目的。
lcd-info 是用 C 编写的,并编译成一个 CLI 应用程序。我们使用 GCC 的简单调用来编译我们更简单的应用程序
% gcc -o setlcd setlcd.c iolcd.c
控制 LCD 的底层例程在 iolcd.c 中,它是从 lcd-info 项目中未经修改借用的。setlcd.c 是 Radii 特定的部分,它使用在 iolcd.c 中找到的函数。我们将我们的二进制文件称为 setlcd,它的运行方式如下
% setlcd <string to display>
构建将 LCD 连接到并行端口的电缆比改编 lcd-info 更耗时。似乎应该有一个合适的现成电缆,但电缆 LCD 侧的引脚排列因制造商/型号而异。与其找到完全正确的电缆/LCD 对,我们不如选择为我们根据价格获得的 LCD 制作自己的电缆。
我们使用 Perl 构建了 Radii 应用程序。我们选择 Perl 是因为它是一种我们非常熟悉的语言,它有许多支持包,并且更新/编译/调试周期很快。
首先要做的是从连接到串行端口的 PIC 开发板读取输入。我们使用了 Device::SerialPort 包。以下是我们应用程序的开头,它展示了如何使用 Device::SerialPort 模块初始化串行端口
#!/usr/bin/perl use Device::SerialPort; use strict; # Set up the port. # All port settings must match the PIC settings. my $port = new Device::SerialPort("/dev/ttyS0"); $port->baudrate(9600); $port->parity("none"); $port->databits(8); $port->stopbits(1); $port->handshake('none'); $port->write_settings;
然后我们需要处理从 PIC 开发板发送的以下消息,这些消息基于用户输入
Msg Meaning --- ------- U The station encoder rotated one unit up D The station encoder rotated one unit down s The select button was pressed u The band encoder rotated one unit up d The band encoder rotated one unit down while ( 1 ) { while (! ($code = $port->input)) { select undef, undef, undef, 0.075; } }
外部 while 循环使应用程序保持运行状态,直到它被杀死或死掉。内部 while 循环尝试从串行端口读取。如果没有任何内容可读取,它会休眠一小段时间,0.075 秒,然后再次尝试。这种休眠对于防止应用程序过度旋转和消耗大量 CPU 时间非常重要。在循环休眠时到达的任何消息都会累积在端口上,并在我们下次读取时可用。
当收到输入消息时,应用程序应始终通过更新 LCD 来响应。有时它应该通过更改当前电台来响应,即当按下选择按钮时。
当我们收到电台向上 (U) 或电台向下 (D) 消息时,我们需要在 LCD 上显示下一个电台,但我们不希望在用户发送选择信号之前更改电台。这使我们进入 LCD 消息显示。如前所述,我们使用 setlcd 命令,但现在我们从 Perl 脚本中使用 Perl system 命令调用它
system("setlcd", "Sel:$radiiStn{$curBand}{$choice}{name}");
其中 $radiiStn{$curBand}{$choice}{name} 是一个哈希,它通过频段索引和选择索引进行索引。它包含必要的选择信息:显示名称(此处使用)、电台 URL 及其频段。
一旦操作员单击选择按钮,PIC 就会发送一条 s 消息。作为响应,系统将 LCD 更新为新的电台名称,并向 XMMS 发信号以播放新的流,再次使用 Perl 的 system 命令
system("setlcd", $radiiStn{$curBand}{$choice}{name}); system("/usr/bin/xmms", "-p", $radiiStn{$curBand}{$choice}{station});
Radii 应用程序使用简单的 XML 输入文件进行配置
<?xml version="1.0"?> <Radii> <station url="http://66.54.65.226:9022"> <band>OLD TIME RADIO</band> <name>AM 1710 Antioch</name> </station> <station url="http://205.188.234.38:8040"> <band>Celtic</band> <name>CelticGrove.com 24/7 Celtic/Irish</name> </station> . . . </Radii>
可以使用 XML::Simple Perl 模块读取 XML 配置文件。
my @station; my %radiiStn = (); my %bands = (); my $file = 'stations.xml'; my $xs1 = XML::Simple->new(); my $doc = $xs1->XMLin($file); foreach my $key (keys (%{$doc->{station}})) { $band = $doc->{station}{$key}{band}; $url = $doc->{station}{$key}{url}; $name = $key; $bands{$band} += 1; $radiiStn{$band}{$bands{$band}}{name} = $bands{$band}.":$band: ".$key; $radiiStn{$band}{$bands{$band}}{station} = $url; }
此代码利用 Perl 哈希来获取所需的频段和电台信息。频段信息,包括名称和电台数量,保存在 bands 哈希中。电台信息,例如名称、URL 和频段,保存在 radiiStn 哈希中。
请参阅在线资源,了解包含完整脚本和其他相关软件的站点的 URL,以及有关如何构建硬件的详细信息。
Radii 演示了如何使用 Linux 快速且廉价地原型化复杂的消费设备。随着 iPod 革命的兴起和卫星广播变得越来越流行,类似 Radii 的设备不可避免地将改变世界各地广播和接收无线电的方式。
快速原型设计不需要特定的硬件、工具集或语言。它不是关于找到最佳解决方案;而是关于使用可用资源快速完成它。当它是 Linux 上的 FOSS 时,资源池是巨大的。在您整理潜在的构建块时,请关注目标。根据需要进行调整,然后使用您选择的语言将所有内容粘合在一起。
我们将笔记本电脑配置为启动到运行级别 3,完全多用户模式。在笔记本电脑启动后,我们启动 Xvfb,设置我们的 DISPLAY 变量,启动 XMMS 并启动 Radii 应用程序。启动顺序是
% Xvfb :1 & % export DISPLAY=:1.0 % xmms & % radii.pl
然后我们隐藏笔记本电脑,享受我们称之为 Radii 的收音机。
本文的资源: /article/8537。
Dan Rasmussen (dan@retro-tronics.com) 是 IBM 的高级 IT 专家,拥有马萨诸塞大学阿默斯特分校的数学学士学位和伦斯勒理工学院的计算机科学硕士学位。他从事软件工程师和 IT 顾问工作近 20 年。Dan 也是一位狂热的古董电子产品收藏家。
Paul Norton (pddknorton@charter.net) 早年曾在大型公司工作,包括施乐、利顿工业和培生。在过去的 20 年里,他专门与小型公司合作,其中几家是初创公司。他的主要业务重点是建立运营和产品及市场开发的战略管理。他拥有技术、人文科学和商业方面的三方面教育,并拥有伦敦西布鲁内尔大学的 MBA 学位。他曾在欧洲和美国广泛工作。
Tatara Systems 产品营销副总裁 Jon Morgan (jamncl4@yahoo.com) 在电信和数据通信行业拥有超过 18 年的市场营销、技术和管理经验。最近,Jon 担任 Appian Communications, Inc. 的产品管理/营销总监。在加入 Appian 之前,Jonathan 在 Fujitsu Network Communications (FNC) 担任过多个管理职位。在加入富士通之前,Jonathan 在贝尔实验室工作了七年。Jon 拥有圣路易斯华盛顿大学的 BSEE 学位和罗格斯大学的 MSEE 学位。