新書推薦:
《
无端欢喜
》
售價:NT$
347.0
《
股票大作手操盘术
》
售價:NT$
245.0
《
何以中国·何谓唐代:东欧亚帝国的兴亡与转型
》
售價:NT$
398.0
《
一间只属于自己的房间 女性主义先锋伍尔夫代表作 女性精神独立与经济独立的象征,做自己,比任何事都更重要
》
售價:NT$
203.0
《
泉舆日志 幻想世界宝石生物图鉴
》
售價:NT$
611.0
《
养育女孩 : 官方升级版
》
售價:NT$
230.0
《
跨界:蒂利希思想研究
》
售價:NT$
500.0
《
千万别喝南瓜汤(遵守规则绘本)
》
售價:NT$
203.0
|
編輯推薦: |
本书提供了3个压缩文件供读者下载,以配合本书的学习和实践。下载网址为http:pan.baidu.coms1i43qtfB本书以Arduino这个著名的开放式软硬件平台为工具,结合丰富的范例,系统全面地介绍了物联网的三大要素物联和网的产品开发和具体实现。书中涵盖了主控端、传感端、通信和联网等模块的硬件集成、软件开发和软硬件整合。Arduino 设计平台的开放已不只是软件开源意义上的开放了,它的硬件设计也完全开源了即硬件的设计电路也完全开放了,是一个彻头彻尾的开放式软硬件开发和设计的平台。
|
內容簡介: |
本书以Arduino 这个著名的开放式软硬件平台为工具,结合丰富的范例,系统全面地介绍了物联网的三大要素物联和网的产品开发和具体实现。书中涵盖了物联网的概念与技术,主控端、传感端、通信和联网等模块的硬件集成、软件开发和软硬件整合等。另外,云下载资源中还提供了范例程序、电路图等资源,以配合本书的学习和实践。 本书适合物联网产品开发从业者与技术人员使用,也可以用作高校学生学习硬件设计的实践教程。
|
關於作者: |
孙骏荣,具有六年多Arduino专案开发与相关研究经验,曾使用Arduino进行数字艺术、自主运动载体工具的实现,也在机电整合应用的项目中使用过其他单片机,目前从事工业自动化领域开发。近年来,也常受邀担任Arduino课程讲师,在学校与相关机构讲解整合应用与软件开发。
|
目錄:
|
01 浅谈物联网物联网 (Internet of Things,IoT)这个名词可以解释得很简单,物品能够连上网络就算是物联网。1-1 物联网的起源与发展 21-2 新时代新思维 61-3 关于本书 9
02 全面感知的联网节点点是构成平面最重要也是最基本的单位。它的结构看似简单,却必须担负起、承、转、结尾等不同的角色。借助数以百计、数以千计的点,可以变化出无穷尽的网络世界。2-1 基础节点的组成 122-2 控制核心的选择 142-3 介绍 Arduino 222-4 Arduino 的软件介绍与第一次下载 272-5 如何感知信号 312-6 系统规划与优化 45
03 物物相连的关键数以万计的点洒落在空间中,彼此之间有着默契的相连,几个之间组成一个网络。这样的网络连接非常有价值,点与点、网络与网络间共享着信息与数据,带给空间无穷无尽的变化。3-1 浅谈物联网通信 563-2 通信种类介绍 603-3 串行通信 643-4 I2C通信 813-5 SPI通信 903-6 网络通信 923-7 小结 105
04 无所不在的连接在物联网中,无所不在的通信占有大部分的版图,其中又以无线通信被视为物联网设置的基本配备。所有感测到的数据要能够不受限制地往上传递,靠的就是部署完善的通信网络,目前在大都市中,移动通信网络(Cellular communication)和Wi-Fi无线网络覆盖范围最为广泛,有许多的应用因此孕育而生。4-1 初入无线通信 1084-2 RF通信 1154-3 2.4G RF 通信(nRF24L01) 1224-4 蓝牙通信 1304-5 XBee 1434-6 Wi-Fi 无线网络 1564-7 小结 164
05家庭自动化物联系统本章以3种无线技术为引子,分别引入不同的应用到家庭自动化的开发中,通过前面学习的传感与控制方式,完成一个完整的解决方案。
5-1 事前准备 1665-2 RFID 1685-3 NFC 2025-4 GPRS 2085-5 小结 217
06爱上云计算物联网的最后一公里,数据的集成与应用,才是发挥物联网价值的所在。为山九仞岂能功亏一篑。
6-1 通往云计算的道路 2206-2 RESTful 2226-3 MQTT 2266-4 MQTT to Cloud 230
APPENDIX A?如何破坏 Arduino APPENDIX B?如何进行除错 APPENDIX C?ASCII字元码 APPENDIX D?物联网套件组合包
|
內容試閱:
|
前言 物联网这个名词真是让人又爱又恨。这个名词绝对是这几年最常被人 提出来讨论的议题之一,但是因为它所涉及的范围广,听得越多反而越不知道什么是物联网真正的应用所在。其实它早在我们生活周围了!智能手机,不!我们应该称之为智能终端,因为手机早已不只是手机,它可以让用户随时随地通过因特网得到所有想知道的信息,以及随时随地和朋友互动,这就是物联网的应用之一。我们把物联网细分成3部分:物,各种各样的设备,甚至包括人类都是其中一部分;联,将所有的物品通过有线或无线的方式连接在一起,彼此能够交换信息;网,将物物相连成网,这个网将成为应用与价值的所在。笔者接触 Arduino 也快 10 年了,看着它开始在中国台湾落地萌芽,到 现在百花齐放,每天都有人发表新的应用和新的想法,Arduino 不再只是冷冰冰的硬件,而是实现大家心中梦想的最佳垫脚石。以 Arduino 来展开物联网的介绍,无疑是希望用最简单的东西让大家能够体验物联网的无所不及。本书篇幅有限,只能点出每种应用的关键与角色,书中有太多太多主题可以再单独深入研究下去。坦白地说,笔者也无法将每个技术或领域研究透彻,因此本书若有错误或引用不当之处,欢迎随时来信指教。希望以此书抛砖引玉,吸引更多玩家一起悠游物联网的世界。Scott Sun2016夏
03 物物相连的关键数以万计的点洒落在空间中,彼此之间有着默契的相连,几个之间组成一个网络。这样的网络连接非常有价值,点与点、网络与网络间共享着信息与数据,带给空间无穷无尽的变化。
3-1 浅谈物联网通信通信在物联网中可以说是相当重要的一环,毕竟物联网三个字中,联网指的就是通信。早期的物联网可以是指任何物品或设备能够连接到因特网,后来谈到所谓的机器对机器(Machine to Machine, M2M)的沟通,又把物联网提升到物物相连的境界。云计算机应用的兴起使整个物联网的架构也随之完整。所以要搞懂物联网,首先一定要搞清楚各种通信接口和架构,从通信的角度出发,就能很快理解整个物联网运行和工作的原理。通信就像人们在对话一样,要有发话或信息给接收对方的方式,例如嘴巴就是一种发话的接口,或比手画脚,也算是一种。无论采用怎样的方式,重点是要能够让对方(也就是接收信息的人)可以明白你的意思,这就是一种通信。如果两个人同时说话,可能会无法百分之百了解对方的意思,因为接收信息的同时你也在发送信息,所以通信当中会有各种顺序规则,让两个人的对话能够很顺畅地一来一往继续下去。如果同时有很多人呢?例如在会议时,又该怎样让每条信息都顺利地给接收方知道,并且正确地发送给想要的人呢?这就包含更多的学问了。下面我们将逐一介绍通信相关的知识,并通过 Arduino 逐一演示。通信架构最简单的通信就是两个人直接的对话,也就是两个设备之间能够通过相同的方式来传送信息,什么叫做相同的方式呢?我们晚一点再细说,不过想想如果有一个人只会说中文,另一个人只会说英文,沟通上就困难许多了。我们把这样的两个设备相互交换数据的架构(见图3-1)称为网络。
图3-1 一对一的通信架构虽然这样的网络非常简单,但是在许多时候我们都要从这样的基础架构开始来建立起稳定的通信。因为这两个设备既可能只相距 1 米,也可能相隔 100 千米,要选择哪种通信方式就要考验我们的系统设计了。接着,我们再加入3个设备。一瞬间通信的架构就变得复杂许多了,如图3-2所示。你会看到一个设备除要跟其他4个设备发送信息外,同时也会接收它们回传的数据。这样就像没有老师在的教室,大家一定是各聊各的,整个教室乱哄哄的。 图3-25 个通信节点
这样的混乱情况,我们可以利用主从(Master-Slave)架构来解决,如图3-3所示。主从架构的意思就是网络中同一时间只有一个人可以发号施令,由他进行命令的发布,其他人则必须等待接收到正确信号后才可以有所动作,因此通信网络就会变成如图3-4所示的样子。 图3-3 主从(Master-Slave)架构(红色为主站)
这样主站和从站的系统设计通常见于数据比较单一或网络内设备不多的情况下,因为同一时间内只会有一个设备(无论主站或从站)进行信息发送,而其他站都会接收到这个信息。因此主从架构的硬件通常采用总线(Bus)的方式,例如 RS-485或 SPI等,而每个站也一定会有独立的站号(ID)配置,方便辨识是否需要按照信息来做出响应。
图3-4 主从架构的通信总线示意图(红色为主站)
不过到了现在的因特网时代,数据存取的方式又复杂了许多,很多数据放置在远程的主机内,而用户可以通过各种设备来进行存取,甚至可以同时进行,这种通信方式也算是主从架构的一种,不过我们把它定义为 Server-Client(见图3-5)。这里的数据端 *(Server)是数据所在的位置。客户端 *(Client)则是会连接到数据端发送存取数据的请求的一端。同一时间数据端可以允许多个客户端进行连接与数据存取。例如,我们现在常用的云硬盘或实时软件,可以通过不同设备进行数据读取,甚至还可以分享给好友。因此在物联网时代,服务器主机的机房需求也在持续升温中。
图3-5主从 Server-Client 架构(黄色为数据端)数据端无法预测随时被客户端请求连接的数量,它是被动等待连接的建立。因此,从系统设计的角度上,数据服务端的硬件需求较高,不过因为数据可以被集中管理,所以拥有较高的安全性。你可能会问,如果网络当中突然加入一个设备,或其中一个设备出现了故障,对整个网络会造成什么影响呢?以主从式的架构来说,建议要有重试(Re-try)的架构,这样对于突然少了一个从站的情况,主站能够尝试再与从站联系。如果是多了一个从站,因为主站本来就不知道新增设备的编号,主站不会去跟它进行沟通。但是如果突然加入的设备设置成主站,问题就大了!因为两个主站可能会同时发送命令,造成通信连接的格式混乱,而从站便无法顺利正确地收到预定的数据分组(称为数据包或者分组)。服务架构的网络管理都集中于主机上,因此不管新增还是减少网络中的设备,主机端都可以执行相对应的操作。当然也有力求平等的架构,比如Ad-hoc网络就是一种点对点的通信模式(见图3-6),整个网络中各个设备并没有地位的区分,所有的设备都可以互相传送数据,网络中也可以随时新增或删除设备,不过整个网络的通信效率和设备的耗能规划反而是这种网络的关键,因为单一设备不只是要负责自己的数据传送,也需要随时帮忙转发其他设备的数据。
图3-6 Ad-hoc 点对点网络架构示意图从物联网的系统来看,由于应用不同、网络内的设备数量多寡不同,因此谁也说不准哪种通信架构更合适。不过可以知道的是,大家都在持续为物联网通信的优化而不懈努力。前面谈的通信架构不一定都是以硬件来实现的,有的还必须搭配软件才能完整实现整个功能。下面我们单从系统硬件的角度来整理一下常见的网络拓扑结构。线性拓扑(见图3-7)每个设备所需要处理的数据源与目标都已固定,网络系统的弹性不 大,但是功能实现起来比较简单。 图 3-7 线性拓扑
星形拓扑(见图3-8)整个网络环绕一个核心设备,所有周围的设备都把数据往此中心传送,若此核心突然出现问题,则整个网络将会失去功能。 图3-8 星形拓扑树状拓扑(见图3-9)当网络节点数量越来越多时,我们可以将所有设备分成数个小团体和几个层级,这样可以有效管理整个网络内的数据流。不过当层级拉得越多越厚时,数据传送的时间也会越来越长。
网状拓扑(见图3-10)这大概是物联网中被最多人研究的拓扑之一,点与点之间如何寻找到最佳路径进行数据传送,每个节点如何能在有限的电力来源下保持最长久的运行。有太多太多好玩的主题可以在这里深入、挑战。
3-2 通信种类介绍在介绍各种常见的通信方式之前,我们要先来谈谈通信接口(Interface)和通信协议(Protocol)的不同。通信接口是指所定义好的电缆接线、电器特性和信号等,基于相同的定义让两个以上的设备可以相互连接。而通信协议是基于前述的接口上所共通的数据格式。举例来说,人类负责说话的嘴巴是一种接口,而中文、英文等则是沟通的协议。当我们使用相同的接口和协议时,才能让对方了解我们想传达的意思。通信上最熟为人知的架构:OSI(Open System Interconnection)模型,就是由 ISO 组织提出让计算机间的通信网络能有固定的标准结构。该架构共有7层:应用层(Application Layer)、表示层(Presentation Layer)、会话层(Session Layer)、传输层(Transport Layer)、网络层(Network Layer)、数据链路层(Data link Layer)和物理层(Physical Layer),如图3-11所示。
图 3-11 OSI的7层通信架构
最底层就是我们所谓的实体接口,以计算机间的有线网络来说,就是由铜线组成的实体网络线。每一层都有它特定的功能,用来桥接其下面一层与上面一层的服务。整个 OSI 带给用户的优点是降低网络的复杂程度、标准化、加速各层的开发、确保通信质量。至于本书要提到的通信架构,大约可以简化成应用层、协议层、传输层和物理层。应用层指的是我们系统中产生数据的执行程序所在的层。协议层指的是数据以特定的数据分组整理成固定格式。传输层指的是通信的方式,例如寻址、握手等。最后物理层指的是整个网络的拓扑及使用到的电气信号、接口接头等。后续的介绍中大家可以通过这样的分层,清楚了解每种通信方式的优缺点以及适用的场合与范围。本节先介绍物理层中我们常用的通信种类。最简单的分类方式是以有线 (wired)和无线(wireless)作为基础进行区分。不过,这里我们谈的是物联网,所以从覆盖范围的大小谈起。大家常常听到的局域网(Local Area Network,LAN),其范围定义成数百米内,通常一栋建筑或一间工厂都在同一个局域网的范围内。范围再小的就是个人网络(Personal Area Network,PAN),顾名思义就是以个人为单位的网络架构,像蓝牙网络就是一个非常典型的个人网络。而比局域网更大的则是广域网(Wide Area Network,WAN),这个范围大概是以国家为单位的网络。在这3个网络中,由于覆盖的范围不同、应用的差异及其特性条件,因此通信的速度也有所不同,大致上是 PAN < WAN < LAN(见图3-12)。 图 3-12 各种网络的大小比较
所以当前常听到的通信技术会根据其属性与其应用,朝通信速度或通信距离两个方向进行发展,目前还没有同时又快又远的通信技术被研发出来,并且这样的技术是不是真的有其应用也还是未知数。传输方式至于传输的方式,可以从方向、方式等进行分类。所谓的方向,指的是两 者之间传递的方向性,大致可分为单向(广播)、半双工和全双工(见图3-13)。单向传输就像是收音机的广播一样,从一个主要设备进行数据信号的发送,其余设备只要能拥有相同的接收配备就可以接收到信息,但是不能反向将数据传回去。半双工则是两个设备双方都可以互相发送数据,但是因为设备能力有限,同一时间内只能作为发送方或接收方,无法同时发送与接收,所以必须通过额外的硬件信号或特定的协议来辨识何时需要作为发送方、何时可以转换为接收方。例如,无线步话机就是一种半双工的通信方式。当按下通话键后,就只有自己可以发出信息,其他人必须轮流等待。全双工则是设备硬件在同一时间既可以发送信息,也可以接收数据。这样的方式必须将发送与接收规划成各自独立的信道,比如打电话,麦克风与耳机就是分开的两组硬件,以处理不同的信息。 图 3-13各种通信技术的比较
另外,信号的传输方式则可以分成并行与串行两种。早期的打印机就是并行传输,想要传送的数据以数条数据线路同时进行传输,传输速度较快,由于需要的硬件线路比较多,因此线路上的成本较高,所占体积也比较大。现在的设备都越做越小,芯片处理能力也越来越强,在这种情况下,并行传输已经比较少见了。串行传输不同于并行传输的地方在于数据是通过固定的引脚按序将数据传送出去的,比如RS-232、USB 和网络等,当前主流的通信方式以串行传输为主。硬件线路 单位传输数据 距离图示 举例 并行传输 多、成本高 多个位 短 早期打印机IDE 硬盘串行传输 少、成本低 一个位 长 USB网络
3-3 串行通信从前面的介绍可以知道,现今的通信方式以串行通信(Serial Communication)为主流。主要的原因就是硬件越做越小,芯片的能力也越来越强,因此无论芯片间的通信或设备间的数据交换,都以串行通信为主要方式,例如 SPI 和网络通信都是。RS-232(见图3-14)则是串行通信的经典之一,被广泛用于计算机与其他设备间的通信,甚至延伸到设备与设备间 的数据交换。RS-232 对电气特性、逻辑电位和各种信号线功能都做了规定。在标准主板上看到的9个引脚的接头(DB-9)就是 RS-232的接口。所谓的 RS 就是 Recommended Standard,即推荐标准的意思,其他类似的还有 RS-485 和 RS-422。这些都是EIA 联盟所制定出来的,会再标注RS-232-C 表示不同版本。 图 3-14 计算机上 RS-232 的接口
RS-232 接口的主要功能是为数据终端设备(Data Terminal Equipment,DTE)和数据通信设备(Data Communication Equipment,DCE)提供实体连接,也就是我们前面讲的物理层。例如计算机就是 DTE,而打印机则是DCE。当初设计RS-232是用来连接调制解调器进行数据传输,也因此它的引脚的定义通常也和调制解调器传输有关。通过硬件引脚的方式来判断数据的流向,称为硬件握手。引脚 含义 英文说明 中文说明Pin1 DCD Data Carrier Detect DCE 通知 DTE 有载波被检测到Pin2 RXD Received Data 接收数据Pin3 TXD Transmitted Data 传送数据Pin4 DTR Data Terminal Ready DTE 告诉 DCE 可以进行传输Pin5 GND Common Ground 接地Pin6 DSR Data Set Ready DCE 告诉 DTE 一切准备就绪Pin7 RTS Request To Send DTE 要求 DCE 将数据送出Pin8 CTS Clear To Send DCE 通知 DTE 可以传数据过来Pin9 RI Ring Indicator DCE 通知 DTE 有电话进来
从上面的表格可以知道,RS-232 的9个引脚的信号方向是固定的,借助这些引脚的顺序变化才可以顺利完成 DTE 和 DCE 之间的数据传送。说到这里,大家有没有猜到,RS-232 若在半双工的通信模式,两个设备间必须通过其他的硬件引脚来确认现在谁负责传送、谁负责接收。RS-232 的信号基准电压是以正负 15V 来作为逻辑电位的变化,其中负电位的部分为逻辑信号 1,正电位的部分为逻辑信号 0。从图 3-15 可以清楚看出这样的电位变化与信号的对比。从图 3-15 中可以发现信号的时间长度是固定的,我们称为波特率(Baud rate),单位是 bit per second(bps)。常见的所谓9600,也就是1秒内会有 9600个二进制位(bit)。从这里还可以看到,RS-232 的通信中,会有起始位(START BIT)和停止符(STOP BIT),起始位就是将电位拉到正 15V(逻辑 0),停止位则是将电位信号拉回负 15V(逻辑 1)。中间的数据则有 8 个位,在某些情况下则会有 7 个位的选择。另外,有校验机制来确保 RS-232 的通信没有受到干扰,称为奇偶校验(PARITY),方式是如果我们设置成偶校验,表示 8 个数据位加上奇偶校验位必须要有偶数个逻辑 1,反之奇校验就是要有奇数个逻辑 1。
图3-15 RS-232 的信号电位变化整个 RS-232 通信中的设置整理如下:項项目 可设置参数波特率(Baud rate, bps) 2400, 4800, 9600, 19200, 38400, 57600, 115200奇偶校验 无(N)、奇(Odd)、偶(Even)数据位 7, 8(不会大于 8)停止位 1,1.5,2
在 RS-232 的通信中,双方必须针对以上参数具有相同的设置,接收方才可以正确判断数据的逻辑信号,正确解析出数据的内容。例如,最常见的9600,8N1表示的就是波特率为 9600bps,8 个数据位,没有奇偶校验,有1个停止位。在使用 RS-232 跟其他设备通信时,必定要先确认设置。RS-232 在计算机与其他设备的沟通基准电压是正负 15V,但是在微控制器中,因为多半以 5V 或 3.3V 来作为系统电源,所以RS-232 的基准电压也随之降至 5V 或 3.3V,习惯将其称为TTL (Transistor-Transistor Logic) 基准。例如,Arduino 的 Pin0 和 Pin1 就是 RS-232 的 TTL 基准,微控制器的信号还需要通过另一个转换芯片来提升基准电压至正负 15V。接着我们就来看看 Arduino是如何进行串行通信的。首先从 RS-232 开始。Arduino 和计算机都是通过 RS-232 的信号来进行程序上传与数据传送的,刚才提到 Arduino 板子上的 Pin0 和 Pin1 就是串行通信的引脚,如图3-16所示。 圖图3-16 Arduino 板子上的 TX 和 RX
在板子上也有通信专用的 LED 指示灯(见图3-17),我们可以利用指示灯清楚地了解当前 Arduino 是否在进行传输或接收数据。
图3-17 Arduino 的传送 LED 指示灯先通过第一个程序了解一下如何启动 Arduino 的串行通信及如何传送数据。程序 3-1 很简单,我们只在setup 中放置了两个函数:Serial.beginSerial.print第一个函数负责启动 Arduino 的串行通信,从函数的名称可以很直观地看出它的功能。它需要输入一个参数,也就是我们说的波特率,在范例程序中先以9600作为设置值。第二个函数则是要打印(输出)的字符串,范例中我们是从 Arduino 发送一串字符给计算机,参数中要输出的字符串必须使用 " "括起来。
我们将范例程序上传到 Arduino 后,Arduino 的开发软件不止可以用来开发项目,还可以帮忙观察通信数据。请单击右上角的串口监视器窗口,如图3-18所示。
图3-18 串口监视器窗口打开后应该会看到我们刚才想要显示的信息已经显示出来了。这时看一下右下方是否也是9600,如图3-19所示。 图3-19 在计算机显示的字符串
前面提到串行通信的前提必须是两边的设备都有同样的设置,因为 Arduino 默认为 8 个二进制位,没有奇偶校验,有1个停止位。因此我们只有从设置波特率的不同来观察这个现象。我们将串口监视器窗口右下角的参数改为其他速率,就会发现结果跟刚才完全不一样了(见图3-20)。这是因为此时计算机判定数据的格式与Arduino 发出的并不相同。 图3-20 范例 3-1 在计算机显示的字符串(计算机端波特率为38400bps)
接着我们把字符串显示的部分移到 loop 中,其余完全不做任何修改。上传后会发现每次输出的字符串全部都连在一起了,无法很清楚地分辨出该断行的位置,如图3-21所示。 图3-21 连续输出字符串(没有换行)
稍微调整一下程序,在 print 后面加上 ln:
编译后再次上传,得到的结果就会非常清楚易 懂,如图3-22所示。 图3-22 连续输出字符串(有换行)
会有这样差异的原因是println 这个函数会在字符串最后加上回车(carriage return, CR)及换行(line feed, LF)字符。这两个字符属于不可见字符,即为有文字操作功能但是不显示出来。可以参阅附录 C 的 ASCII 表了解还有哪些字符也属于不可见字符。回车(CR)符的十进制值为 10,十六进制值为 0x0A。换行(LF)符的十进制值是 13,十六进制值是 0x0D。我们可以分别用 "\r" 和 "\n" 来表示它们。因此,在 print 后面加上 ln 也可以用 print"\n\ r" 来实现相同的功能:
刚才提到十进制和十六进制,在串行通信上是否可以表现出它们的不同 呢?在 Arduino 里,当然可以。只要我们在函数中加上要表示格式的设置即可。
|
|