原文:Smart Home Automation with Linux and Raspberry Pi
协议:CC BY-NC-SA 4.0
一、电器控制:让东西做事情
Abstract
对于大多数人来说,家庭自动化始于并止于电器控制原理。当任何家用设备(如视频或电视)由除其前面板上的按钮或其原始遥控器之外的东西控制时,它被认为有点神奇,是进一步研究的主题,特别是如果控制是远程进行的。电灯和烤面包机不需要由墙上的开关控制,你的电视也不需要从 PVR、DVD 播放器或卫星接收器接收信号。每个设备都有自己的特性和控制方法,并且每个设备都有特定的功能,这些功能不容易被抽象成任何通用形式的控制接口。但是,可以使用两种基本方法中的一种来控制其中的大多数:
对于大多数人来说,家庭自动化始于并止于电器控制原理。当任何家用设备(如视频或电视)由除其前面板上的按钮或其原始遥控器之外的东西控制时,它被认为有点神奇,是进一步研究的主题,特别是如果控制是远程进行的。电灯和烤面包机不需要由墙上的开关控制,你的电视也不需要从 PVR、DVD 播放器或卫星接收器接收信号。每个设备都有自己的特性和控制方法,并且每个设备都有特定的功能,这些功能不容易被抽象成任何通用形式的控制接口。但是,可以使用两种基本方法中的一种来控制其中的大多数:
- 电源线供电控制(灯泡、烤面包机、电茶壶)
- 红外(IR)遥控器(电视、视频)
虽然现代机顶盒的背面可能有串行、USB 或网络插座,但这些是对前两种方法的补充,并不排斥它们。因此,能够控制 IR 信号和电源线涵盖了现代家庭中的大多数设备。如果你知道如何控制电源,即使是相对简单的电器,如茶壶,也可以远程控制,因为它们的建造并没有任何被其他方式控制的意图。毕竟,如果你确保茶壶装满水并插入墙壁开关插座,茶壶本身也打开了,那么开始烧水的唯一必要任务就是轻触墙壁插座上的开关——这可以通过电源控制来控制。我将首先介绍这些控制电源的方法。
X10
X10 是我将介绍的方法之一,它允许你远程控制任何插入家中标准环形电源的设备的电源。灯、电茶壶和烤面包机都是这类现有设备的例子。此外,我将介绍最初发明的由 X10 控制的设备,如电动窗帘轨道。X10 通过相当便宜和非常容易安装实现了市场渗透。
关于 X10
X10 是一种控制协议,它沿着主电源线发送数据包,并带有诸如“打开设备”或“调暗至 50%”的消息数据包通过计算机接口或定制遥控器等发射器应用于电力线,然后由一个简单得多的接收设备(如灯开关)进行处理,进而控制本地设备的电源。
X10 的工作原理是将数据编码成高频脉冲串(120KHz),并将其添加到现有的电力线上。因为所有国家的市电不是 50Hz 就是 60Hz(其中日本和大溪地两个都用!),这些高频信号通常会被大多数只考虑功耗的器件丢失。另一方面,可以将一种特殊的设备插入对高频脉冲感兴趣的电力线。因此,每当电压从正变到负时,就可以识别出一个二进制数字,反之亦然。
Caution
有几种基于这一原理的设备,大多数 DIY 商店都有自己的变体。但是,如果它们不包含 X10 标志,则它们与 X10 不兼容,因为它们的协议不同。它们也可能相互冲突。
X10 控制的每个设备都必须有一个地址。这个地址由两部分组成:房屋代码和单位代码。房屋代码只是一个字母,从 A 到 P,应该是你的房子所独有的。显然,只有 16 个字母可供选择,房屋代码不会对世界上的每所房子都是唯一的,但它应该对任何与你共用直接电源的房产都是唯一的。这通常包括你的邻居,偶尔也包括两三个门外的房产,因为你所有的电线都汇聚在道路下更大的管道中。因此,任何共享这些线路的房子也将共享 X10 消息,这使得控制你邻居的电器以及(或代替)你自己的电器成为可能。目前,很少有人参与家庭自动化(尤其是 X10)来解决这个实际问题。现在,你可以在电表和家里其他电源之间安装一个过滤器,让自己安心一些。这通常被称为全屋滤波器,有几种品牌和型号,如 PZZ01,允许 200A 的电流。很自然地,考虑到所涉及的电流水平(以及某些国家的法律),许多人雇佣合格的电工来安装这样的设备。
地址的第二部分是单元代码,共有 16 个单元代码,由 0 到 f 之间的十六进制数字表示。虽然这看起来不是很多,但 16 个设备允许您在中等大小的四居室房子的每个房间中拥有两个设备(一个灯和另一个)。大多数房间只有一盏灯,而电视和收音机等电器更有可能通过红外线甚至以太网进行有效控制。
除了地址之外,每个 X10 接收器模块都适合两大类中的一种,要么是灯,要么是电器。这是 X10 模块本身存在的差异,决定了它将如何向插入其中的设备供电以及它将接受哪些消息。电器模块只对插入其中的任何东西提供开/关控制,并且通常具有足够高的额定功率来接受大多数家用电器(烤箱除外)。相比之下,灯模块也将响应亮度控制消息,改变施加到插入其中的灯泡的电压。因此,将烤面包机插入灯模块会有问题,并且有潜在的火灾危险。另一方面,将灯添加到电器模块中可以很好地工作,并且只受到失去调光功能的限制。
Note
一些类型的灯(如荧光灯和节能灯泡)通常不能在灯模块上工作,必须与电器模块一起使用。
每个 X10 消息由三部分组成:
- 开始消息块(1110 的半字节)
- 地址(房屋代码和/或单位代码)
- 命令代码(例如,“打开”)
有几种不同的命令,主要分为两组——针对所有设备的房屋代码信息和针对单个设备的单元代码信息。如前所述,每个 X10 模块都被构建为接受或忽略特定的消息,通常根据它是被指定为灯模块还是电器模块;然而,设备模块也将忽略“所有灯打开”的消息,但尊重“所有单元关闭”,这是由区分灯和单元的命令的微妙措辞所暗示的。有趣的是,它们的相反变体(“所有灯关闭”和“所有单元打开”)并不存在。这是故意的。“所有灯都亮着”的意图之一是作为一种安全特征。意外调用“所有单元开启”命令可能会导致茶壶干烧或类似的危险。相反,“所有单元关闭”为房子提供了一个快速关闭程序。
一旦消息被发送出去,其他什么都不会发生。永远!接收方不会生成消息的确认,发送方也不会查询最近控制的设备的状态来确认其到达。这是因为发射电路比接收器更复杂和昂贵,并且因为增加信息设备会增加最简单的灯开关的成本和体积。一些双向开关确实存在,为您提供了一种查询其状态的方法,但它们更昂贵。
然而,为了确保数据的有效性,消息被发送两次,并且两个消息被比较是否相等,因为电力线上的电噪声可能已经破坏了部分信号。因此,接收一条 X10 消息大约需要 0.64 秒。虽然这是礼仪中被接受的一面,但当客人住在你家时,这并不特别友好,因为当他们试图开灯时,灯似乎没有工作…所以他们再次按下开关,这样就关掉了!为了克服这一点,许多设备都有一个直接影响灯光的本地开关,而无需发送 X10 消息。对于 X10 照明开关来说,这是最真实的,它的作用就像普通的墙壁开关,而不是由现有(即普通)照明开关控制的原位 X10 插座。
X10 可能出现的另一个问题是死角,由于某些设备产生的电噪声,所有的消息都可能(有时确实)被吞噬。已知某些 MacBooks 的电源存在此问题。因此,有时需要将 X10 设备移动到不同的插座上才能工作。当电路中有变压器或有分相系统时,X10 信号也会丢失。同样,您可能需要将发射器和接收器移至问题设备的同一侧。
Note
在进行 X10 安装之前,先用几个设备进行试验,以确保房子中有一个位置能够发出 X10 消息,其他绝大多数区域都可以听到。
总体设计
在购买和安装任何设备之前,你必须首先考虑你想要控制什么设备,以及你想要如何控制它们。这个问题的重要部分不是你将使用多少设备,而是如何控制它们。这可以很简单,也可以很复杂。并且根本不需要涉及计算机。
简单案例
在这种情况下,您的设备将由本地开关或一个或多个插入电源的有线控制器控制。有线控制器在这里是必要的,因为你总是需要某种方式将 X10 信号引入电力线。有些有线控制器(SD7233)包括定时电路,因此它们可以在一天中的特定时间自动开灯或关灯——有时在随机的时间框架内,以迷惑潜在的窃贼。这些工作很好,并提供了一个更便宜的替代运行计算机整天,每天。
除了基本的定时器功能,这种设置只能由与控制器进行物理接触的人来控制。这是探索 X10 最便宜的方式,但是设备不能通过网站、电子邮件或手持控制器无线遥控。
如果美学很重要,有一些控制器(例如,TMD4,如图 1-11 所示)将安装在墙上的插座中,允许您使用现有的灯开关来控制多个灯,而无需在茶几上安装类似于《星际迷航》的控制器。然而,这需要购买一个 X10 开关(发送信息)和一个 X10 灯具(响应信息),对于这种简单的设置来说通常是多余的。
标准案例
在前面显示的简单情况之后,下一步是利用无线控制器。市场上的大多数设备使用无线电频率(RF,433MHz),允许从花园、穿过墙壁、穿过地板和穿过天花板来控制设备。精确的范围根据信号传播的材料、在 433MHz 范围内工作的其他设备(如电视发送器或 RFID 阅读器)以及发射器的强度而变化,一些中等价位的设备在无障碍时具有 25 米的范围。
由于 RF 与电力线没有连接,因此它还需要使用 RF-to-X10 网关,该网关可插入墙上的插座,接收任何合适的控制器发送的 RF 信号,并将数据消息发送到 X10 电力线。尽管这种设备有一个可配置的房屋代码,但是它们的单元代码总是被硬编码为一个,所以如果您计划从一个更简单的环境中迁移,一定要避免对任何设备使用这样的代码。
以这种方式采用 RF-to-X10 网关为自动化提供了更大的空间,因为控制器是无线的,不再需要位于电源插座旁边,使它们能够出现在浴室中,而在许多国家,这种插座与水龙头的距离在 1.5 米以内,这违反了国内住房法规,例如在英国。有贴在墙上,坐在桌子上,甚至可以戴在钥匙圈上的射频控制器!
射频遥控的主要问题是很难过滤掉恶意传输, 1 意味着外面的人可能会控制你的车内灯。
全自动
这与标准自动化示例的最大区别是包含了一个计算机接口,通常是 CM11,这将在本章后面介绍,如图 1-14 所示。它没有 X10 地址,但它被动地监控电源线上的信息,并通过串行或 USB 端口将它们传回计算机。类似地,计算机可以使用该设备将新信息传送到电力线上,这些信息将被您已经拥有的设备接收到。一旦有了计算机,可能性就出现了。我将在本章稍后讨论 X10 设备时讨论这些可能性。
完全有可能使用不使用 RF 无线或遭受其问题的计算机实现全自动解决方案。除了射频,您还可以使用更安全的传输和协议,如 HTTPS,通过 iPod touch、iPhone 或其他适当连接的手持设备(如移动电话)上的网络浏览器将信息发送到电脑,电脑再将合适的数据传输到电力线。
分配地址
因为你家里的每一个自动化设备都需要一个地址,所以在这个过程开始的时候给它们分配一个合理的、容易记忆的地址是有意义的。这里要记住的最重要的事情是,你的 X10 配置可以随着你的预算增加而增加,你更有可能在你的房子里增加几个新设备,而不是增加几个新房间!
确定房屋代码非常简单。如果你的一个或多个邻居有 X10 系统,那么选择他们不用的字母。这听起来可能很明显,但你应该和他们谈谈他们是否有一个,以及他们使用什么代码。仅仅因为你目前没有看到任何非理性行为,并不意味着未来不会有冲突。我也会避免使用 P,因为一些设备(例如,TM13UAH)认为 P 是“接受任何房屋代码上的消息”,这可能会造成混乱和问题。我唯一的其他建议是避免 A,这是大多数设备的默认设置。这有两个好处。首先,它确保了任何在附近“玩”X10 设备的人不会无意中闯入你的网络并造成损害。第二点是,通过改变默认设置,你可以确定系统被成功地重新编程,而不是因为一个幸运的巧合而暂时停止工作。
为单元代码生成赋值是你自己判断的事情,但是你不能通过创建一个模式而走得太远。我从 2 开始给我的设备编号,并以逆时针顺序在我家的房间里工作,从楼上开始,到厨房结束。我假设每个房间有两个设备。我的推理和思考过程如下:
- 从 2 开始,因为 RF-to-X10 网关使用 1。
- 每个房间两个设备意味着每个房间从 2,4,6,8 开始,以此类推,这很容易记住。
- 我唯一需要记住数字的时候是在黑暗中摸索遥控器的时候。这是我在床上找电灯开关的时候。因为主卧在楼上,我开始在楼上数数。当我躺在床上时,我面对着房子的其余部分,第二个卧室在我的正前方,第三个在它的左侧,这使得逆时针运动更加自然。
- 如果楼上和楼下的分离没有发生在单元代码 8 上,我会留下一个间隙,这样它就发生了。
- 我把休息室/餐厅分成两个逻辑房间,尽管它是一个空间。这意味着我可以在一个空间中放置多达四个设备,这很可能发生在更大的开放式区域中。
- 随着时间的推移,厨房更有可能获得设备,所以我把它放在列表的最后。
如果您浏览可用控制器的选择,您会注意到大多数都有一个选择器开关,可以将按钮从 1–4 重新分配到 5–8,或者从 1–8 重新分配到 9–16。另一种方法是让第一组(比如 1-4 个)只控制房子里的灯,第二组(5-8 个)用来控制相同房间里的电器,使它在“灯和电器”之间切换,而不是“楼上楼下”。这确保了尽管选择了第一个存储体,但是当你想要控制灯时,不可能意外地关闭电器,反之亦然。
最后要考虑的是您计划使用的控制器模块的物理大小,因为许多模块只支持八个设备。如果您最方便的编号系统碰巧使用设备 9-16,那么您将不得不重新考虑您的模式或只购买更大的控制器。
使用多个房屋代码
一处房产可能有两个或更多的房屋代码,使家用设备的总数达到最多 256 个。这对最大的豪宅来说已经足够了!这种设置的唯一考虑是诸如“所有灯关闭”的控制消息只能应用于单个房屋代码。对于基于计算机的控制,您可以很容易地修改软件,以发送两个(或更多个)“所有单元关闭”类型的消息,这将影响指定房屋代码上的所有设备。然而,如果你选择只使用独立的遥控器,比如你将在本章后面学习的桌面控制器,当你依次关闭每个房子的代码时,这可能需要一些拨弄。在这种情况下,您可能希望将房屋代码划分为一楼、二楼等,并为每一层设置单独的控制器。
设备模块
我现在将介绍市场上可以通过 X10 控制的众多设备,换句话说,就是那些包含接收器的设备。这些分为三类:
- 内部:X10 接收机和它控制的东西在同一个物理外形中。电动窗帘轨就是一个例子。
- 本地控制:X10 接收器处理信息,但控制直接接入其中的电源。电灯开关就是一个例子。
- 插入式模块:这些模块可以插入标准电源插座,外部设备可以插入其中。X10 逻辑决定是否允许电流在它们之间流动。电器单元就是一个例子。
控制灯光
这是迄今为止最常见的设备类型,因此有几种不同的设备可供选择,在 X10 术语中称为灯模块。然而,应该注意的是,一些灯根本不能附接到灯模块。这些包括在大多数厨房里都能找到的荧光照明带和它们的紧凑型荧光灯(通常被称为节能灯泡)现在正在全国各地的家庭中出现。更糟糕的是,这些灯泡还会在电源线上引入尖峰信号,从而关闭附近的 X10 灯。 2
各种灯模块之间的主要功能差异在于所讨论的设备是否支持调光。当光线变暗时,交流电压的幅度不会减小。相反,功率正弦波的一小部分被移除,这有效地短时间关闭灯。因此,灯泡灯丝每秒钟充电和放电的次数比平常多得多,这就产生了一个不断变化的电磁场。这可能导致灯丝开始振动并产生可听见的嗡嗡声。这通常不是灯泡的问题(你总是可以购买粗糙的维修灯泡,使灯丝更加稳定,以防止这种移动),但对于其他不是为它制造的电器来说,这是危险的。
请注意,与 LED、紧凑型荧光灯和卤素灯等更新的替代品相比,许多国家正在逐步淘汰旧的白炽灯泡,因为它们的效率相对较低。
灯模块(LM12U)
这是一件简单的事情,需要零安装。你只需将它插入一个空闲的墙上插座,使用前面的拨号盘设置地址,然后将灯插入前面的插座,如图 1-1 所示。
图 1-1。
The LM12U lamp module, 122 × 52 × 42mm
这将支持 60 至 300 瓦之间的任何白炽灯,并且可以通过设置为相同房屋代码的任何 X10 控制器来打开和关闭或调暗。LM12U 有一个姐妹设备,AM12U,在同一作品中工作。主要区别在于,AM12U 适用于设备,因此会忽略任何“暗淡”消息。LM12U 还将响应两个特殊消息,“所有灯打开”和“所有单元关闭”,前提是它们使用匹配的房屋代码发送。这个模块,像这里介绍的许多其他模块一样,与电力线串联放置,起到逻辑与门的作用。也就是说,灯的开关和墙上的电源开关都必须打开,X10“打开”消息才能生效。
Note
这里给出的代码是这些设备的英国版本。由于世界各国使用的电源系统略有不同,但差异很大,因此根据您所在的国家,需要不同的备用模块。例如,意大利的 LM12U 被称为 LM12I。
卡口灯模块(LM15EB)
这也是一个简单的零安装设备,但需要更多的配置。要安装它,你把它插到一个现有的灯座上,然后把灯泡(最高 150 瓦)重新插入它的自由端。然而,荧光灯和低能量灯都不应该使用。通过关闭并再次打开灯来设置地址,然后在灯重新打开后的 30 秒内,按下控制器上所需的房屋/单元代码三次,每秒一次。一旦代码被读入,灯就会亮。该设备还有一个拧入版本(LM15ES,ES 代表爱迪生螺丝),尽管它是图 1-2 中所示的卡口版本(LM15EB)。
图 1-2。
The LM15EB, 45 × 45 × 95mm
LM15EBs 缺乏较大的 LM12U 的调光功能,但因为它们只比传统配件延伸 62 毫米,所以它们足够小,可以隐藏在大多数灯罩内,使房间保持现有的美学品质。
同样,该模块的作用类似于一个与门,仅当 X10“on”命令已发送且灯开关正常打开时,灯才发光。
墙壁开关(LW10U)
正如你从图 1-3 中看到的,这些是标准灯开关的完全替代品,这意味着你只能使用白色塑料。然而,它们很容易安装到现有的嵌入式开关盒中,仅从墙壁伸出 16 毫米。该装置的地址由翘板开关后面的一对拨号盘设定,用螺丝刀轻轻撬开即可访问。然而,应该小心,因为将开关固定在 Shell 上的塑料接线片非常脆弱,在断裂之前只能承受三四次拆卸。
除了通过“开”、“关”、“暗”和“亮”命令进行远程控制之外,还可以通过开关在本地实现相同的功能。触摸它一次会将灯完全打开或关闭,而按住它会使灯变暗(如果它很亮)或变亮(如果它很暗)。唉,当你关掉它然后再打开时,不能保持最后的亮度,你也不能在没有首先使它完全变暗的情况下稍微增加昏暗灯的亮度,但本地控制意味着灯在按下按钮后立即亮起,以便不混淆任何客人。
图 1-3。
The LW10U, 85 × 85 × 30mm
该设备还响应“所有灯打开”和“所有单元关闭”消息,以匹配房屋代码。
带调光器的微型模块(LWM1)
该模块是 LM10U 的涡轮增压版本,如图 1-4 所示。它的工作方式与 LM10U 相同,但足够小,可以安装在墙壁插座内,允许您使用任何您喜欢的开关面板。
图 1-4。
The LWM1, 40 × 40 × 15mm
它支持 LM10U 的所有现有功能,但也可以记住最后的亮度设置,允许灯光在第一次打开时平滑地改变,这有助于延长灯泡的寿命。
Note
较便宜的模块在全亮度下打开,所以如果你喜欢情调照明,那么这是一个值得考虑的变体。
此外,这是本产品中少数支持双向 X10 通信的器件之一。这意味着您可以向设备发送消息,询问其当前的亮度状态,并且设备能够回复。这对于大多数其他设备是不可用的,这意味着您(或者更具体地说,您的控制器设备)必须记住它发送的最后一条消息,希望它到达,以便模拟灯状态的查询。如果亮度被局部改变,甚至这个结果也可能是有缺陷的。然而,在大多数情况下,这种功能是不必要的,因为您很少想知道灯是否亮着。如果你要去睡觉,那么你不感兴趣的是灯是否亮着,只关心你是否能关掉它。除非你有一个非常大的房子,否则你通常可以在一个漆黑的房子里看到一盏灯亮着,因此知道你是否需要重新发送“所有单元关闭”的消息。
这种设备的缺点是它的价格大约是 LM10U 的三倍。但是,LW12 中有一款中端产品具有相同的规格,但没有双向通信功能。
DIN 轨道调光器(LD11)
这是一个(非常)高功率模块,能够控制高达 700W 的设备,因此它适用于主卤素以及传统的主照明。该设备不是用来代替开关(如 LWM11)或与灯泡连接(如 LM15EB),而是远程放置在保险丝盒附近,LD11 输出电缆直接进入灯具。这是 LD11 上的一个开关终端,允许设备打开和关闭,就像在本地一样。然而,由于从设备到 LD11 有四条(潜在的)长电缆(两条用于电源,两条用于控制,如图 1-5 所示),其目的并不那么明显。
图 1-5。
The LD11, 50 × 80 × 70mm
LD11 的主要用途是情绪照明,因为它支持卤素,以及场景照明,因为它具有柔和的调光和记忆功能。因为它们通常被放置在远离设备本身的地方,所以你会得到一个更干净的安装。令人欣慰的是,模块成本的降低抵消了布线成本。
如果您使用 LD11 为照明插座供电,只有灯具必须使用它们,因为调光功能会损坏许多其他类型的电器。为此,你可以为灯具和 LD11 供电插座使用非常规插头和插座。如果你的国家使用方形插头,请使用圆形插头,反之亦然。
家用电器微型模块(AWM2)
此模块使用前缀 A,因为它主要用于控制设备;然而,它的功能也适用于灯光。如图 1-6 所示,AWM2 位于标准墙壁插座内,支持两个开关。一个开关控制本地连接的灯泡(并将等效的 X10 消息发送到电力线),而另一个开关将 X10“开”或“关”消息依次发送到下一个地址。因此,如果您的 AWM2 配置为 E2,您也可以从同一台交换机控制 E3。通过在楼梯的顶部和底部安装两个相同配置的单元,您可以从任何位置控制楼上和楼下的灯,而无需重新布线。因为这是一个内部模块,你可以使用任何开关面对你的选择。但是,请注意,该设备不支持调光。
图 1-6。
The AWM2, 46 × 46 × 18mm
控制设备
对于不带 X10 的电器,如茶壶、烤面包机和高保真音响设备,需要第二种类型的设备。这些设备的功能与 LM12U 或 LM15EB/LM15ES 非常相似,即设备插入现有的电源插座,相关设备插入 X10 模块。如前所述,这些要求墙上插座上的开关以及电器本身上的任何开关都必须保持永久开启。这进一步意味着任何插入这种模块的可以远程控制的设备在任何时候都必须是安全的。以茶壶为例,它必须含有足够的水,这样它就不会烧干。
设备模块(AM12U)
像它的姐妹模块 LM12U 一样,这是一个非常简单的“即插即用”设备,尽管它看起来相同(见图 1-7 ),但有三个非常重要的区别:
- 它没有调光器支持
- 它可以控制荧光灯
- 它可以在更高的负载下工作(白炽灯高达 500W,电风扇等感性 3 电器为 1A,加热器等电阻性负载 4 为 16A)
因此,它的预期目的是实现风扇和茶壶等设备的自动化。然而,真空吸尘器和风扇加热器等高功率设备很少在这些模块上工作,因为当电机打开或关闭时,电机周围的磁场崩溃会产生反电动势。这种反电动势会产生一个很大的电压尖峰,可能会烧断 AM12U 中的保险丝(如果你幸运的话)或该设备(如果你不幸运的话)。
图 1-7。
The AM12U, 52 × 122 × 33mm
有一个嵌入式版本,称为 AW12U,具有类似的规格。
Note
当互联网连接不可用时,通常是由于路由器被阻塞或崩溃,您可以经常使用这些设备来自动重启路由器和调制解调器。
家用电器微型模块(AWM2)
这是之前(以及图 1-6 中)作为灯光控制合适候选的同一模块,因为它也可以用于控制电器。除了尺寸更小(46×46×18 毫米)之外,与 AM12U 相比,它的主要优势是额定功率更高,可以为风扇加热器等设备供电。该装置的给定功率规格为白炽灯 2kW,感应设备 3A,电阻负载 16A。
如前所述,这种设备安装在墙上的插座,使其更难规避。因此,该模块可让您在夜间关闭儿童的电视或立体声系统,而无需像 AM12U 那样拔掉插头。
表 1-1 给出了之前提到的设备的分类。
表 1-1。
Basic X10 Modules
| 装置 | 名字 | | --- | --- | | AM12U | 设备模块(插头) | | AWM2 | 家用电器微型模块(墙内) | | LD11 | DIN 导轨调光器 | | LM10U | 墙壁开关 | | LM12U | 灯模块 | | LM15EB | 卡口灯模块 | | lm15 是 | 拧入式灯模块 | | LWM1 | 带调光器的微型模块 | | LW12 | 带调光器的墙内模块(类似 LWM1,但无双向通信) | | TMD4 | 微型模块发射器调光器(四开关,墙内,无电源处理器) |内部设备
这些设备很少见,通常属于新奇类。一个很好的例子是 REX-10,一个犬吠报警系统!在接收到合适的 X10 消息(例如,来自运动检测器)时,该设备播放狗吠声,片刻之后,发送 X10 消息以打开灯。作为一个想法,这是好的,但很难配置这些硬连线设备,因为你可以用一个简短的计算机程序或简单的脚本有效。
组合设备
我将简要介绍一些设备,尽管它们没有附带 X10 控制,但总是与 X10 控制一起使用。还应该注意,电源控制同样可以来自替代的功率控制方法(例如,C-Bus)。
电子窗帘轨:改装
只需将 U 形拉绳缠绕在电动马达上,就可以实现多种窗帘的自动化。当然,细节是关键,所以市场上有一些预装的电机和滑轮系统,可以打开和关闭窗帘,安装在顶部导轨上。它们包括 Regency PowerMotion、通用窗帘电机(UCM)和 Add-a-Motor 80 (CM80)。
使用翻新解决方案需要您有一个良好的现有顶部导轨,因为这决定了电机能够处理的窗帘的最大重量——如果卡住,电机可能会烧毁。具体重量会因设备而异,但一个很好的指南是,带有滚珠轴承的顶部导轨将管理高达 30 公斤的窗帘,而没有滚珠轴承的顶部导轨可能会停止在 10 公斤。
所有这些设备都需要手动安装,以将电线固定到电机上,配置窗帘的打开和关闭位置,并调整电子设备以结合单独的 X10 接收器。根据设备的不同,这可能涉及一个简单的 AWM2 或 AM12U 单元,也可能是一个串联模块。
一旦安装好,控制窗帘是一件简单的开/关事情,例如,需要一些额外的控制逻辑来自动将它们定位在“50%打开”的位置;但是,您可以随时手动发出“off”命令来阻止它们进一步打开。有专门为窗帘控制设计的开关,如 Marmitek X10 电机驱动开关(SW10),它将标准 X10 信息“开”、“关”和“亮”分别转换为“完全打开”、“完全关闭”和“部分打开”。
Tip
在安装后的最初几天,你不应该让控制帘无人看管,因为电机可能会试图将它们移动得太远而烧坏。
电子窗帘轨:预建
一个这样的解决方案是无声的 Gliss AutoGlide。这就提供了一个带有预装电机和遥控装置的定制窗帘轨道。因为窗帘轨道是定制的,你必须事先知道你的窗户的尺寸和形状,因为 DIY 改装是不可能的,只有制造商才能弯曲它(以适合凸窗)。电机可以由 X10 设备模块控制,使用的 DIY 量与改造版本相似。
独立控制器
除非你有办法控制它们,否则拥有大量遥控灯具和电器没有多大用处。本节所述的所有设备都包含某种形式的 X10 发射器,可将 X10 数据信息发送到电力线,然后由前面所述的任何 X10 模块接收。
桌面发射器模块
这些模块都提供了从基本键盘向特定设备发送 X10 消息的方式。由于它们由市电供电,信号可以直接放在电力线上,从而无需 RF-to-X10 网关。该组支持最大的设备选择,每个设备都添加了自己独特的卖点。这里我只介绍一小部分。
迷你控制器(MC460)
这是一个标准但实用的有线设备,支持八个单元,可在两个组(1–4,5–8)中切换,以及标准的“所有灯打开”/“所有单元关闭”选项和亮度控制。为了减少按钮数量,亮度控制只影响最近一次打开或关闭的灯。这在大多数发射器模块中是相当标准的。
日落/黎明控制器(SD7233/SD533)
从表面上看,这就像早期的标准迷你控制器,连接到电源,控制八个设备,以及“所有灯打开”/“所有单元关闭”和亮度控制。然而,它还包括一个光线传感器,当天黑时,它会打开预定的一组灯,当它再次亮时,它会关闭它们。这些亮度设置可以通过一点点试错来调整,尽管黄昏和黎明在一年中不断变化,但这不一定能用作自然的唤醒电话。
迷你计时器(MT10U)
如图 1-8 所示,这种装置通过使用计时器而不是传感器来解决黄昏到黎明的问题。这允许您控制多达八个照明或电器模块,但只允许您预编程其中的四个,使它们一天打开或关闭(最多)两次。这可以让你模仿一个“住在”房子里的感觉。此外,它还包括一个随机选项,将改变 30 分钟的编程时间,给人一种“人类居住”的感觉。这个装置也可以兼作闹钟。
这种设备和以前的设备都减少了对计算机服务器的需求,因为它们可以根据(简单的)逻辑发送预定的消息。
图 1-8。
The MT10U, 55 × 150 × 110mm
Maxi 控制器(SC2800)
虽然该设备是作为安全系统(MS9780)的一部分设计的,但它也可以提供对房屋中所有 X10 设备的完全有线控制,如图 1-9 所示。虽然它没有任何计时功能,但它有一个电话插座,可以让你从外面拨号和开关灯(通过使用按键式电话输入单元代码,然后分别按*或#键)。
图 1-9。
The SC2800 provides easy access to your light switches via telephone
表 1-2 总结了这些桌面设备。
表 1-2。
Desktop Controller X10 Modules
| 桌面控制器 | 名字 | | --- | --- | | MC460 | 迷你控制器(4 × 2) | | MT10U | 迷你小时 | | SC2800 | Maxi 控制器 | | SD7233/SD533 | 日落/黎明控制器(8) |手持式发射器模块
这些模块以无线方式工作,因此需要一个 RF-to-X10 网关。除此之外,它们执行与桌面发射机模块相同的任务,只是它们需要电池供电。
手持式射频遥控器(HR10U)
这些是相对便宜的设备,能够控制任何给定房屋代码中的所有 16 个设备。它们支持亮度控制,但不支持“所有灯打开”/“所有单元关闭”,并且它们以开/关的顺序排列按钮,而不是更符合极客逻辑的开/关。
这种设备的一个有用的特点是,它的左侧有一张纸条,你可以在上面写下每个按钮控制的设备的名称。除此之外,这是一个相当简单的设备,“做它在锡说。”
还有一个更小的版本,只包含三个设备按钮,称为操纵杆开关(SS13E,如图 1-10 所示),它也是无线的,因此可以放置在任何墙上。这使得你可以在浴室里控制设备,而在浴室里,电源供电的控制器是非法的。
图 1-10。
The SS13E Stick-a-Switch
遥控钥匙(KR22E)
这个几乎是新奇的设备允许你从你的钥匙圈使用“开”、“关”、“亮”和“暗”信息控制四个连续编号的设备。它没有很大的范围,电池也不会持续很长时间。
EasyTouch 面板 10 RF
这种 Marmitek 设备是最接近廉价触摸屏的设备之一。这是一个电池驱动的 RF-to-X10 发射机(就像 HR10U 一样),但通过触摸屏幕来操作。然而,屏幕仅仅是玻璃面板后面的图像。这就是它比其他解决方案便宜的原因。虽然这确实会阻止您从设备接收任何视觉反馈,但是您可以自定义图像(通过用 GIMP 和您的打印机制作一个图像)并控制按钮在触摸屏上的显示位置;因此,您可以让这看起来像一个更昂贵的单位。与 HR10U 不同的是,HR10U 有一组固定的 16 个按钮,它可以操作多达 30 个按钮,提供足够的空间来通过 Minerva 系统的一部分 Cosmic 控制所有的灯和其他设备(参见第七章),该系统允许您仅使用基本的 X10 消息集来设置定时器、收听新闻和播放 MP3 收藏。
EasyTouch35 通用遥控器
这种设备的外观是传统的“一体化”红外遥控器,具有八个 AV 设备的独立菜单,并能够从其他遥控器学习代码。然而,除了红外功能之外,它还包括一个 RF 发射器,用于通过 TM13 等 RF-to-X10 网关控制 X10 设备。
作为一个标准的红外遥控器,它工作得足够好,尽管背光时屏幕略有嗡嗡声。触摸屏很好用,你可以使用每个功能的预定义图标自己设计菜单。
我将在本章后面更详细地介绍通用遥控器。对于标准 X10 无线控制器,请参考表 1-3 。
表 1-3。
Wireless Controllers for X10
| 无线控制器 | 名字 | | --- | --- | | EasyTouch35 | 通用遥控器 | | KR22E 号 | 遥控钥匙 | | 断续器 10U | 手持式射频遥控器 | | SS13E | 操纵杆开关 |墙内发射器模块
这些看起来像我前面提到的墙壁开关,因为它们隐藏在现有的墙壁插座中。但是,这些并不直接控制任何设备。相反,它们只向特定设备(如灯或电器模块)发送 X10 消息,依靠它来控制与之相连的硬件。因此,要将它们用作自动照明开关,你需要两个设备:墙内发射器和电器接收器。
一种类型的墙内模块是微型模块发射器调光器(TMD4,如图 1-11 所示),它可以通过连接到其中的四个开关控制多达四个不同的 X10 单元。如果您想要控制灯光或电器的简单开/关,这些信息包括调光控制。拥有大客厅的人和喜欢情调照明和多光源的人可能在一个房间里有四盏灯,这是少数几个让你从一个简单的面板控制所有灯的设备之一。然而,注意,每个灯仍然需要它自己的灯模块。当然,没有必要每个交换机命令一个 X10 设备;它可以简单地把信息放在电源线上,让 PC 控制器做一些事情,比如改变立体声的音量。
图 1-11。
The TMD4
运动传感器
市场上的大多数传感器是无源红外传感器(PIR ),有室内和室外两种,后者通常用作安装在传感器所在区域的安全灯。PIRs 与 EagleEye 运动传感器(MS14)一样,每当检测到运动时,会向特定但用户可选择的 X10 模块发送“on”消息。大多数型号还可以配置为分别在黄昏和黎明时发送“开”和“关”信息。尽管一些设备可以将消息发送到多个设备(PR511 和 PSH01 跃然脑海,两者都包含内置泛光灯),但大多数设备只能与单个设备通信,需要 X10 设置中的计算机在需要时将此消息转发到其他设备。稍后你会发现如何!
网关和其他外来设备
网关是允许通信数据流过的任何设备,尽管对话的每一方有不同的协议。在大多数技术中,网关执行双向功能,在任一方向上转换协议。在 X10 网关中,一般只有一个方向,即进入 X10。
这一类别的主要器件是 TM13U,这是我已经提到过的 RF 至 X10 网关。如图 1-12 所示,其中一种设备允许无线射频遥控器将信息放在电力线上,供 X10 设备处理。它永远不会反过来。该设备将监听来自其前部拨号盘上设置的相同房屋代码的所有射频信息,并将它们(使用相同的房屋代码)转发到电源线(假设插座已打开)。但是,如果将拨号盘设置为 P,它将对所有房屋代码的射频信号做出响应,但会根据原始房屋代码转发这些信号。该设备的硬连线地址通常为 1。
图 1-12。
The TM13U, 122 × 52 × 33mm, or 224 × 52 × 22mm with aerial extended
要在两个或多个相位上传输,您需要一个耦合器。这将在电源的一个相位上监听 X10 信号,并在另一个相位上复制它。这既可以在单个单元中发生(如 TF678),也可以为需要耦合的每相需要一个单独的器件(FD10,如图 1-13 所示)。
事实上,这两种耦合器设备都被称为过滤器/耦合器,这意味着它们可以完全过滤掉 X10 消息,而不是复制 X10 消息,从而防止消息泄露到邻居的房子里。通过扩展,它们可以防止您邻居的 X10 设备控制您的设备。
图 1-13。
The FD10, an interesting filter/coupler module, looking very uninteresting
网桥是一种充当两种不同协议之间媒介的设备。在这种情况下,总是存在桥接家庭自动化系统的协议,例如从 X10 到 C-Bus 或从 X10 到 UPB pulse work x。此类设备对于逐段升级系统或控制系统中不存在的和/或没有合适的软件驱动程序的特定设备非常有用。然而,在大多数情况下,桥接设备和原始模块的成本必须非常特殊,才能物有所值。
表 1-4 中涵盖了这一设备以及许多其他外来设备。
表 1-4。
Miscellaneous X10 Controllers
| 杂项设备 | 名字 | | --- | --- | | FD10 | DIN 滤波器和耦合器 | | MS14 | PIR-鹰眼运动传感器 | | PR511 | 带泛光灯的 PIR | | PSH01 | 电动喇叭警报器 | | TF678 | 全屋过滤器 | | TM13UAH | RF-X10 网关,适用于所有房屋代码 |计算机控制
但是目前最强大和最有创意的设备是电脑界面,比如 CM11,如图 1-14 所示。这是一个收发器,它能够将信息从电力线传输到计算机,并将信息从计算机发送回电力线。与大多数 X10 设备不同,CM11 上的电源插座不由 X10 控制,而是一个简单的直通端口。因此,如果你想用 X10 控制你的电脑,你有两个选择。
Caution
小心不要把计算机的电源加到正常的房子代码上,因为你可能会在发出“所有单元关闭”的信息时不小心关掉它。
首先,您可以为计算机分配一个未使用的单元代码,并配置计算机在电源线上看到它时发出关机命令。(我将很快向您展示如何操作。)其次,你可以使用一个单独的设备模块,只需将计算机插入其中。这是一个可行但不太好的解决方案,因为您可能会将机器插入不间断电源(UPS)中。
图 1-14。
The CM11EFL
除了作为一个控制器,这个设备还可以作为一个事件调度和信息中继系统,即使没有连接到计算机。因此,您可以使用软件(即提供的 Microsoft Windows 版本或 Linux 等效版本,如何裕)对设备进行编程,并让它独立运行,因为这些编程信息现在存储在它自己的 EEPROM 中,即使没有电源,它也能保留数据,允许它从一个地方移动到另一个地方,而无需重新编程。(这也意味着有可能拥有一个没有一台电脑的稍微自动化的房子!)但是,您必须保留上传到 CM11 的文件和数据的副本,因为无法从设备下载。
Caution
从电源或计算机上拔下 CM11U 时,请务必先从设备上拔下串行电缆,因为电缆的杂散噪音会影响内部存储器及其设置。
事件调度程序允许您在一天中的任何时间、一周中的任何一天、一年中的任何日期发送任何 X10 消息。就其本身而言,该设备没有随机改变时间的能力,但它有一个黄昏和黎明设置,在你以经度和纬度的形式向它提供你的物理位置细节后,它就会工作。你可以从地图上找到你的经度/纬度,或者(如果我们现在是认真的)从网上的许多地理网站中找到。对于这些计算,您的 IP 地址通常足够准确,并且可以从以下网站获得:
http://api.hostip.info/get_html.php?position=true
按照 CM11 的说法,消息中继系统被称为宏。这允许一个 X10 消息(例如“卧室灯亮了”)向您的任何或所有其他设备产生额外的自定义消息。一个典型的宏可能包括“着陆灯到 50%”,“浴室灯亮”等等。这些消息可以在时间上分开,允许一个单独的“浴室灯亮着”消息变成这样的短程序:
Bathroom light on
Stairs light to 50%
Wait 5 minutes
Bathroom light off
Wait 2 minutes
Stairs light off
因此,简而言之,CM11 可以提供自动化房屋可能需要的大部分功能,尽管是以非常静态的方式。为了让您的 CM11 动态处理 X10 消息,您需要电脑永久开机并安装一些软件。不幸的是,CM11 目前随附的软件仅适用于 Microsoft Windows。因此,相反,你可以呼吁社区软件,如何裕,作为一个替代品。
和宇
何裕是一个简单的命令行工具,可用于大多数*nix 系统(包括大多数 Linux 发行版、BSD 和 Mac OS X),能够与 X10 计算机模块进行双向通信,以及用宏和预定事件对 EEPROM 进行编程。也可以在 www.heyu.org
首页下载。这不是 OSI 认为的自由软件或开放源码,但是源码是免费的,可以免费使用。
安装后,软件会在首次运行时自动配置。这需要几秒钟的时间,包括打开串行端口(默认为/dev/ttyS0
)并验证 CM11 是否真正插入并正常工作。最好的方法是通过运行以下命令将何裕包括在启动序列中:
heyu engine
这确保了何裕后台进程正在运行,从而允许接收传入的消息,触发外部脚本。engine 参数还启动何裕内部的状态机,允许它记住每个灯和设备的最后设置,这很有用,因为许多设备(尤其是较便宜的设备)不允许您查询它们的状态。在非计算机化的环境中,这种反馈循环是不必要的,因为作为一个人,你可以看到当你按下按钮时灯是否亮了,所以你可以看到你是否需要再试一次。电脑没那么有天赋。对于任何计算机界面来说,指示模块的当前状态也是一个很好的设计实践,这使得这个特性更加重要。如果您可能在家中使用大量基于计算机的界面(比如,通过网页),那么升级到前面介绍的双向灯和电器模块是值得的。
配置
配置保存在/etc/heyu
内的各种文件中,特别是x10.conf
,其中保存了串行设备、默认房屋代码、别名、场景和脚本。默认情况下,所有日志信息都被写入/var/log/heyu
。
顾名思义,别名为您想要在x10.conf
文件中设置的每个设备提供了一种人性化的房屋和单元代码,以及该设备是灯具模块(StdLM
)还是电器模块(StdAM
):
ALIAS lounge e5 StdLM
ALIAS stereo e6 StdAM
一旦指定了别名,就可以在配置文件和对其发出的命令中使用它。这种抽象减少了当你需要对你的家用电器重新编号时所需要的改变的数量。
场景是何裕描述中继消息或宏的方式。每一行都包含一个标签名和一列分号分隔的命令:
SCENE movie_mode on tv; on stereo; dimb lounge 10;
何裕的调光范围在 1 到 22 之间,由相对和绝对亮度变化命令支持(分别为dim
和dimb
)。请注意,如果在何裕配置文件运行时对其进行更改,则必须发出以下命令来刷新参数:
heyu restart
发送消息
这可以通过如下命令简单地完成:
heyu turn studio on
heyu onstate studio
heyu bright lounge 5
heyu lightsoff _ # the underscore means current house code
它可以放在更大的 shell 脚本中,从其他语言调用,或者通过带有 CGI 的网站触发。注意,这些都是阻塞命令,所以在 X10 消息被发送之前,脚本的其余部分不会执行——当然,除非您在后台模式下开始该任务:
heyu turn studio on &
这些命令也可以放在 crontab 中,这样就不需要将更改上传到 CM11U 的内部 EEPROM:
export EDITOR=vi
crontab -e
然后,作为示例行,添加以下内容:
30 9 * * 1-5 /usr/bin/play /usr/share/sounds/alsa/Noise.wav
这就增加了一个早上 9:30 的闹铃(还能是什么时候!?)在一年中每个月的每一天(第一个通配符)(第二个通配符),同时也是工作日(星期一=1,星期五=5)。
如果您想添加一个随机元素,比如说在 9:30 的半小时内,那么您可以使用一些简单的bash
来代替调用这个:
00 9 * * 1-5 sleep
echo $((RANDOM%60))m; /usr/bin/play
ⅱ
/usr/share/sounds/alsa/Noise.wav
请注意,我已经提前 30 分钟开始延迟,但是创建了一个持续 60 分钟的随机值。
接收消息
无论何时收到命令,何裕都能启动配置文件中指定的外部脚本。在许多情况下,这可能是打开额外的灯光,就像场景或微距一样:
SCRIPT bedroom on :: /usr/local/bin/heyu turn bedside_light1_mine on
SCRIPT bedroom on :: /usr/local/bin/heyu turn bedside_light2_theirs on
它可以运行外部脚本,而不是只控制灯光。这有一个好处,除了 root 用户之外,其他用户也可以编辑它,它不需要heyu restart
,并且它提供了很大的灵活性,不能压缩到一行中。类似如下的代码:
SCRIPT bedroom off :: ∼steev/bin/housenight
将运行一个私人脚本,关闭家中所有重要的灯和电器(请记住,没有“关闭所有设备”的命令),在您的 Twitter feed 上发布一些内容,并播放“晚安”音效:
#!/bin/bash
wavplayer default play ∼steev/media/good-night-gorgeous.wav
tweet Good night all
/usr/local/bin/heyu turn studio_light off
/usr/local/bin/heyu turn kitchen_light off
/usr/local/bin/heyu turn lounge_light off
shutdown –h now
或者,它可以检测传感器发射器发送的信息,该信息根本不发送到任何设备,而是被转发到其他几个设备:
SCRIPT pir_detect_msg on :: /usr/local/bin/heyu lightson _
除了控制 X10 设备,还可以控制 PC 本身。此示例截取来自单个交换机的消息,以控制 CM11 所连接的 PC 的音量:
SCRIPT E6 on :: /usr/local/minerva/bin/mixer default dec master 10
SCRIPT E6 off :: /usr/local/minerva/bin/mixer default inc master 10
运行这些命令的用户权限与发出初始命令的用户权限相同:
heyu engine
这确保了该用户可以使用命令和设备(如/dev/dsp
)。仅仅使用 X10 消息就可以构建复杂的脚本和交互。在第七章中,我将讨论宇宙。
EEPROM 编程
CM11 的 EEPROM 的所有功能都可以通过何裕进行编程。连接 CM11U 时,您只需创建一个名为/etc/heyu/x10.sched
的文本文件(此目录中也有一个示例文件),其中包含合适的命令和类型列表:
heyu upload
该过程会将该文本文件转换为合适的二进制图像,并通过现有的串行电缆将其上传到设备。因为不可能从 CM11 中检索该数据,所以您会希望确保保留一份x10.sched
文件或结果图像的备份以备后用:
/etc/heyu/x10image
文件格式的全部细节可以在手册中找到,包括如何将日期格式从默认的 YMD 切换到 DMY。现在,我将通过一个例子来包括我自己的时间表的一些片断:
macro movies_on 0 dimb lounge 22; 0 on tv; 0 on stereo;
macro lounge_off 0 off lounge; 0 off lounge_table; 0 off tv; 0 off stereo;
timer ...wt.. 01/01-12/31 21:00 00:02 movies_on lounge_off
trigger e1 on movies_on
z 波
Z-Wave 是由成立于 1999 年的 Zen-Sys 创建的,作为家庭自动化领域无线控制产品的专有协议。2008 年,公司和技术被西格玛设计公司接管,该公司仍然生产和供应大部分芯片。这意味着所有生产 Z-Wave 品牌设备的制造商都必须从适马(或其附属公司,三美)购买,并且都必须经过测试和验证程序,才能获准将其产品标记为“Z-Wave”这些供应商是 Z-Wave 联盟的一部分,目前共有 200 家制造商,提供大约 600 种不同的产品。
系统设计
Z-Wave 使用的通信信道是 900MHz 射频信号(根据您的地理位置略有不同),传输速度约为 40 千比特/秒。(尽管采用 400 系列芯片的较新设备可以支持高达 100kbs。)虽然信号强度通常会受到墙壁和地板的影响,但每个设备的覆盖范围可达 20-30 米,并且可以以网状形式连接,这样一个设备可以向下一个设备重复消息,从而扩展覆盖范围。除了在它们之间发送消息,这些设备还与集线器或主控制器通信,集线器或主控制器用于通过以太网路由器或计算机将它们连接到更大的网络。典型的控制器包括 Tricklestar 和 Z Wave Aeon USB 适配器,这需要一台 PC,以及不需要的 VeraLitz Z Wave 控制器。还有一个 RaZberry Z Wave 控制器,可以直接连接到您的 Raspberry Pi 的 GPIO 控制器,如果您希望采用该路径的话。
当每个新的 Z-Wave 设备添加到系统中时,它会与附近的控制器配对,确定它们之间的信号强度,然后在路由算法中使用。这使得向放置在地下和车库中的设备发送信号成为可能,只要至少有一个设备在它和网络的其余部分的范围内。然而,在如此低的数据速率下,如果试图强迫节点像中继器一样工作,很容易使节点过载。
为了安全起见,Z-Wave 依赖于这种配对安排,因为每个单元上的按钮都是以类似于蓝牙配对的方式按下的,以确保每个单元都可以与另一个单元通话。这远非理想,但考虑到相对较低的使用率,中间人攻击的可能性相当低。
像 X10 一样,Z-Wave 有一个房屋代码(称为网络 ID)和一个用于寻址的单元代码(其节点 ID)。这些允许在单个网络上有 232 个不同的节点,虽然略少于 X10 的可用数量,但对于大多数房屋来说已经足够了,尽管如果需要的话,在网络之间桥接并不困难。
Z-Wave 的最大优势一直是兼容性,因为 Z-Wave 联盟的互操作性实验室确保了几乎所有设备都可以相互通信。然而,这种封闭的商店确保了任何开源软件都无法工作。但是现在这种情况已经改变了…
绕过 NDA
因为 Z-Wave alliance 的每个成员都必须签署一份 NDA 和保密协议才能访问正式的规范和白皮书,所以开源开发者不可能构建一个真正的 Z-Wave 设备——直到黑客开始对协议进行逆向工程!现在有几个选择。
开放式 Z 波
有了这样一个直接且典型的开源名称,这个项目获得了很多关注也就不足为奇了。它有两个主要部分,库和基于 web 的配置界面,后者带有自己的迷你 web 服务器。该库依赖于 libudev,根据您的系统,可能需要显式安装 libudev。例如:
apt-get install libudev-dev
然后,您可以通过传统方式从源构建开放的 Z-Wave:
svn checkout
http://open-zwave.googlecode.com/svn/trunk/
cd open-zwave/cpp/build/linux/
make
由于 web 服务器的原因,控制面板需要最新版本的 httpd 库,因此通常最好从源代码安装。大多数问题都发生在省略这一步的时候:
wget``ftp://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.19.tar.gz
tar zxvf libmicrohttpd-0.9.19.tar.gz
cd libmicrohttpd-0.9.19
./configure
make
sudo make install
然后,您可以获取控制面板的信号源:
svn checkout
http://openzwave-control-panel.googlecode.com/svn/trunk/
并通过取消注释第 36 行周围的三个特定于 Linux 的配置条目来修改配置。然后使用 make 正常构建,将 web 配置目录链接到开放的 Z-Wave 库:
ln –s../open-zwave/config/
并运行它,指定端口:
./ozwcp -d -p 13112
然后,您可以浏览到该页面,输入您的设备名称(或勾选 USB 框,对于以这种方式连接的控制器),并单击“初始化”。通过使用–d
标志,您将在控制台上看到调试信息,这在这种情况下总是很有帮助的。你现在可以和你的房子说话了!
linuxmce,你好吗
LinuxMCE 项目已经收集了免费的 Z-Wave 信息有一段时间了,并在他们的 wiki 中专门描述了它:
http://wiki.linuxmce.org/index.php/ZWave
更重要的是,他们已经成功实现了该协议的一个版本:
http://svn.linuxmce.org/svn/branches/LinuxMCE-0810/src/ZWave/
虽然这主要是一个媒体中心项目,但您可能会发现它引入了更多您通常想要的依赖项,特别是如果将它安装在较小的 PC 上,如 Raspberry Pi。但是,如果您的控制器不被 Open Z-Wave 支持,而 LinuxMCE 能够使用它,那么您应该微笑着接受开销!
网络
有时(不公平地)被称为“其他 Z 协议”,ZigBee ( http://www.zigbee.org
)是一种使用射频在 10 到 100 米范围内的设备之间进行通信的协议。与大多数其他系统不同,不需要单独的控制器,所有设备都可以成为网络的协调器(ZC)、路由器(ZR)或终端设备(ZED)。 5 通过这种方式,它们被连接成一个网状结构,让范围自然延伸到房子的其他部分。它还支持 128 位密钥的安全性,而且由于许多供应商都提供芯片,它们相对便宜。
从政治上来说,ZigBee 有一个联盟(不出所料,称为 ZigBee 联盟),它为来自 400 多家不同公司的 600 多种产品的规范、标准和细节提供了一个焦点。由于会员资格对所有人开放,低准入门槛提供了一些创新产品,如 AlertMe、LG 的空调和能源监控器,以及常见的按钮、灯、调光器和传感器。
Linux 软件
由于比 Z-Wave 更开放,规范可以免费获得,软件的范围应该已经超过了 Z-Wave。但是没有!这是因为 ZigBee 联盟包括一个单一的条款,要求所有使用 ZigBee 标志的被许可方成为联盟的成员。加入联盟需要花钱。很多钱!GPL 的第 2c 条(Linux 内核就是根据它编写的)规定:
您必须根据本许可证的条款将整个作品免费许可给所有第三方。
因此,不能在内核中包含 ZigBee。一些项目试图称自己为 Xbee 以避免这种情况,并且寿命很短。其他的( http://sourceforge.net/apps/trac/linux-zigbee
)已经从 ZigBee 转向其他基于无线电的协议,比如 IPSO 和 6LoWPAN。
自然,没有什么可以阻止开发人员开发最终用户集成到内核中的库,但是这在某种程度上增加了入门的障碍。其中一个项目是:
http://support.robotis.com/en/software/zigbee_sdk/zig2serial/linux.htm
这是一项勇敢的努力,但和其他努力一样,注定要被否决,除非联盟引入零成本层(像蓝牙那样),允许代码包含在主线内核中,从而实现大规模采用。
与 Z-Wave 的区别
似乎编码者只需要一个普通的字母就可以开始问这个问题,就好像它可能是一个叉子或者有一些与发展政治相关的有趣的八卦。事实上,ZigBee 是一种类似的协议,只是因为它使用 RF 从集线器到一组类似目的的设备进行通信。(而且都是“Z”开头的!但是说一个比另一个好是错误的,因为它们的目的不同。在考虑是否使用 X10 照明或色调时应该问的相同问题,应该在这里作为一个更大的问题来问“哪个是对我来说最好的解决方案?”
在大多数情况下,Z-Wave 设备之间具有更好的兼容性。虽然关门可能会令人懊恼,但它确保了一系列设备能够愉快地相互交谈——作为硬件,似乎人们不能轻易改变固件。鉴于我们能够与 Z-Wave 和 ZigBee 设备自由通信,这样的哲学观点是没有实际意义的。相反,它归结于用例。如果你想要来自不同制造商的设备,而你没有能力预测它们的兼容性,那么 Z-Wave 可能是更好的选择。另一方面,如果只有一部分设备,或者你计划建造自己的设备,那么 Zigbee 更有可能吸引人。尤其是考虑到 Arduino XBee 盾( http://arduino.cc/en/Main/ArduinoXbeeShield
)及其继任者( http://arduino.cc/en/Main/ArduinoWirelessShield
)依然可用。
接下来,看看你家的物理空间。例如,如果您有大量的地下室空间或类似的情况,需要多个单元来允许 RF“查看角落”,那么 ZigBee 是一个更好的选择,因为它更好的带宽可以促进更多的消息被重复,以便将信号发送到目的地。这里的警告是,如果你的传统 WiFi 信号无法穿透墙壁,那么 ZigBee 也不会,因为它们工作在相同的频率上,当两个设备试图共存时,会有更多的带宽损失。
c 总线
虽然有几个众所周知的电器控制协议,但 X10 和 Z-Wave 更为人所知,有知识的公众成员知道它们,主要是因为它们的准入门槛普遍较低。然而,在 HA 社区中,Clipsal C-Bus 系统的所有权成为了目标。 6
关于中巴
C-Bus 系统由澳大利亚公司 Clipsal 开发,作为远程控制各种照明系统的一种手段。Clipsal 的初衷不是在 HA 领域,而是在体育场照明设备、商业舞台和会议中心。这意味着系统必须支持比家庭设置更长的电缆线路和更大的地址空间。它在两个方面都取得了成功,一个子网中的 100 个设备可以使用 1 公里长的电缆,每个子网可以通过基本网桥连接到另外 6 个设备,或者通过现在可用的以太网网桥连接到更多设备。
X10 和 C 总线的区别
C-Bus 的主要区别在于它的安装。虽然 X10 通过现有的电力电缆传输数据,但 C-Bus 设备是通过利用一种专有协议来控制的,该协议通过一根单独的 Cat-5 电缆传输。因此,这种安装只能由合格的 Clipsal 批准的工作人员进行,从而增加了初始成本。然而,一旦所有电缆铺设完毕,由于互连将始终存在,并且不会过时,因此维护水平几乎为零。它还提供了开关和计算机之间的双向通信,使查询调光器或电器的状态变得很简单。此外,由于信号速度不受电力线中过零事件的限制,所有光线变化都是瞬间发生的,只有拥有多年 X10 系统经验的人才能真正体会到这一优势。
为了降低这种初始开销,Clipsal 最近推出了一种无线版本的 C-Bus,它消除了昂贵的安装需求,因此我将集中讨论这部分设备。这可选地支持其数据流的 128 位加密,使其比(未过滤的)X10 无线解决方案更安全,尽管它仍然可以被确定的黑客攻击。其无线范围并不比之前介绍的 RF-X10 组合更好,根据材料不同,范围为 5 至 20 米。不幸的是,一个 C-Bus 无线子网上最多有 30 个设备,这使得它的功能不如使用两个房屋代码的 X10 系统。通常采用的 C-Bus 安装方法是,有线版本用于初始房屋配置,无线版本作为一种廉价的升级途径添加进来。
对于极客来说,主要的区别在于软件,因为协议是封闭的,使得 Linux 工具无法使用。为了重新占领这个市场,Clipsal 发布了一个包含二进制驱动程序的 RPM,并在其网站上免费提供。
Note
Red Hat package manager (RPM)可以在 SUSE 等非 Red Hat 平台上使用,也可以使用 Alien 等工具进行转换。然而,以这种方式打包的驱动程序的最大问题是它与 Linux 内核的兼容性。驱动程序 API 的任何变化,或者内核版本号之间的类似中断,都会使驱动程序(以及您的 C-Bus 系统)变得无用。在这些情况下,当没有更多开放的解决方案可用时,最好是保留一个低级的遗留系统,并准备在必要时将其他软件从机器中迁移出来。
与 X10 不同,每个 C-Bus 设备都包含一个微处理器,可以在没有计算机的情况下远程控制其他设备。这是通过将设备切换到五种模式之一来实现的,大致分为以下几种:
- 普通、独立、开关
- 基本对等交换控制
- 网络化开关控制
- 网络开关控制,带远程
- 与有线 C-Bus 安装接口
附加的计算机对较小的 HA 装置和那些关心复杂照明 UI 的人是有益的。但对于我们这些打算控制其他设备的人来说,包含 PC 不是问题。
设备
像 X10 设备一样,C-Bus 具有调光和控制连接到它的电器的能力。它们的不同之处在于,C-Bus 灯开关能够直接控制一个或多个其他设备,并且只需最少的设备上配置。
Note
由于前面给出的原因,这里我只考虑无线设备。
控制灯光
灯光开关有两种设计,Neo 和 Saturn,分别属于 5850 和 5880 产品系列,仅装饰风格不同,但在每组中,您都可以选择两个、四个、六个和八个按钮的版本。它们总是成对的,前两个按钮控制相连灯泡的调光功能。要求每个后续对将按钮按压信息(无线)传输到另一个设备、7、或设备。由于内置微控制器,这些开关可以配置为调光开关、开/关对、远程触发器或场景触发器(后者是宏编程的 C 总线术语,其中几个器件可以同时发生几种状态变化)。场景编程也可以通过 C-Bus Toolkit 软件进行,尽管这目前仅适用于 Microsoft Windows。
每个系列都有几个设备,能够支持各种负载和特性,但一般来说,C-Bus 调光器将支持 25W 至 500W 之间的白炽灯和卤素灯(高达 2A),以及风扇电机(高达 2A)。
这两个系列还提供基本的开关单元。除了缺少调光功能之外,它们看起来与它们的灯控制对应物相同。作为补偿,它们可以支持更大范围的设备(最高 2KW,有些地方 8A),包括荧光灯。
Note
似乎没有墙内单元出售,这意味着你不能使用你自己风格的面板无线 C-Bus 电子设备。
控制设备
像 X10 一样,C-Bus 提供了一个插入墙壁并控制电流流向相应插座的电器模块。这些被称为 5812 系列插头适配器,看起来像它们的 X10 对应物,除了它们也支持调光和开关版本。
因为每个 C-Bus 设备都包括一个微控制器,并且 C-Bus 协议支持其他设备的远程编程,所以通过对开关上的“关联”进行编程(相当于 Linux 符号链接),前面提到的任何灯开关也可以用于控制电器开关。
控制器
5888 系列无线遥控器是这里的主要设备。它是一个 RF 发射器(工作频率为 433.92 MHz),支持 10 台设备,最远可达 70 米(尽管在一栋建筑内更有可能支持 25 台设备)。由于所有 C-Bus 模块的统一设计,通过使用遥控器控制一个开关,进而通过使用场景控制另外两个开关,在技术上可以控制超过分配的十个设备。此外,使用此遥控器不需要射频网关,因为 C-Bus 无线网络已经在射频上运行。这也意味着多个遥控器可以控制任何单个设备,任何单个按钮可以控制多个设备。
像 X10 一样,它也支持“全部关闭”消息。
方法
由于对无线网络的重视,有时有必要回归到有线网络。这就是无线网关 C-Bus 5800 系列的用武之地。这是一个必要的特性,也是有线和无线版本的 C-Bus 能够连接在一起的唯一方式。此外,通过使用 C-Bus Toolkit 等软件,它可以连接到计算机进行远程、顺序和智能控制。因此,该设备对于需要 PC 控制的纯无线网络也是必要的,因为商用路由器使用的 802.11 无线协议不适合作为 C-Bus 无线网关。
照明控制
除了我已经讨论过的通用电器控制器之外,还有许多用于照明的专用控制器。这是最近的发展,但并不令人惊讶,因为照明是家庭自动化发展的主要因素之一。毕竟,我们大多数人都是从控制灯开关开始的。鉴于灯是一种特殊的情况,因此有可能向通信协议添加额外的功能,如果它是一种传统的设备,如颜色,这将是没有意义的。
Note
虽然许多灯泡将自己归类为 WiFi,但这种情况很少发生,因为它们与集线器通信,集线器又与网络对话。
顺化(越南城市)
由电子巨头飞利浦设计,这是目前最突出的照明解决方案。基本的初学者工具包提供了一个控制中心和三个灯泡,虽然该单位可以支持多达 50 个。该集线器连接到有线以太网端口和电源插座。然后,它使用 ZigBee 光链路(无线)协议直接与灯泡对话。
Hue 最大的卖点是色彩;或者说,它的颜色范围。每个螺旋灯泡支持动态范围的颜色,可从应用程序上的色轮中选择。这些颜色可以从照片中选取,并编程到场景中,这样三种灯光就可以反映出你房间的配色方案,例如,可以通过增强壁炉架照片中的颜色来实现。
配置是自动的(正如您对消费设备的期望),集线器从您的 DHCP 服务器获取其 IP,该服务器提供一个网页,该网页重定向到 Hue online 服务,您可以在该服务中注册您的设备,并在(在线)帐户和您的网桥之间建立连接。一旦发生这种情况,您可以通过网站远程操作它。这通过轮询协议工作,由此 Hue 桥每半秒向 Hue 服务器发出请求任何新命令的呼叫,并更新桥的 IP 的服务器。你可以通过浏览 http://www.meethue.com/api/nupnp.
来验证 Hue 网站是否能看到你的桥
或者,你可以通过手机控制 Hue,目前 iOS 和 Android 设备都支持。
对于我们这些从事开源工作的人来说,对应用程序的依赖是一种偶然的束缚,尽管 Phillips 刚刚推出了他们的 API,允许你直接与中枢对话来控制灯光。这在 http://developers.meethue.com/coreconcepts.html
都有。获得网桥的 IP 后,您必须通过按网桥顶部的“link”按钮来设置用户,然后在 30 秒内发出命令:
$ curl -H "Content-Type: application/json" -X POST -d '{"devicetype":"myhome"}'
http://192.168.0.27/api/
它返回一个带有用户名的 JSON 对象,比如 d 7 AE 8 b 2151d 50 df 1 e 61 f 380289 f 33 BF,这个用户名应该在所有将来的请求中使用。
然后,您可以要求网桥使用以下命令搜索系统上的灯:
$ curl
http://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights
扫描需要一些时间,然后您才能重新发出命令以获取可用的,以下列形式返回:
{"1":{"name": "Hue Lamp 1"}}
从这里开始,您可以查询状态:
$ curl
http://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights/1
{
"state": {
"on": true,
"bri": 254,
"hue": 14922,
"sat": 144,
"xy": [
0.4595,
0.4105
],
"ct": 369,
"alert": "none",
"effect": "none",
"colormode": "ct",
"reachable": true
},
"type": "Extended color light",
"name": "Hue Lamp 1",
"modelid": "LCT001",
"swversion": "65003148",
"pointsymbol": {
"1": "none",
"2": "none",
"3": "none",
"4": "none",
"5": "none",
"6": "none",
"7": "none",
"8": "none"
}
}
更改颜色和亮度:
$ curl -X PUT -d '{"transitiontime":0, "bri":255, "hue":28000, "sat":200}'
http://192.168.0.27/api/d7ae8b2151d50df1e61f380289f33bf/lights/1/state
除此之外还有很多。你应该知道,顾名思义,色调使用 HSB 颜色空间,即色调、饱和度和亮度,这使它能够发出更自然的白色和更好的柔和色调。它还支持通过 CIE 模型(在色度图上绘制颜色,详见 http://developers.meethue.com/coreconcepts.html#color_gets_more_complicated
)进行编程控制,这意味着如果你习惯于更传统的 RGB 符号,你将需要调整你的思维或代码。
有几个网站可以提供颜色转换的可视化表示,比如 http://www.workwithcolor.com/color-converter-01.htm
。要将 HSB 值转换为色调参数,您必须:
- 色相乘以 200(技术上是乘以 182.04!)
- 将亮度和饱和度的百分比重新调整为 0 到 255 之间的值
Tip
色调在每个状态改变操作之间有一个过渡时间。这提供了一个比你在代码中能管理的更平滑的过程,并且推荐在长渐强或渐弱中使用它。
网桥上还有一个开放端口 30000,您可以telnet
到这个端口并直接发出命令,比如[Link,Touchlink]
不管结果有多有趣,它们都不提供 API 中已经没有的任何功能,因此无需进一步讨论。同样,更多非官方的好消息,你应该去参观一下everyhue.com
。
Note
当 Hue 灯泡关闭时,您不能改变它们的颜色,尽管您仍然可以向灯泡发出“警报”,让它们暂时亮起,以指示邮件的到达或门铃的按下。
英斯特朗
虽然 Insteon 能够控制的不仅仅是灯泡,但它已经在照明领域找到了自己的位置。它采用了 X10 的理念,通过电力线传递所有信息,但通过其射频网络提供了第二个“网格”,从而扩展了这一理念。它还改进了 X10 型号,允许每台设备接收和发送信息,这意味着每台设备也是一个中继器,确保更好地覆盖整个房子。
Note
虽然 X10 和 Insteon 可以在相同的电力线上工作,但 Insteon 不会像它自己那样重复 X10 信号。
事实上,在大多数情况下,Insteon 是比 X10 更好的选择——它的反应速度更快,数据吞吐量更高,在所有情况下都可以查询设备状态,并且所有地址在工厂都是唯一分配的,因此不存在房屋代码或邻居纠纷的问题。缺少的是可用设备的范围(正在弥补)和 Linux 软件。
与 X10 一样,你将需要一个特殊的单元,比如一个 PowerLinc 调制解调器 8 ,以允许你的 Linux 机器或 Raspberry Pi 与 Insteon 设备进行通信。您还需要合适的 USB 驱动程序(iplcd)和控制软件。这就是问题所在!这个领域唯一真正的竞争者是在 http://www.bobsplace.com/ilinks
,但即使这样也已经停止了开发工作。幸运的是,这些代码保留了下来,并在大多数旧设备上运行。否则,你应该看看名仕屋(misterhouse.sourceforge.net
),因为它包含一个 Insteon 驱动程序,比其他可用的驱动程序更新。虽然这意味着安装比必要的更多的代码,但它确实有比平均水平更好的工作机会!
利夫
最初是在 2012 年作为 kickstarter 项目开始的,它被列在“值得一看”的标题下。根据供应情况,灯泡可以设置为主灯泡或从灯泡。主灯泡被赋予一个 IP 地址,连接到 Wi-Fi 网络,并能够以网状形式向从灯泡分发命令。目前的说法表明,每个主机可以连接 9 个从机。智能手机控制应用程序和黑客软件开发工具包预计将与灯泡同时上市,并将于 2013 年底前上市。
夜灯
这是你能找到的最便宜、最简单的自动灯。这些智能为零,由一个插头、一个灯泡和一个光传感器组成。天黑时,它们会亮起来。天一亮,他们就关掉。就这么简单。然而,尽管简单,人们不能忽视他们的好处。毕竟,它们非常便宜。因此,如果你想为着陆提供低水平的照明,这是最划算的方法。对于那些坚持要进行一些黑客活动的人,你可以考虑用一圈电致发光线(EL-wire)代替灯泡,这将为房子提供一种 Tron 式的感觉,引导你在卧室和浴室之间移动。
射灯
对大多数人来说,自动灯是一个很好的方式,让房子看起来有人居住,更重要的是,当你不在的时候有人居住。然而,有了控制它们颜色的能力,你可以做的不仅仅是在早上淡化它们,模仿日出,或者在晚上淡化它们。你可以在整个晚上改变灯光的色调。这里的关键术语是“蓝光”
平板电脑或个人电脑上明亮的屏幕是一件坏事,因为它会欺骗大脑认为现在还是白天,因此更难入睡。通过在晚上逐渐降低亮度,它可以帮助一个宁静的睡眠。或者更具体地说,降低蓝色分量的亮度会有所帮助。这是因为蓝色提醒我们百万年的进化过程,蓝天依然可见,我们应该警惕。
有几个选项可以自动改变你的 Linux 显示器的颜色设置,f.lux 和 Redshift,它们都在 X Window 下工作。
Note
随着变色灯泡(如 Hue)的出现,预计在不久的将来会有实现蓝光解决方案的脚本。
f .拉克斯
这是来自 Stereopsis 的免费软件(如啤酒),可从以下网址获得:
在 Windows、OS X 和 Linux 的可执行版本中。然而,与大多数免费啤酒软件不同的是,它也可以作为源代码获得,当与 Linux 一起工作时,它更容易安装,也可以从以下网站获得:
wget
http://secure.herf.org/flux/xflux.tgz
tar -xvzf xflux.tgz
sudo cp xflux /usr/local/bin
sudo chmod 755 /usr/local/bin/xflux
通过指定您的经度(-g
)和纬度(-l
),它可以作为用户应用程序运行:
./xflux -l 51 -g 0
如果你不确定这些参数,你可以用众多在线工具中的一个来确定你的位置,比如 http://itouchmap.com/latlong.html
。
该程序将在后台运行,并使用您的地理位置来确定日落,然后根据需要重新着色您的窗口管理器。它还有一个选项,可以禁用自己一个小时,这样你就可以做任何依赖颜色的工作,如照片处理,甚至游戏。
红移
有一个相当于 f.lux 的完全开放的源代码,称为 RedShift,大多数存储库中都有。例如,在 Debian 中,你可以把 apt 和:
apt-get install redshift
这与 f.lux 的工作方式完全相同,作为一个 userland 应用程序,它接受经度和纬度参数,并以相同的方式影响显示器的颜色(尽管使用的特定颜色略有不同,所以您可能希望两种颜色都进行试验,看看使用其中一种是否会获得更好的睡眠模式)。
因为它不作为守护进程运行,所以您应该这样调用它:
redshift -l 51:0 &
如果您需要暂时禁用它,那么您需要发送一个 USR1 信号:
kill –USR1 1195
其中 1195 是进程 ID,当然,可以通过执行以下命令来检索:
echo $!
紧跟在redshift
命令之后,或在进程列表中搜索:
ps ax | grep redshift
联网设备
虽然 X10、Z-Wave 和 C-Bus 都是向简单设备发送简单控制的好方法,但更复杂的通信需要更好的方法。更具体地说,它需要更大的带宽。当命令是“播放这首歌”时,它需要明显更多的带宽。最容易实现的方式是通过本地以太网,因为它可以高速发送命令和数据,而没有 USB、RS-232 或并行电缆的距离限制。而且,与 X10 不同,双向通信作为规范的一部分是免费提供的。
以太网设备
有许多设备支持通过以太网进行通信,或者是控制它,或者是向它提供数据。有些可以独立工作,无需额外的硬件,如个人录像机(PVR)和媒体 Shell。两者都包括存储媒体的方法和播放技术。另一些则需要服务器为其提供数据。该设备的功能及其在自动化家庭中的使用总是通过利用联网能力来改进。这意味着您将需要某种服务器,用于大多数未来的设备。这引出了由局域网连接的两个必要部分——前端和后端——的区别,无论它是有线的还是无线的。
前端或头单元通常由连接到附近的 HiFi 或电视的设备组成,以便播放位于物理上远程的机器上的媒体。因为这样的单元放在客厅或卧室,应该是小巧、静音、有吸引力的。优选地,它还应该相当便宜,因为想要参与流媒体的房子中的每个房间都需要一个前端单元。
相比之下,后端存储在远离主生活区的地方(因为它通常是一台带有噪音风扇的大型 PC),但能够通过网络向室内的所有主机提供媒体流。
我将在第三章中介绍各种面向媒体的主机,尽管大多数显示的主机可以用运行适当软件的 Linux 机器重新创建。然而,功耗、噪音和成本通常会比定制的嵌入式设备大,即使这些设备中的许多本身可能运行 Linux!然而,要连接这些单元,您需要知道如何设置网络。
网络入门
为了最好地利用这里的设备,您需要将一台 Linux 机器配置为合适的服务器。大多数计算机科学书籍将从描述 OSI 七层网络模型开始其网络部分…我不会!相反,您将只学习提供和配置适合自动化的家庭网络的必要、实用的步骤。
Note
这里以及整本书中的每个 Linux 例子都是基于 Debian 和其中的包。这不是我的主张,仅仅是实用性,因为这是我所使用的。一些发行版可能会将文件放在稍微不同的地方,或者有稍微不同的名称,但是原则总是相同的,并且很容易找到等价的文件。
概念
家庭网络是家中每台计算机共享一组公共资源(如打印机、扫描仪和存储空间)的一种方式。从这个意义上说,它非常像一个办公网络。这种住宅的不同之处在于技术水平,因此也在于运行它所需的专业知识。办公 IT 系统中的一个主要问题是安全问题。有了家庭网络,使用家庭网络的人之间的关系就大不相同了,社会习俗也受到了影响。
标准网络配置有两部分—内部和外部。内部部分是一个网络,它将所有的家用计算机及其外围设备连接在一起,使它们对外界不可见。这些设备可以通过电缆或无线网络连接在一起。
外网就是一切!家里的电脑通常无法使用大而宽的互联网;只有通过调制解调器、宽带连接、3G 卡或类似设备连接到 ISP,才能使用该功能。
要将网络的这两端连接在一起,您需要一台路由器。有时路由器是一个小盒子,作为 DSL/电缆/宽带包的一部分,自动分离内部和外部流量。有时候你需要买一个。它们有一个承载外部网络流量的 RJ-45 插座,您可以将宽带调制解调器的网线插入其中,还有一个或多个通向内部网络的输出。
或者,您可以使用带有两个网卡的 PC—一个配置为与外部网络通信,另一个配置为与内部网络通信。如果你有一个 3G 卡,那么这就像你的外部配置的网卡。
由于路由器同时存在于内部和外部网络中,它能够自动将两组流量分开,并阻止任何您不希望在两者之间传输的数据或软件。默认情况下,大多数路由器配置为允许所有传出流量,但阻止所有传入流量,特定端口上的流量除外。端口是流量协议流经的路由,由一个数字来表示。例如,所有网页都在端口 80 上被请求。因此,如果您的路由器阻止了端口 80 上的传入流量,您将无法从家庭内部网络之外访问您的内部 web 服务器。
根据网络上的计算机数量,您可能还需要一个提供额外网络插座的交换机,以便您可以插入更多的计算机。虽然不太可能有很多人会用计算机填满八个插座,但非计算机设备也使用以太网传输数据,从而耗尽可用插座的情况并不少见。
访问
网络上的每台设备都必须有唯一的地址。目前有两种寻址形式,IPv4 和 IPv6。IPv4 最初是通过点状四元组(如 89.16.172.66)来描述地址的形式,几乎被地球上的每一台机器和家庭设备所使用。IPv6 于 1998 年由互联网工程任务组引入,旨在克服 IPv4 的各种问题,如地址耗尽。然而,它的采用并不普遍,许多小型的面向家庭的设备并不使用它,所以我将集中讨论 IPv4。
一台机器要有一个地址,必须由人或适当配置的计算机给它一个地址。它不能随机生成一个地址,以防地址与网络上的另一台机器冲突,或者是保留地址之一,如 127.0.0.1。家庭中所有联网的机器都应该存在于一个特定的地址范围(称为子网)内,并且应该被分配给 IPv4 规范提供的私有地址范围之一。这不仅停止了与 Internet 上其他现有站点的冲突,还确保了这些网络内的数据是安全的,并且对于网络外的机器是不可见的,因为所有路由器、交换机和网关都不会使用本地网络外的私有地址范围重新传输任何流量。这些私有地址范围是 10.x.x.x, 9 172.16-31.x.x 和 192.168.x.x,其中 x 可以表示 0 到 255 之间的任何值。出于演示的目的,我将把我的子网分配到 192.168.1.x 范围,给我 254 个 10 可能的网络设备。大多数人将此用于私有网络,因为几乎所有家用路由器都在此范围内分配地址。此外,在各种互联网论坛上发现的大多数问题可能会有详细的答案,使用相同的地址,因为你有。
现在知道了网络的地址范围,您必须考虑各个地址。第一个要分配的是路由器,它通常获得 192.168.1.1 的名称, 11 ,然后是 Linux 服务器,我将分配 192.168.1.2。
Caution
配置 IP 地址等属性需要您以 root 用户身份登录,因此要小心行事!
您可以通过使用桌面 GUI 中的工具或者直接配置/etc/network/interfaces
文件来为 Linux 机器提供一个静态地址:
auto eth1
iface eth1 inet static
address 192.168.1.2
netmask 255.255.0.0
broadcast 192.168.1.255
network 192.168.1.0
这告诉系统使用分配为 eth1 12 的网卡作为静态 IPv4 地址 192.168.1.2,带有所有标准参数。
您可以使用这种方法为网络上的每台机器分配静态 IPv4 地址,只需记下哪台机器分配了哪个号码。然而,过一段时间后,这可能会变得令人厌倦,许多嵌入式设备不允许对配置进行这样的控制。这两种情况都要求您升级到 DHCP。
DHCP 代表动态主机配置协议,是一种配置网络上每台客户机网络设施的方式。该软件由两部分组成,客户端和服务器。客户简单地说,“我是一台机器;网络在哪里?”通过电缆向所有机器传送信息。服务器侦听所有这些消息,并通过返回发送方用于联网的所有配置数据(如其 IPv4 地址、域名等)进行响应。
在 Linux 中配置 DHCP 客户机很容易,只需用以下内容替换前面的/etc/network/interfaces
文件:
auto eth1
iface eth1 inet dhcp
创建 DHCP 服务器需要更多的工作,但通常可以避免,因为许多网络路由器都包含一个 DHCP 服务器,尽管有时默认情况下它是禁用的。
要在 Linux 中准备一个,您应该首先使用如下命令安装 DHCP 服务器软件:
apt-get install dhcp3-server
然后,您可以编辑/etc/dhcpd.conf
文件,为每台机器分配地址。在编辑之前,您可能需要运行以下命令:
ln -s /etc/dhcp3/dhcpd.conf /etc/dhcpd.conf
ln -s /usr/sbin/dhcpd3 /usr/sbin/dhcpd
可以按照以下步骤分配每台机器的地址:
Giving it the next free number in a series, say 100–254. These are pooled addresses. Looking at the MAC address of the network card that sent the message (all MACs are unique) and giving it a specific address based on that number. Doing any combination of 1 and 2.
因为这些汇集的地址在数量上是有限的,所以它们永远不会被分配给机器。相反,它们是租用的,每台机器的 DHCP 客户机必须重新请求地址,如果它在一段时间后仍在使用它。软件在后台自动完成这项工作。如果你家有很多访客(谁愿意用互联网而不是和你聊天!),那么租用地址是最简单的方法,因为每个朋友都不需要静态地址,而静态地址需要配置。
汇集地址的配置如下:
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
range 192.168.1.5 192.168.1.115;
}
否则,您家中的机器数量可能是有限的,因此静态地址几乎不会增加什么工作,并且可以更快地排除故障,因为您预先知道每台计算机应该有什么 IP 地址。典型的配置如下所示:
host teddyspc {
hardware ethernet 00:A1:68:8E:9E:AA;
fixed-address 192.168.1.4;
}
此主机部分可以包含在前面显示的子网部分中,以便在池规则中创建例外。
您可以通过键入以下命令来确定已经授予了哪些租约:
more /var/lib/dhcp3/dhcpd.leases
DHCP 服务器中还有许多其他选项,但这些选项足以让一切正常工作。我将在适当的时候介绍特定的额外案例。
电脑游戏
我叫史蒂文,通常简称为斯蒂夫。我电脑的名字是 192.168.1.110,对于非极客来说不太好记。很可能你的房子里会有比极客更多的非极客,极客会用诸如“霍利的电脑”或“安吉拉的笔记本电脑”这样的名字来称呼每台电脑这里有两类问题:让房子里的计算机有可用的名称,让它们知道房子外面互联网上每台计算机的名称。
计算机名通常会自动分布在本地网络中,所以它们不是问题,尽管有时信息传播到所有机器可能需要 30 秒。如果出现问题,您可以通过添加如下一行来强制提供 IP 地址和计算机名称之间的映射:
192.168.1.110 mediapc
到位于/etc/hosts
或C:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts
的文件,这分别取决于您使用的是 Linux 还是 Windows。
将互联网域名转换成数字是通过一种称为域名系统(DNS)的服务器来完成的。这是一个简单的客户机/服务器过程,其中客户机提供一个域名,如google.com
,服务器返回计算机的全局可访问 IPv4 地址。世界上有许多这样的服务器,按层次排列。因此,如果您的本地 DNS 服务器不知道某个特定的域,它会询问其父 DNS 服务器,依此类推,一直到主根区域服务器。您所需要做的就是配置您的家庭机器使用这个链中的第一个 DNS 服务器,搜索将会自动发生。如果您的 ISP 为您提供了 DNS 服务器地址,您可以直接使用它。或者,如果您使用的是路由器,那么它通常会通过在网络的外部(只有它能看到)寻找 DNS 服务器来自动配置自己,然后充当 DNS 中继,它假装是内部网络的 DNS 服务器,而是在将结果返回给您之前传递 ISP 的 DNS 的所有请求。
有了 DNS 服务器的 IP 地址(在这个例子中,您将使用路由器的 192.168.1.1),当它也请求自己的 IP 地址时,您可以使用 DHCP 服务器将这个信息分发给每台机器。因为相同的 DNS 服务器用于所有本地机器,这可以通过在/etc/dhcpd.conf
文件的顶部设置全局选项来实现:
option domain-name-servers 192.168.1.1;
或者,如果您不使用 DHCP 来提供网络凭证,那么您必须恢复到您指定其静态地址的同一个/etc/network/interfaces
文件,并添加以下内容:
dns-nameservers 192.168.1.1
网络服务
在工作网络中拥有一台机器并不足以让一台机器与另一台机器一起做某些事情。需要进行交流。您已经看到了两个正在运行的服务(DHCP 和 DNS),您可能还知道其他服务,比如访问网站的 HTTP 和传输文件的 FTP。为了让你的机器像这样工作,你需要安装某种服务器。诀窍在于知道任何特定的任务需要什么样的服务器。我将根据需要介绍这些服务器。我要展示第一件事是如何设置一个文件共享服务器,它能够通过本地网络提供文件,允许音乐收藏位于一台机器上,但可以由子网中的任何其他机器播放。
Note
让内部网络的文件对外部可用是可能的,但是我将在本书的后面讨论这个问题。
使文件可用的服务称为 Samba,它允许文件(和打印机)在机器之间共享。因为它基于一种广为人知的协议(称为 SMB/CIFS)运行,所以它可以在不同的操作系统(包括 Linux、Windows 和 Mac OS X)之间共享这些资源。 13
它以通常的方式作为您的发行版安装,如下所示:
apt-get install samba
它是通过编辑以下文件来配置的:
/etc/samba/smb.conf
这用于指定本地计算机上的哪些文件夹对其他计算机可用,以及在什么条件下可用,例如密码或读/写权限。因为有问题的机器位于私有地址范围内,所以文件只能由本地机器访问,所以通常可以将所有这些文件夹设置为公共可访问,因为在这个上下文中“公共”指的是家中的每个人。与企业网络不同,在家庭环境中滥用网络设施(通常是孩子们!)可以通过不给他们提供任何晚餐来掩盖!
有许多方法可以配置 Samba 来提供文件,但是默认方法适合家庭环境。我个人通过三种特定方式添加共享各种文件的部分。第一个提供对我的媒体服务器上的音乐和视频文件的完全访问,比如//mediapc
。它们安装在如下所示的目录结构中:
/media/mp3
/media/tv
/media/movies
并提供了配置部分,就像这样:
[media]
comment = Media Server
path = /media
browseable = yes
public = yes
writable = no
read only = yes
guest ok = yes
这让在家的任何人,包括游客,都有机会听我一直热衷的任何乐队。它是公开的(意味着我的访问者不需要我的电脑上的用户帐户)和可浏览的(所以它可以在网络上找到,没有人知道它的确切名称)。然而,它是只读的,防止访问者意外地(或恶意地,也许是流氓病毒)删除文件。
他们可以从他们的 Windows 网上邻居(或通过键入\\mediapc\media
)或从 Linux(通过桌面或命令行,用smbmount //mediapc/media local_media_folder -o guest
14 )看到它。
接下来,我将第二个共享到同一个位置。这有一个密码,这意味着只有我可以添加最新的 DVD 或音乐购买到系统中。
[media_incoming]
comment = Media Incoming
path = /media
browseable = no
public = no
writable = yes
read only = no
guest ok = no
最后一个共享是我电脑的 DVD 光驱。这在我家里几乎没有使用过,因为我有时间把我所有的 CD 和 DVD 翻录到本地机器上的文件中,但它偶尔还是有用的。默认安装提供了一个关于此方法的合适示例:
[cdrom]
comment = Media server's DVD
writable = no
locking = no
path = /dvd
public = yes
preexec = /bin/mount /dvd
postexec = /bin/umount /dvd
最后两行将在请求时自动挂载磁盘,并在磁盘短期闲置后卸载它。系统被告知如何处理/media/dvd
的安装(拆卸),在/etc/fstab
中有适当的描述:
/dev/scd0 /dvd udf,iso9660 user,noauto 0 0
根据网络上的范围和登录配置,您可能需要设置特定的 Samba 用户。如果您是一名系统管理员,为所有机器(Windows/Linux/Mac)设置一个集中的登录数据库可能看起来是一项简单的任务。但是对于我们其他人来说,每台机器都有自己的用户名和密码。因此,Samba 服务器无法知道这些其他机器,也无法知道它们各自的用户何时决定更改密码。这使得 Samba 无法知道它应该从另一台机器接受什么样的用户名/密码组合。因此,它使用单独的设置密码表。
您只需以 root 用户身份为每个拥有特定 Samba 共享文件夹密码访问权限的用户键入以下内容:
smbpasswd -a steev
对于每个用户,您将被要求提供以下信息:
New SMB password:
Retype new SMB password:
此时,您可以向家庭成员询问密码,或者给他们分配一个密码,因为只有这台机器上的 root 用户才能更改密码。但是,一旦用户从特定的机器登录,操作系统通常会记住凭证,因此不会不断地提示任何人输入这些信息。
然后,您应该重新启动 Samba 服务,使这些更改对全世界可见。
/etc/init.d/samba restart
这是使文件在您的网络中可用所必需的。这允许您使用目前可用的各种媒体流设备或主机。
闭路电视摄像机
尽管人们对 CCTV 的印象是贴在小电视屏幕上的颗粒状黑白镜头,但现实却相去甚远,特别是因为彩色 CCTV 现在非常便宜,图像通常通过以太网传输。虽然网络摄像头和闭路电视摄像头背后的技术相似,但使用廉价的网络摄像头作为更昂贵的闭路电视摄像头的合适替代品并不是特别容易:
- 网络摄像头使用 USB 传输数据,这将电缆长度限制在 5 米左右,无需特殊的延长线
- 网络摄像头在弱光环境下工作不太好
- 网络摄像头在物理上不够坚固或防水,不足以在户外使用
所以,虽然你可以在白天通过电脑旁边的摄像头窥视窗外,但你不会走得更远。相反,你需要一个特别设计的相机,通常通过无线网络传输图像,这样你就可以将相机放在需要的地方——而不是你是否可以用电缆连接它。
Note
几个版本的闭路电视摄像机可用于有线室内只。与传统网络摄像头相比,这些摄像头的主要优势在于它们通过 IP 网络传输数据,这意味着它们不需要直接连接到 PC。
事实上,市场上的每台 CCTV 摄像机都需要一根电源线(尽管以太网供电通常就足够了),因此无论您选择有线还是无线网络,都必须至少有一根电缆连接到摄像机的位置。除此之外,主要选择是室内或室外安装,后者更能适应天气。如果您购买了室内设备(如 Y-cam ),但后来又改变了主意,您通常可以将它放在壁挂式装置(Y-cam Shell)中,并将其安装在拱腹下方。
对于可能用作婴儿监控器的室内闭路电视,有像松下无线 IP 摄像机(BLC-20)这样的摄像机,它具有运动检测和内置网络服务器,因此它不需要 PC 来操作,只要在路由器上打开适当的网络端口,就可以远程查看。它的哥哥(BLC-131)也提供了摇摄和俯仰功能的摄像机遥控。
当一个摄像头位于内部但指向外部时,那么最好是寻找那些支持某种形式的“夜视模式”的摄像头使用 CMOS 传感器的传感器在这方面更好,因为它们可以在低至 0.2 勒克斯的光照水平下工作,而传统的 CCD(如网络摄像头中使用的)仅为 3 勒克斯。大多数声称具有夜间模式的 CCD 相机通常都是通过软件实现的,不会做任何好的 GIMP 会话无法解决的事情,所以尽可能选择 CMOS。
在很大程度上,所有的闭路电视都以同样的方式工作;这是在你的预算内平衡规格和价格的问题。考虑图像的大小、FTP 上传、网络访问、是否收到关于移动侦测的电子邮件通知等等。
不是的无线摄像头
市场上的许多 CCTV 摄像机在并非指 WiFi 的上下文中使用“无线”一词。XCAM2 无线摄像机系统就是这样一种设备。他们实际上使用工业、科学和医疗(ICM)无线电波段将信号传输到定制的接收器,通常用于在连接的监控器上显示。因此,它们不适合集成式家庭自动化解决方案,因为需要远程查看闭路电视输出。
但是,如果特定的接收器向 RCA 复合视频提供输出,您可以将这些接收器插入电视卡并从中进行录制,或者使用 Emprex ME-1 等硬件媒体录像机。这将限制您只能使用一台摄像机,并防止您在 CCTV 处于活动状态时使用电视卡(用于录制或观看)。其中,第二个问题很容易通过购买第二张电视卡来解决。前者更难。
如果您需要多个摄像机,那么您将需要使用一些额外的控制硬件,这可能会使成本超过一体式 IPCCTV 摄像机。这个问题有两种解决方法。
第一种涉及使用几个摄像机,但只有一个接收器。然后,您可以使用 X10 根据需要打开和关闭特定的摄像机。接收器将拾取现在存在的(唯一的)信号,并像以前一样将其传递给电视卡。这是为 XCAM2 建议的方法,但这意味着您无法一目了然地查看所有摄像机。
第二种解决方案使用多个接收器(因此成本更高)和一个电视切换器来选择不同的输入。有些甚至会把所有的图像合成一张。切换这些单元需要使用基于计算机的红外发射器并对其进行编程,因为大多数都不是 IP 可控的。(我们稍后将了解 IR 控制。)
定制硬件
在许多情况下,没有必要构建自己的 CCTV 配置,因为这是一个已知的问题,制造商已经提供了自己的解决方案。一个这样的单元是 CCTV 记录器/DVR,它通常带有 CD 重写器和视频输出。这个盒子将捕获来自多个摄像机的信号,并通过 S-video 或 composite 提供它们的输出,然后可以像以前一样输入到电视卡中,用于远程观看和录制。有些型号还配有红外遥控器和网络端口。
另一种选择是,如果你想让一切都基于 PC,那么可以使用 PCI 卡进行实时监控,这样就可以从一个卡上监控四个或更多的输入通道,比如 RW-1240R。然而,大多数软件和驱动程序目前都是基于 Windows 的,所以我们不再赘述。
Caution
许多独立的闭路电视设备接受来自 BNC 视频连接器的摄像头输入,而基于网络摄像头的设备使用 RCA。
Linux 软件
一旦网络摄像头图像以数字格式提供,无论是通过 USB 驱动器还是连接到电视卡的复合输入,图像都可以随意处理或传输。通常,处理将通过 Linux 驱动程序的标准视频(V4L)进行,现在是第二个主要版本。这使得数据可以被任何兼容的软件处理。以下是一些例子:
- xawtv:一个 X window 实用程序,用于回放和录制视频流,包括复合输入和电视台。它有一些一次预览许多视频流的功能,但因为大多数(模拟)卡必须在设备之间重新调谐,结果不是实时的
- camserv:它提供了自己的网络服务器,你可以通过任何网络浏览器实时观看视频输入,支持 motion JPEG 格式。然而,这里没有声音支持
- mencoder:
mplayer
包的一部分,它提供了一个命令行接口来记录来自 V4L 通道的 AV 信号 - motion:一个集成了运动检测的小工具,这样你只需要在有东西在外面移动的时候记录 feed(并因此耗尽硬盘空间)。具体的移动量是用户可配置的,以防止它浪费在风中摇摆的树木或你的猫走过视图的空间
独立 BitTorrent 客户端
这是近年来兴起的众多“Linux in-a-box”设备之一,毫无疑问还会有更多。这些,如 Emprex NDS-100,取代了全功能 PC,并提供 BitTorrent 和文件及打印机共享功能。本质上,它是您希望从一台永远在线的机器上获得的低功耗功能,而无需运行它的高功耗硬件。如果你已经有了自己的家庭服务器,或者打算用它来做其他事情,那么根据你所用的服务器类型,这并不能为你节省太多。例如,迷你 ITX 盒将具有类似的功耗,并提供更好的功能。
红外遥控
对于坐在沙发上看电视的人来说,没有什么比红外遥控器更方便的了。手机中的一个小红外 LED 按预定的顺序闪烁,接收设备上的“眼睛”可以对其进行解码,以改变频道、提高音量等。红外遥控器非常便宜,每个设备都有一次。这是第一个问题,因为随着设备数量的增加,沙发上的可用空间成比例地减少!
第二个问题是视线,所有的红外遥控器都是靠视线工作的。这意味着您必须在适度的容差范围内将遥控器指向设备,以便接收信号。但是把设备放在你面前并不总是很方便;例如,投影仪通常会在你身后。如果电视音频连接到 HiFi,由于空间或电源插座不足,它们可能位于房间的不同位置。或者,您可能希望将 DVD 播放机的电缆连接到卧室或厨房,以便不间断地继续播放电影。在每种情况下,如果不移动自己或设备,您可能无法远程控制设备。
红外遥控器偶尔会出现的第三个问题是接收眼,它并不总是能看到信号。第三个问题通常可以通过在“眼睛”上放置一块磨砂玻璃或透明胶带 15 来解决这将从更大的角度范围衍射入射光,使其更加敏感。前两个问题需要更多的硬件。
多功能遥控器
有这么多组合一体式遥控器,不试一下很难知道该买哪个。不幸的是,这是您通常必须做的事情,因为每一个都有这样或那样的怪癖,使得它不适合您的特定设备。
尽管存在多种多样的“一体化”遥控器,但它们的设计并不相同。您需要考虑您想要控制的每个设备的具体情况,因为在英国和爱尔兰,例如,Sky Plus 使用的红外协议与正常情况略有不同,因此除非您的遥控器专门设计来处理它,否则您的设备将显示为静音。
现在有很多学习遥控器,这些都是很好的投资。另一个有用的特性是宏,它将按顺序存储许多命令。例如,电影模式宏可以将电视切换到 DVD 输入,打开并弹出 DVD 托盘,并将 HiFi 设置为接受 DVD 输入。
红外继电器
这些设备通过将红外信号从一个地方转发到另一个地方来克服视线问题。它们由一个发射机(监控红外信号并通过无线电转播)和一个匹配的接收机(向设备回放相同的红外信息)组成。有了合适的传输范围,就可以从楼上遥控楼下的电视。
有时可能会有多个发射器,一个在厨房,一个在卧室,两者都将信号发送到一个地方,让您可以从任何地方遥控电视。
同样,有时也可能有多个接收器,使多功能遥控器能够从卧室向楼下的电视和隔壁房间的 HiFi 发送命令。然而,这种配置不太常见,因为如果你已经安装了一个红外继电器,设备的位置并不重要,所以它通常在同一物理位置;因此,您只需要安装一个红外接收器,它会将中继信号一次发送到所有设备。如果设备彼此相当接近,但接收器看不到两个设备,则通常使用 Y 形分离器和两个 IR LEDs,而不是购买另一个接收器单元。
两个发射器和接收器之间的通信是通过下面概述的方式之一完成的。
通过架空电缆
如果您的主要目的是中继电视的红外控制,那么您可以获得将红外数据嵌入现有同轴天线电缆的设备,隐藏它的结果与 X10 类似。例如,Labgear MRX120 HandyLink 就提供了这样的解决方案。当然,这种方法需要在每个房间都有一根天线,如果你的重点是电视控制,就会有。如果空中电缆已经存在,那么扩大规模就很容易,因为增加额外的放大器相当便宜,而且是一件简单的即插即用的事情。然而,如果没有现有的电缆,考虑到 IR-RF-IR 的可能性,这可能会更加麻烦,但它可以在 RF 接收特别差的情况下提供解决方案。
在这两种情况下,不可能在每个房间观看不同的频道,即使有 Sky,因为它从调谐器分发单一信号。
Note
当通过同轴电缆传递红外信号时,您可能需要一个红外旁路套件,因为信息在通过分配放大器时会变得混乱。
红外-射频-红外网关
这些设备在重播之前,以如此多的无线设备使用的 433MHz 无线电频率,通过空气中继红外数据。对于这些设备,您可以选择仅红外传输或电视发送器。
仅红外发射器,如 Powermid XL,是这些设备中最简单的一种,它允许您远程控制设备,而无需安装电缆或插座。它们相当便宜,但只传递红外数据,所以当你在另一个房间时,受控设备必须能够对你产生影响。
电视发送器是无线版本的空中电缆或旧的电视分配系统,其中涉及到一个天线放大器和一个单独的天线电缆进入家中的每台电视。电视发送器接收一个输入信号,然后将其发送给任何正在收听的接收器,对它看到的任何红外信号进行编码。市场上有许多变体,包括那些带有 SCART 插座(而不是老式的同轴天线插座)和 RCA 复合视频。即使是更便宜的型号也经常有一个“频道”开关,允许在同一栋房子里使用多个接收器-发射器对,而不会混淆信号。随着这些设备变得越来越主流,一些设备几乎与仅红外发射器一样便宜,电视功能成为免费的附加功能。
IP 上的 IR
也可以使用诸如 KIRA Keene IR Anywhere over IP 这样的设备,通过现有的以太网电缆发送数据。这消除了其他方法可能带来的任何距离或干扰问题,还提供了一种从电脑远程控制红外设备的方法,而无需将电脑及其红外发射器置于设备的物理范围内。
受 IP 控制也意味着红外信号可以通过互联网发送。虽然这本身毫无意义(因为当你不坐着看电视时,你不能从更换电视频道中获得任何好处),但它确实提供了一种从远程计算机控制基于红外的设备的现成方法。如果某样东西可以从电脑上控制,那么它就可以从任何连接到电脑的东西上控制,比如网页或 cron 作业。
使用 KIRA 转发红外代码首先需要你教它这些代码。这是通过使用图 1-15 所示的软件生成文本文件来完成的。
图 1-15。
Configuring KIRA
该软件可从基恩网站 16 获得,并且已经用 Java 精心编写,使其对 Linux 友好。将 KIRA 连接到您的网络并使用您的 DHCP 服务器为其提供 IP 地址后,您可以添加新命令。首先,您请求将所有红外信息发送到这台机器,然后在按遥控器上的第一个键之前按“Learn”。这将显示如下代码,然后可以复制并粘贴到一个文本文件中供以后使用:
K 240C 037F 0369 03AC 034D 0624 035A 0378 0382 0378 0381 0396 0366 0377
0382 0396 0365 0396 06E0 03AF 034C 072C 0353 0378 2000
我为每个设备使用了一个目录层次结构,这样我的电视的开/关按钮就在目录ir/tv/codes/on
中。由于同一个按钮执行两种功能,我在off
和on
之间创建了一个符号链接。那些拥有更大房子和更多电视的人可能会喜欢用一个比电视更具描述性的名字。
虽然 KIRA 有一个网页,但它不是很容易配置,并且限制你只能使用四个预存的红外代码。幸运的是,它还监听 UDP 端口 30303 和 65432 上发送的命令。前者用于设备发现和配置,因此无法更改端口。后者是红外控制端口,它处理所有基本命令来控制范围内的各种红外设备。对这些命令的所有响应也由 UDP 返回,因此您需要运行网络实用工具的两个实例瑞士军刀netcat
来处理它。
首先创建两个终端窗口,并通过键入以下命令在其中一个窗口中启动 UDP 服务器:
nc -u -l -p 30303
现在,它将在端口 30303 上侦听发送给它的任何 UDP 消息。现在,在另一个窗口中,在同一个端口上向 KIRA(其 IP 地址已被 DHCP 服务器确定为 192.168.1.111)发送一条消息:
echo disD | nc -q 0 -u 192.168.1.111 30303
您应该看到另一个窗口活跃起来,并报告有关设备的各种统计信息。如果没有,检查端口是否打开,并且正在使用(网络的另一把瑞士军刀)netstat
:
netstat -ntpl
通过一些普通聪明的bash
编码,您可以使用如下脚本获得相同的结果:
#!/bin/bash
TEMPFILE=
mktemp``
nc -u -l -p 30303 >$TEMPFILE &
PROCESS=$!
echo disD | nc -q 0 -u 192.168.1.111 30303
# Wait for a second so the output has finished writing
sleep 1
kill $PROCESS
cat $TEMPFILE
rm $TEMPFILE
发送红外信息的过程是相同的,只是您需要切换到红外端口。这里有一个例子:
cat ir/codes/tv/off | nc -q 0 -u 192.168.1.111 65432
发送到端口 65432 的唯一响应是 ACK,可以安全地忽略它。但是,如果您决定监听端口 65432(并且您已经请求将所有 IR 消息转发到您的 PC),那么您将会看到键码出现。这些可以从终端窗口(而不是使用 web 界面)复制到您自己的配置文件中。有一个提供的 API 文档详细说明了每个端口处理的每个命令。注意,通过使用您的 Linux 机器来维护 IR 代码,您不需要将 keycode 文件上传到它的 web 服务器上的四个插槽之一。
Note
您的网络上可以有几个 KIRA 设备,每个设备向不同的设备发送消息,尽管 KIRA 要接收消息并将它们发送回 PC,您必须从其 web 界面显式启用该功能,并给它一个 IP 地址,在那里netcat
或类似的设备将被监听。
红外控制
如果您的电脑离您想要控制的红外设备很近,则很容易为其添加合适的基于 USB 的发射器或接收器。这些可以从 RedRat 这样的地方买到,也可以根据 LIRC (Linux 红外线遥控)提供的电路图制作,该公司也提供了软件。
Caution
大多数个人电脑将 USB 端口直接连接到主板上,如果你在构建自己的设备时出错,你可能会毁掉它。购买一个单独的带有 USB 插座的 PCI 板应该可以提供一些保护,防止意外事故的发生。
对于红外传输,您需要知道您想要控制的设备的特定控制代码。如果你有一台标准的电视机或录像机,这些数据通常可以在网上获得(http://lirc.sourceforge.net/remotes/
);否则,你也需要购买或建立一个红外接收器来教 LIRC 现有的代码。幸运的是,如果你接受了早期的提示,买了一个 RedRat,你将有一个内置的接收器,与提供的 Windows 软件或 LIRC 一起,可以直接用于编程代码。
LIRC 17 是读取和传输红外数据的 Linux 标准方法。它由一个标准的守护进程lircd
和一组工具组成,这些工具记录输入的消息并把它们再次传送回来。它采用模块化方法来支持各种可用的 LIRC 设备。在这里复制安装指南可能有些鲁莽,但可以说有三种主要类型的支持控件:
- GPIO 设备:这些设备通常与电视卡一起提供,例如 Hauppauge 的电视卡。这些模块通常被编译成标准的守护程序版本
- 串行端口设备:这涵盖了各种不同的设备,包括自制的发射器,因为它们直接处理串行数据,所以不需要任何特定的驱动程序代码。典型电路可从 LIRC 网站获得。如果你不确定要不要把自己的电子设备连接到你的电脑主板上,你可以买串行 PCI 卡,它可以提供一定程度的保护,防止流氓电子设备
- 内核驱动程序:这些驱动程序,比如 RedRat3 设备,要求您从源代码构建 LIRC,并且(在某些情况下)将新的驱动程序代码复制到 LIRC 目录中。从这里,您可以重新构建安装(
data2setup.sh
)文件,并正常构建。这些设备将使用/dev/lircd
设备,该设备应该拥有ugo+rw
权限
一旦构建完成,就可以根据 LIRC、 18 的表格配置和准备驱动程序,该表格还提供了各种设备的示例配置文件,这些文件用人性化的名称描述了每个按钮以及要发送的红外信号的详细信息。从这里,您可以在.lircrc
文件中添加在各种按钮按下时触发的特定命令,其格式如下:
begin
prog = mythtv
button = Rew
config = Left
end
遥控器上的每个按钮都以这种方式映射到软件的一个功能(prog
)。
一般来说,使用 RedRat 和 LIRC 的最大好处之一是它可以包含在许多标准媒体播放器、混音器和电视应用中。因此,如果这是您的 IR 的主要目的,那么您已经完成了您的媒体安装,因为这些命令可以触发现有软件中的一些有用的东西!
LIRC 也有一个网络模式,您可以通过网络套接字与 LIRC 守护程序通信,允许外部应用程序像本地红外遥控器一样工作。这对于测试是有用的,并且作为一种远程基于 PC 的媒体播放器的方法,无需编写新的代码。
对于更具体的应用,您将需要使用irexec
,如下所示:
begin
prog = irexec
button = ok
config = /usr/bin/someprogram with arguments here
end
通过这种方式,您可以使用 IR 遥控器与其他任意应用程序进行交互,包括其他机器上的媒体播放器。此外,你可以采用与 Cosmic 相同的想法(本章前面提到过,在第七章中有更详细的介绍)来开发一个基于状态的控制机制,使用非常便宜的红外发射器。
结论
您家中的每个设备都应该能够被远程控制,或者通过电源线(X10 或 C-Bus),以太网插座,或者通过基本的红外线。这是两阶段过程的第一步。第二种是当你有一台计算机能够向这些设备发出控制信息。届时,这些设备可以在世界任何地方无缝使用。当设备不支持这样的功能时,你就得黑它。这就是极客乐趣的开始!
Footnotes 1
法拉第笼可以工作,但在家庭环境中通常不实用!
2
您可以通过观察 http://jvde.us/x10/x10_cfls.htm
处显示的示波器轨迹来见证引入的噪声。
3
感性负载使用磁场,通常以电机或螺线管为特征。
4
阻性负载将电流转换成其他形式的能量,如热能。
5
一些标有 ZED 的设备可能无法作为 ZC 或 ZR 使用,因为需要的功能较少,所以可能是故意这样设计的。价格可能是一个指南。
6
C-Bus 主要在英国和澳大利亚使用,在美国相当于 SquareD Clipsal。这是为了避免与利用消费电子总线(CEBus)的类似技术 CEBus/EIA-600 相混淆。
7
只要它们是以网络模式配置的。
8
旧的电力线控制器与新的 Insteon 设备不兼容。
9
您可能还会看到它被列为 10.0.0.0/8,其中 8 表示地址中 32 位二进制数字的前 8 位是固定的,因此在 10.0.0.0 到 10.255.255.255 之间有超过 1600 万个地址。类似地,您可能还会看到以下使用中的地址:172.16.0.0/12(在 172.16.0.0 到 172.31.255.255 之间提供超过一百万个地址的范围)和 192.168.0.0/16(在 192.168.0.0 到 192.168.255.255 之间提供 65,536 个地址的范围)。
10
有两个地址保留给子网(0)和广播(255),因此总数从 256 减少到 254。
11
有些路由器不能离开 192.168.1.1 进行配置,因此最好避免将此号码用于其他用途。
12
通过检查dmesg | grep eth
的输出或将别名eth1 mynetcarddevice
添加到/etc/modules
来确定这是 eth0 还是 eth1。
13
10.2 及更低版本。
14
除非挂载在/etc/fstab
中,否则只能通过使用 umount 目录作为根目录来卸载。
15
www.cleverandeasy.com/Multimedia/increase-operating-angle-of-infrared-remote-control.html
见。
16
www.keene.co.uk/electronics/multi.php?mycode=KIRA
见。
17
18
二、设备黑客:转换现有技术
Abstract
黑客行为有三种经典形式:软件、硬件和湿件(也称为社会工程)。最近,固件黑客攻击变得突出,因为利用嵌入式 Linux 的低成本硬件为无法构建硬件的软件黑客打开了大门。我将在本章中讨论硬件黑客及其相关软件。
黑客行为有三种经典形式:软件、硬件和湿件(也称为社会工程)。最近,固件黑客攻击变得突出,因为利用嵌入式 Linux 的低成本硬件为无法构建硬件的软件黑客打开了大门。我将在本章中讨论硬件黑客及其相关软件。
软件黑客
对于大多数开发人员来说,软件是一个更容易的黑客,因为与入侵硬件相比,不可挽回地破坏某些东西的机会大大减少了。事实上,当史蒂夫·沃兹尼亚克和史蒂夫·乔布斯在家酿电脑俱乐部制造机器时,他们推断,每一个对硬件感兴趣的黑客,就有 100 个对软件感兴趣的黑客,所以他们专注于苹果电脑的软件功能。当 Acorn 在 1981 年建立 BBC A 和 BBC B 时,一个类似的主题是真实的,因为他们努力开发软件,使其适合学校的学习。
历史肯定会重演,Raspberry Pi 利用这些理念提供了一台小型机器,其中的软件是最容易破解的部分。他们甚至通过将树莓 Pi 模型的前两次迭代命名为 A 和 B,向最初的 Acorn 机器致敬!树莓派如此成功,以至于很难保证供应能满足需求。因此,有时有必要在易贝寻找旧的二手设备来完成更适合树莓派的任务!
Linksys NSLU2
这种旧设备也被亲切地称为“Slug”,是一种小型的嵌入式 Linux 设备,旨在用作网络可寻址存储(n as)设备。你插上电源,一根网线,和(最多)两个 USB 硬盘,你就可以使用 Samba 协议从同一网络子网上的任何机器上检索存储在上面的数据。
该机器本身是无声的,由 Intel XScale IXP420 驱动,并包含 32MB 的 SDRAM 和 8MB 的闪存,用于存储软件。它的低价位和固件的开放性对想要添加或改变机器上的软件的黑客来说很有吸引力。该机已于 2008 年正式停产,但仍可在各种商店和网上买到。
就其预期形式而言,当只需要文件服务器时,Slug 是一种合适的机器,既可以作为桌面工作的远程备份(可能位于楼梯下或阁楼上),也可以为家中的媒体播放器提供音乐。但是,通过更改其固件,它可以变成以下形式:
- Web 服务器(Apache、PHP、Perl 和 Python 都受支持)
- 电子邮件服务器
- 打印机服务器(Slug 的成本可能低于 USB 打印机与其联网的同类产品之间的差异,尽管这种差异不如以前大)
- 媒体服务器(通过 Squeezebox 服务器、iTunes 或 Samba 共享)
在任何软件更改发生之前,您必须首先将一个不受限制的 Linux 版本安装到设备的固件中,这是通过其内置的 web 界面进行的。这里有两个主要的变体:Unslung(使用 Optware 包)和基于 OpenEmbedded 的 SlugOS(正式名称为 OpenSlug)。
从悬挂处取下
对于基本的改进和最少的麻烦,Unslung ( www.nslu2-linux.org/wiki/Unslung/HomePage
)是首选,因为它安装在现有固件之上,看起来与最终用户非常相似,因为它基于原始 Linksys 代码。该固件提供了额外的功能,例如使用 FAT 格式化磁盘的能力,如果您想使用现有的硬盘驱动器,这是必要的,因为 Slug 中使用的任何磁盘都需要在使用前进行特殊格式化(到 ext3)。
还可以使用如下命令通过 Optware 安装额外的软件包:
ipkg install apache
但是,您需要小心,因为它们被安装到内部闪存,这可能会很快耗尽,从而导致设备无法启动。为了防止这种情况发生,您需要将操作系统移动到其中一个外部驱动器上(USB 记忆棒或整个硬盘驱动器,具体取决于您打算添加的内容的范围和大小),这一过程称为“解除您的 Slug”或者,您可以执行硬件破解来增加内存。
数百种包装可用于非悬挂式废料浆,包括:
- BitTorrent 客户端
- Xbox 媒体服务器的流媒体工具
- Apache web 服务器
- 星号 VoIP
- 杯子
- 饭桶
- 关系型数据库
- 嘘
正如你所看到的,大多数主要的软件包都是可用的,这使得这是一个非常低功耗的机器,能够提供大多数家庭任务。但是,它们都受到 2.4 内核的限制,所以对于更奇特的硬件(如蓝牙),您将需要采用 SlugOS。
斯拉格洛斯
SlugOS 是一个更大的努力,它像对待任何其他硬件一样对待 Slug,它有一个基本的操作系统和用于主要功能的独立包,符合传统的 Unix 思想“做一件事并把它做好”。这也删除了特定于 Slug 的功能,如基于 web 的配置工具和基本服务,如 Samba,因此您必须显式安装。
如果您使用 Slug 作为一个更大的家庭自动化服务器的基础,那么这在升级路径中提供了更大的范围,因为它让您可以访问 SlugOS 所基于的 OpenEmbedded 项目提供的数千个包。但这样做需要您将一个连接的硬盘驱动器的一部分或全部专用于操作系统,这是一个需要您将一个小系统安装到闪存中,然后将操作系统引导到硬盘驱动器上的过程。这样,SlugOS 允许使用基于 2.6 的内核以及 RAID 和 NFS 功能。
当使用外部 USB 驱动器保存操作系统时,请始终使用硬盘驱动器(而不是记忆棒)。这是因为一些应用程序(如 MySQL)会向交换文件中写入大量内存,并且因为闪存在大约 100,000 次写入后变得不可用,所以这种情况迟早会发生。或者,您可以将交换文件分配到第二个(硬盘)驱动器,允许操作系统从只读记忆棒启动和运行。
在弹头上发展
要为 Slug 编写您自己的软件,您应该从 SlugOS 开始,因为这使您可以访问标准开发工具,这些工具运行在允许在 Slug 上编写、编译和测试代码的设备上。这就是所谓的本地开发。首先,您需要运行以下命令,以及其他标准构建包(详见 www.nslu2-linux.org/wiki/HowTo/SlugOSNativeCompileEnvironment
),然后再正常开发您的代码:
ipkg install slugos-native
然而,如果没有屏幕,你将无法使用 GUI 调试器,比如kdbg
,这对一些人来说可能是一个可怕的降级。然而,无头运行机器是完全可能的,因为你可以通过ssh
或telnet
远程连接。这是优选的,因为机器的速度使得 GUI 方法对于大型应用不切实际。您更有可能为您的桌面机编写和测试您的应用程序,然后,当它准备好了,为 Slug 进行交叉编译。
交叉编译是一个过程,通过这个过程,运行在机器 A 上的编译器能够生成适合于机器 b 的代码。为此,您需要一套新的编译器、工具、头文件和库(统称为工具链),它们是专门为另一种体系结构构建的。这些文件与您现有的开发文件分开存储,因为它们会与运行您机器的文件冲突。然后,编译过程照常进行(通过make
或gcc
的变体,如armeb-linux-gnu-gcc
)以产生合适的可执行文件,或者 Linux 术语中的 elf。
安装这些工具的最佳介绍在 www.nslu2-linux.org/wiki/DebianSlug/CrossCompiling
。
请注意,如果您只使用现有的包,那么任何形式的编译工具都是不必要的,您可以完全依赖预构建的包。
黑客入侵游戏机
游戏机非常适合玩游戏。旧游戏机非常适合玩旧游戏——也适合入侵 Linux 机器!随着上一代机器变得便宜并且技术过时,旧的游戏控制台为媒体播放器、网络服务器、控制单元等提供了良好的嵌入式平台,因为它们总是具有适合于电视的连接器,并且在客厅中看起来很自然。在这一节中,你将学习如何让这些机器按照你的意愿运转,而不是它们的具体用途。
唉,这并不是一帆风顺的,因为制造商没有向计算机游戏行业以外的任何人提供编译器或开发环境,即使这样,也只有严格的保密协议(NDAs)才能实现。虽然这应该足以满足过分热心的法律部门,但他们随后建立了安全措施,通过加密光盘格式、BIOS 或可执行文件来使在其上运行自制代码变得困难。对于黑客来说,这本身就是一个有趣的问题。因为大多数制造商在游戏机上赔钱(知道他们会在游戏上收回),颠覆性的黑客更喜欢这个过程。
尽管成本不断下降,但不值得为了将一台新主机黑进 Linux 机器而购买它,但慈善商店和在线拍卖可以为黑客提供上一代硬件,其成本使时间和 geek-cred 值回票价。(尽管这是一个更简单的命题,只需使用一个树莓派!)然而,面对所有的技术挑战,随着更新更强大的机器的出现,或者随着时间效益超过替代设备的成本,领导这些控制台黑客项目的人的兴趣往往会减弱。所以,很可能是部分(或者全部!)在你读到这篇文章的时候,这些项目可能已经失宠了,因为 Xbox 360 已经过时了,而 PlayStation 4 是当前的游戏机。
“梦幻女郎”
Dreamcast 是 1998 年在命运多舛的世嘉土星之后发布的一款游戏机。它是由 IBM 研究员 Tatsuo Yamamoto 和世嘉硬件工程师 Hideki Sato 领导的两个工程师团队在世嘉内部竞争中的获胜者。最终的控制台采用了两种设计的元素,并基于 200MHz 日立 SH4 RISC 处理器和 VideoLogic 的 PowerVR2 图形芯片,对于视频播放来说速度足够快。
它还配备了一个光学 GD-ROM 驱动器,支持标准的 CD-ROM 分区(包括操作系统),以及游戏的专有格式部分。这款游戏机也标志着微软首次将 Windows CE 操作系统与其 DirectX 技术相结合,进军硬件领域。
该控制台还包括一个视觉内存单元(VMU),除了是一个基本的内存盒外,还具有 8 位处理,48 ×32 像素 LCD 屏幕,D-pad 和四个基本按钮。它原本是用来作为一个辅助游戏设备,而不是一个掌上游戏机本身,需要插入控制器才能发挥作用。这是一个好主意(几年后,索尼在其 PocketStation 设备中再次使用了这一想法,该设备也具有红外控制功能),但与当时的同等技术相比,它对于任何重要的工作来说都不够强大。
世嘉还通过为 Dreamcast 提供鼠标、键盘和以太网(俗称宽带适配器,或 BBA)等外围设备走在了前列。后两者被认为是安装和使用 Linux 的基础。
LinuxDC ( http://linuxdc.sourceforge.net
)是一个古老的——几乎已经不存在了——的项目,最近已经看到了一点新的生机。这是一个相当完整的发行版,适合 web 浏览(带 BBA)、电影回放和仿真。这本身是一个很好的技巧,但也有电缆提供双向串行通信,要么在 Dreamcast 和 PC 之间,要么在红外(IR)发射器和接收器等外围设备之间。您可以使用 http://mc.pp.se/dc/serifc.html
所示电路中的一个芯片和三个电容器自己构建这种电缆,或者购买类似的兼容电缆,即众所周知的 DC 编码电缆。
还有一种用于 Linux 的 Dreamcast 仿真软件叫做 LXDream,它提供了一种快速的方法来验证各种 Dreamcast 软件黑客是否工作。你可以在 www.lxdream.org
找到这个,它还提供了从 www.lxdream.org/wiki/index.php?title=Dreamcast_Linux
到 LinuxDC 的预建磁盘映像 iso 的所有重要链接。
Note
像 LXDream 这样的模拟器需要机器原始 BIOS 的映像。因为这些通常仍受版权保护,所以它们不与模拟器打包在一起,必须从一台机器(您合法拥有的机器)中提取。
除此之外,还有各种独立软件可以交叉编译,并通过串行 DC 编码电缆上传到 Dreamcast。其中一些显示在 http://mc.pp.se/dc
的页面上。这包括文本、图形、声音和串行通信的示例源代码。通过避免操作系统,您可以更好地利用相对较小的 16MB 内存和 200MHz 处理器,但这是以降低开发难度为代价的。
索尼游戏机
索尼现在正在推广其第三代游戏机,富有想象力地命名为 PS3。把整台机器变成一个家庭自动化设备(因为它已经是一个非常强大的媒体播放设备)仍然太新,在经济上不可行,但如果你想的话,你可以在上面安装 Linux,前提是你使用 3.15 或更早版本的固件,或者使用其他 OS++。 2 (注意,Slimline 版 PS3 不支持这个。)对于软件工程师来说,这是一个学习 CELL 架构的好平台,但因为内核不是为这种芯片优化的,所以操作系统相对较慢,这意味着同样的钱和电可以更好地用于标准 PC。然而,这台机器的新颖意味着有两个旧的游戏机被忽视了,可以用很少的钱买到。
游戏机 1
1994 年发布的第一款 PlayStation(现在称为 PlayStation 1,以区别于 PlayStation 品牌)只有 2MB 的 RAM,33.8MHz 的 CPU,没有内存管理单元(MMU),这意味着只有 uClinux 内核适合移植,但即使在那时,转换系统的其余部分也很困难。似乎只存在一个安装,Runix(最初称为 PSXLinux),尽管现在几乎不可能找到。这并不是很大的损失,因为与现代游戏机不同,它没有硬盘,这限制了它作为 Linux 机器的使用。
不使用现有的 Linux 软件,仍然有可能使用 Net Yaroze 和利用 128KB 存储卡进行临时存储来从头开发应用程序。它包括一个黑色的 PlayStation、控制器、电缆、软件和软件开发手册,旨在通过提供一种在 PC 上编译软件并通过串行电缆(也用于调试)上传到 PlayStation 的方法,让爱好者进入该领域。这台机器是通过邮购和向大学出售的,但并不成功。最终,这些设备并不多,所以它们主要是在发烧友之间进行交易,以获得额外的金钱。然而,该机的速度使其不适合视频播放, 3 以及缺乏通信端口进一步限制了其潜力。
PlayStation 1 更好的用途不是作为电脑,而是作为 CD 播放器,尤其是第一版。这是因为与后来的版本相比,最初的控制台内部有一个大大改进的 DAC,在播放 CD 时,它可以提供专业的音频质量输出。该型号可以通过型号 SCPH 100x 和独立的音频和视频 RCA 输出来区分。
PlayStation 2
索尼的第二台机器于 2000 年发布,名为 PlayStation 2(你可能会在这里发现一个命名模式!),并且它提供了比其前身更大的功率。它有 32MB 的内存,包含独立的 I/O、声音和图形芯片,还有一个名为 Emotion Engine 的主 CPU(运行频率为 294.9MHz 或 299MHz,取决于它是原始设备还是后来的设备)。这使得它成为 Linux 的一个更现实的规范。此外,索尼公司提供了一条简单的途径,它出售自己的补充套件,名为 PS2 Linux。它为最终用户提供了硬盘、键盘、鼠标、以太网适配器以及开发软件所需的软件和手册。这些套件不再出售或支持,但有些可以从旧库存和二手经销商处获得。如果你忽略电视输出而使用显示器,开发起来会更容易——你需要一个绿色同步的显示器。所提供的发行版最终是基于带有 2.2.x 内核的 Red Hat 的旧版本,尽管现在存在更新的版本,以及 Mozilla、XChat 和各种轻量级 GUI 应用程序;使用 USB 端口的实用程序,如打印机和照相机;和网络端口。虽然工具包和软件磁盘偶尔还会出现在易贝,但这个网站已经被关闭了。在 http://web.archive.org/web/20130303202328/http://playstation2-linux.com
.
仍然有一些网页内容可以通过返程机获得
除了官方的 Linux 发行版之外,还有大量的自制软件可供选择,比如媒体播放器和模拟器。你可以从像 http://sksapps.com
或者旧的 exploitstation.com
site (now languishing at
http://web.archive.org/web/20100712044012/http://www.exploitstation.com
这样的网站下载它们作为 elf,或者你可以在 PC 上使用一套交叉编译工具自己构建它们,并从光盘、存储卡、网络或者 USB 记忆棒上运行。
说服 PS2 运行未经许可的软件不再困难,因为已经发现了几个纯软件漏洞,以及所谓的 modchip 被物理焊接到计算机本身的硬件黑客。
一种软黑客被称为 PS2 独立漏洞,其中一个 PlayStation 1 游戏的光盘被用来从存储卡加载一个特殊的文件,这反过来会触发缓冲区溢出,允许未签名的代码运行。这在 http://sksapps.com/index.php?page=exploitinstaller.html
有详细解释。
免费的 McBoot ( http://freemcboot.psx-scene.com
)是一个较新的软黑客,它还允许你通过安装捆绑在特定存储卡上的特殊软件来运行自制软件。它还可以在超薄 PS2 和大多数新机器上工作(不同于独立漏洞),目前已知的唯一例外是日期代码为 8c 和 8d 的机器(BIOS 版本 2.30)。
最近的黑客攻击和解放努力导致了一个名为 kernelloader ( http://kernelloader.sourceforge.net/
)的项目,该项目利用这些方法在您的 PS2 上创建一个完整的 Linux 发行版(一个苗条的 PS2 需要从直播 DVD 而不是网络启动),此时您可以正常使用机器。
除了列出的站点之外,一些视频共享网站还包括描述该过程的可视教程。而且,一如既往,你也许能找到合适的 modchips 进行硬件黑客攻击。
便携式游戏机
还有一个最终的 PlayStation 产品需要提及,因为 PS3 太新了,PS Vita 也没有得到充分利用,所以我们不会关注它!PlayStationPortable (PSP)于 2004 年发布,基于 PS2。这是一个手持设备,通过 802.11b WiFi 连接为 HA 黑客带来好处。IrDA 也是老的 PSP-1000 型号的特色,新版本(PSP Go)支持蓝牙。所有这些都有双 MIPS R4000 芯片,运行频率为 333MHz 4 和 32MB 的 RAM,使它们成为功能强大的设备。
然而,像大多数游戏机一样,PSP 被设计成只能运行索尼创造的签名代码,因此在任何真正意义上它都不能成为一台可编程计算机。而且,像大多数游戏机一样,黑客们通过利用最初 1.5 固件中的一个问题找到了规避这一问题的方法。这最终导致索尼公司进行了一场猫捉老鼠的固件升级游戏,以堵塞这些漏洞(并通过包括网络浏览器等新功能来贿赂用户进行升级),因为黑客试图重新打开这些漏洞,或想办法降级到 1.5(不触发索尼公司在固件中放置的木马代码,这将“砖化”你的机器)以利用旧的漏洞。
PSP 有各种各样的自制软件,包括 YouTube viewer PSPTube 和 Xbox Media Center 的控制应用程序;好的出处是 http://dl.qj.net/PSP/catid/106
。然而,这款设备的一个真正好处是,你甚至不需要侵入它就可以安装一个网络浏览器,因为(从 2.0 版本开始)NetFront 浏览器已经默认包含在内,从 3.90 版本开始,它已经包含了用于 VoIP 通话的 Skype。因为大多数家庭自动化设备都带有 web 服务器,或者可以很容易地编写一个 web 服务器,所以 web 浏览器足以实现相当高水平的家庭控制。
Note
如果你打算使用定制的或破解的固件来运行自制软件,那么一定要在设备的生命周期中尽早这样做。这样,如果固件更新过程中出现问题,您不会丢失任何个人数据。
游戏机种
像索尼 PlayStation 3 一样,微软目前的游戏主机 Xbox 360 太新太贵,不值得黑进其他东西,尽管许多人都致力于解决这个问题,并为此创建了 www.free60.org
项目,该项目现在能够运行自制代码。
Xbox 游戏机于 2001 年推出,这可能是许多人第一次考虑使用(接近)标准的 PC 连接到标准电视的可能性。这无疑得益于微软在该部门使用了 Windows 和 DirectX 技术,这两种技术都是众所周知的,从而为黑客提供了非常低的准入门槛。
作为一个单元,Xbox 基于 733MHz Pentium III 芯片,64MB 内存,以及 DVD-ROM 和 10GB 硬盘驱动器——默认情况下,这是唯一的上一代游戏机。它还支持以太网和 USB 端口,但具有专有的外形和布线。这种抗议性的疏忽导致许多公司仅仅围绕 Xbox USB 转换器的销售制定商业计划,这种转换器有很多!
作为一个物理单元,它非常大(320×100×260 毫米),并且有一个相当嘈杂的风扇,尽管硬件黑客可能能够将它压缩到笔记本电脑的大小,并用一个安静的风扇代替风扇。在任何情况下,您肯定希望机器远离您的耳朵和正在使用的扬声器系统。
运行 Linux
在微软的首款旗舰游戏机上运行 Linux 有一种反常的极客乐趣。此外,由于我们正处于其生命周期的末期,任何损坏、无效保修或机器损坏对我们来说都没有几年前那么重要了。此外,黑客社区有足够的时间来改进黑客攻击过程,以便即使那些害怕烙铁的人也可以毫无畏惧地进行攻击。主站点是 www.xbox-linux.org
。
Note
虽然所有的 Xboxes 都能够运行 Linux,但 1.6 版存在许多问题,因为 BIOS 不再存储在可以(重新)刷新的芯片中。这种芯片被称为薄小外形封装(TSOP),而是硬连线的,需要使用加载了克伦威尔 Linux BIOS 的额外硬件修改芯片,即使这样,由于使用不同的图形硬件,可能的输出分辨率也大大降低(只有复合和 S-video 以及过扫描,以及高达 480p HDTV)。您可以通过 www.xbox-linux.org/wiki/Xbox_Versions_HOWTO
(
处的图表确定版本号,可能需要通过 http://web.archive.org/web/20100728124622/
http://www.xbox-linux.org/wiki/Xbox_Versions_HOWTO
处的存档版本进行访问。
和通常的控制台黑客一样,有硬件和软件两种方式。硬件方式包括购买和焊接 modchip 尽管使用它们的合法性值得怀疑,但这为黑客攻击提供了最广阔的空间,因为您可以执行以下操作:
- 增加硬盘大小(但仍建议小于 137GB)
- 用另一个硬盘或 DVD-RW 更换 DVD
- 使用 Linux 下的所有磁盘空间
安装芯片后,你需要欺骗 Xbox 运行允许你使用它的代码。这是通过漏洞利用来实现的,例如 MechAssault 漏洞利用,它使用游戏中的破损代码和精心制作的保存游戏文件,此时你可以将任意数据传输到 Xbox 上(通过网络)并运行应用程序来用它刷新 BIOS。这个过程很简单,但很复杂,因为你需要适配器电缆、正确版本的游戏和一台单独的机器。如前所述,这是将 Xbox Linux 引入 1.6 版机器的唯一(相对)安全的方式。
硬件黑客的缺点是 Xbox 游戏(换句话说,Xbox Live)的在线组件不可用,因为微软将禁止任何人在其机器上使用 Linux。
软件破解包括大部分相同的步骤,在 www.xbox-linux.org/wiki/Software_Method_HOWTO
(或 http://web.archive.org/web/20100728124622/http://www.xbox-linux.org/wiki/Xbox_Versions_HOWTO
如果网站离线)详细解释了一些额外的复杂情况。自然地,作为软件,Linux 安装会在每次重启时消失——您的数据会保留,但您必须恢复启动 Linux 的黑客程序才能访问它。
曾经有一个 Xbox 巧克力项目,Xbox Linux 用户将帮助潜在用户修改他们的机器。它仍在进行,但志愿者越来越少。询问您当地的 Linux 用户组(又名 LUG 见 www.linux.org/groups
为你的本地组)可能是另一种想法。
黑一个 Xbox 的原因,看你自己了。如果你只是想让它播放 DVD,那么微软 DVD 播放套件是一个更好的选择,它自带 IR 遥控器。作为一个机顶盒,按照今天的标准,与我已经提到(并将提到)的其他解决方案相比,它可能有点嘈杂。但是作为一个次要的(甚至主要的)文件服务器,web 服务器,甚至桌面机,它有着非常积极的极客凭证。
播放器
尽管名为 Xbox Media Center (XBMC ),但在非 Xbox 平台上运行的版本比 Xbox 平台上的多,包括 Raspberry Pi 和 Live CD 的版本,所有这些都可以从 www.xbmc.org
获得!这是因为该软件只能使用 Xbox 开发工具包(XDK)进行编译,该工具包只提供给获得许可的开发人员。因为微软不喜欢 Linux 开发者在它的控制台上编写开源软件,所以爱好者不能以任何形式使用它。因此,在野外运行的 XBMC 的唯一本地版本是那些由授权开发者编译的版本和那些开发者泄露的版本。这种版本的合法性受到严重质疑。在这两种情况下,你仍然需要一个修改过的 Xbox 来运行代码,就像在 Xbox Linux 上一样。
Note
如果您可以使用 Xbox 软件,那么您可以使用 XBMC 的 Microsoft DVD 播放套件附带的红外遥控器。
作为软件,XBMC 包含许多高端功能,仍在积极开发中。这包括一项减少启动时间的倡议,使它看起来更像一个机顶盒,而不像一台运行软件的计算机——这是所有家庭自动化设备都应该追求的目标。
它的功能包括播放几乎所有格式的媒体(来自硬盘、光学媒体、网络共享、在线流和源,以及 iTunes 的 DAAP),显示照片,运行 Python 编写的插件(用于天气预报等),以及玩游戏。它还能够通过 IMDb(亚马逊拥有的互联网电影数据库)和 FreeDB(用于 CD 曲目列表)的数据服务来支持媒体。对许多人来说,XBMC 最大的乐趣在于它的可剥除性,它允许任何一个只有最低限度知识的人为软件创建定制界面。
尽管它很突出,但 XBMC 有几个分支:Boxee,集成到社交网络应用程序中;MediaPortal,一个具有 PVR 处理的以 Windows 为中心的版本;Plex,专注于 Mac OS X 和相关的面向苹果平台的功能(如 iTunes 应用商店);以及支持来自其(商业)视频点播网站的媒体流的 Voddler。
硬件黑客
这类攻击包括对现有硬件或新硬件的更改,您可以轻松构建新硬件来控制现有计算机或受现有计算机控制。
Linksys NSLU2
现有的 NSLU2 单元(又名 Slug)不需要任何硬件改造就可以运行前面提到的任何定制的 Linux 固件。然而,你可以用各种方法来改进这个单元。
永远在线
像大多数消费类硬件一样,Slug 有一个开/关按钮。对于正常操作,这是可以的。但是对于家庭自动化系统来说,它通常是 24/7 工作的(像房子的其他部分一样),这可能会在短暂停电时引起问题,因为机器需要手动重新打开。此外,如果你正在远程控制 Slug 的电源,可能是通过一个定时 X10 设备模块或独立的定时器,它不会完全打开,因为它需要按下按钮。
在第一种情况下,这里有显而易见的解决方案,例如将 Slug 放在 UPS 上或保持其可访问性,以便您可以手动控制它。然而,这些都否定了它便宜、隐蔽、可控(对 HA 来说很重要)的优势。
您可以通过执行几个硬件破解中的一个来使您的保修无效,以确保机器在通电时始终开机,从而解决这个问题。从在各种配置中使用 USB Y 形电缆到将元件焊接到电路板上,不一而足。皆详之,以其优劣在线( www.nslu2-linux.org/wiki/HowTo/ForcePowerAlwaysOn
)。
超频
在 2006 年之前,尽管芯片被设计为以 266MHz 运行,但所有 Slugs 的运行速度都低于必要的速度,因为它们的 CPU 主频为 133MHz。这在技术上意味着原始版本是欠频的,这意味着下面的黑客被称为去欠频,而不是超频。如果您登录到您的 Slug(通过telnet
或ssh
,取决于您的固件)并键入以下内容:
cat /proc/cpuinfo
你会看到一个 BogoMIPS 值,表示当前的速度。如果这在 133 值的 10%以内,那么您可以通过移除图 2-1 中所示的电阻器来提高速度。
图 2-1。
The de-underclocking resistor (second from the bottom in the R84 stack). Image from http://www.nslu2-linux.org/gallery/hardware
released under cc-by-sa
你可以用指甲钳、烙铁、锯子或以上任何方法的组合来移除它。请确保不要损坏任何其他组件。
串行端口
你可以使用一个标准的串行端口在许多旧技术之间进行双向通信,例如游戏杆、LCD 文本显示器和其他形式的自制电子设备。它还提供了一种在网络等其他路径出现故障时通过getty
控制阻塞的方法。
已经有一个串行端口隐藏在 J2 的 Slug 主板上。唉,它的控制电压为 0/+3.3v,而不是标准 RS-232 串行端口所需的+/-12V,这意味着您需要一个功率电平转换器。(然而,严格来说,该标准要求硬件区分+/-3–15V 范围内的电压。)一些转换器可以作为单个芯片购买(如 MAX3232),或者已经包含在一些移动电话数据线中。你可以在网站上找到全部细节( www.nslu2-linux.org/wiki/HowTo/AddASerialPort
)。
还有一些电路可以让您轻松地将 LCD 字符显示器(如 HD44780)连接到 Slug,提供基本的(非常低功耗的)显示器来报告当前的媒体播放或机器状态。然而,这也需要打开您的 Slug 进行硬件调整。
乐高 Mindstorms
乐高 Mindstorms 于 1998 年首次发布,最初被称为 Mindstorms 机器人发明系统(RIS)套件,包含一个名为 RCX 的控制砖块,您可以向其上传红外程序。然后,该软件将运行,控制连接到 RCX 砖的各种电机和传感器,并通过红外与其他人通信。这自然会产生与 IR 相关的常见问题,如第一章所述(主要是视线)。有两个版本的 RCX 发布,都在不同的载波频率操作红外(虽然两个 RCX 模块可以在任一频率上传输),但功能相同。
编程可以用多种语言完成,包括 Java、C/C++、Lisp 等的精简版本,只要将其编译成适合内部微控制器(Renesas H8/300)的代码。由于年代久远,它现在相当便宜,尽管提供的红外发射器不支持任何 64 位操作系统,并且正在失去对较新的 32 位操作系统的支持。
2006 年,乐高从 RCX 搬到 Mindstorms NXT。这通过改进处理器(现在是 32 位 ARM7/TDMI 芯片)和通信设备(现在包括 USB、蓝牙和板载 100 × 64 像素 LCD 矩阵)提高了主模块的规格。处理器的升级使得控制软件的改变成为必要,但这是意料之中的,大部分 RIS 代码现在已经移植到 NXT 上。乐高组件也有所改进,如表 2-1 所示。
表 2-1。
LEGO Mindstorms Specifications
| 装备 | 发动机 | 触摸传感器 | 光传感器 | 超声波传感器 | 声音传感器 | 颜色传感器 | | --- | --- | --- | --- | --- | --- | --- | | 远端软体安装服务(Remote Installation Service) | Two | - | Two | one | - | - | | NXT | 3* | one | one | one | one | - | | NXT 2.0 | 3* | Two | one | one | - | one | | NXT 教育 | 3* | Two | one | one | one | - |- These are servo motors, which internally monitor their position for greater positional accuracy.
自 2009 年以来,Mindstorms 已经进行了第三次迭代(NXT 2.0),包括与 NXT 2.0 版本相同的 RCX 砖块,一些替代的乐高技术砖块,以及从声音到颜色的传感器变化。这是一个奇怪的变化,因为现在所有的 NXT 2.0 机器人默认都是聋的!这可能是销售更多附加传感器的一种策略,但是对于狡猾的黑客来说,使用网络上或各种书籍中的说明,例如 Extreme NXT,使用标准电子元件可以更便宜地制造这些传感器。 6
乐高 Mindstorms 的优势在于它能够快速制作出可以由电脑控制的硬件原型,以及可以将信息反馈给电脑的远程传感器。这提供了一种方法,通过这种方法,计算机的状态可以由现实世界中的某些东西来演示。同样,它允许计算机在某种程度上理解现实世界。
家庭自动化充满了创意,一旦新鲜感消失,并不是所有的创意都有持久力来改善你的生活。这使得乐高成为一种完美的手段,可以在投入时间和金钱购买 PIC 芯片、电机和仅用于一个项目的机箱之前,构建概念验证硬件。以下是一些想法:
- 创建一个机器人,当收到电子邮件、私人即时消息或电话时,它会挥手或做手势
- 使用 NXT 处理器模块上的 LCD 来传递信息,例如天气
- 创造一个机器人打开冰箱,把啤酒带进客厅 7
- 为房子周围的传感器和设备创建一个蓝牙网关(用于猫的皮瓣或压力垫)
每个传感器和电机的处理都非常简单,因为这只是一个编程问题,使用一个可用的 Linux 环境,如 leJOS NXJ(LEGO Mindstorms 的 Java)或 NXC(不完全是 C)。关于这个主题的书籍和网络文章比比皆是,包括这个有用的起点: http://www.eggwall.com/2011/08/lego-nxt-mindstorm-with-linux.html
。
Arduino 作为 I/O 设备
Arduino 及其许多克隆和变体是微控制器板,您可以将其视为成熟的乐高——它提供了一种简单的方式来将现实世界与计算机进行交互,在芯片上(而不是在软件中)处理基本处理任务,并与硬件电机和传感器一起工作。
基于简单的微控制器,目前有 16 种形式的 Arduino,但现在最流行的开发版本是基于 ATmega168 芯片的 Arduino Diecimilanove,尽管它正被使用 ATmega328 的 Arduino Uno 取代。它支持 14 个可配置为输入或输出的数字引脚和 6 个模拟输入。这里缺少的部分是模拟输出,可以通过在 14 个现有数字输出中的 6 个上使用脉宽调制(PWM 8 )或使用额外的电子设备来提供。电源可以通过 USB 端口、电源插座或连接电池夹和电路板的电线来提供。板载跳线用于在 USB 和外部电源之间切换。
对于那些习惯于大型机器的人来说,Arduino 芯片组的规格显得相当小:
- 14KB 可用闪存(ATMega328 版本为 30KB),用于软件
- 2KB 闪存,由引导加载程序使用
- 1KB SRAM 存储器(ATMega328 版本为 2KB ),用于存储数据
- 512 字节的 EEPROM(atmega 328 版本为 1KB),用于永久数据;相当于一个迷你硬盘
- 16MHz 时钟速度
即使是内存容量翻倍的 ATMega328,甚至是 256KB 的 ATMega2561,似乎也不够用,尤其是与 Raspberry Pi 相比。然而,Arduino 通常执行的任务非常简单,通常是在比较各种输入和执行简单逻辑的领域,所以这个规范已经足够大了。操作系统中的复杂任务,如 TCP/IP 堆栈,通常是不必要的,因为您可以将这些任务的请求传输到连接的 PC。当它们不匹配时,问题通常通过构建适当的电路并为该硬件组件包含必要的驱动软件在硬件中解决。
如果你有使用其他微控制器或 PIC 芯片的经验,Arduino 在技术上与它们没有任何不同,所以你可以继续使用你以前用过的任何芯片。然而,Arduino 为那些对电子产品缺乏经验的人提供了许多好处:
- 一个基于 C 语言的开发环境,代替汇编程序
- 标准 USB 输入/输出控制
- 一个庞大的黑客社区,发布项目设计并分享技巧
- 强大的开发板,不太可能在错误连接时爆炸
- 各种预建的兼容电路板(称为屏蔽板)可提供更复杂的功能,如无线通信。在本章后面的“Arduino 硬件”一节中,你会看到一些例子
- 对于纯粹主义者来说,开源硬件和架构。这是一个经常被忽视的点。硬件开源使得像 Seeeduino 这样的克隆人制造者得以存在。克隆可以更便宜、更耐用,并且可以使用表面贴装元件,同时仍然保持与 Arduino 及其配套屏蔽的引脚兼容
可能的项目范围类似于 LEGO Mindstorms,尽管现在电路可以小得多,包含更多的分立元件,并通过上述防护罩实现更广泛的功能。LEGO 设备可能会发出嘟嘟声或播放简短的声音来指示电子邮件的到达,而 Arduino 可以使用语音合成或完整的音频回放。
安装和设置
所有 Arduino 软件都写在 PC 上,通过 USB 传输到板卡。这也用于接收 Arduino 选择传输的任何数据,默认情况下通过/dev/ttyUSB0
。(记得将您的用户添加到dialout
组,以便可以访问/dev/ttyUSB0
。)开发可以按照您希望的任何方式进行,但是使用基于 Java 的 IDE 是最简单的。即使您采用命令行方式,代码也需要使用avr-gcc
工具链进行编译,该工具链可以安装在 Debian 下,如下所示:
apt-get install gcc-avr avr-libc avrdude
Java,如果卸载,将需要一个额外的行,像这样:
apt-get install openjdk-6-jre
从这里开始,安装 IDE 就很简单了。这是从位于 http://arduino.cc/en/Main/Software
的网站上作为单个档案提供的。将它解压到一个适当的目录(这些步骤都不需要 root 访问权限),并从该目录运行./arduino
。然后,在使用之前,您应该设置适当的 USB 设备和 Arduino 类型(分别为工具➤串行端口和工具➤板)。
您可以通过从菜单中选择文件➤新建来开始项目。这就创建了 Arduino IDE 所称的草图。这包括 Arduino 工作文件夹中的一个子目录和一个主源文件。其他源文件可以添加到草图中(通过草图➤添加文件),并将自动包含到项目构建中。这里没有Makefile
等价,每一个添加到草图的文件,即使是另一个目录下的库文件,都被复制到草图目录下。注意,尽管在视觉上与 C 代码相似,但为了清楚起见,所有文件都被赋予了扩展名.pde
。
Note
不能创建给定名称的草图。相反,您必须创建一个空白的新草图,然后选择另存为单独的步骤。
构建过程本身使用avr-gcc
在幕后处理,这是一个用于 Atmel AVR RISC 处理器的交叉编译工具链,ATmega168 就是其中之一。它在 sketch 文件夹中创建一个单独的 applet 目录,并将所有头文件和所有源文件的连接复制到其中(以.pde
结尾)。正是这个(.cpp
)源文件被交叉编译成十六进制,然后上传到 Arduino。
Arduino 软体
大多数人为了测试他们的设置而建立的最简单的电路是闪光灯。Arduino Diecimila 板上的第 13 号引脚有一个内置电阻,允许您将 LED 直接连接到它和 0v 电源,而不会损坏它。一些主板也有表面贴装 LED,所以你甚至不需要它!眨眼教程代码,可以从 IDE 中加载(文件➤例子➤ 01。基本),简单来说就是这样:
int ledPin = 13; // LED connected to digital pin 13
void setup() // run once, when the sketch starts
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() // run over and over again
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
这段代码很容易理解,因为许多常见的 C/C++/Java-ism 是不必要的:
- 不需要头文件
- Main 已被两个功能取代:设置和循环
- 没有事件循环或回调。每次循环时都必须读取引脚状态
如果你是一个受过传统训练的开发人员,强烈反对这里使用的阻塞函数delay
,那么有一些例子演示如何使用millis
函数来推断没有阻塞的时间。
对于大多数复杂的软件和库,您当然可以引用头文件,但是请记住,添加到项目中的任何其他源文件都将被复制。当然,创建自己的库是可能的,但是在这样的小规模项目中,这通常会耗费更多的时间。
读取数字输入
这些是最简单的电路,因为它们由单个电阻和开关组合而成,如图 2-2 所示。
图 2-2。
Reading a digital switch on the Arduino
在此配置中,引脚 2 用作示例,并在开关断开的所有时间向 Arduino 报告 1(高)电压。这是因为“上拉”电阻 R1。没有它,引脚实际上是断开的,因此其电压可能会波动到 0 到 5v 之间的任何值,从而导致错误读数。(然而,大多数时候,它会浮动到 1。)当开关闭合时,引脚直接连接到 0v 接地轨,导致读取 0。Arduino 代码随后会观察这种变化,如下所示:
int inputSwitchPin = 2;
int lastState = HIGH;
void setup() {
Serial.begin(9600);
pinMode(inputSwitchPin, INPUT);
}
void loop() {
int pinState = digitalRead(inputSwitchPin);
if (pinState != lastState) {
Serial.println(pinState?"released":"pressed");
lastState = pinState;
}
}
这将在某些情况下工作,但不是所有的,因为硬件不是那么简单!开关是机械怪兽,当它们被按下时,往往会在开和关之间“弹跳”几次。然而,如果这个开关连接到一盏灯上,你可能看不到它的开关,因为所涉及的时间是以毫秒来计量的。但是计算机足够快来发现它,所以你需要编写代码来忽略任何状态变化,比如说,在 100 毫秒内发生的变化。
int inputSwitchPin = 2;
int lastState;
long timeLastPressed;
long debouncePeriod = 100;
void setup() {
Serial.begin(9600);
pinMode(inputSwitchPin, INPUT);
lastState = digitalRead(inputSwitchPin);
timeLastPressed = millis();
}
void loop() {
int pinState = digitalRead(inputSwitchPin);
if (pinState != lastState && millis() - timeLastPressed > debouncePeriod) {
Serial.println(pinState?"released":"pressed");
timeLastPressed = millis();
lastState = pinState;
}
}
我在这里使用的开关通常是打开的,顾名思义,在正常情况下保持打开(因此没有电流在触点之间流动),当按下开关时关闭。有些开关标记为常闭,在这种情况下,只需反转示例中的输出即可。
当您不关心所涉及的数量时,也可以使用模拟设备(如光传感器)来报告数字开/关输入。在本例中,您可能对外面是否有光感兴趣,而不是光有多亮。您可以修改电路,如图 2-3 所示。
图 2-3。
Reading the light on the Arduino
这种电路称为分压器电路,因为电压(正式名称为电位)是由供电轨两端的电阻按比例分压的。R2 是一种光敏电阻(LDR),它在黑暗中具有非常高的电阻(像一个打开的开关),但在亮时几乎像一个闭合的开关(即低电阻)。(这是对过程的过度简化,但足以让事情运转起来。)LDR 在这些条件下的确切电阻取决于具体的 LDR,并非所有制造商或供应商都提供此信息,因此您可能需要进行实验。
这个基本电路可以用来在天黑时开灯(记住要让 LDR 远离有问题的灯!)并可用于监控经过传感器的人,因为他们的影子通常足以关闭 LDR。你也可以得到以类似方式工作的红外发射器和接收器,它们可以放置在门口或前门的任何一侧,这样当有人接近你的房子时,你可以得到预警。
Note
当您对从关到开的状态变化感兴趣时,这就是所谓的上升沿触发。从开到关的变化称为下降沿触发。
读取模拟输入
这些检测连续范围的值。与可用作输入或输出的数字引脚不同,Arduino 上的模拟引脚是硬连线的,因此不需要进行初始配置。这使您除了读取它们的值之外什么也做不了:
int analogInputPin = 2;
int value = analogRead(analogInputPin);
value
的结果将在 0 到 1023 的范围内,代表管脚上的电压,在 0 到 5v 之间。
如果您重复使用图 2-3 中的电路,将输入馈送到模拟引脚而不是数字引脚,您可以通过以下方式观察输出值的范围:
Serial.print("LDR brightness = ");
Serial.println(value);
这使您可以凭经验确定灯光的精确亮度。你会注意到这个数据有很多波动,所以最好的方法是通过两个极限和中间的死区来确定它是否足够亮或足够暗以控制光线。也就是说,如果数字从大于 X 下降到小于 X,那么就认为是光,如果从小于 X+N 上升到大于 X+N,那么就是暗。
然后,您可以在电路中添加一个可变电阻来微调亮度,如图 2-4 所示。
图 2-4。
Controlling the brightness at which the Arduino is controlled
除了光之外,你还可以测量温度(热敏电阻)、距离(超声波测距仪)和旋转位置(通过将手柄或轮子连接到电位计的主轴上)。
Note
你可能听说过 Arduino 内置了一个温度传感器——这部分是真的!它包含在 328 系列(带有“8P”零件号的芯片)及其克隆产品(ATmega16P 和 ATmega168PA)中,但是,唉,没有其他的了。如果你有幸拥有这个版本,那么你可以在 https://code.google.com/p/tinkerit/wiki/SecretThermometer
找到合适的代码。
如果使用不同类型的传感器,读取模拟输入的方法不会改变。事实上,有一个 QM-NG1 气体传感器可以被替换到上述电路中,如果在厨房检测到泄漏,就会发出声音警告。类似地,MQ2 烟雾探测器也可以用于类似的目的。这两种情况传统上都仅限于当地警告。但是通过短信提醒将警告发送到你的手机(关于如何发送此类信息的详细信息,请参见第五章)你可以打电话给朋友或邻居为你检查,特别是当警报在住宅外可能听不到的时候。
发送数字输出
这听起来很简单,包括那些你只想发送简单的开/关信号给电灯开关或小马达的情况。代码需要一个简单的设置和调用,如下所示:
int outputLightPin = 2;
pinMode(outputLightPin, OUTPUT);
//
digitalWrite(outputLightPin, bState ? TRUE : FALSE);
从这里开始,一切都与赛道有关。
Arduino 上的每个引脚都能够提供高达约 40 毫安的电流。这对于大多数小负载来说是足够的,比如灯、缓冲器和一些小马达。如果您的设备使用的电流不超过 300 毫安,那么您可以使用 Arduino 作为开关,仅使用类似于图 2-5 中的电路,从电路板本身提取电流。
图 2-5。
A transistor switch circuit, allowing you to draw up to 300mA
对于更大的东西,你需要使用一个继电器和单独的电源,如图 2-6 所示。
图 2-6。
Using a relay to control high power loads Note
实际上,Arduino 适用于高达 800 mA 的高功率负载。但对于脏负载,如电机,300 毫安可能是更保守的明智。
发送模拟输出
如前所述,模拟输出仅在使用 PWM 时在基本 Arduino 上可用。这仅在引脚 3、5、6、9、10、11 和 21 上受支持。 9
analogWrite(analogWritePin, value); // value is between 0 and 255, inclusive
这将允许你改变发光二极管的亮度和压电蜂鸣器和扬声器的音量,但没有太多其他的。实际上,在家庭自动化环境中,你不需要很多其他东西。例如,将电机移动到特定位置,最好使用伺服或步进电机,许多其他形式的定位应该通过使用反馈回路来完成——打开电机开始移动,当传感器显示它已经移动足够远时关闭电机。
创建音频输出
这是 Arduino 可以提供的最简单的人性化反馈形式之一,因为电路只需要一个连接到数字输出引脚的蜂鸣器。该代码是一个简单的循环,每秒在开和关之间改变输出状态 440 次,例如,产生高于中音 c 的 A 音符。
Arduino 主站点上的示例提供了必要的代码,使它发出嘟嘟声并播放简短的音乐。对于那些寻求更高级音乐控制的人来说,有阿姆斯壮( www.bluedust.dontexist.com/armstrong
),Arduino 音乐系统,它提供了一个小型旋律处理器,允许你用这样的代码演奏大本钟的钟声:
ancInitialize(OUTPUT_LOCAL);
ancAssignChannelToPin(CHANNEL_OUTPUT_PIEZO_SPEAKER, piezoPin);
char *pChimesPhrase1 = "L32O4edcL64O3g";
char *pChimesPhrase2 = "L32O4cedL64O3g";
char *pChimesPhrase3 = "L32O4cdeL64c";
char *pChimesPhrase4 = "L32O4ecdL64O3g";
char *pChimesPhrase5 = "L32O3gO4deL64c";
// a quarter past
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase1);
// half past
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase2);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase3);
// a quarter to
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase4);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase5);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase1);
// top of the hour
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase2);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase3);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase4);
ampPlayString(CHANNEL_OUTPUT_PIEZO_SPEAKER, pChimesPhrase5);
使用各种屏蔽提供更复杂的音频输出,包括样本回放。
与 PC 的通信
基本的 Arduino 允许通过其内置的 USB 端口与 PC 进行双向通信。这使用了最初用来上传程序的同一串行端口。在发送或接收数据之前,必须先对其进行设置,这两者都受此方法支持:
Serial.begin(9600);
Arduino 只能逐个字节地从 PC 读取数据,因此您需要使用如下代码在循环中读取数据:
int incomingData = Serial.read();
但是,请注意,这个函数是阻塞的。也就是说,在串行端口上有数据之前,它不会从read
函数返回。如果你的设备只对信息作出反应,那么这就很好了。然而,更常见的是将它放在循环的开始,用下面的语句包围:
if (Serial.available() > 0) { /* ... */ }
然而,将数据从 Arduino 写回到 PC 更容易,因为数据的大小是已知的。这可以通过Serial.print
或Serial.println
函数来处理,以便快速轻松地获取字符串消息。或者可以使用Serial.write
写入单个字节:
Serial.write(byteData);
这对于希望传输大量数据的应用程序非常有用。但是对于测试和开发,我发现简单的基于 ASCII 的协议更容易使用,因为简单的串行终端允许我以人类可读的文本发送和接收消息。Minerva 特性 MINX (Minerva 输入传输)使用分隔符<|
和|>
包围控制消息,允许 Arduino 将消息传回 PC,以便进行进一步处理,而不会影响任何其他调试或跟踪消息。我会在第七章的中详细介绍这一点。
Note
某些型号的 Arduino,如 Mega,有三个额外的串行端口,可寻址为 Serial1、Serial2 和 Serial3。
在这个收发等式的 PC 端,你有一个简单得多的工作,因为 Linux 中的一切都被当作一个文件。因此,您可以发出以下命令:
tail -f /dev/ttyUSB0
要查看从 Arduino 发回的所有数据并向电路板引入命令,请使用以下命令:
echo -n send data > /dev/ttyUSB0
正是从这一点上证明了基于 ASCII 的协议的好处。在最简单的情况下,您可以发出这样的命令:
Serial.print("1");
从 Arduino 将 PC 控制程序切换到打开状态,相当于关闭状态。这使得 C 程序非常简单:
// USB script trigger
#include <stdio.h>
char *szUSBDevice = "/dev/ttyUSB0";
int main() {
char v;
FILE *fp = fopen(szUSBDevice, "r");
if (!fp) {
printf("Failed to open USB...");
return 1;
}
while(1) {
if (fread(&v, 1, 1, fp)) {
if (v == '1') {
// button pressed
} else if (v == '0') {
// button released
} else {
printf("%c", v);
fflush(stdout);
}
}
}
return 0;
}
这也包括将非控制代码写入stdout
的功能,该代码可被重定向至日志文件。如果您用 g++作为arduino_read
来编译前面的程序,那么您可以在后台将其作为一个进程来启动,只需很少的努力就可以使它像守护进程一样:
./arduino_read > logfile 2>&1 &
硬件烧坏
对于一些复杂的应用程序,Arduino 板上的 ATmega168 芯片不够强大,无法处理这项任务。因此,与其他计算机一样,需要额外的芯片来减轻负担。为了与 Arduino 的模块化设计保持一致,这些芯片被构建到具有必要接口电路的独立电路板中,以便它们可以直接安装在现有 Arduino 电路板的顶部。由于这个原因,他们被称为盾牌。大多数屏蔽还包括一个通道,以便其他屏蔽可以放置在它的顶部。然后有一个单独的软件库,用于控制设备,并被复制到Arduino/hardware/libraries
目录中。
Note
并非所有的屏蔽都与 Arduino 的所有型号兼容。
市场上有许多 Arduino 屏蔽,大多数都有免费提供的规格和电路图。每个防护都有特定的任务,包括以下问题领域。
以太网网络
Arduino Ethernet Shield 支持四个并发连接,使用 TCP 或 UDP 数据包在客户端或服务器模式下工作。它基于 Wiznet W5100 芯片组,使用数字引脚 10–13 进行通信。
无线电控制
由于 Arduino 黑客的出色工作,现在有一个 WiFi 盾可用,能够使用 802.11b 和 802.11g 协议。 http://arduino.cc/en/Main/ArduinoWiFiShield
处的代码,连同 WiFi 盾库,提供 WEP 和 WPA2 加密,以及板载 SD 微插槽。也有一些例子把这个单元变成一个网络服务器。
为了符合它的身份,WiFi 盾使用许多 pin 码在它自己和 Arduino 之间进行通信。因此,如果您有一个输入/输出繁重的应用,那么期待 4051 芯片( http://playground.arduino.cc/learning/4051
)多路输出和扩展其能力。
Tip
如果 shield 和 Arduino 拒绝对话,那么短路引脚 3 和 7 可能会有所帮助。
在 802.11 之外,主要的替代方案是 Xbee shield,它使用 ZigBee 无线协议,这意味着它不能直接与现有的 WiFi 连接兼容,但可以作为基本场景的无线电发射器和接收器,并具有大约 30 米的室内范围。对于基本的安全措施来说,这通常是一个更好的选择。
发动机
LadyAda 的电机屏蔽支持 DC、伺服和步进电机的中等功率控制。支持的电机总数和总功耗由特定的电机本身决定,但引用的规格允许您使用两个 DC 伺服系统(5V)和最多四个 DC 电机,两个步进电机,或一个步进电机和最多两个 DC 电机。这个护盾确实使用了很多针来控制,也使用了很多能量,但是可以用来锁住猫的翅膀或者建造一个机器人。
例如:Arduino 迎宾垫
有了这些知识,您可以构建一个简单的电路,编写一些 Arduino 软件,并添加一个 Linux 端脚本,以便在有人进出房间时触发一段语音。
我将展示如何使用 Arduino 来监控放置在地毯下的压力垫(使用常开开关)的状态,并将消息传输到 PC。Arduino 还会记住当前状态,因此一旦踩下压力垫内的开关,房屋状态就会被认为是“空置”,因为人们已经离开了房屋,当开关再次关闭时,状态就会变为“有人居住”电路是一个简单的开关,如图 2-2 所示。当然,您可以在 Raspberry Pi 上编写相同的代码,但是没有理由浪费这么多 CPU 周期,除非您还打算添加一个前门摄像头或其他类似的功能。
Note
你也可以使用压力垫来确定你是否在闹钟响起后起床,你可以使用离开卧室的行为作为阻止闹钟响起的手段。
Arduino 软件稍微复杂一些,因为您正在寻找开关从闭合状态变为打开状态的情况,因为人们可能会在穿外套时站在垫子上一分钟或更长时间。我还在这里包括了一个定时器,这样如果在第一个上升沿的两秒内检测到第二个上升沿(由其他人踩在垫子上引起),house 状态不会改变。这是为了让几个人同时离开房子,而不会造成混乱。自然,这并没有解决只有部分居住者离开房子的问题,但这是一个开始!
int inputSwitchPin = 2;
int lastState;
long timeLastPressed;
long debouncePeriod = 100;
int houseState;
long doormatUnblockAt;
long doormatDelayPeriod = 2000;
int blockSteps;
void setup() {
Serial.begin(9600);
pinMode(inputSwitchPin, INPUT); // declare pushbutton as input
lastState = digitalRead(inputSwitchPin);
timeLastPressed = millis();
blockSteps = 0;
houseState = 0;
}
void loop() {
int pinState = digitalRead(inputSwitchPin);
if (pinState != lastState && millis() - timeLastPressed > debouncePeriod) {
if (pinState == 0) { // i.e., pressed
if (!blockSteps) {
houseState = 1-houseState;
blockSteps = 1;
Serial.print(houseState?"1":"0");
}
doormatUnblockAt = millis() + doormatDelayPeriod;
}
timeLastPressed = millis();
lastState = pinState;
}
if (millis() > doormatUnblockAt) {
blockSteps = 0;
}
}
最后,前面显示的 USB 脚本触发代码适用于监控 0 和 1 的串行消息:
if (v == '1') {
system("enter_house.sh");
} else if (v == '0') {
system("leave_house.sh");
... as before ...
它运行enter_house.sh
脚本来输入:
say default welcome home
x10control default on lounge_light
或者根据情况选择离开的leave_house.sh
脚本:
say default Goodbye
RAIN=
weatherstatus | head -n 1 | grep -i “[rain|shower]”``
if [ "$?" -eq 0 ]; then
say default Remember your umbrella it might rain today.
say default $RAIN
fi
在这些代码示例中,我使用了不带路径的简化命令来演示这个过程。这些命令本身是出现在 Minerva 系统中的抽象,在第七章中有所介绍。
例如,这种“住宅状态”信息可以扩展到打开安全灯或者将个人电子邮件重定向到工作帐户。要将 Arduino 输出连接到系统的其余部分,您要么需要使用网络屏蔽(有线或无线,取决于您的连接点),要么需要一台配有网络屏蔽的本地 PC。PC(如 Fit-PC2、笔记本或类似的小型机器)的优势在于它可以作为显示和控制面板重复使用。在这个例子中,在门边有一个显示当天任务和打印天气提醒的面板可以为额外费用提供一个合适的借口。
通过使用你和你家人的习惯的个人知识,该代码可以进一步扩展。例如,考虑一下离开你的房子,10 秒钟后回来拿你的手套的行为。一方面(没有双关语),您可以向语音合成模块添加一个低温警告。另一方面,你可以确定任何在 20 秒内激活压力垫的人正在回家(而不是其他人离开它),因此忽略通常的消息。
此外,你可以延长这一宽限期,让你上了车,却发现忘了带钥匙。在这一点上,你可以自动触发一个报警装置,当它连接到钥匙上时,会发出蜂鸣声,这样当压力垫检测到你回来时,你就可以很容易地找到它。
Note
稍加修改,您可以使用两个压力垫(一个在内侧,一个在外侧)来更准确地确定行进方向。
根据所用压力垫的类型,你也可以在猫扑旁边的地毯下放置一个,因为你的宠物的重量通常足以触发它。这将允许你把它和一个乐高机器人连接起来,当他们从惯常的闲逛中回来时,这个机器人可以给猫喂食。
Caution
大多数压力垫由于其内部的电子设备而不能被切割成合适的尺寸。
例如:Arduino 录音机
大多数人在火车票和购物清单的背面做笔记,因为打开电脑或找到手机的记事本应用程序太费力了。通过结合 Arduino 的无界面环境和无监控器 PC 的音频功能,您可以创建一个非常简单的录音机。
你从基本的开关电路开始,然后复制三次——录音、播放和擦除按钮各一次,如图 2-7 所示。
图 2-7。
Using three switches and inputs to control a voice recorder
然后,您可以修改同样平庸的 Arduino 控制程序来检查三个按钮,而不是一个,记住要对每个按钮进行去抖。这里也有一点小小的变化。因为您使用 record 按钮来控制记录的长度,所以当按钮被按下时,它会发送一条开始消息,当释放时,它会发送一条停止消息。
int pinStates[3];
int lastStates[3];
long timesLastPressed[3];
int inputSwitchPins[3] = {2,3,4};
void setup() {
Serial.begin(9600);
for(int i=0;i<3;++i) {
pinMode(inputSwitchPins[i], INPUT);
lastState = digitalRead(inputSwitchPins[i]);
timesLastPressed[i] = millis();
}
}
void loop() {
for(int i=0;i<3;++i) {
int pinState = digitalRead(inputSwitchPins[i]);
if (pinState != lastStates[i] &&
millis() - timesLastPressed[i] > debouncePeriod) {
switch(i) {
case 0: // record
Serial.print(pinState==0?"B":"E");
break;
case 1: // play
if (pinState == 0) {
Serial.print("P");
}
break;
case 2: // delete
if (pinState == 0) {
Serial.print("D");
}
break;
}
timesLastPressed[i] = millis();
lastStates[i] = pinState;
}
}
}
请注意,我还扩展了控制代码。我现在用 B 和 E 来开始和结束录音,用 P 来播放声音,用 D 来删除所有声音,而不是简单的 0 和 1。然后,您可以像对门垫一样修改基于 PC 的 C 代码,以运行您在 PC 上编写的三个脚本中的一个来控制声卡:
if (v == 'B') {
system("vox_record.sh start");
} else if (v == 'E') {
system("vox_record.sh stop");
} else if (v == 'P') {
system("vox_play.sh");
} else if (v == 'D') {
system("vox_delete.sh");
... as before ...
这可能是用vox_record.sh
录制声音:
#!/bin/bash
LOGFILE=/var/log/voxrecordpid
DIR_INCOMING=/usr/local/media/voxrecord
if [ "$1" == "start" ]; then
FILENAME=
mktemp -p $DIR_INCOMING.wav
arecord -f cd -t wav $FILENAME >/dev/null >/dev/null 2>&1 &
PID=$!
echo $PID >$LOGFILE
fi
if [ "$1" == "stop" ]; then
PID=
cat $LOGFILE``
kill $PID
rm $LOGFILE
fi
或者用vox_play.sh
播放目录中的每个声音:
#!/bin/bash
DIR_INCOMING=/usr/local/media/voxrecord
for F in "$DIR_INCOMING"/*.wav
do
play $F
done
甚至可以通过vox_delete.sh
全部删除:
#!/bin/bash
DIR_INCOMING=/usr/local/media/voxrecord
rm -f $DIR_INCOMING/*
自然,这里有更多的空间来支持删除单个记录等等。但这代表了这个想法。
Note
Minerva 系统将这些想法抽象成 Minx,这样就不需要为每个 Arduino 应用程序提供单独的可执行文件。密涅瓦将在第七章中讲述。
示例:Arduino 接口
在大多数情况下,Arduino 只能通过 LED 或小型 LCD 文本显示器来指示其状态。大多数友好的家庭界面需要更大的屏幕或语音输出。对于这些,Arduino 通常会向房子里其他地方的更大的机器发出请求。然而,随着越来越多的屏蔽提供,更快的芯片和更多的时间投入到更多的定制编程的引入,其他方式的接口现在可以从一个不起眼的 Arduino。
Note
许多高级软件要求通过使用快速 PWM 来实现精确定时,快速 PWM 通过将波形产生模式位设为 011 来激活。请注意,如果你的代码的其余部分在正常操作中使用它,你将需要重新获得对该库的控制,这可能包括禁用其他使用它的盾牌。类似地,在某些情况下,您可能还需要避免正常的轮询-测试-输出循环。
语音合成
演讲的使用是一把双刃剑,在第五章中有更全面的介绍。一方面,这是最自然的交流方式,我们人类已经完善了几千年。另一方面,计算机化的语音听起来仍然像一部糟糕的 60 年代 B 级电影,当一个人说话时,无法传达语言中存在的细微差别。
但是很酷!
Arduino 说出任意文本字符串最自然的方式是使用屏蔽,如 GinSing ( http://www.ginsingsound.com
)或 Voicebox ( http://www.sparkfun.com/short/9799
)。就能力和成本而言,两者相当,GinSing 因其更高额定功率放大器和改进的 16 Khz 回放速率而略胜一筹。对于那些想要一个预制盾牌的人来说,它也胜过 Sparkfun 产品。但是,您需要运行的唯一测试与输出有关,也就是说,您更喜欢哪种声音。这两个网站都是老派的,所以听听这两个网站的例子,然后做出相应的选择。
Note
有一个著名的例子是用不安全的 Arduino, https://code.google.com/p/tinkerit/wiki/Cantarino
进行语音合成,但这主要是一个技术演示,要转换成其他东西需要合理的工作。
声音制作
范围从简单的哔哔声到样本回放。然而,它不能支持多个声源,因为没有足够的处理能力来管理声音的实时混合。如果您愿意,也有一些使用多个扬声器的概念验证,但它们很少足够好。或者,你可以买两个 Arduinos,但在这种情况下,最好买一个树莓派!
单独的哔哔声可以用作简单的确认音,表明系统已经执行了特定的任务——高音表示“正常”,低音表示“错误”——或者发出警报声(想想 80 年代的电脑游戏在类似技术水平下的声音范围!)它最大也是最明显的好处是声音只需要很少的处理能力,你可以在芯片上运行复杂的操作。我们早些时候在软件领先的 Armstrong 的操作中看到了这一点,但您也可以依赖硬件,并使用语音合成芯片来生成多声道音频。
对于音频反馈,样本回放显然是更好的解决方案。虽然哔哔声是可以忍受的,但它们仅仅是可以忍受的!如果你听任何电视节目或电影,高科技设备的哔哔声和唧唧声总是比简单的方波声音更有色彩(或音色)。《星球大战》中 R2D2 的哔哔声可能听起来很简单,但如果你分析它们,你会发现它们很有质感。因此,用样本代替哔哔声是一个明显的进步。
此外,声音样本可以用来表示任何东西。包括预先录制的语音。这(正如我们将在第五章中看到的)可以用来代替语音合成来创造一个更自然的室内声音。有人拿《星际迷航》里的电脑 Majel Barrett 的声音,在这方面!所以,只要你只需要预先录制的短语,这就提供了一个非常好的界面。
Tip
除了新闻报道之外,大多数反馈系统都可以用预先确定的错误代码和消息来量化。您可能需要将消息从“您在/dev/sda1 上只有 N 兆字节的可用空间”改为“您的服务器磁盘空间不足”,但这通常是更可取的。
样本回放的方法比发出简单的哔哔声稍微复杂一些。这是因为要制作可识别的样本,您必须更频繁地更改输出 pin。通常是一个数量级。例如,要播放 440Hz 的方波(中 C 以上的“A”),必须每秒钟将引脚的输出电平从高变到低 440 次。(这是 880 操作。)对于一个样本,通常每秒需要至少 11050 次变化,每一次电平变化都需要额外的存储器访问时间,并使用模拟输出。奈奎斯特定理表明,要表现 1000 赫兹的声音,你需要至少两倍于此的采样频率,即 2000 赫兹。作为指南,CD 的播放频率为 44,100 赫兹。
但是,有可能!
有两种纯软件解决方案可供您选择,它们都源于 http://playground.arduino.cc/Code/PCMAudio
处的基本代码,这提供了一种操作引脚 11 上的 PWM 信号的相当低级的解决方案。该库的扩展(即高级)版本位于 http://hlt.media.mit.edu/?p=1963
,并允许您使用以下代码启动回放:
#include <PCM.h>
const unsigned char sampleData[] PROGMEM = {
126, 127, 128, 128, 128, 128, 128, 127, 128, 128, 128, 129, 129, 128, 127,
... lots more data here...
};
void setup()
{
startPlayback(sampleData, sizeof(sampleData));
}
void loop()
{
}
您会注意到回放总是采用样本数据的数组,而不是文件名。如果你有一个能让你用 SD 卡或 USB 记忆棒工作的保护罩,那么你就可以从一个文件开始播放。但是,如果没有它,您就需要将它作为原始数据直接访问,这涉及到离线处理音频文件,并生成一个可以读取的大数组。
生成这个数组的问题有各种代码解决方案,虽然输出不过是声音中每个样本的 8 位输出电平。典型的包有 EncodeAudio ( https://github.com/damellis/EncodeAudio
)和 wav2c、mplayer、sox。
这种方法的局限性很多,但是,在一个无屏蔽的 Arduino 上,你还能指望什么呢!?首先,您需要将数据存储在它的闪存(不是 RAM)中,这样会占用您的程序空间。但是,你仍然被限制在 4 秒左右的音频,8 位,采样频率为 8Khz。
要超越这些限制,你需要两样东西:更大的内存和能够更快播放的定制芯片。幸运的是,这些问题是相伴而生的,因为你需要一个支持外部闪存的屏蔽来处理前者,所以后者的制造商已经免费提供了它。这方面的两个主力是 Sparkfun MP3 播放器 shield ( https://www.sparkfun.com/products/10628
)和 Lady Ada 的 wave shield ( http://www.ladyada.net/make/waveshield
),它为.wav
文件提供回放支持,最高可达 16 位单声道 22KHz 样本,这是对我们之前看到的 PCM 示例的显著改进。它还提供了一个小功率放大器,能够驱动 1/8W 8 欧姆的扬声器。这可以用于一个会说话的时钟,一个厨房用的秒表,或者一个虚拟的宠物。
然而,在规划任何项目之前,您需要仔细查阅硬件规格,因为这项任务所需的软件库可能非常大(因为它们包括 Flash 访问和样本回放,例如 wave shield 使用 10KB 的内存),因此您可能没有空间来容纳所有自动化控制逻辑。或者你可能需要升级到更好的芯片。
Note
Arduino 可访问的闪存上的文件系统通常使用 8.3 文件名,因此如果没有额外的查找表,不可能从字典中预先录制每个单词的语音。
显示系统
如果你需要一个完整的显示器,或者高分辨率的图形,那么你的 Arduino 可能不得不承认输给了 Raspberry Pi。然而,对于许多应用程序来说,这是不必要的。
最简单的连接显示器形式是 LCD,例如 SparkFun SerLCD ( https://www.sparkfun.com/products/9393
),它提供两行 16 个字符,以及一个背光。这种设备不需要额外的驱动硬件,LCD 库作为标准提供。字体也保存在设备中,因此消息可以简单地用
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("hello, world!");
对于警告和基本消息来说,这通常就足够了,尽管如果需要的话,您可以随时缓冲和滚动消息。
如果你对布线更感兴趣,那么也可以用一个 Arduino 驱动几个 LED 矩阵设备,比如这个例子 http://g33k.blogspot.co.uk/2010/02/arduino-56x8-scrolling-led-matrix.html
。这具有每个 LED 控制的优点,并且仍然是相当低的功率。下一步是使用电视显示器,Arduino 能够通过复合插座直接驱动它!
TVout 项目( https://code.google.com/p/arduino-tvout
)使用两个电阻和一根电线来控制标准电视机上的 128 x 96 像素显示器。它只支持黑白渲染,但已经用于小游戏,以及更传统的应用程序。生成图像的处理开销自然很高,因此控制逻辑需要相当严密,但仍然很有可能制作出有用的报告应用程序。
输入操纵杆
操纵杆,尤其是老式的操纵杆,是极好的输入设备,因为它们与大多数标准声卡上的并行端口相连接,而且物理上很坚固。这使得按钮可以重复使用,特别是作为脚踏板来控制软件。事实上,这提供了一种非常便宜的方式来给你的机器添加听写模块,而不需要 Arduino 提供输入。除了触发 Linux 机器上的单个事件,比如请求天气报告或机器状态,它还可以向其他应用程序提供消息。例如,mplayer
可以在从模式下运行,允许从标准输入或命名管道向其输入命令。类似地,X Window 电视观看软件xawtv
带有xawtv-remote
来改变频道和音量(根据大多数遥控器),给你开/关捕捉和截图功能。这使得定格魔术表演成为可能,看看他们是怎么做到的!
你可以直接从/dev/js0
中读取操纵杆,但是使用抽象通常更好,比如简单的 DirectMedia 层(SDL)。这允许您在必要时将代码移植到其他地方,避免依赖设备层次结构带来的不可预测性,并使其他人更容易添加和修改您的代码。
读取和处理操纵杆的代码是一个非常简单的 C 代码循环:
#include <SDL/SDL.h>
int main() {
if (SDL_Init(SDL_INIT_JOYSTICK) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
}
SDL_JoystickEventState(SDL_ENABLE);
SDL_Joystick *pJoystick = SDL_JoystickOpen(0);
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_JOYBUTTONDOWN:
// Use event.jbutton.which, event.jbutton.button, event.jbutton.state
break;
}
}
SDL_JoystickClose(pJoystick);
return 0;
}
按下按钮可以自然地在内部触发软件,或者利用我前面提到的 Minerva Minx 系统来执行单独的外部脚本(Minerva 在第七章中有详细介绍)。
通过一种被称为力反馈的技术,一些操纵杆也可以被用作输出设备,这种技术可以在 Linux 下使用libff
。这种功能是通过两个驱动器中的一个来提供的,HID 驱动器(hid-lg2ff
)或 I-Force 驱动器(iforce.ko
),它们覆盖了市场上的许多力反馈设备。唉,没有全部收录,所以最好先查兼容性( http://sourceforge.net/apps/mediawiki/libff/index.php?title=SupportedDevices
)。力反馈主要用于游戏,因为当玩家受到攻击或死亡时,游戏会通过操纵杆中的一个小电机引起设备的轻微震动。移动电话和传呼机上的振动选项以同样的方式工作。以任何先进或有意义的方式塑造振动的空间非常小,并且 Linux 中很少(如果有的话)游戏支持该库。然而,fftest
(来自 http://sourceforge.net/projects/libff/files/ffutils
的 ffutils 项目)可能会被黑客攻击,以在电子邮件到达时提供一个小的隆隆声。
其他输入控制器
游戏开发从来都不是 Linux 社区的强大卖点;因此,可用的库(以及由此产生的游戏质量)数量很少。这导致了解决设备控制问题的零星方法。这方面的一个很好的例子是 SDL(用于良好的固体操纵杆处理,但力反馈目前仅在不稳定的 SVN 分公司可用)和 fflib(用于力反馈)之间的分离。目前只有一个项目试图弥合这一鸿沟,它被称为面向对象输入系统(OIS);你可以在 http://sourceforge.net/projects/wgois/
找到它。
OIS 正计划抽象出用户输入设备(包括键盘、鼠标和操纵杆)的所有设备(和驱动程序)特定元素,并为它们提供一个统一的 API。虽然这对游戏开发者来说是令人钦佩的,但它对我们没有太大的帮助…除了最近推出的代码支持任天堂 Wii 的远程棒(又名 Wiimote)。这种外设通过蓝牙进行操作,并可以通过将红外 led 成像到其传感器来确定它所指向的屏幕区域,这些 led 固定在屏幕顶部或底部的一根杆上。这也可以确定它的方向和加速度。这使得它非常适合在电视屏幕上运行的复杂应用程序,在这种情况下,鼠标不适合,但需要等效的控制手段。
还有 CWiid 工具,默认情况下在一些发行版中可用,它提供了一个鼠标驱动包装器,允许 Wiimote 控制未移植的基于鼠标的应用程序。
入侵笔记本电脑
带有固态存储和预装 Linux 软件的上网本价格现在非常低,其成本并不比顶级的独立相框高多少。另外,你还会得到更好的处理器、视频播放、网络连接(通常是无线的)和 VoIP 软件。这使得上网本成为理想的家庭自动化面板,具有多种用途。
显然,较旧的笔记本电脑也可以用于黑客攻击。任何缺少硬盘、电池没电或键盘损坏的笔记本电脑都是特别划算的,因为新零件的成本使它们太昂贵而无法重建,而且拥有一台依赖有线电源线的笔记本电脑对家庭自动化用户来说并不像对其他人那样是个问题。
它们作为控制面板的用途是显而易见的,因为屏幕和键盘可以折叠起来,很容易安装在任何墙壁或表面上。或者,键盘底座(大部分电子产品)可以藏在桌子或工作台下面,只露出屏幕。然后,它可以通过操纵杆输入或更令人印象深刻的触摸屏来控制。
大多数笔记本电脑都可以加装触摸屏。它们是一种安装在屏幕上的透明膜,以及一个 PS/2 插座,模仿鼠标传递 X 和 Y 坐标以及左键上下信息的行为。应当注意,软件接口必须被适当地编程,因为膜不能检测鼠标位置,除非其上有压力(即,鼠标悬停或悬停事件将不存在),并且没有鼠标右键的输入。幸运的是,大多数 web 界面通常是合适的。
Note
触摸屏薄膜无法切割成笔记本电脑的尺寸;它们必须预先定好尺寸,所以在购买前要仔细检查,记住屏幕尺寸是在 LCD 屏幕的对角线上测量的,而不是可视区域。
您自己的电动设备
甚至一些顽固的极客也不愿意用市电来创造黑客。但是只要稍加注意,你就可以控制任何电源供电的设备,比如热水器、取暖器、车库门电机等等。这样做需要一个可控的继电器系统,接受控制信号并关闭或打开一组触点,使电流从插头流向您的设备。您甚至可以将它们直接连接到标准消费设备(如调制解调器和打印机)上,以重新启动或重启它们。这方面有几个选择。
X10 控制
例如,建造一个完整的 X10 单元来控制一个电机,这远远超出了本书的范围,尝试一下是不公平的。相反,我将展示一个嵌入式设备模块,如 AM12W,它处理 X10 协议的脏工作,并在其两个连接之间产生一组闭合触点。它的工作方式与你在第一章中看到的 AM12 相同(虽然稍微便宜一些),但它不是控制流向插头插座的电流,而是控制电源和 X10 单元之间以及单元和设备之间的电流。图 2-8 显示了该接线。
图 2-8。
Connecting an AM12W to a mains-powered device
这适用于任何只能通过 X10 遥控的装置。为了支持本地开关(开/关或瞬时按钮),AD10 是更好的选择。这也支持设备上的手动超控,如图 2-9 中的蓝色按钮所示。
图 2-9。
The AD10 module
图 2-10 所示为接线;尽管这两种类型的按钮在这里都有介绍,但实际上只有一种会用到。
图 2-10。
Wiring an AD10 to a mains-powered device
与 AM12W 相比,该模块的主要优势在于使用的开关是标准电气开关,而不是(更昂贵的)X10 开关。
Note
所有设备都应相应地接地,而不是为了清晰起见而如图所示。
无线网络控制
通过合适的电子设备,您可以将 Raspberry Pi 或 Arduino 连接到 WiFi 板,并添加一些继电器来控制外部设备。然而,这种黑客攻击并不总是必要的,因为一些预建的设备已经存在,这消除了使用主电源工作的需要和担忧。
一个这样的设备是 DIN Relay III(来自 http://www.digital-loggers.com/din.html
),它支持 WiFi,允许你同时控制多达 8 个设备,由交流或 DC 供电。举例来说,如果你在楼梯下的橱柜里有几个设备,这就有了自然的规模效益。即使你目前的房屋布线不是本地的(到一个单独的位置),这种设备也使这样的任务更有吸引力,因为它提供了一个费用很少的集中控制系统。
尽管它有一种脚本语言(完全可以忽略不计!)它确实具有调度和可控制的内置状态 LCD,并且不需要显示关于单元状态的信息。
低压控制
对于许多应用来说,没有必要控制 115/240V 电源线。这是因为几乎所有的家用设备都工作在低得多的电压下,通常为 24V 或更低。这包括一些更现代的 24V 灯泡。因此,你可以绕过它,在电源出口和电路板入口之间切换电流,而不是在插头处控制器件。
Note
一些设备具有双电源线路,例如 3.3V 和 5V 轨道。在这种情况下,您将需要一个“双掷”继电器,以便两个电源电路可以同时打开或关闭。
这种切换动作可以用任何合适的继电器来进行。决定“合适”继电器的是“触点额定值”这是在特定电压下,继电器能够安全切换的电流量。如果超过这个值,继电器可能会一直保持打开或关闭状态,而不会发出任何警告。这些总是在继电器或使用它们的开关单元上指定。美国国家电气制造商协会,或 NEMA,已经为交流和 DC 引入了一系列的名称,表示电流的类型和最大电压。
您可以使用 Arduino、继电器和上述 Arduino 数字输出控制指南来构建您的 WiFi 继电器开关。对于那些寻找预建解决方案的人来说, http://www.relaypros.com/Relay/Relay/Wi-Fi_Relay
和 http://www.relaycontrollers.com
(以及许多其他软件)都提供了合适的功能。
当然,它不必是控制继电器的 Arduino,因为 Raspberry Pi 或任何形式的微控制器都可以很好地处理这项任务。一个著名的例子是纳特·莫里斯( http://www.natmorris.co.uk/feedtoby
)的《喂养托比》,他通过推特用微型控制器给他的宠物狗喂食。在这种情况下,用电动机代替继电器。
结论
同样,您可以使用几个精心挑选的硬件来构建复杂且引人入胜的系统,同样,您也可以用最少的努力来构建智能自动化工具。通过使用替代输入设备,如压力垫和操纵杆,您可以改变与您的家庭互动的方式。通过添加替代的输出设备,也许是由旧的游戏控制台驱动的,你可以向以前全尺寸台式电脑无法到达的区域提供视觉效果。机器人和电脑化迎宾垫的引入给你的家增添了一种前所未有的凉爽。
Footnotes 1
NDA 是公司制定的法律文件,旨在防止您与他人谈论他们的技术或想法。
2
3
现在使用的编解码器比当时游戏中使用的格式需要更多的 CPU 能力。
4
3.50 之前的固件会在 222MHz 下欠频。
5
有些援引违反 DMCA/EUCD,有些案件被驳回。
6
正式名称为 Extreme NXT:将 LEGO MINDSTORMS NXT 扩展到下一个级别(ISBN 978-1590598184)。
7
顺便说一句,这是一个很难建造的,因为大多数冰箱门上的吸力比乐高马达更强大。
8
PWM 是指数字输出电压在高电平和低电平之间切换,使得平均电压在一段时间内介于两者之间。然而,并不是所有的硬件都可以这样供电,但这是一种廉价的折衷方案。
9
使用 ATmega8 的旧主板仅支持第 9、10 和 11 针,而较新的 Arduino Mega 可以支持 12 针的 PWM。
10
自 2005 年 1 月 1 日起,在英格兰和威尔士,《建筑条例》P 部分规定,只有经过认证的工程师才能进行这种特殊的电气安装工作。如果不是由这样的人进行,那么工作必须在完成时得到认证。其他国家可能有类似的法律。