文档内容
书书书总 主 编 李晓明
!
副 总 主 编 赵 健
! !
本 册 主 编 方向忠
!
本册副主编 杨晓哲
!
编 写 人 员 按姓氏笔画排序
! "#
方向忠 朱兰娟 苏宇彤 杨晓哲 吴俊杰 徐 雄 奚 骏 曾 贇
! ! ! ! ! ! ! ! ! !
责 任 编 辑 高 烨
! !
美 术 设 计 储 平
! !
普通高中教科书 信息技术 选择性必修 开源硬件项目设计
! ! !!
上海市中小学!幼儿园"课程改革委员会组织编写
出版发行 华东师范大学出版社 上海市中山北路 号
! ! !""! "
印 刷 上海华顿书刊印刷有限公司
!! !
版 次 年 月第 版
!! !#$#% ! %
印 次 年 月第 次
!! !#$#% ! %
开 本 毫米 毫米
!! !&’$ (%#)$ !%$%"
印 张
!! !’*#+
字 数 千字
!! !%"!
书 号
!! !!"#$’,& , +,"$ $++) ,
定 价 元
!! !%%*"$
版权所有 未经许可不得采用任何方式擅自复制或使用本产品任何部分 违者必究
% %
如发现内容质量问题 请拨打电话
& $#% "$%,%)
如发现印 装质量问题 影响阅读 请与华东师范大学出版社联系 电话
’ & & ( #$#% "$%,%%
全国物价举报电话
#%#!%+
按照 中华人民共和国著作权法 第二十五条有关规定 我们已尽量寻找著作权人
声明! ) * &
支付报酬 著作权人如有关于支付报酬事宜可及时与出版社联系
( (
本册教材图片提供信息
#
本册教材中的部分图片由全景网 视觉中国等图片网站提供
’ (
书书书!"#$
飞速发展的信息技术不断改变人们的思维与交往模式 身处科技
&
发展日新月异的时代 在熟练使用信息技术工具的基础上 如何学
& &+
习 如何参与 如何创造 是我们需要认真思考的问题
,+ ,+ , (
当有一天 你不再满足于仅仅作为一个产品的使用者 你想知道
& &
它是怎样被设计和制造出来的 或者想为它添加新的功能 又或者想
& &
为他人设计新产品 你将如何开始 比如 你想设计一个智能水杯 用
& - & &
来提醒自己和家人多喝水 你想打造一个机器伙伴 以帮助自己养成
. &
良好的学习习惯 你想开发一个运动助手 通过它来更好地达成运动
. &
目标 你想尝试搭建一辆可以自动驾驶的无人小车 你可能还想到
. //
很多很多 你甚至想改造整个世界
& (
然而 你想到的这些与众不同的一切 可能没法直接找到现成的
& &
产品 你需要拥有一种全新的思维方式 开源硬件项目设计 可
( (+ ,
以帮助你用开源的视角重新审视与发现 哪些开源硬件可以支持你
&
的创意 哪些开源代码可以支持你的构想 哪些开源系统可以支持
& &
你的设计 你需要运用开源社区 开展合作 获得支持 不断优化
( & & &
和迭代自己的作品 你也需要将自己新的发现 新的作品分享到
( ’
开源社区 不仅仅为了展示自己 也为了方便其他人进行创造
& & (
按照 普通高中信息技术课程标准 年版 开源硬件项目
) !#$%* "*&+
设计 是选择性必修课程中的一个模块 在内容的呈现方面 教材按
, ( &
照开源硬件项目设计的流程 呈现从需求分析到发布共享的全过程
& .
在案例的选择方面 从制作简单作品开始 逐渐实现作品之间的互联
& &
和综合制作 在学习的过程中 同学们不仅要学习 怎么做 更要综
( & + ,&
合运用科学 技术 工程 数学 艺术等多学科知识 理解 为什么 感
’ ’ ’ ’ & + ,&
!"#$ !! !受动脑思考 动手制作 合作参与和创造作品的乐趣 践行开源与
’ ’ &
知识共享的理念 提升计算思维与创新能力 拓宽视野 为实现创新驱
& & &
动发展的目标努力奋斗
(
!"#
" %&’()*+,%&’
!"#$%&’()%&*+
!!!!"
$%&’",-./01$
!!!#
()*"+,-."
!!!$
(/*"+,01234567"
!!!"%
(8*"+,01$%9:;<"
!!!#&
!2#$%&*+34567869
!!!!$’
$%&’":;<=>?$
!!!$(
()*"+,01=>?@ABC"
!!!$)
(/*"+,01=>?DE"
!!!’$
(8*"+,01=>?DF"
!!!&&
*- . !! !&
!@#$%&*+345ABCD8EF
!!!!)#
$%&’"%GHIJK$
!!!)’
()*"GH;IJK"
!!!)&
(/*"GH;ILM"
!!!)*
!L#$%&*+MNOPQR
!!!!"+’
$%&’"STUVWX$
!!!"+(
()*"NOPQRST9:"
!!!"+)
(/*"NOPQRUVWXA"
!!!""%
(8*"NOPQRYZAB"
!!!"")
([*"NOPQR$%\]"
!!!"%*
YZ$%&*+[\]^_67!69AB‘a
!!!!"##
bc
!!!!"#*
" %&’()*+,第 一 章
开源文化与开源硬件
本章学习目标
!
了解开源文化!开源协议和开源社区"认识开源硬件的特征"理解开源的
理念与知识共享的精神"理解知识产权保护的意义#
!
了解计算机信息处理过程"知道开源和闭源的区别#
!
知道常用开源硬件的种类!功能和基本组成结构#
!
掌握开源硬件开发环境的基本使用方法#
!
理解开源硬件项目的开发流程"初步掌握开源硬件项目的需求分析!方
案设计!系统制作!调试优化!作品发布等的方法#
书书书广泛应用的信息系统 不断扩增的数据以及不断迭代优化的算法 提高了采集 传输 存
、 , 、 、
储 加工和使用信息的效率 深刻影响着人们的生活 工作和学习 推进着我国向信息社会发
、 , 、 ,
展 由硬件 软件 数据和人等要素组成的信息系统 既可以用 闭源 的方式也可以用 开源
。 、 、 , “ ” “ ”
的方式建设和开发
。
日常生活中 很多互联网网站是基于开源的操作系统 WEB服务器和数据库开发出来的
, 、 ,
一些智能手机中的 Android操作系统源于开源的 Linux可以说 只要上网或者使用智能手
, ,
机 我们就在不知不觉中使用了开源软件
, 。
在本章的学习中 同学们将初步感受以 自由 开放和共享 为宗旨的开源文化 从信息处
, “ 、 ” ,
理过程的角度 了解开源硬件的起源和发展 尝试使用开源硬件和图形化编程软件进行简单的
, ,
系统搭建和编程控制 理解开源硬件的结构和功能 在学习和认识开源世界 享受开源产品所
, 。 、
带来的丰富多彩的生活 感受科技所创造的价值的同时 同学们要进一步思考 开源是为了什
、 , :
么 开源能创造什么 开源要遵守什么
? ? ?
本章知识结构
##-
# #- 4 #-M,@@"
#
# K
D
- L A
# # # ! A
. ) @
@ 2 ( @
#
4
- +
7
8
* D D
"
)
开源硬件项目设计
"SEVJOP
华
东
师
范
大
学
出
版
社
2项目主题 初探智能水杯
华
项·目·情·境
开源硬件为我们提供了一个全新的 可以不断进行创造的学习空间 生活中很
、 ,
东
多产品都可以使用开源硬件设计制作 从不起眼的烟雾报警器 到炫酷的呼吸灯
。 , ,
再到造型新颖独特的智能水杯 人们不断创造新的产品 让生活 工作和学习更
, , 、
便捷
。
我们每天需要补充充足的水分 饮水不足会引发很多健康隐患 然而我们在忙
师
, ,
碌的学习工作中常常忘记喝水 设想这样一个按时提醒饮水的智能水杯 早上起
。 :
来洗漱完毕后 智能水杯提醒饮水 并显示水量和水温 饮水完毕 自动补水 间隔
, , , , ,
一段时间再次提醒饮水 如果将这样的智能水杯制作出来 我们就能很大程度
…… ,
范
上避免饮水不足的问题 如何运用开源软硬件实现智能水杯的提醒功能和显示功
。
能 对于一些特殊人群 比如老人 智能水杯又该如何设计以满足他们的需求
? , , ?
在这一章中 我们将围绕智能水杯的制作 学习开源硬件系统编程调试方法和
, ,
开源硬件项大目设计流程 完成智能水杯设计方案
, 。
学
项·目·任·务
任务1 任务2 任务3
出
分析常见的信息 探索典型的开源 按照开源硬件项
处理系统中的信息流 硬件组成结构和开发 目的开发流程,完成智
向,从信息处理过程的 环境,选择版合适的控制 能水杯的项目设计。
角度,完成智能水杯的 器及开发环境来设计
结构描述。 智能水杯的电子控制
系统。
社
第一章 开源文化与开源硬件 3第一节 开源文化
开源 即开放源代码 最初指的是一种软件的发布
华
(opensource), ,
模式 软件作者遵循 自由 开放和共享 的精神 在一定的协议规
。 “ 、 ” ,
则约束下将软件源代码公开 让大家共享使用 这是起始于计算机
, 。
科学领域的一种文化现象 知识成果的开放 共享激发了源源不断
, 、
东
的创意 随着开源理念的不断深入和推广 开源 的内涵和外延不
。 ,“ ”
断丰富和扩展 形成了一种更广义的开源文化
, 。
师
体 验 思 考
开源文化发展至今已经过数十年的历程 产生了许多开源软硬件成果 随着互联网的发展 开源更是
, 。 ,
渗透到了信息 教育 经济 生活等范多个领域 它不只限于软件 还逐步涉及硬件 成为信息技术发展的重要
、 、 、 , , ,
推动力
。
你了解开源文化吗 在你生活的周遭 你接触到的事物中有哪些体现了 自由 开放和共享 的精神
? , “ 、 ” ?
大
一、 开源的起源和宗旨
学
开源 一词来源于 自由软件 自由软件是指倡
“ ” “ ”(freesoftware),
导尊重用户 自由 将源代码公开 让用户可以自由使用 复制 修改
“ ”, , 、 、
出
和分发源代码的软件 但由于 在英文中有 自由 和 免费 双重
。 “free” “ ” “ ”
图1.1 开源软件标识 含义 容易被人误解为免费软件 再加上自由软件的反
,freesoftware ,
商业信条也让企业和公司对其敬而远之 因此在1997年的一个战略
,
研讨会上 一批很有影响力的自由软版件创始人决定改用开源软件
,
来描述自由 开放的理念 开源软件的标识如
(opensourcesoftware) 、 。
图11所示
. 。
开源以 自由 开放和共享 为宗旨 以协议社和合作的创新方式促
“ 、 ” ,
进开源同商业的结合 即在提倡开放和知识共享的同时 允许人们以
, ,
协议维护产权 以专利形式从产品中获取利益 在它的推进下 网景
, 。 ,
公司正式宣布将他们的旗舰产品网景浏览器的源代码免费开放 这一
,
举动为开源运动的发展迎来了转机
。
4 开源硬件项目设计知 识 延 伸 自由软件和免费软件的区别
自由软件与免费软件不同 free虽有 免费 之意 但 免费 不等于 自由 首先 免费软件只是免费
华 ,“ ” “ ” , “ ” “ ”。 ,
提供给用户使用 并不公开源代码 其次 我们虽然可以免费使用某些软件 但却不能自由地使用 因为这
, 。 , , ,
些软件使用了数字版权管理 digital rights management缩写为DRM 技术后 便可以合法地追踪用户的
( , ) ,
使用行为
。
东
作业练习
师
开源也为同学们学习编程提供了很好的机会 许多工程师都是从开源中
,
开始学习和汲取灵感的 想知道你最喜欢的网页是如何运作的吗 在 Web
。 ?
浏览器中点击 查看源代码 尝试阅读网页的源代码 通过查阅资料了解一
范“ ”, ,
些代码的含义 思考源代码与网页效果之间的对应关系
, 。
大
二、 开源协议的作用
学
探 究 活 动
开源的基本理念是追求 自由 开放和共享 但是 任何开源都不是简单地 无条件地 无理由地完全
“ 、 ”。 , 、 、
开放 而是要遵循一定的规则 即协议 在开源领域的协议出被统称为开源协议或开源许可证 open source
, , 。 (
license 是指为了保护开源软件原作者的相关知识产权 在软件所有者与软件使用者之间设立的一种具
), ,
有法律性质的虚拟合同 它也可被视为一种授权方式
, 。
1. 通过网络搜索引擎 找一找有多少种开源协议
, 。 版
2. 试着对不同的开源协议进行分类 说明为什么要有如此多不同的开源协议
, 。
开源软件就是在开源许可证下发布的社开放源代码的软件 开源
。
许可证是授权使用 分享开源软件和其他产品的源代码 源设计等的
、 、
条款 它提供了一种独特的产权模式 使得开源软件与专有软件一样
, , ,
也受版权法保护 例如 它可以要求用户在所使用或修改的源代码中
。 ,
保留原作者名字和版权声明 或者要求用户再发布时必须遵循同一个
,
许可证等 开源许可证的意义就在于对运行 复制 修改 发布受版权
。 、 、 、
保护的软件等行为进行规范 保障原作者的合法权益 保护软件开发
, ,
者共享合作的积极性 保障开源文化健康持续地发展
, 。
第一章 开源文化与开源硬件 5通常开源许可证主要分为两大类 左版版权 许可证和
: (copyleft)
宽松式 许可证 是作为 著作权 字面
(permissive) 。copyleft copyright( )
意义上的反义词而被发明出来的词汇 其含义是 给予任何人运行 复
, “ 、
华
制 修改以及发布改变后程序的许可 但前提是发布的条款不能被改
、 ,
变 也就是说任何人都可以自由使用左版版权源代码 但修改后的代
”, ,
码也必须采用左版版权许可证发布 不能闭源 而宽松式许可证则对
, ,
东
用户几乎没有限制 用户可以修改开源代码后选择闭源
, 。
目前国际公认的开源许可证有上百种 最常用的有
, GPL、LGPL、
等 不同的开源许可证规定了不
BSD、MIT、Mozilla、Apache、CC 。
师同的自由度和不同的商业模式 比如 是否允许商用 是否允许修改
, , , ,
修改后是否需要继续开源 开源是否必须继续使用相同协议授权等
, 。
图12描述了部分开源许可证之间的区别和适用情况
. 。
范
大
学
出
版
图1.2 部分开源
许可证之间的区别
及适用情况
社
知 识 延 伸 开源许可证的比较
表1.1中所列的是部分开源许可证之间的比较 出于不同的考虑 可以对开源的内容选取不同的许可
, ,
证来保护
。
6 开源硬件项目设计表1.1 部分开源许可证之间的比较
是否包 是否允 是否允 是否有 是否有
版 是否允 是否允 是否允 有无担 有无
华许可证 含源 许商业 许私人 专利 转售
本 许链接 许发布 许修改 保责任 商标
代码 使用 使用 许可 许可
Apache许可证 2.0 是 是 是 是 有 有 有 有
3句版BSD许可证 是 是 是 是 有 有 有
东
2句版BSD许可证 是 是 是 是 有 有
GNU通用公共许可证 2.0 是 是 是 是 是 有 无 有
GNU通用公共许可证 3.0 是 是 是 是 是 有 有 有
师
GNU宽通用公共许可证 2.1 是 是 是 是 是 是 有 有 有
GNU宽通用公共许可证 3.0 是 是 是 是 是 是 有 有 有
MIT许可证 是 是 是 是 有 有
范
Mozilla公共许可证 2.0 是 是 是 是 是 有 有 有 有
Eclipse公共许可证 1.0 是 是 是 是 是 有 有 有
Affero通用公共许可证 是 是 是 是 是 有 有
一般的著作权 大是 是 否 否 无
学
作业练习
在开源运动中 关于版权保护一直争议不断 很多开发者由于不了解开
, 。
源许可证的内容 在开放源出代码的时候不知如何选择 也有的开发者在使用
, ;
别人的开源代码时未遵循其原始许可证 由此带来了许多不必要的法律纠纷
, 。
1. 拥有GPL许可证的开源软件 MySQL是一个常用的数据库软件 其
,
所属的公司于2009年被收购 有人担心新公司会将 MySQL同其他产品合
, 版
并而不再开源 你认为这种情况会发生吗 为什么
。 ? ?
2. 如果你希望将自己开发的项目开源 并允许别人使用和修改你的代码
, ,
但要求使用者也必须公开源代码 那么你在发布项目时可以选用哪些许可证
, ?
社
三、 开源社区
开源文化的另一个重要标志是催生了一种新的组织结构 开
———
源社区 所谓开源社区指的是在互联网上针对某个或某些开源代码
。
而形成的一个共享学习与交流的平台
。
第一章 开源文化与开源硬件 7探 究 活 动
开源社区一般由开源技术的核心团队 领导者用户或者知名的企业搭建 由全世界的编程爱好者自发
华 、 ,
参与 比较著名的开源社区有开源中国社区 Linux社区 码云社区 GitHub社区等 在社区中 大家遵循
, 、 、 、 。 ,
相应的开源许可证 通过论坛 博客 跟帖 推送等方式发布源代码 探讨问题 分享成果 合作创新 对开源
, 、 、 、 、 、 、 ,
软硬件的开发 完善和发展起到了巨大的推动作用
、 。
试着进入开东源中国社区的技术问答栏目 查看最新提问和最新回答的内容 探究开源社区能为我们提
, ,
供怎样的平台
。
师在开源社区兴起之前 绝大多数商业软件公司采用的都是传统的
,
开发模式 在过去高度集中 严密的封闭式管理下 开发过程艰难而缓
, 、 ,
慢 与之相反 开源社区采用扁平化 开放式的集市模式 不仅软件的
。 , 、 ,
发明者 互联网上众多的志愿者都可以自由地参与开发 就如同一个
范
, ,
开放的集市 所有的社区成员好比集市中的一个个商户 大家遵守既
, ,
定规则 相互监督 共同增进和维护社区的繁荣
, , 。
就是典型的集市模式的例子 1992年 的第一个
Linux 大 。 Linux
版本在网上发布 立刻吸引了众多软件人才的介入 迅速推动了
GPL , ,
的发展 到1993年第一批发行版 和 出现
Linux 。 Slackware Debian
时 社区上已有100多位开发人员 开发者们自由地修改和发
,Linux 学。
布程序版本 能很快发现错误代码并加以修复 在这种快速漏洞响应
, 。
机制的作用下 不断地完善 社区的规模迅速扩大 软件质量
,Linux , , 、
工作效率和品牌影响力也得到很大的提升
。
出
四、 从开源软件到开源硬件
版
探 究 活 动
随着开源文化的快速推进 开源的理念逐渐从软件领域拓展到了硬件领域 开源硬件(open source
, ,
hardware缩写为OSHW)应运而生 开源硬件是已公开的硬件设计 包括电子设计社图 机械设计图 电路
, 。 , 、 、
原理图和材料清单等
。
1. 收集与开源软件和开源硬件相关的资料 了解从开源软件拓展到开源硬件的缘由和过程
, ;
2. 分析开源硬件对开源文化发展的作用 以及它在许可证方面的特殊性
, 。
1. 开源硬件的概念
开源硬件是指 可以通过公开渠道获得的硬件设计 任何人可以对
“ ,
8 开源硬件项目设计已有的设计进行学习 修改 发布 制作和销售 需要指出的是 开源硬
、 、 、 ”。 ,
件并不是可免费使用的硬件产品 而是由开发者公开的硬件的所有设
,
计信息 以及与开源硬件相关的驱动程序源代码 可供使用者学习及进
, ,
华
一步开发 因此 开源硬件除了秉承开源文化的开放 共享之外 还在
。 , 、 ,
成本低 可二次开发 可裁剪等方面对开源文化的内涵作了延伸
、 、 。
开源硬件对开源理念的延伸还体现在把开源软件惯用的开源协
东议规范带到了硬件共享领域 衍生出开源硬件许可证
, (opensource
如基于 20的 和 开源硬件许
hardwarelicense), GPL . TAPR CERN
可证 基于 20的 开源硬件许可证等 不过开源
, Apache . Solderpad 。
师硬件许可证的普及度不高 更多的人还是直接使用开源软件许可证
, ,
例如 等协议就常被运用于开源硬件领域
GPL/LGPL、CC 。
相对于开源软件 开源硬件涉及的对象比较特殊 不仅包括硬件
, ,
产品的设计信息 如设计文件 源代码等 还包括硬件产品的实物本
范
( 、 ),
身 从知识产权的角度来看 硬件产品的设计信息受到开源许可证的
。 ,
保护 但由此制造出来的实物产品则只受专利权的保护 因此除非开
, 。
发者拥有硬件实物的产品专利 否则其他人还是可以在未经许可的情
大 ,
况下复制硬件产品而不会侵犯硬件设计文件的许可证
。
2. 开源硬件的特征
学
开源硬件源于开源软件 并扩展了开源的适用范围 因此开源硬
, ,
件具备开源软件某些基本特点 如源代码开放 遵循一定的协议规范
( 、
出
等 其特征可归纳如下
), :
1 开放共享性 开源硬件的设计图 原理图 材料清单等资料
() 。 、 、
都是公开的 而且往往具有标准化的接口和完善的文档 任何人都可
, ,
版
以方便地获取和使用 并可以在对已有的设计进行学习 修改或扩展
, 、
的基础上 再予以发布 进而形成更高层次的分享
, , 。
2 二次开发性 开源硬件允许在开放的原始设计信息基础上
() 。
进行二次开发 使用者可以复用别人的开社发成果 对开源硬件进行裁
。 ,
剪和选择 通过修改 再造 形成满足用户个体需要的相应产品设备
, 、 , 。
3 迭代创新性 开源可以使开发者很好地利用已有的类似产
() 。
品或者基础产品进行迭代 避免低价值的重复工作 同时更多开发者
, 。
的参与也有助于硬件项目的完善和更新 当开发者不再受专利授权所
,
困 越来越多地公开分享他们的创新时 他们便能在充满智慧和创造
, ,
力的开源平台上 获得更多的免费帮助 从而改进自己的发明 拓展硬
, , ,
件产品的外延 实现快速的迭代与创新
, 。
第一章 开源文化与开源硬件 9事实上 开源硬件不仅仅是硬件设计方法的开放 更是一种创新
, ,
理念的开放
。
华
知 识 延 伸 开源硬件的起源与发展
开源硬件的概念最早由国际业余无线电爱好者在项目实践中形成 1997年
。 ,
为了让硬件制造东商能够自行认证他们开放的硬件产品 这些无线电爱好者首次发
,
起了 开源硬件认证计划 正式确立了 开源硬件 的概念 开源硬件正式成为了开
“ ”, “ ” ,
源文化中的一个重要成员 开源硬件的标识如图1.3所示
。 。
然而开源硬件项目的发展并不是一帆风顺的 由于半导体产业的特殊性和过
师 。
高的生产成本 开源硬件曾一度陷入难以维持的困境 进入 21世纪后 随着
, 。 ,
FPGA和SoC(片上系统)设计在嵌入式系统 embedded system 应用中异军突 图1.3 开源硬件标识
( )
起 原先阻碍开源硬件发展的生产成本过高等问题得以解决 加之国际知名企业在
, ,
开源项目上取得巨大的商业成功 开范源硬件又迎来了新的发展契机 开源硬件项目
, ,
也如雨后春笋般涌现 出现了如虚谷号 掌控板 Arduino树莓派 Raspberry Pi BeagleBone micro
, 、 、 、 ( )、 、 :
bit Edison可穿戴设备平台 MakerBot 3D打印等一大批项目 此外 2017年发射升空的立方体卫星
、 、 。 ,
UPSat几乎没有使用商用元件 全部采用开源软件和开源硬件 是第一颗发射到轨道上的开源卫星 随着
, 大, 。
开源硬件思想渗透至硬件设计的各个层面 开源硬件作为产业正式走上成熟的发展道路
, 。
学
3. 开源硬件与创客文化
随着硬件成本的逐渐降低和互联网 物联网的蓬勃发展 开源硬件得
出、 ,
到广泛的应用 在开源文化的熏陶下 特别是在 树莓派等开源
。 , Arduino、
硬件项目的影响下 出现了一批不以营利为主要目的 热衷于整合资源将
, ,
创意变为实际产品的创新之人 他们被称为 创客 开源硬件为
, “ ”(maker)。
版
创客提供了实现创意的工具和开放的创造空间 随着当今世界产业链生态
,
圈的不断完善 开源资源变得触手可及 创客队伍也不断壮大 由此萌生出
, , ,
很多有趣和有创意的开源项目 秉承着开放 合作 分享的理念 创客文化
。 、 、 ,
也从以兴趣为主导的亚文化逐渐演变成主流文化社融入到开源文化之中
, 。
创客文化一般有三个特点 首先 创客使用数字化工具和电子元器件
: ,
设计产品并制作模型样品 创客的一部分工作是通过添加传感器 编写控
, 、
制程序 连接互联网等 使实物变得更加智能 其次 对于在开源社区上分
、 , ; ,
享成果 开展合作创客们已经形成一定的规范 他们在网上发布成果后 数
、 , ,
以百计的人可以共享他的设计创意和代码 协助进行错误修正 这对创客
, ,
改进自己的产品大有裨益 再者 在遵守开源协议的前提下 可以通过一定
; , ,
的标准将开源硬件设计文件直接提供给商业制造服务商 用于制造所
,
10 开源硬件项目设计设计的产品 这就大大缩短了从创意到产品的时间 尤其是随着制造行
, ,
业信息化程度的提高 一些行业逐渐产生了自动化 智能化 定制化 个
, 、 、 、
性化的生产方式 将创意和发明实物化和商业化的效率也大大提高了
, 。
华
创客文化对教育也产生了较大的影响 许多开源硬件已进入学校
,
课堂 便利的设计 多种多样的元件 开放的文化这三个特点得到充分
, 、 、
发挥 创客教育应运而生 它旨在培养青少年综合学习和动手实践的
, ,
东
能力 同时为科技创新注入了新的活力 然而要成为一名创客并非易
, 。
事 首先 创客要用与众不同和充满创意的方式思考问题 同时要考虑
, , ,
这个创意的价值何在 它解决了什么问题 它能为他人或社区作出怎
, ,
师样的贡献等 其次 创意只是一个开始 如何实现创意则更为重要 创
。 , , ,
客需要具备用开源硬件将创意转化为实体物品的能力以及一定的编
程能力 在设计和制作作品的过程中要反复调试 这意味着创客还需
, ,
要范学习更多的 造物工具 高质量的创造是每位创客的追求 开发有
“ ”。 ,
用的实体物品 简洁优美的程序和信息资源 并把它们贡献给社会 创
、 , ,
客从这样的挑战中获得创造的乐趣 最后 创客还应是怀有热情的志
。 ,
愿者 以开源的方式在社区中共享成果 创造价值
大
, 、 。
知 识 延 伸 开源硬件的典型应用——RepRap
学
RepRap是世界上首个多功能 可自我复制 能打印塑料实物的 3D打印机原型机 RepRap最初的
、 、 。
设计是为了实现自我复制 RepRap的许多部件可以由自身打印和生产 人们只要愿意花一些时间收集
。 ,
足够的材料 就可以通过复制和组装RepRap自身的部件来实现RepRap的自我复制 因此 从某种意义
, 。 ,
上说RepRap也是一台 技术免费 的3D打印机 出
“ ” 。
RepRap遵循开源协议 从软件到硬件各种资料都在GPL许可证下发布 这意味着任何人都能够自
, 。
由地改进和制造RepRap并无偿地分享给大家 RepRap的开源特性充分体现了开源文化 自由 开放和
, 。 “ 、
共享 的精神 因此 凡是在最初的RepRap机型的基础上制作 在技术层面上能实现自我复制 并无偿地
” 。 , ,版 ,
提供给大家使用的机型 都可以被称为 基于RepRap的项目
, “ ” 。
社
作业练习
基于对开源软件 开源硬件的了解与认识 你和你的团队打算创建一个开源硬件项目 为此小组成员
、 , 。
决定先明确一个成功的开源硬件项目通常具备什么样的共性特点 以及应该选择什么样的硬件许可证
, 。
1. 找出几个成功的开源硬件项目案例 了解项目的团队构成和项目所有更新的版本 并尝试分析 归
, , 、
纳出成功的开源硬件项目的共性特点
。
2. 搜集有关开源硬件许可证TAPR CERN Solderpad的内容 对照图 1.2的部分开源许可证之间
、 、 ,
的区别及适用情况 试着将它们归入相应的类别 必要时可加以扩充
, , 。
第一章 开源文化与开源硬件 11第二节 开源硬件平台及其结构
我们在日常生活 工作 娱乐和消费等过程中 往往有意识或无意
、 、 ,
华
识地接触到各种各样具有不同功能 不同规模的信息系统 信息系统
、 。
的构建和运行离不开计算机硬件系统的承载 涉及的硬件平台有开
,
源 部分开源和闭源之分 从开发者的角度来看 选择一个开源的硬
、 。 ,
东
件平台意味着你是站在前人的肩膀上开始设计的 这不仅能够降低前
,
期的开发成本 还能使你摆脱低价值的重复工作而投入到高价值的创
,
新工作 从开发过程的角度来看 由于世界各地的优秀程序员参与代
; ,
师码错误或安全漏洞检查 开源项目的代码会有更高的灵活性和稳健
,
性 能产生更多的创意
, 。
范
体 验 思 考
每天早晨6点电子闹钟准时响起 小申同学起床 感应台灯自动点亮 吃早饭时 小申同学通过语音
, , 。 ,
智能音箱了解当天的新闻和天气 然后刷交通大卡乘坐地铁去学校 在学校门口刷校园卡后进校 中午使用
, , ,
校园卡支付午餐费用 然后到学校图书馆通过检索系统查找一本科普读物 并使用校园卡登记借阅
, , 。
小申同学上述这段经历中用到了哪些信息系统 它们分别是什么 生活中还有哪些常用的信息系统
? ? ?
学
一、 基于微控制器的信息处理系统
出
随着计算机的广泛应用 网络的普及以及大数据等技术的日渐成
、
熟 信息时代已然到来 对信息资源的充分利用是信息社会的重要特
, 。
点 而构建各种各样的信息系统是开发版利用和管理信息资源的重要
, 、
方式 信息系统的运行不仅需要计算机承载 也越来越离不开网络
。 , 。
信息系统处理能力和系统规模等不同 所需要的计算机和网络也有区
,
别 此处的 计算机 是一个宽泛的概念 它不社仅可以指日常使用的
。 “ ” ,
笔记本电脑 还可以是其他形式的计算机 小到只有指甲盖大小
PC、 , ,
的微控制器 大到体型庞大的超级计算机 比如处理飞机机票和铁路
, 。
车票预订的大型系统通常由高性能服务器 云计算资源等支持 需要
、 ,
较高的数据传输能力 处理能力和存储能力作保障 与之相比 家用的
、 ; ,
电子闹钟和小型扫地机器人等系统 所需要的计算能力就会小很多
, ,
如果系统在使用上有轻巧 低功耗 低成本 高可靠性等要求 则可以
、 、 、 ,
采用集成在单个芯片上的计算机 单片机 来实现 这类为实现特定
( ) 。
12 开源硬件项目设计的功能而专门优化设计的特殊计算机被称为微控制器 与通用计算
。
机的明显不同之处在于 微控制器一般不连接显示器 键盘等常见的
, 、
输入 输出设备 用户也不能够随意改动在其上运行的用来驱动特定
/ ,
华
设备的软件 因此这类软件也被称为固件
, (firmware)。
1. 信息处理系统的组成
东
信息系统的运行平台无论采用哪些硬件或采用何种互连方式 一
,
般都具有相同的工作过程 即都能够按照一定的目标和规则 从外部
, ,
师世界获取信息 再对获取到的信息进行处理 然后将处理后的结果反
, ,
馈给信息接收方并作出响应 一般可将实现以
。
上三个主要过程的模块作为一个整体 统称为信
,
范 息处理系统 也就是说它由三个模块组成 即信
, ,
图1.4 信息处理系统的工作过程 息输入 信息处理和信息输出 如图14所示
、 , . 。
信息输入: 通过键盘 鼠标 传感器等输入设备 检测 识别和采
、 、 , 、
集系统外部的信号源 根据采集到的信息的类型进行相应的转换和格
大
,
式化等 完成信息的获取
, 。
信息处理: 在中央处理器或微控制器的控制下 依照一定的算法
,
规则对采集到的信息进行转换 判断 计算 加工 存储等 并根据信息
学、 、 、 、 ,
接收者的要求作出相应的决策 完成输出信息的内容准备
, 。
信息输出: 对信息处理得到的结果进行格式化 压缩 转换等 通
、 、 ,
过输出设备实现信息的定向传输和响应 用来完成特定任务的输出
出。
设备也被称为执行器或响应输出器件
。
信息处理系统受益于计算机技术和设备 特别是开源软硬件设
,
备 它们由于在性能 种类 价格和效率等方面的优势 正逐渐深入到
, 、 、 ,
版
我们的科研 教育 工业 农业 国防 日常生活等方方面面 由此涌现
、 、 、 、 、 ,
出许许多多为特定应用而设计的专用信息处理系统 这些信息处理系
,
统在各个应用领域辅助或代替人类进行信息活动 已成为我们生产和
,
社
生活的得力助手
。
知 识 延 伸 嵌入式系统
嵌入式系统是一类具有一个或多个特定功能的信息处理系统 一般都可进行实时计算 往往被用作某
, ,
个设备的一个部件 这类系统一般都具有低功耗 高可靠性 可扩展等特点 而我们常见的个人电脑等通
。 、 、 。
第一章 开源文化与开源硬件 13用计算机用起来比较灵活 比如可替换硬盘 增加内存等 这样能满足更多用户的需求
, 、 , 。
用在嵌入式系统中的处理器和微控制器发展很快 从最初的4位处理器 用于电饭煲等家电 到之后
, ( ),
的8位华处理器 用于游戏机 遥控器等 16位处理器 用于机顶盒 路由器等 32位处理器 用于网络设
( 、 )、 ( 、 )、 (
备 机器人等 等 其处理能力在不断增加 处理速度也从 0.1MIPSmillion instructions per second即每
、 ) , , ( ,
秒百万条指令 发展到超过1000MIPS
) 。
东
2. 信息处理系统实例分析———烟雾报警器
师
在各种各样的公共场所 比如教室 图书馆 博物
, 、 、
馆 咖啡厅等 都可以看到烟雾报警器的身影 它虽然
、 , 。
范是一个很小的装置 却成为现代安全设施的标配 默默
, ,
图1.5 烟雾报警器
地保障着人们的人身安全和财产安全
。
如图15和16所示的烟雾报警器可视作小型的
. .
大专用信息处理系统 它采用专门的烟雾检测装置 即烟
, ,
雾传感器作为系统的输入模块 用集成度高 功耗小
, 、 、
成本低的微控制器作为烟雾信号处理模块 用蜂鸣器
, 、
模块等作为输出模块 构成如图17所示的烟雾
学
Wi-Fi , .
报警信息处理系统
。
(1) 输入模块
传感器能感知外界信息 并能将得到的信
出 ,
息按一定规则变换成电信号或其他所需形式
图1.6 烟雾报警器内部器件
的信号 图18中的烟雾传感器的内部是如
。 .
图19所示的一对侧斜向安装的红外光敏发
. 版
射 接收对管 黑的为接收管 透明的是发
、 。 ,
射管
图1.7 烟雾报警信息处理系统的组成 。
由于发射管和接收管是侧斜向安装的 而
,
社
光沿直线传播 没有烟雾时接收管是无法接收
,
到发射管发出的红外信号的 当有烟雾进入烟
;
雾传感器内部时 由于烟雾颗粒的作用 发射
, ,
管发出的红外光发生散射 接收管便接收到了
,
红外信号 这个信号的强度与烟雾的浓度相
。
关 因此在将该信号由电流转换成电压时 电
图1.8 烟雾传感器 图1.9 红外对管 , ,
压值的大小直接反映了外界烟雾浓度的大小
。
14 开源硬件项目设计烟雾传感器构成了信息处理系统的输入模块 它将得到的电压信号传
,
送到微控制器后便完成了信息的获取
。
(2) 处理模块
华
烟雾报警器的电路板上连接有一块微控制器芯片 它对接收到的
,
烟雾信号进行处理 输入模块传送来的电压信号是一个在一定范围
。
内 如在0 33 之间 的模拟信号 而微控制器是数字信息处理器
( ~ .V ) ,
东
件 无法直接处理烟雾传感器传入的模拟信号 因此需要先把输入模
, ,
块传送来的模拟信号转换成数字信号 这个通常由模数转
,
换器件 简写为 或称为
(analogtodigitalconverter, ADC,
师 转换器 完成 如图110所示 为方便用户使用 现
A/D ) , . 。 ,
今很多微控制器中都集成有 模拟信号可直接传入到
ADC,
图1.10 微控制器输入接口示意图 微控制器的一些输入 输出接口 接口 再由这些接口
/ (I/O ),
范传送进
ADC。
的转换精度由它的二进制位数决定 若其二进制位数为10
ADC ,
位 则表明它能将一定范围内的电压信号转换为十进制数0 210-
, ~(
1 即0 1023之间的数值 烟雾浓度越高 电压信号就越大 转换后
), ~ 大。 , ,
的数值也越大 所以根据转换后的数值就能判断周边环境的烟雾情
,
图1.11 微控制器 况 如果该数值超出一定的阈值就可以判定为有险情 需要采取相应
, ,
的措施
。 学
微控制器 如图111所示 一般根据所要实现的功能来选型 烟
( . ) 。
雾报警器所需的控制功能简单 即判断烟雾浓度对应的电压值是否超
,
出阈值 因此 它对整体运算能力和处理能力的要求不高 一般8位的
, , 出 ,
微控制器就可以完成
。
图1.12 蜂鸣器
(3) 输出模块
输出模块根据微控制器的指令完成相应的操作或动作 烟雾报
。
版
警系统的输出由蜂鸣器 如图112所示 和 模块 如图113所
( . ) Wi-Fi ( .
示 构成 当烟雾浓度超标时 蜂鸣器将报警 同时 模块会通知
) , , , Wi-Fi
管理员
。
图1.13 WiFi模块 微控制器输出的都是数字 社 信号 常用的输出模块多为
- ,
数字器件 如蜂鸣器 模块等 可以直接接收微控制
( 、Wi-Fi ),
器传送来的数据 但当其输出信号用于驱动一些模拟端口
。
的模块 如电机设备等 时 则需先将数字信号转换为模拟
( ) ,
信号 一般由数模转换器件 简
, (digitaltoanalogconverter,
图1.14 微控制器输出接口示意图
写为 或称为 转换器 进行转换后再输出 如
DAC, D/A ) ,
图114所示
. 。
第一章 开源文化与开源硬件 15烟雾报警器中的烟雾传感器 微控制器 以及蜂鸣器 模块
、 , 、Wi-Fi ,
是构成信息输入 信息处理和信息输出三个模块的实体 它们通过相
、 ,
应的接口连接成一个有机的整体 组成烟雾报警信息处理系统 烟雾
, 。
华
报警器的信息处理过程为 当周边环境的烟雾浓度较高时 烟雾传感
: ,
器将这些数据传送到微控制器 微控制器将其与设定的阈值比较 若
, ,
高于设定值则表示烟雾浓度超标 不超过该值则表示正常 微控制器
, ;
东
根据判断结果控制输出模块 一旦烟雾超标 蜂鸣器便立刻发出报警
, ,
声 同时 模块提醒管理人员采取措施
, Wi-Fi 。
烟雾报警器还可以设计成更加复杂的信息处理系统 如整合报警
,
师和处理功能 当烟雾浓度超标时 烟雾报警器不仅发出报警声 还能自
, , ,
动启动由微控制器控制的喷水装置 及时处理险情
, 。
范
体 验 思 考
若烟雾报警器是在一栋大楼中使用 如何将各个房间的报警信息汇总 实现集中管控
, , ?
大
作业练习
学
分析你周边的系统中哪些具备信息处理系统的构成要素 利用 信息输入 信息处理 信息输
。 “ ——— ———
出 这根主线 将它们的各模块描述出来 填入表1.2
” , , 。
出
表1.2 生活中信息处理系统的组成器件
信息处理系统 信息输入 信息处理 信息输出
运动传感器、脉搏传感器、触
智能手环 微控制器 版震动电机、显示屏、指示灯
摸按键
社
16 开源硬件项目设计二、 常见的开源硬件开发平台
华
信息处理系统的运行依赖于有承载运行功能的硬件平台和相应
的控制软件 开放性是基于开源平台的信息处理系统的特点之一 即
。 ,
允许用户在协议限制范围之内 从开源的核心硬件和应用于该硬件
,
东平台的软件出发 依据需要对系统进行二次开发 在已有的共享资
, ,
源的基础上进行学习 改造 调试 甚至重新发布 从而搭建起功能
、 、 , ,
更强大或更能适应特定环境的新系统 充分体现出开源的迭代创新
,
师特征
。
体 验 思 考
范
目前 开源硬件的典型代表是Arduino和树莓派系统 我们可以使用 Arduino和树莓派制作出功能多
, ,
样 极具创意的电子作品 观察几种典型的Arduino和树莓派开发板实物 阅读相关说明书 观察开发板上
、 。 , ,
的各种标识信息 尝试回答 它们的品牌型号和供电方式是什么 你能否识别出其中的微控制器和输入/
, : ?
大
输出模块
?
探 究 活 动
学
随着开源硬件的兴起 关于开源硬件的创业成功案例不断涌现 开源硬件让创业者可以更轻松地将创
, ,
意转化为现实
。 出
1. 对比几种常用的开源硬件平台 了解它们的功能特点
, ;
2. 对照典型的Arduino和树莓派开发板的硬件结构 归纳出它们的基本组成模块 并分析它们各自的
, ,
适用场景
。
版
1. Arduino开发平台简介
社
是目前较受初学者欢迎的一款开源硬件开发平台 由意
Arduino ,
图1.15 Arduino标识 大利一家高科技设计学校的师生在2005年联合设计完成 其标识如
。
图115所示
. 。
开源平台包括硬件和软件两部分内容 硬件部分 即
Arduino 。 ,
开发板 由微控制器 闪存 以及一组通用输入 输出
Arduino , 、 (flash) /
缩写为 接口等构成 软件部
(generalpurposeinputoutput, GPIO) 。
分主要包括用于编写 程序的集成开发环境
Arduino (ArduinoIDE)
第一章 开源文化与开源硬件 17以及相关的开发包 开发板和 如图116
。Arduino ArduinoIDE .
所示
。
是一款侧重于 性能的微控制器 支持底层设计 可
华 Arduino I/O , ,
以通过主板上的 引脚直接与开关 传感器 电机等各种相关部件
I/O 、 、
连接 读取它们的状态信号 或者控制它们的运转 同时 也支
, , ; Arduino
持与上层 机的通信 可以实现交互式系统功能 的主要
PC , 。Arduino
东
优势是
:
1 容易入门 属于入门级的开源硬件开发平台 它提
() 。Arduino ,
供的 支持图形化编程方式 开发工具包对硬件底层的操
ArduinoIDE ,
师作进行了很好的封装 使得没有编程经验的人也能轻松上手 大大降
, ,
低了学习难度和开发门槛
。
2 可跨平台使用 具有完善的开发环境
() 。Arduino ,ArduinoIDE
可以从范网上免费下载 并且能够在 等主
, Windows、Macintosh、Linux
流操作系统上运行 适用范围广泛
, 。
图1.16 Arduino开发板和 3 有较好的扩展性 硬件电路板可以自行手动组装
Arduino IDE () 。Arduino ,
还可以通过扩展板和自带的 接口与键盘 鼠标 传感器 电机 显
大
I/O 、 、 、 、
示屏 蓝牙 等各种模块连接 实现功能扩展 完成模块化 标准
、 、Wi-Fi , , 、
化的设计 因此它也被称为 电子积木
, “ ”。
4 有较大的开放性 是起步比较早的开源硬件项目
() 学。Arduino ,
不仅软硬件都完全公开 还提供了丰富完整的开源技术资料和完善活
,
跃的支持社区 同时 还预留了非常友好的第三方库开发接
。 Arduino
口 便于用户在成功实现了自己的设计后把成果分享给其他人 实现
, 出 ,
迭代更新
。
2. 典型的Arduino开发板及其硬件结构
版
针对不同的应用需求 开源平台提供了多种型号及众多
,Arduino
衍生微控制器 如基于8位 的
, CPU ArduinoUno、ArduinoNano、
2560等 基于32位 的 社
ArduinoMega , CPU ArduinoDue、ArduinoExen
等
Proto 。
(1) Arduino Uno开发板
是最常见的 平台开发板之一 简单 实用
ArduinoUno Arduino , 、 、
上手快 在意大利语中是 一 的意思 作为系列板
。Uno “ ” ,ArduinoUno
中的第一个控制板 是 平台的标准参考模板
, Arduino 。ArduinoUno
采用一块8位的处理器芯片 开发板上同时具有闪存 内存 数字
, 、 、 I/O
接口 模拟输入接口 接口 电源插座等 工作电压为5 开发板
、 、USB 、 , V,
18 开源硬件项目设计大小规格为686 ×534
.mm .mm。
与大部分的开发板一样 开发板上的硬件资源大
,ArduinoUno
致可分为几大模块 微控制器最小系统模块 电源模块 调试模块以
: 、 、
华
及 接口模块等 模块之间在电气和逻辑关系上相互联系和支
I/O 。
持 共同构成一个完整的开发环境 其中 电源模块从外部接入电
, 。 ,
源并转换成稳定的工作电压 为开发板上的所有电气元件供能 调
, ;
东
试模块转换 接口信号 方便我们建立起电脑端与开发板之间的
USB ,
通信连接 微控制器最小系统模块是开发板的 大脑 我们编写并
; “ ”,
下载的程序就在这一位置运行 开发板的组成如图
。ArduinoUno
师117所示
. 。
范
大
学
图1.17 Arduino Uno
开发板的组成
(2) 其他 Arduino开发板
出
是 的微型版本 与后者最大的不
ArduinoNano ArduinoUno ,
同是没有电源插座 并且 接口采用 型插座 开
, USB Mini-B 。Nano
发板尺寸很小 只有45 ×18 可以直接插在面包板上使
, mm mm,
图1.18 Arduino Nano开发板 用 是专为空间有限的应用而
版
设计的开发板 其外形如图118
, 。 .
所示
。
2560 如图119
ArduinoMega ( .
所示 是社系列中采用8位
) Arduino
处理器芯片的最高配开发板 包含
,
了单片机运行所需的所有要素 虽
。
然其体积比前两个大 10152 ×
( . mm
533 但它的闪存空间大
.mm), ,I/O
引脚数多 通信接口多 适用于物联
, ,
网项目等
。
图1.19 Arduino Mega 2560开发板
第一章 开源文化与开源硬件 19如图120所示
ArduinoDue( . )
是基于32位 3处
ARM Cortex-M
理器的第一个 开发板 包
华 Arduino ,
含了支持微控制器所需的全部要
素 只需通过 电缆将其
, MicroUSB
连至计算机 或通过 适配
, AC-DC
东
器 电池为其供电 即可使其工作
、 , 。
的大小与
ArduinoDue Arduino
2560相同 但与其他
图1.20 Arduino Due开发板 Mega , Arduino
师 开发板不同的是它的工作电压为
33
.V。
3. 树莓范派开发平台简介
树莓派是由英国的几位开发者历经6年时间开发 并于2012年
,
正式发布的一款基于 架构的开源硬件开发平台 开发者最初
大
ARM 。
的动机是为了提升学校计算机编程教育水平 让计算机变得有趣
, ,
以更多地激起人们对计算机科学的兴趣 因此命名时采用了大家
。
喜欢的水果名称 树莓 派 则是对通用编程语言 的
图1.21 树莓派标识 ———“学”,“ ” “Python”
简称 最终的命名即为二者的组合 树莓派 图121是树莓派的
, “ ”。 .
标识
。
树莓派是一款侧重于计算性能的卡片式计算机 预装 操作
出 , Linux
系统 采用 架构处理器 配备较全面的接口 包括可供键盘 鼠
, ARM , , 、
标使用的 接口 可与显示器或者电视机
USB ,
相连 的 高 清 多 媒 体 接 口
版
(high-definition
缩写为 以及快
multimediainterface, HDMI),
速以太网接口 卡扩展接口 数字
、SD 、 GPIO
接口等常用接口 支持 等
, Java、C、Python
社
开发语言 虽然其外形仅有一张信用卡那么
,
大 但它具备了一般个人电脑的基本功能 相
, ,
图1.22 树莓派开发板
当于一台微型化的低成本电脑 树莓派开发
。
板的外形如图122所示 树莓派的主要特
. 。
点有
:
1 功能强大 树莓派自带多种多样的接口和强大的功能 不仅
() 。 ,
可以连接开关 传感器 电动机或微处理器等元器件 直接实现底层硬
、 、 ,
件的 控制 还能在较低的功耗水平下 像一般 机那样稳定地
I/O , , PC
20 开源硬件项目设计运行完整版的 操作系统 为用户提供开发更上层应用产品的
Linux ,
可能
。
2 硬件结构模块化 基于树莓派的所有扩展功能都有成品模
() 。
华
块可供选用 用户只需像搭积木一样将模块插入相应的接口即可 这
, ,
就大大降低了对用户的电子和硬件知识的要求 适合复杂信息处理系
,
统的设计
。
东
3 资源共享 树莓派拥有完善的社区支持 可提供完备的树莓
() 。 ,
派开发文档 为树莓派的系统迭代优化提供支持
, 。
师4. 典型的树莓派开发板及其硬件结构
树莓派是一个非常小巧的通用计算机 运算性能和智能手机相
,
仿范树莓派如果连接上必要的外围设备 如电视机和键盘 就成了一
。 ( ),
台名副其实的低功耗通用电脑了 你能用它来做在一台普通计算机上
,
所能做的事情 随着树莓派与物联网技术的结合 树莓派更是被广泛
。 ,
地应用于工业控制 机器人 智能家居 创客教育等领域 图123是
大
、 、 、 。 .
树莓派外接设备的连接图
。
学
出
版
社
图1.23 树莓派外接设备连
接图
第一章 开源文化与开源硬件 21树莓派开源平台提供了多种型号的开发板 它们尽管型号不同
, ,
但基本硬件组成大致相同 以树莓派3 +为例 树莓派3 +开发板
。 B , B
采用64位 53处理器 以 卡为存储模块 卡
华 ARMCortex-A , MicroSD ,
片周围含有多种多样的 接口模块 其中包括 接口 以太网接
I/O , USB 、
口 模拟视频信号输出接口和高清多媒体接口等
、 。
在图124所示的树莓派3 +开发板中 可以看到其主要的硬件
. B ,
东
模块和它们所在的位置
:
师
范
大
学
图1.24 树莓派 3B+开
发板
出
1 树莓派3 +开发板的处理器芯片临近中心区域 它是由集成
() B ,
电路构成的 处理器模块 相当于开发板的 大脑 具有信息处理
SoC , “ ”, 、
图形渲染以及输入 输出控制等功能
/ 。
版
2 处理器模块下方的银色连接器是一个高清多媒体接口
()SoC
媒体播放器和电视机顶盒上都有相同类型的接口 用高清多媒体接
( ),
口连接显示器或电视机 可以提供高清分辨率的视频以及数字音频
,
社
信号
。
3 树莓派3 +开发板左上方的两排插针是 接口 这些接
() B GPIO ,
口最常见的用处是连接扩展板电路 通过它们可以将树莓派和其他硬
,
件设备连接起来
。
4 树莓派3 +开发板的左下角是一个 电源接口
() B MicroUSB ,
和目前的智能手机的接口一样 用一根 数据线将树莓派
, MicroUSB
连接到合适的电源适配器上 树莓派就可以启动了
, 。
5 树莓派3 +开发板的左边底侧有一个 卡槽 可以
() B MicroSD ,
22 开源硬件项目设计插入 存储卡 一个安全性高的存储卡不但可以为操作系统 程序
SD 。 、 、
数据和其他文件提供存储空间 而且不易使数据丢失
, 。
华
5. Arduino与树莓派的比较
与树莓派是创客进行发明创造的两大利器 和
Arduino ,Arduino
东
树莓派看起来十分相似 都是小型电路板 但实际上它们的区别
, ,
很大
。
实质上是一个微控制器 由于微控制器只是计算机的一
Arduino ,
师部分 功能有限 所以尽管 可以通过一些小型的类 应用程
, , Arduino C
序进行编程 但无法运行一个操作系统 树莓派则是一台完整的迷你
, 。
计算机 它的核心是一款 微处理器 以 卡作为内
。 ARM , SD/MicroSD
存范和硬盘空间 外接键盘 鼠标 显示器等 可以加载 操作系统
, 、 、 , Linux ,
运行复杂的应用程序
。
树莓派侧重于计算性能 它只有数字 接口 缺乏模拟输入接
, I/O ,
口 而 更侧重于 性能 不但包含数字 接口 还包含不
大
, Arduino I/O , I/O ,
少模拟输入接口 可以连接大量的数字传感器和模拟传感器 擅长处
, ,
理模拟输入信号
。
在许多方面结合使用树莓派和 可以充分发挥两块电路
学 Arduino,
板的优势 如果使用带有 接口并含有类似于 这样兼
。 GPIO AlaMode
容 硬件的接口板 就可以将树莓派和 结合起来 实
Arduino , Arduino ,
现功能和性能的最优化
。出
作业练习
版
1. 收集信息 从开源的内容和功能特点等角度 对比Arduino和树莓派 并给出它们的一些成功案例
, , , ,
完成表1.3
。
社
表1.3 Arduino与树莓派的对比
硬件平台 是否开源 功能特点 成功案例
Arduino
树莓派
第一章 开源文化与开源硬件 232. 上网搜集典型开源硬件平台的常用开发板信息 将它们的特性填入表1.4
, 。
表1.4 常用的开源硬件开发板的特性
华
开发板 处理器 I/O接口 开发 操作 特点及
硬件平台 主频
名称 位数 类型 语言 系统 应用场合
最基础的开发板,适用对性
Uno 8 16MHz 数字和模拟 类C语言 不支持
能要求不高的普通应用场合
东
Arduino
Nano
Due
树莓派 师
虚谷号
掌控板
范
三、 集成开发环境(IDE)
大
要使计算机正常工作 仅仅有硬件系统是不够的 还需要软件系
, ,
统的支撑 软件是计算机信息处理系统能够运行的基础 也提供了用
。 ,
学
户和硬件平台交互的方式 在进行项目开发前 首先需要搭建基于硬
。 ,
件平台的软件开发环境
。
集成开发环境 缩写为
(integrateddevelopmentenvironment,
出
是提供程序开发环境的应用软件 它集成了程序代码编写 检
IDE) , 、
查 编译 下载 调试等一系列功能 可以将编写 编译好的程序下载到
、 、 、 , 、
控制器运行 并提供一定的调试手段 帮助我们测试程序 找错纠错
, , , 。
集成开发环境将用户在开发过程中所需版要的工具或功能集成到一起
,
提供一体化服务 能够最大化地提高开发者的工作效率 集成开发环
, 。
图1.25 集成开发环境下
境下的软件开发过程如图125所示
的软件开发过程 . 。
社
项 目 实 践
项目器材
【 】
电脑 Arduino开发板 USB数据线
、 、 。
操作步骤
【 】
1. 安装Arduino IDE 可访问Arduino官方网站下载Arduino IDE软件 安装完成后的Arduino IDE
。 。
的编程环境如图1.26所示
。
24 开源硬件项目设计华
东
师
图1.26 Arduino
范
IDE编程环境
2. 安装Arduino 驱动 用USB数据线将Arduino开发板与电脑
。
连接起来 第一次连接的时候 需要安装相应的驱动 驱动程序位于
, , 。
Arduino软件安装目录下的 Drivers文大件夹中 驱动程序安装完成之
。
后 打开电脑的 设备管理器 会发现在 端口 项中增加了一个 COM
, “ ”, “ ”
端口设备 请记下该端口号 如图 1.27所示 所用计算机通信端口号
, 。 ,
为COM5
。 学
请同学们将自己所用的开发板型号和其在电脑上所使用的串口
号 填入表1.5
, 。 图1.27 通过 设备管理器 查看
“ ”
Arduino的COM端口
出
表1.5 开发板型号及其串口号
开发板型号 串口号
版
3. 在Arduino IDE的 工具 菜单
“ ”
下设置相应的 开发板 和 端口 (如图
“ ” “ ”
1.28所示)注意端口设置要与 设备管 社
, “
理器 中显示的 Arduino的 COM端口
”
一致
。
图1.28 设置 开发板 和 端口
“ ” “ ”
第一章 开源文化与开源硬件 254. 用 Arduino IDE打开 Arduino自
带的Blink程序 如图1.29所示
, 。
5华. 点击工具栏中的 按钮将程序
下载到Arduino微控制器自带的闪存 观
,
察Arduino板上LED的闪烁
。
东
图1.29 搜索Blink程序
师
技 术 支 持 图形化编程
范
Arduino IDE的默认编程环境支持源代码的文本编程方式 我们还可以通过在 Arduino IDE中添加图
,
形化的插件来搭建图形化编程环境
。
1. ArduBlock插件
大
ArduBlock是一款可以配合Arduino IDE使用的第三方软件 它以图形化的方式来编制比较简单的程
,
序 使用时不需要了解具体的编程语言的写法 只要将需要实现的功能以图形的方式告知编译系统 用类
。 , ,
似于 搭积木 的 拖拉 方式 将左边相应的功能模块 控制模块 元件模块放入中间的编程窗口中 通过功
“ ” “ ” , 、 、 ,
学
能堆叠来编写程序 比较适合初学者
, 。
将ArduBlock压缩包中的 libraries和 tools文件夹复制到
Arduino的安装目录下 然后重新启动 Arduino程序 在 工具
, , “ ”
菜单中即可看到 ArduBlock 选项 如图 1.30所示 点击
出
“ ” , 。
ArduBlock 即可进入图形化编程环境 图1.30 菜单栏内的 ArduBlock选项
“ ”, 。 “ ”
2. 米思齐 Mixly编程环境
( )
与Arduino IDE一样 米思齐也是一款免费开源的硬件编程软件 同时支持文本和图形化编程方式
, , 。
版
米思齐基于Blockly和 Java8支持 Arduino和 micro bit硬件开源平台 它将图形化编程方式和文本编
, : 。
程方式融合在一起 用不同的颜色代表不同类型的功能块 用户只需直接拖动模块就可以编写出简单的
, ,
程序
。
社
项 目 实 践
【项目器材】
电脑 Arduino开发板 USB数据线
、 、 。
【操作步骤】
1. 用USB数据线连接好计算机和Arduino开发板 并设置好Arduino IDE中的 开发板 和 端口
, “ ” “ ”。
26 开源硬件项目设计2. 从开源平台网站上下载 Blink.abp 图形化程序文件 并用
“ ” ,
ArduBlock打开 同学们也可以自己完成图形化程序设计 以实现 Arduino
, ,
华开发板板载LED(如图1.31所示)的闪烁 亮1s暗1s
( , )。
3. 点击工具栏中的 按钮 将程序下载到 Arduino微控制器并运
,
行 观察Arduino开发板板载LED的实验效果 同时观察 Arduino IDE界
, 。
面上自动东生成的文本代码 图1.31 Arduino开发板板
。 载LED
注意 在ArduBlock中点击 按钮时 搭建好的图形化程序会在
: ,
Arduino IDE中自动生成C++文本代码 并自动完成编译 然后将编译后的
, ,
目标代码存入到A师rduino微控制器自带的闪存 并开始运行
, 。
【流程示意】
范
大
图1.32 闪烁LED程序流程示意图
学
【关键代码】
出
版
社
【代码说明】
1. Arduino程序的构成
Arduino程序包括两部分 即初始化程序和主体程序
, 。
1 初始化程序 void setup(){初始化程序代码}
() :
初始化程序的代码在{ }内完成 主要实现引脚的输入/输出方式 串行通信速率 变量初值等的设置
, 、 、 。
这部分在整个程序运行过程中只执行一次
。
2 主体程序 void loop(){主体程序代码}
() :
第一章 开源文化与开源硬件 27主体程序的代码在{ }内完成 它包括执行程序时的各个过程 控制 输入/输出等 这部分在整个程序
, 、 、 。
运行过程中可无限次地重复执行 直至断电或关机
, 。
2华. 设定数字引脚
可以用digitalWrite()函数给一个数字引脚写入 HIGH或者 LOW 即高电平或低电平 对 Arduino开
, 。
发板板载的LED而言 高电平可以点亮LED而低电平则熄灭LED
, , 。
3. 设置延迟值
东
可以用delay()函数设置程序延迟的时间 单位 ms 1s=1000ms
( : , )。
师 作业练习
如果要求LED快速闪烁 如亮0.1s暗0.1s应如何修改程序 如果要
, , , ?
求亮的时间长于暗的时间 那又要如何修改程序
范, ?
六、 程序的调试
大
程序在运行过程中可能会出现运行结果不正确或失效等问题 这
,
就需要在实际硬件环境中作进一步的调试 调试其实就是针对软件
学 。
运行中出现的问题 通过现象找出原因的过程
, 。
项 目 实 践
出
对于运行在开发板上的程序 由于缺少像台式机那样可以进行交互的外部设备 程序的调试变得较为困
, ,
难 在上一节的两个活动中 我们是直接通过观察开发板板载 LED的运行效果来检查程序是否正确运行
。 ,
版
的 但有时直接观察实验现象很容易产生误差 不能够精确定位出错位置 那么有没有办法利用我们的电脑
, , 。
显示器 把开发板上程序运行过程中的数据同步显示出来 让我们通过监控程序的运行来检测错误所在呢?
, ,
【项目器材】
电脑 Arduino开发板 USB数据线
社
、 、 。
【操作步骤】
1. 用USB数据线连接好计算机和Arduino开发板
。
2. 在ArduBlock中打开上一个活动中完成的程序 Blink.abp 在原来程序的每个过程后面加上串口
“ ”,
输出 以显示运行中的程序状态 其中LED亮时屏幕上显示 LED ON 暗时显示 LED OFF
, 。 “ ”, “ ”。
3. 点击工具栏中的 按钮 将程序下载到Arduino微控制器并运行 然后点击工具栏中的 按钮
, , ,
打开串口监视器 仔细观察Arduino开发板板载LED的亮和灭 同时观察串口监视器上同步打印的字符
。 , 。
4. 在ArduBlock中点击 另存为 按钮 将程序另存为 Blink Monitor 1
“ ” , “ ”。
28 开源硬件项目设计5. 在程序 Blink Monitor 1上修改 删除显示延迟状态的输出语句 并将同步显示的字符由 LED
“ ” , , “
ON改为 - LED OFF改为 _
” “”,“ ” “”。
6. 点击工具栏中的 按钮 将程序下载到 Arduino微控制器并运行 然后点击工具栏中的 按
, ,
钮 打开串口监视器
, 。
7. 在ArduBlock中点击 另存为 按钮 将程序另存为 Blink Monitor 2
“ ” , “ ”。
8. 因为ArduBlock图形化编程命令比文本编程更少 控制不够多样 下面在Arduino IDE中对自动生
, ,
成的文本程序进行修改 将两行打印回车语句 Serial.println();删除 如下所示
, “ ” , :
第一章 开源文化与开源硬件
华
东
原代码 修改后代码
师
voidsetup voidsetup
9600 9600
Serial begin Serial begin
13 13
pinMode OUTPUT 范 pinMode OUTPUT
voidloop voidloop
大
13 13
digitalWrite HIGH digitalWrite HIGH
- -
Serial print " " Serial print " "
1000
Serial println delay
13
1000 学 digitalWrite LOW
delay _
13 Serial print ""
digitalWrite LOW 1000
_
delay
Serial print ""
Serial println
出
1000
delay
9. 然后点击工具栏中的 按钮将程序下载到 Arduino微控版制器 再点击 按钮 打开串口监视
。 ,
器(如图1.33所示) 仔细观察LED的亮和灭 同时观察串口监视器同步输出的字符 此时可看到代表低
。 , 。
电平和高电平的简单方波信号 如图1.34所示
( )。
社
图1.33 LED亮灭的串口监视器 图1.34 串口监视器显示的简单方波信号
29【关键代码】
Blink Monitor 1程序如下
“ ” :
华
东
师
Blink Monitor 2程序如下
“ ” :
范
大
学
【代码说明】
1. 串口初始化设置函数Serial.begin(9600)将串口传输率设出定为9600bps
。
2. 通过串口打印加回车 即Serial.println()函数 将数据打印到串口输出 注意 Serial.println()函数
, , 。 :
打印输出数据后自动换行 而Serial.print()函数打印输出数据后不换行 Serial.print()函数在ArduBlock中
, 。
没有对应的图形化语句 所以在 Blink Monitor 2程序生成对应文本程序后要对其进行适当修改
, “ ” 。
版
作业练习
社
1. 和同学讨论一下 Blink Monitor 1和 Blink Monitor 2程序的输出各有什么优点
,“ ” “ ” ?
2. Blink Monitor 1程序中
“ ” :
(1) 语句 能否放到 之后
?
(2) 语句 能否放到 之后
?
3. 在调试中 我们是需要监控程序的运行 还是只需要监控关键步骤 关键变量和关键数据的变化
, , 、 ?
30 开源硬件项目设计项 目 实 践
同学们有没有留心观察过现在的手机 当有未接来电或未查阅的短信时 手机上的指示灯会由暗到
华 ? ,
亮逐渐变化 就像人的呼吸一样 这是LED在微处理器控制下完成的显示效果 我们把这样显示的LED叫
, , ,
作呼吸灯
。
在前面的实例当中 我们都是用 Arduino微控制器来控制 LED的两种状态 亮或灭 那我们能否使
, : 。
LED慢慢东变亮 再逐渐变暗 实现连续变化的呼吸灯效果呢
, , ?
【项目器材】
电脑 Arduino开发板 万用表 示波器
、 、 、 。
【操作步骤】
师
1. 连接好计算机和Arduino开发板
。
2. 从开源平台网站上下载 fade.abp图形化程序文件 并用ArduBlock打开 亦可自己完成图形化程
“ ” , ,
序设计 实现Arduino开发板板载的LED由暗逐渐变亮 每3s改变一次亮度 串口同步显示相应提示
, , , 。
范
3. 点击工具栏中的 按钮 将程序下载到 Arduino微控制器并运行 然后点击工具栏中的 按
, ,
钮 打开串口监视器 在Arduino开发板板载LED亮度变化的同时 仔细观察串口监视器同步输出的字符
, 。 ,
(如图1.35所示)
。
大
学
出
图1.35 串口监视器字符 图1.36 示波器接法
4. 小组合作 按图1.36所示用万用表检测GN D 和13号引脚版的电压 注意红表笔接13号引脚 黑表
, , ,
笔接GND 当串口监视器输出时 记录此时的电压值 保留一位小数 填入表1.6
。 , ( ), 。
表1.6 记录万用表显示的电压值
社
level 1 2 3 4 5 6 7 8 9 10
电压值
5. 用示波器的接地探针连接GND信号脚接13号引脚 按下示波器的 Autoset按钮 示波器会自动
, , “ ” ,
调整设置 通道垂直档位 时基以及触发方式等 使波形显示达到最佳效果 观察如图 1.37所示的波形
( 、 ), 。 ,
并在表1.7中记录波形下方的占空比 保留一位小数 占空比即一个周期内高电平宽度占周期的比例
( ), 。
第一章 开源文化与开源硬件 31华
东
师
范
大
学
出
版
图1.37 示波器显示的数据
社
表1.7 记录示波器显示的占空比
level 1 2 3 4 5 6 7 8 9 10
占空比
32 开源硬件项目设计【流程示意】
华
东
师
范
大
(a)
实现呼吸灯程序效果
(b)
根据
level
值设定占空比并输出高低电平
图1.38 呼吸灯程序流程示意图
学
【关键代码】
=0
intlevel
出voidsetup
9600
Serial begin
13
pinMode OUTPUT
版
voidloop
=
Serial print "level "
Serial println level
=0 社 3000 ++
for inti i< i
13
digitalWrite HIGH
100
delayMicroseconds level*
13
digitalWrite LOW
1000- 100
delayMicroseconds level*
++
level
10 =0
if level> level
第一章 开源文化与开源硬件 33作业练习
华
1. 观察程序中设定的占空比和 LED亮暗变化的关系 并回答 程序中
, :
的变量 level有什么作用 它的上限值 10能够增加或减少吗?如果改变其
?
上限值 实验现象会发生什么变化
, ?
东2. 程序中的变量i有什么作用 它的上限值3000能够增加或减少吗?
?
如果改变其上限值 实验现象又会发生什么变化
, ?
3. 这个活动中 为了能够正确地用万用表和示波器观察实验效果 我们
, ,
设计的呼吸灯会跳跃式地逐步变亮 显示效果不是最佳 如果要实现更好的
师 , 。
呼吸灯效果 应该如何修改程序
, ?
范
知 识 延 伸 示波器的使用
1. 示波器面板及按钮
大
各种型号的示波器面板式样及其按钮分布大相径庭 但基本功能是相近的 示波器按钮说明如图
, 。
1.39所示
。
2. 连接探针
学
探针样式如图1.40和1.41所示 旋紧连接在示波器上的信号输入端 用夹子接地 同时用测量头接触
, , ,
测量点 波形就会显示在示波器屏幕上 探针通常有10倍信号衰减或无衰减两种可调档位
, 。 。
出
版
社
图1.39 示波器面板按钮说明
34 开源硬件项目设计华
东
师
图1.40 探头连接 图1.41 探头调节
测量时接地夹子要与被测电路的接地端相连 否 则 会 造成测量不准确 甚至损坏设备
, , 。
3. 自动定标
范
按下 Auto Scale键 可将示波器自动配置为对输入信号显示最佳效果 如果要使示波器恢复到以前
“ ” , 。
的设置 可再次按下 取消自动定标
, , 。
4. 停止与重新扫描
大
示波器的功能就是显示不同时刻的信号波形 随着信号的不断输入 波形不断地显示在屏幕上 由于
, , ,
屏幕大小有限 波形看上去随时间在移动 不利于观测和记录参数数据
, , 。
Run/Stop键呈绿色 表示示波器正在运行 即示波器符合触发条件 正在采集数据 若要停止采集
“ ” , , , 。
学
数据 可再次按下 Run/Stop键 使波形固定
, “ ” , 。
Run/Stop键呈红色 表示数据采集已停止 若要开始采集数据 可再次按下 Run/Stop键 使波形
“ ” , 。 , “ ” ,
重新移动
。
出
版
社
第一章 开源文化与开源硬件 35第三节 开源硬件项目设计方法
开源硬件项目的系统设计是一个反复迭代 逐步求精的过程 这
、 。
华
个迭代过程一般包括以下五个步骤 需求分析 方案设计 作品制作
: 、 、 、
调试优化 作品发布
、 。
东
体 验 思 考
在进行创新实践时 需要理解项目要求 考虑如何充分利用开源硬件的特点 确定项目实施计划和方
, , ,
师
案 使项目能够顺利有序地进行 让设计的系统更好地满足相应需求
, , 。
通过智能水杯的开发实践 体验开源硬件项目的开发流程 并探讨 如何设计方案 如何选择开源硬
, , : ?
件器材 设计制作完成的开源项目如何发布
? ?
范
开源硬件项目的系统设计过程如图142所示 本节将以智能水
. 。
杯设计为例 介绍开源硬件项目系统设计的各个步骤
,大 。
学
出
版
社
图1.42 开源硬件项目系统设计的主要步骤
36 开源硬件项目设计随着社会智能化程度的提高 人们对生活用品的智能化要求也不
,
断提升 以水杯为例 传统的水杯没有显示 提醒功能 我们希望智能
。 , 、 ,
水杯具有显示水温和水量的功能 方便我们把握喝水的情况 同时 我
, , ,
华
们希望智能水杯能根据个人的生理状况和喜好 提供喝水提醒 缺水
, 、
提醒等功能 使我们更科学 更合理地饮水 除此之外 智能水杯还应
, 、 。 ,
满足每个人对水杯外观 形状 装饰等个性化的审美需求
、 、 。
东
一、 需求分析
师对项目进行需求分析有助于明确项目目标 可将需求分为核心需
,
求和附加需求两类 核心需求是必须满足的 在满足核心需求的前提
, ,
下 结合作品设计方案 利用有限资源尽可能地去实现更多附加需求
, , 。
注意这两类需求可能会转换 尤其是在作品迭代时会有调整或增减
范 , 。
探 究 活 动
大
在发布开源硬件的网站和社区上有很多其他人分享的作品 它们是获得灵感 创新想法 完善作品 交
, 、 、 、
流经验的重要渠道 善加利用可以帮助我们更有效地开发优秀作品
, 。
【活动步骤】
学
1. 上网查阅智能水杯的相关资料 了解现有的或类似的产品 再通过用户调查 头脑风暴等方法 理解
, , 、 ,
智能水杯项目的需求 如表1.8所示 提出项目的设计目标 并对项目的需求和功能进行细化
( ), , 。
2. 通过一定的方式 如网站 论坛 专家咨询 小组讨论等 获取相关的开源资料 判断和评估项目各功
, 、 、 、 , ,
能实现的技术难点 明确在现有的技术 资料 资金 时间等限制条件下完成项目设计的可能性
出
, 、 、 、 。
3. 从作品功能完整性 用户体验 成本因素等多方面对需求进行评估 不断调整需求内容直至通过
、 、 ,
评估
。
版
表1.8 智能水杯的需求分析
显示水温和剩余水量 采纳
核心需求 定时喝水提醒 采纳
社
缺水提醒 采纳
使用悦耳的音乐提醒 采纳
定时的时间可以设置 采纳
附加需求
能远程查看水温、水量等状态 忽略
外观设计体现个性化 采纳
第一章 开源文化与开源硬件 37二、 方案设计
华
根据需求分析的结果论证和设计可行的系统实现方案 一般包括
,
信息处理系统设计方案和功能结构设计方案两个部分 设计过程中
。
应及时沟通设计信息并作交叉确认 使信息处理系统设计与功能结构
,
东
设计相匹配 如果出现了二者不匹配的情况 就需要修改设计直到满
, ,
足所有的匹配要求
。
师
探 究 活 动
智能水杯的方案设计可细分为两大部分 水杯的信息处理系统设计与水杯的功能结构设计
: 。
【活动步骤】 范
1. 水杯的信息处理系统设计
项目设计中的信息处理系统一般也被称为电子控制系统 根据需求分析明确产品的主要功能 分析
。 ,
各个功能在信息输入 信息处理 信息输出等各模块中的对应关系 明确各功能模块之间信息通信的方式
、 、 大, ,
确定需要使用的主要硬件器材 包括微控制器 传感器 执行器等
, 、 、 。
1 功能描述
()
通电启动智能水杯 进行初始化设置 包括饮水的时间和缺水警示阈值等 将设定参数存入存储器
, , , 。
根据设定值启用硬件定时器 实现定时提醒喝水 学
, 。
运行过程中用传感器获取水温 剩余水量等信息 实时监测剩余水量 并传送给微控制器 微控制器接收
、 , , ;
到传感器的信息 经处理后通过OLED显示屏将信息显示出来 当水杯内水量偏低时 执行器报警提醒加水
, ; , 。
(2) 器件选择
出
根据智能水杯的功能 选择相应器件 智能水杯功能与器件表如表1.9所示
, 。 。
表1.9 智能水杯功能与器件表
版
编号 功能 描述 对应模块 对应器件
1 测温 测量水的温度 输入模块 温度传感器
2 测剩余水量 测量水杯中剩余的水量 输入模块 压力或水位传感器
社
3 喝水提醒 指定时间提醒喝水 输出模块 定时器、蜂鸣器
时间和缺水警
4 设定喝水的时间和缺水警示阈值 输入模块 按键、OLED显示屏、存储器
示阈值设定
5 缺水提醒 水杯内水量过少时,提醒及时补充 输出模块 传感器、蜂鸣器
6 远程显示 向监护人远程显示测量信息 输出模块 蓝牙、WiFi等无线通信模块
-
7 水杯运行控制 控制水杯的正常运行,整合系统功能 处理模块 微控制器(含存储器、定时器)
38 开源硬件项目设计3 系统设计框图
()
电子控制系统的设计框图如图1.43所示
:
华
OLED
东
图1.43 智能水杯电子控制系统设计框图
师
2. 水杯的功能结构设计
功能设计主要考虑作品在工作时操控方面的情况 结构设计主要考虑作品的机械结构组成
, 。
1 功能设计
() 范
在功能设计方面 制定如表1.10所示的操作方案
, 。
表1.10 按键控制功能表
大
编号 功能键名称 功能说明 备注
按键1 测温 显示水杯中水的温度 快捷操作
按键2 测剩余水量 显示水杯中剩余水量 快捷操作
学
按键3 选定/退出 设定喝水时间、剩余水量警示阈值 用短按/长按操作菜单
2 结构设计
() 出
将结构设计细分为杯盖 杯体 杯底等部分 杯体上嵌有OLED显示屏 按键等 杯底安置控制板 电池
、 、 , 、 , 、
和传感器模块等电子控制系统 同学们可以发挥创意 制定智能水杯个性化的外观及装饰方案
。 , 。
版
体 验 思 考
社
以小组的形式开展以下活动
:
1. 收集和比较常见智能水杯的功能和特点 设计小组的智能水杯功能表
, 。
2. 在开源社区中 寻找智能水杯作品 在分析该作品的基础上 评估小组设计的智能水杯方案的可
, , ,
行性
。
3. 思考在作品设计中应如何选用开源模块和闭源模块开展作品设计 讨论开源文化对创新的意义
, 。
第一章 开源文化与开源硬件 39三、 作品制作
华
开源硬件项目的作品制作包括电子控制系统制作和结构造型制
作两个任务 电子控制系统制作要完成硬件开发和软件固件开发两
。
个部分 即根据功能设计选择合适的硬件器件 并选择恰当的开发环
, ,
东
境编写程序 结构造型制作是指安装电子控制系统的机械结构 完成
; ,
作品外观的制作
。
师
探 究 活 动
作品制作可以从搜索开源社区上的资源开始 选择一个类似作品 在他人经验和成果的基础上 进行
, , ,
修改和完善 使之符合自己的需求范快速完成应用系统的设计 有效提高自己的工作效率
, , , 。
【活动步骤】
1. 电子控制系统制作
电子控制系统制作要确定控制器和外围器件 选出符合方案设计要求的器件的具体型号 在选定合适
大, ,
的开发环境和软件支持程序库后完成软件固件部分的开发
。
1 控制器及开发环境选择
()
一般而言 要优先选择有开源社区支持 软件开发环境成熟的方案 这样可以在遇到问题时得到技术
, 、 ,
支持 并且尽可能避免其他因素的干扰 如果遇到开发学问题也可以讨论咨询 表1.11给出了智能水杯控制
, , 。
器选择方案
。
表1.11 智能水杯控制器选择方案
出
控制器类型 Arduino Uno Arduino Nano 树莓派3B+
主控板尺寸是否满足要求 否 是 否
版
运算能力是否满足要求 是 是 是
存储容量是否满足要求 是 是 是
接口类型和引脚数量是否满足要求 是 是 是
社
是否支持电池供电 是 是 否
是否有开源社区 有 有 有
是否有良好的软件开发环境支持 有 有 有
结论 体积过大 适合 功耗太高
40 开源硬件项目设计2 外围器件及驱动程序库选择
()
依据项目需求提出的每个器件分类 综合考虑性能 价格等因素 优先选取有高质量开源软件程
, 、 ,
华序库支持的器件 具体确定每个分类模块或部件的器件型号 具体到智能水杯 其硬件配置如表 1.12
, 。 ,
所示
。
表1.12 智能水杯硬件配置
东
编 硬件 开源软件 综合
模块 关键参数 器件型号
号 开源 库数目 评价
师供电电压:3.3~5V
DS18B20数 字
1 温度传感器 测量范围:0~100 是 有 确定
℃ 温度传感器
测量精度:±0.5 (-10~85 )
℃ ℃
压力感应范围:20~6000g RPC18.3LT电
范
2 压力传感器 - - 是 有 确定
触发力:20g(默认电阻值小于200k 时触发) 阻式压力传感器
Ω
感应厚度(灵敏度)范围:0~13mm XKCY25T12V
- -
3 水位传感器 工作环境温度:0~105 智能非接触式液 是 有 确定
大
℃
液位检测精度:±0.5mm 位传感器
4 按键 工作电压:3.3~5V 通用 是 有 确定
学
SSD1306
OLED显示 像素个数:128列×64行
5 OLED液晶显示 是 2个以上 确定
屏 工作电压:3.3~5V
模块
出
6 蜂鸣器 工作电压:5V 通用 是 有 确定
3 硬件搭建
()
版
以开源社区中的类似方案设计为参考 根据图1.43所示智能水杯的设计原理 完成顶层框图和电路图
, ,
设计 仿真 印刷板制作 依需要 及焊接等步骤 完成硬件搭建 并用开发环境完成固件流程设计 代码编
、 、 ( ) , , 、
写和测试
。
2. 结构造型制作
社
依据在功能结构设计环节提出的要求 参照在器件选型环节确定的器件尺寸和系统框图环节确定的
,
连接方法 明确成型作品的几何尺寸限制 特别需要注意的是 作品的组装过程需与电子模块安装流程配
, 。 ,
合 同时还要考虑维修的方便性 智能水杯的结构设计如图1.44所示
, 。 。
第一章 开源文化与开源硬件 41华
东
师
图1.44 个性化的智能水杯
范
3. 作品组装
将作品的电子控制系统模块和结构造型模块 按照设计的要求进行组装 检查完整性
, , 。
大
作业练习
学
在详细设计过程中 如果找不到一款完全合适的开源硬件开发板或驱动程序 是否意味着设计无法进
, ,
行 请思考如何充分利用开源社区提供的开放资源提高创新设计的能力
? 。
出
四、 调试优化
版
完成作品各模块制作 集成后 还必须进行功能的测试与调试 优
、 , ,
化设计方案并完善作品
。
测试与调试要根据所测内容设计合适的流社程 配置相应的环境
, ,
帮助确定并隔离出现问题的模块 查明原因并落实修正措施
, 。
探 究 活 动
在完成硬件模块搭建和软件编程后 要按照要求对每项功能进行测试 测试的目的是检验作品在功
, ,
能 结构和性能等方面能否达到预定的要求 若发现错误 则修改相应软件和硬件 直到测试无误 在测
、 。 , , 。
42 开源硬件项目设计试的基础上 还要对设计方案和作品进行较为全面的评估 并依据评估结果 对系统进行优化 调试与优
, , , 。
化主要包括 借助调试环境和测试工具 观察测试系统运行过程中的现象 发现错误及时纠正 调整硬件模
: , , ;
华块 提高信息检测与显示的准确性和可靠性 设计和优化作品的设计方案 增强作品的功能 提升系统的性
, ; , ,
能以及使用体验的友好性
。
【活动步骤】
1. 功能测试
东
逐一测试智能水杯的功能 以列表形式 如表1.13所示 将测试时的现象描述清楚 如果存在功能错误
, ( ) , ,
则需判明原因并加以修改 必要时可以重复上述的设计过程 直到所有功能都满足 并完成功能测试表
。 , , 。
表1.13 智能水杯功师能测试表
编号 功 能 现象描述 错误原因判断
1 温度测量和显示 能正常显示水温 无错误
2 剩余水量范显示和警示 能正常显示剩余水量 无错误
3 喝水提醒 能定时播放音乐 无错误
4 时间和缺水警示阈值设定 能正常设置 无错误
大
2. 作品优化
通过了测试的作品可进行演示 收集反馈信息后修改需求表 开始迭代优化 提高作品质量
, , , 。
学
作业练习
出
1. 在调试中发生功能错误 一般是采用什么样的方法定位错误发生的原因 如果水杯无法显示水温
, ? ,
应该先检查什么 再检查什么
? ?
版
2. 万用表和示波器在查找 定位错误时都是常用的仪器 两者在具体使用时又有哪些不同
、 , ?
社
五、 项目发布与共享
开源的意义在于 它一方面给了开发者一个较高的起点 使得他
, ,
们能够从低价值的重复工作中解放出来 站在前人的肩膀上开展高价
,
值的创新活动 另一方面 开源也给了发布者分享资源的舞台 使得发
; , ,
布者的想法和创意能够迅速传播
。
开源硬件项目设计的最后一个重要步骤是项目的发布与共享 这
,
第一章 开源文化与开源硬件 43既是我们为开源做贡献的一种方式 也是从开源获取回报的一个途
,
径 因为通过开源 我们可以巩固现有技能 遇见 志同道合 的伙伴
。 , 、 “ ” 、
寻找导师或者尝试帮助他人 学习领导和管理的艺术 探索更多创意
、 、 ,
华
等等 为开源贡献力量 得到的回报就是能够学到更多 受教更多 并
。 , 、 ,
且可以从中锻炼很多能力
。
东
探 究 活 动
智能水杯设计制作完成后 可以作为开源项目设计的案例在某个开源社区上发布 发布前 先要了解
, 。 ,
师
开源硬件项目发布需要注意的有关事项 选择一个开源社区 学习开源硬件项目发布与共享的方法
, , 。
【活动步骤】
1. 注册项目账号 在开源社区网站注册项目专用的账号 并创建项目 上传软件代码和设计文档
。 , , 。
2. 合理地组织代码和文档 在分享源代码给公众之前 一方面需要认真考虑代码的组织方式 包括文
。范 , ,
件目录结构 代码风格等 另一方面要制作文档 给出明确的开发指南 这样 其他人就能方便地获取源文
、 , , 。 ,
件 轻松地读懂源代码 全面地了解项目的设计思路 进而为项目的设计提供新的建议 由此真正达到资源
, , , ,
共享 迭代创新的目的
、 。
大
3. 选择开源许可证并发布项目 在开源硬件项目的设计正式发布之前 还有一件很重要的事情是选
。 ,
择一个合适的开源许可证 选好后应遵循开源许可证规则发布相关的硬件设计和软件代码 实现资源
。 ,
共享
。
4. 宣传和维护 做好项目的宣传 让更多人参与
学
到你的项目中 同时定期登录社区 查看相关的留言
。 , 。 ,
和建议 及时更新以完善项目的实施
, 。
出
作业练习
1. 归纳总结开源硬件项目的设计过程 说明在开发开源项目的各个阶
,
版
段分别需要提交哪些技术资料以及如何对项目进行评估
。
2. 为开源做贡献并不意味着总要提交代码 也可以通过设计界面 编写
, 、
文档 组织活动 检查他人代码等方法来为开源做贡献 举例说明你能为开
、 、 。
源贡献什么
。 社
44 开源硬件项目设计第 二 章
开源硬件系统的输入和输出
本章学习目标
!
通过制作开源硬件系统的输入和输出部分"理解开源硬件系统的基本组
成"掌握输入与输出的多种实现方式#
!
能根据项目需求分析设计开源硬件产品的开发方案"知道产品各组成部
分的功能及相互间的调用关系#
!
能根据设计方案和开源硬件使用说明选择合适的开源硬件"会测试与优
化产品设计方案#
!
能根据设计方案搭建产品的各种功能模块#
!
通过设计!制作机器伙伴"经历发现问题与解决问题的过程"体验开源硬
件项目的开发流程#一个完整的信息处理系统 通常都会有输入与输出部分 例如 日常生活中的计算机主机
, , , ,
一般都连接了输入/输出设备 如打印机 键盘和鼠标等 有些设备只有输入功能 如键盘和鼠
, 、 , ,
标 有些设备只有输出功能 如打印机 开源硬件系统有多种输入/输出方式和输入/输出设备
, 华, 。
可以灵活选择与搭配 传感器可以将环境中的声 光 电 磁 温度 湿度等转化为电信号 计算
。 、 、 、 、 、 ,
机对这些输入的电信号进行处理后 执行器响应处理结果 完成特定任务 灵活多样的传感器
, , 。
和执行器组合方东式 构成了开源硬件系统的输入/输出设备 能够满足人们的不同需求
, , 。
在本章中同学们将学习开源硬件系统的输入与输出 灵活地调用与创造不同的输入与输
,
出组合 动手制作简单的输入/输出产品 在设计与制作产品的过程中 同学们需要进一步思
, 。 ,
师
考 如何设计产品方案 如何选择合适的输入/输出方式
: ? ?
范
大
本章知识结构
学
出
版
社
46 开源硬件项目设计项目主题 打造机器伙伴
华
项·目·情·境
如今 越来越多的机器装置正在以一种类似 机器人 的形态与我们的学习 工
, “ ” 、
东
作 生活 娱乐紧密关联 机器人 一词最早出现在 20世纪初的一本科幻小说中
、 、 ,“ ” ,
但机器人并非是在外形上与人类相似的机器装置 事实上科学家们认为 机器人是
, “
一种自动化的机器 能够依靠自身的动力和控制能力完成某种任务
, ”。
机器人就像人类的 伙伴 一样为人类提供特定的服务 它获取输入数据 执行
师
“ ” , ,
特定的输出 复杂的机器装置能代替人进行部分体力和脑力劳动 在学习和生活
, 。
中 我们常遇到一些小烦恼 比如 夜间需要开灯时 发现开关离得太远 学习时 发
, , : , ; ,
现自己始终无法集中注意力 学习效率不高 晚上沿路跑步时 路上的车辆太多 存
, ; , ,
范
在一定的安全隐患 那么 怎样利用开源硬件设计机器伙伴帮助我们解决这些实
。 ,
际问题呢 机器伙伴是如何获得输入信息 如何处理信息以及如何完成特定输出
? ,
的呢
?
本章我大们将在分析上述问题的基础上 选择合适的开源硬件器材 设计制作自
, ,
己的机器伙伴 编写程序并进行调试 最后在小组内展示 分享自己的作品
, , 、 。
学
项·目·任·务
出
任务1 任务2 任务3
设计一个感应机 设计一个定时提 设计一个安全机
器伙伴,使之能够感应 醒机器伙版伴,使之能够 器伙伴,使之能够发出
到你的存在,并在特定 自动地帮助我们更好 个性化的醒目灯光,在
情境下作出反应。 地规划时间。 夜晚提醒过往车辆。
社
第二章 开源硬件系统的输入和输出 47第一节 开源硬件系统的微控制器
计算机的输入设备接收到的信息包括数字量和模拟量两大类 在
,
华
开源硬件系统里 微控制器接收输入设备的信息进行处理 然后发送
, ,
给输出设备 这些信息也有数字量和模拟量之分
, 。
东
体 验 思 考
微控制器是如何处理数字量和模拟量的呢 图 2.1展示的是微控制器的输入/输出接口 它是如何分
师? ,
辨出要从哪个接口读取数据 又是从哪个接口把数据发送出去的呢
, ?
范
大
学
图2.1 微控制器的输入/
输出接口
出
一、 微控制器的组成
版
微控制器是通过芯片上的引脚与外部的输入 输出设备连接的
/ 。
随着科技的快速发展 微控制器集成的功能模块增多 其功能也日益
社
, ,
强大 与此同时 电子设备小型化对微控制器的封装尺寸提出了严格
。 ,
要求 芯片能够放置的引脚数目受到限制 其内部的所有模块一般无
, ,
法同时连接到芯片引脚上
。
以 开发板使用的微控制器为例来说明 该芯片
ArduinoUno ,
内部组成如图2 2所示 可以看到微控制器芯片有多种接口
. ,
模块
。
组成个人计算机主板的必备器件 比如中央处理器 内存 输入
, 、 、 /
48 开源硬件项目设计华
东
师
图2.2 典型的微控制器内部组成
示意简图 范
输出接口等都可以在微控制器中找到 图22中 时钟生成模块产生
。 . ,
大
时钟控制信号以控制系统运行 复位电路模块可产生内部复位信号以
;
控制系统从最初始的状态开始运行 闪存保存程序固件代码
; ;SRAM
用于系统运行时存储信息 数字 模块提供基本的输入 输出功能
; I/O / ;
学
芯片的边沿是引脚
。
微控制器为了更好地适应不同应用场合的需要 还增加了一些常
,
用的专用模块来增强系统的功能 如图22中的 接口模块等
, . UART 。
这些接口功能模块在使用出时一般都需要通过引脚连接到外部的对应
设备才能够发挥作用 为方便用户开发和使用 开发板
。 ,ArduinoUno
将微控制器的大部分引脚连接到了开发板的接插件上
。
版
二、 微控制器的引脚
开发板的引脚分布如图社23所示 开
ArduinoUno . 。ArduinoUno
发板除了用黑色标记的电源 芯片复位等特殊的引脚之外 还有20个
、 ,
可用于通用输入 输出 的引脚 它们被分为3个 端口
/ (GPIO) , GPIO ,
分别是 和 一般简写为 和 因
PORTB、PORTC PORTD, PB、PC PD。
为微控制器芯片引脚数目的限制 大部分引脚无法做到单独应用于一
,
个特定功能 所以很多数字引脚还同时连接到了内部的多个接口功能
,
模块上 这些数字引脚也可以作为内部功能模块 如 2
。 ( UART、IC、SPI
等 引脚 输入引脚或者 输出引脚使用 因此引脚的功能
) 、ADC PWM 。
第二章 开源硬件系统的输入和输出 49图2.3 Arduino Uno引脚和引
脚复用功能示意图
都不是单一的 而是根据固件程序运行时对该引脚的配置 确定该引
, ,
脚连接到哪个特定的功能模块或者是否作为普通的数字引脚使用 这
,
样的设计被称为 引脚功能复用 其特点是 具有复用功能的引脚在
“ ”。 ,
同一时间只能体现一种功能 比如引脚 4和 5如果被设置为用于
, A A
2 的通信 那么它们就无法同时被用于模拟输入
IC , 。
引脚的复用功能可以在图23中查询 以 开发板
. 。 ArduinoUno
上蓝色14号数字引脚为例 该引脚还连接有代表模拟输入功能的绿
,
色 0 标签和代表通用输入 输出功能的黄色 0 标签 据此可以
“A ” / “PC ” 。
了解 该引脚既可以作为数字输入 输出接口 又能连接内部的模数转
, / ,
换模块输入通道 0 开发板的3号 5号 6号 9
ADC 。ArduinoUno 、 、 、
号 10号 11号数字引脚除了具有数字输入和数字输出功能 还具有
、 、 ,
模拟输出 输出 的功能 在其引脚编号旁边有相应的
(PWM ) , “~”
标志
。
微控制器运行时复用引脚使用的实际功能是通过软件编程体现
引脚配置的方式来确定的 示例如下
。 :
1 实现数字输入配置
()
开源硬件项目设计
华
东
师
范
大
学
出
版
社
14 设定14号引脚为输入模式
pinMode INPUT
= 14 读取14号引脚信号电平
value digitalRead
502 实现模拟输入配置
()
第二章 开源硬件系统的输入和输出
模拟引脚不需要使用 函数 将其指定为输入或者输出模式
pinMode
= 0 采集14号引脚上的模拟信号
value analogRead A
3 实现数字输出配置
()
14 设定14号引脚为输出模式
pinMode OUTPUT
14 设定14号引脚输出高电平数字信号
digitalWrite HIGH
14 设定14号引脚输出低电平数字信号
digitalWrite LOW
4 实现模拟输出 输出 配置
() (PWM )
华
东
师
11255 设定11号引脚为 模拟 输出 取值范围0 255
analogWrite PWM ~
范
三、 数据的输入/输出方式
大
微控制器通过执行输入和输出相关的指令来完成数据的输入和
输出 执行数据输入的条件是 外部设备的数据准备好提供到微控
。 :
制器并且微控制器准备好接收 对应地 执行数据输出的条件是 外
。 , :
学
部设备准备好接收数据并且微控制器准备好发送数据 为有效完成
。
数据的输入和输出 必须在对应的条件满足时才执行相应的输入和输
,
出指令 可以采用轮询和中断这两种方法来完成微控制器的输入和
。
出
输出
。
轮询是让微控制器以一定的周期按顺序查询每一个外部设备 看
,
它们是否有数据输入 输出的要求 若有 则进行相应的输入 输出服
/ , , /
务 若无 就接着查询下一个外部设版备 其明显的缺点是 利用率
, , 。 CPU
低 实时性比较差 比如 同学们在学校自修教室里上晚自习 并计划
, 。 , ,
每学习一个小时休息十分钟 因此会每隔一段时间去查看手表 看看
, ,
一个小时到了没有 如果没到则继续自习社如果到了就停止自习 在自
, , ,
修教室内开始休息十分钟 这种不断查看手表的方式对于自习的效
。
率有很大的影响 此例中休息十分钟就好比是完成了一个输入 输出
。 /
的服务 而每隔一段时间查看手表就好比是轮询
, 。
中断则是指微控制器在正常运行程序的过程中 由于预先安排或
,
突发随机事件 中断正在运行的程序 转到为应对此事件而专门设计
, ,
的中断服务程序 中断服务程序的调用是由 来调度自动完成的
, CPU 。
其优点是 利用率高 实时性好 仍以上晚自习为例 假设同学们
CPU , 。 ,
51设置了每隔一个小时响一次的定时闹钟 听到闹钟响后 暂停自习并
, ,
记录所学内容所在的页码 然后离开自修教室到操场上休息十分钟
, ,
休息完毕回到自修教室再从标记的页码开始继续自习 这样的方式
。
较之前一种方式 自习的效率有所提高 此处 在自修教室上晚自
, 。 ,“
习 这个事件就相当于主程序 闹钟响起 可认为是中断请求 而 每
” ,“ ” , “
隔一个小时离开自修教室到操场上休息十分钟 就好比中断响应 标
” ,“
记的页码 可认为是断点 结束休息后回到自修教室继续从标记的页
” ,“
码开始继续学习 就好比中断返回 继续执行主程序 中断流程示意
” , 。
图如图24所示
. 。
图2.4 中断流程示意图
以下是一段程序 程序的功能是通过定时器中断 使得13号引脚
, ,
的 以500 的间隔闪烁
LED ms 。
开源硬件项目设计
华
东
师
范
大
学
出
< > 调用定时器扩展库 头文件
#includeTimerOne h TimerOne
voidsetup
13 设定13号引脚为输出模式
pinMode OUTPUT
版
初始化定时器 每500 调用一次定时器中断服务函数
ms
1 500000
Timer initialize
设定 函数为定时器中断子程序
reFresh
社
1
Timer attachInterrupt reFresh
voidloop
中断服务程序
voidreFresh
读取13号引脚的电压 并取反输出
13 13
digitalWrite digitalRead
52其中 函数是主程序 函数是中断服务程序 程
,loop() ,reFresh() 。
序运行后 首先执行主程序 这段主程序里没有任何代码 即什么也
, , ,
不执行 直到微控制器接收到定时器传来的中断请求 主程序暂停
, , ,
华
生成一个断点 保存当前的主程序运行状态 转而响应中断 执行中
, , ,
断服务程序 待中断服务程序执行完毕 返回至主程序的断点处 恢
, , ,
复到先前的主程序运行状态 继续执行主程序 直到接收到下一个
, ,
东
中断请求
。
作业练习
师
查阅资料 比较常见的开源硬件开发板的数字和模拟引脚数量 填写
, ,
表2.1
。
范
表2.1 常见的开源硬件开发板的数字引脚与模拟引脚
硬件平台 开发板 数字引脚数 模拟引脚数
大Uno
Arduino Nano
Due
学
树莓派
虚谷号 /
掌控板 /
出
版
社
第二章 开源硬件系统的输入和输出 53第二节 开源硬件系统的输入
开源硬件系统的输入可以有多种形式 如人机交互的鼠标 键盘
, 、 、
华
触摸屏等 也可以使用能自动采集数据的传感器 传感器可以感应周
, 。
围的环境变化 可用来测量物理量 并将数据返回给系统处理 以便系
, , ,
统根据数据作出相应的响应
。
东
体 验 思 考
师
人有五官 并且通过听觉 视觉 嗅觉 味觉 触觉来感知世界 如何让机器也能够尽可能地感知这个
, 、 、 、 、 。
世界呢 我们可以为机器打造 五官 吗
? “ ” ?
范
一、 数字信号输入
大
1. 按键
学
按键是常见的数字输入型电子元件 按下时闭合 处于导通状
, ,
态 按键交互一直以来是人机交互的常用方式 从机器主体的角度
。 。
考虑 按键可以作为机器与外界交互或与人沟通的渠道 如图25
, 出 ( .
所示 比如生活中的各种家用电器 按下开关时 通常都有一个
)。 , ,
电源指示灯亮起 表明其处于工作状态 图26给出了几个常用
, 。 .
的按键开关
。
版
社
图2.5 人机交互 图2.6 常用的按键开关
中的按键
54 开源硬件项目设计知 识 延 伸 上拉电阻和下拉电阻
如果将按键或其他的开关型元件作为输入模块 需要将其状
华 ,
态的改变转化为相应电压的变化 才能使其被开源硬件系统识
,
别 Arduino开发板的数字引脚在没有外接电子元件时 其相应
。 ,
电压的状态是不确定的 可以用一个上拉电阻或下拉电阻把
。
Arduino东开发板引脚的状态确定下来 其中上拉电阻的一个引脚
。
连接到正向电压VCC而下拉电阻的一个引脚直接接地
, 。
上拉电阻的工作原理可参考图 2.7 当开关 S断开时 根据
。 ,
欧姆定律 Vout VCC即 Vout得到高电平 当 S闭合时 GND
, ≈师, ; ,
和Vout短接 Vout 0即Vout得到低电平 下拉电阻的工作原
, ≈ , 。
图2.7 上拉电 图2.8 下拉电阻
理与上拉电阻的相似 如图2.8所示
, 。 阻连线 连线
上拉电阻和下拉电阻不仅可以将开关状态转变为能被
Arduino开发板识别的高 低范电平 还可以防止在S闭合时VCC和GND出现短路
、 , 。
2. 传感器大与感官
人需要借助感觉器官来感知外界的各种信息 而我们的开源硬件
,
系统可以利用传感学器来感知外界信息
。
传感器有多种分类 按照用途和应用场景来分 有开关传感器 温
, , 、
湿度传感器 超声波传感器 光敏传感器 压力传感器 声音传感器 加
、 、 、 、 、
速度传感器 红外传感器 角度传感器 重力传感器 传感器等 按
出
、 、 、 、GPS ;
数据输入方式又可大体分为数字式传感器和模拟式传感器 数字式传
,
感器能直接输入数字信号 模拟式传感器能采集外界连续变换的物理
,
信号 它往往需要相应的连接引脚配备
, 版 ADC。
探 究 活 动
社
声音传感器能获取什么信息 查阅资料 试着在表2.2中填写与人的感官对应的传感器 以及它所能
? , ,
获取的信息
。
表2.2 人的五官感觉 超五官感觉与对应的传感器的比较
、
人的感觉 对应的传感器 传感器获取的信息
听觉 声音传感器 外界声音的强度
视觉
第二章 开源硬件系统的输入和输出 55(续 表)
人的感觉 对应的传感器 传感器获取的信息
触觉
味觉
嗅觉
非五官感觉 红外线传感器
Ⅰ
非五官感觉 陀螺仪传感器
Ⅱ
项 目 实 践
机器的开和关 可以通过按键来实现 按键是机器最常用的控制元件 LED是机器最常用的状态显示
, , ,
元件 将按键用作机器的开关 通过手动控制LED的亮灭来显示机器的工作状态
。 , 。
【项目器材】
Arduino Uno按键开关 红色M5直插LED220 电阻 10k 电阻 面包板 杜邦线
、 、 、 Ω 、 Ω 、 、 。
【系统框图】
机器开关系统框图如图2.9所示
。
LED
图2.9 机器开关系统框图
【操作步骤】
1. 按照图 2.10连接电路 将按键通过面包板接到 Arduino
,
Uno开发板数字8号引脚 红色LED接到数字12号引脚 也可
, 。(
以用其他引脚 但最好不选用0号和1号引脚 因为0号和1号引
, ,
脚同时也是串口通信接口 这属于引脚功能的复用
, 。)
2. 编写程序 实现当按键按下时 LED亮起 当按键按下时
, 。 ,
数字8号引脚输入为高电平 控制数字 12号引脚输出高电平
, ,
LED亮起 当按键未按下时 数字 8号引脚输入为低电平 控制数
; , ,
图2.10 机器开关实物连接图
字12号引脚输出为低电平 LED不亮
, 。
【核心程序】
开源硬件项目设计
华
东
师
范
大
学
出
版
社
=12 定义 接口为12号引脚
intledpin LED
=8 定义按键输入为8号引脚
intinpin
定义变量
intval val
voidsetup
56第二章 开源硬件系统的输入和输出
定义 接口为输出接口
pinMode ledpin OUTPUT LED
定义按键接口为输入接口
pinMode inpin INPUT
华
voidloop
= 读取8号引脚电平值 并将其赋给
val digitalRead inpin val
== 检测按键是否按下 按键按下时 亮起
if val东LOW LED
给12号引脚低电平
digitalWrite ledpin LOW
else
师给12号引脚高电平
digitalWrite ledpin HIGH
范
体 验 思 考
大
1. 能否将loop()中的程序代码用digitalWrite(ledpin digitalRead(inpin));来代替
, ?
2. 如要实现当按键按下再弹起后LED在点亮和熄灭两种状态之间切换 程序应如何设计
, ?
学
技 术 支 持 面包板的使用
出
面包板(如图2.11所示)是一种通用插座板 各种电子元器件可根据需要插入或拔出 不需要进行焊
, ,
接 这样可以快速构建电子电路的实验系统 另外 面包板上的元件可以重复使用 适合进行电子电路实
, 。 , ,
验的组装 操作和调试
、 。
版
社
图2.11 面包板正
反面对比图
57二、 模拟信号输入
模数转换也是微控制器的重要功能之一 在 328 的内
华 。 ATmega P
部集成了一个10位精度的 该 可接受0 5 的模拟电压
ADC, ADC ~ V
输入 它将 的6个输入 输出接口作为输入通道 对应在
。 PORTC / ,
开发板上即为 0 5引脚
ArduinoUno A ~A 。
东
1. 电位器
师电位器 如图212所示 一般有三个引脚 它本质上是一个滑动
( . ) ,
变阻器 通过滑动或旋转接触的方式改变电阻的值 进而改变电路的
, ,
输出电压 如果使用中间的引脚 则它可以作为可变电阻使用 如果
。 , ;
只使用范两边的引脚 则它可以作为定值电阻使用 电位器工作原理图
, 。
图2.12 电位器
如图213所示 它的三个引脚中 一般中间引脚用于输出可变电压
. 。 , ,
两边的引脚分别接地和接固定电压
。
大
2. 模拟输入引脚的编程控制方法
开发板有6个模拟输入引脚 和
ArduinoUno 学 (ArduinoMini
开发板有8个 2560开发板有16个
ArduinoNano ,ArduinoMega ),
每个引脚接有10位精度的 可以将外部的电压信号转换为能用
ADC,
10比特表示的数值 电压量程范围是0 5 即输入电压0 5 将
。 出~ V, ~ V
转化为0 1023的整数值 其精度为5 1024个单位 每个单位
~ , V/( ),
约等于00049 即49
. V( .mV)。
要从指定的模拟输入引脚读取值 需要用到 函
图2.13 电位器工作原理图
, 版analogRead(pin)
数 括号中的参数 为相应引脚号 函数返回值为整数型 范围为
, pin , ,
0 1023
~ 。
值得注意的是 如果模拟输 入 引 脚 没 有 进 行 任 何 连 接
, ,
社
的返回值也会因为某些因素而波动
analogRead() 。
项 目 实 践
随着传感器类型的不断丰富 机器感知外部不同类型的信息也越来越方便 声音传感器能将外界声
, 。
音信息转化为电信号 就好像给机器加上了 耳朵 使其能感知外界声音大小的变化
, “ ”, 。
【项目器材】
Arduino Uno开发板 声音传感器模块 杜邦线
、 、 。
58 开源硬件项目设计【系统框图】
机器耳朵系统框图如图2.14所示
。
图2.14 机器耳朵系统框图
【操作步骤】
1. 实物连接 按照图2.15连接 其中声音传感器
。 ,
的信号输出端也可以连接到 A1~A5这些支持模拟输
入的引脚
。
2. 编写程序 实现声音的获取和显示
, 。
3. 观察结果 点击 Arduino IDE工具 菜单下的
。 “ ”
串口绘图器 命令 在相应窗口中观察外界声音大小
“ ” ,
对生成波形的影响 如图2.16所示 图2.15 机器耳朵实物连接图
, 。
图2.16 观察声音的波形
【关键程序】
第二章 开源硬件系统的输入和输出
华
东
师
范
大
学
出
版
社
voidsetup
9600 初始化串口传输率为9600
Serial begin bps
voidloop
= 0 读取 0引脚的输入值
intsensorValue analogRead A A
串口窗口中显示获取的值
Serial println sensorValue
100 延迟100
delay ms
59作业练习
设计一个噪声监测仪 通过 LED的亮度实时反映噪声的强弱 噪声变
华 , :
大时 LED变亮 当噪声超过一定检测值时 蜂鸣器响起
, ; , 。
东
三、 机器伙伴·感应节能夜灯
项 目 实 践
师
制作一个节能机器伙伴 感应节能夜灯
——— 。
【需求分析】
范
晚上 当有人经过时 灯自动亮起 过段时间之后 灯自动熄灭
, , , , 。
【功能设计】
1 当检测到光线低于一定阈值并且有人经过时 点亮LED
() , 。
2 LED每次点亮会持续30s如果上一大条件仍然满足 LED继续点亮
() , , 。
【软硬件设计】
1 主控板的选择
()
根据项目需求和开源硬件各种开发板的特点 结合表2.3选择合适的开发板 你可以自己添加需求
, 学, 。 ,
看看主控板是否满足
。
表2.3 感应节能夜灯开发板选材表
出主控板是否满足项目要求
考虑因素 项目要求
Arduino 树莓派
尺寸 中等大小 是 是
运算能力 低 是 是
版
模拟输入接口1个
接口类型与数量 数字输入接口1个
数字输出接口1个
电池供电情况 支持电池供电 社
操作系统情况 不需要操作系统支持
结论
2 检测元件的选择
()
检测光线可用数字式光敏传感器 检测人体可选用超声波传感器 声音传感器 人体红外传感器 摄像
, 、 、 、
60 开源硬件项目设计头等 请查阅相关资料 比较这几个传感器 说明选用某个传感器的理由 并填写表2.4
。 , , , 。
表2.4 传感器选择
华
传感器名称 输入信息类型 可行性分析
超声波传感器
声音东传感器
人体红外传感器
摄像头
师
3 系统框图
()
感应节能夜灯系统框图如图2.17所示
。
范
LED
图2.17 感应节能夜灯
大
系统框图
4 流程示意图
()
感应节能夜灯流程示意图如图2.18所示
。学
出
@
@ 版
社
)*
图2.18 感应节能夜灯流程示意图
5 硬件模块搭建
()
准备的器材有 人体红外传感器 HC SR501或其他感应传感器 光敏电阻 红色 M5直插 LED
: ( )、 、 、
220 电阻 10k 电阻 面包板 杜邦线
Ω 、 Ω 、 、 。
第二章 开源硬件系统的输入和输出 61感应节能夜灯实物连接图如图2.19所示
。
图2.19 感应节能夜灯实物连接图
6 关键代码
()
开源硬件项目设计
华
东
师
范
大
获取光线的模拟数值 函数的返回值范围是0 1023
analogRead ~
= 已定义为 0
intlightValue analogRead lightSensor lightSensor A
学
获取当前人体红外值1为有人0为没人 已定义为4号引脚
sensorPin
=
inthumanHeatValue digitalRead sensorPin
当入射光弱时 光敏电阻增大 亮度阈值要根据实际情况调整
出
600 ==1
if lightValue> &&humanHeatValue
如果光线暗并且也有人经过 则亮灯
digitalWrite ledPin HIGH
30000
delay
版
如果光线亮或没有人 则灭灯
else digitalWrite ledPin LOW
【调试优化】
社
上述程序中将亮度阈值设为600我们具体操作时 需要根据实际情况进行修改 试着完善程序 增加
, , 。 ,
相应的串口输出语句 在表2.5中记录在不同光线情况下A0引脚得到的模拟值 请结合表2.5用合适的
, 。 ,
数值代替程序中原来的亮度阈值 并查看运行结果
, 。
表2.5 不同光线情况下的运行结果
光线情况 很暗 较暗 较亮 很亮
得到的模拟值
62体 验 思 考
华
和同学讨论 为什么LED串联的是220 电阻 而光敏电阻串联的是10k 电阻?
: Ω , Ω
东
技 术 支 持 超声波测距
超声波测距模块(如图2.20所示)可以通过发送和接收超声波 利用发送声波和接收到回波的时间差
, ,
以及声音的传播速师度 来计算距离 设超声波在空气中的传播速度为v测出发送声波和接收回波的时间
, 。 ,
差为t则模块到前方障碍物的距离s=v×t/2
, 。
以常用的HC SR04模块为例 我们来看看超声波测距模块的工作原理和过程 图2.21表明了超声
, 。
波测距原理 首先向HC SR04模块的Trig引脚输入持续至少10 s的高电平脉冲 这时模块就会自动发
, 范 μ ,
送8个40kHz的方波 并自动检测是否有信号返回 如果接收到返回信号 模块就会通过Echo引脚输出
, 。 ,
高电平 高电平持续的时间就是超声波从发送到返回的时间 据此就可以计算出模块到障碍物的距离=(高
, ,
电平时间×声速)/2
。
大
学
出
图2.20 超声波测距模块结构图 图2.21 超声波测距原理
超声波测距引脚连接如表2.6所示 参考连接图如 图2.22所示版
, 。
表2.6 超声波测距引脚连接对照表
社
Arduino Uno 超声波模块
5V引脚 VCC
3号引脚 Trig
2号引脚 Echo
GND引脚 GND
第二章 开源硬件系统的输入和输出 63图2.22 超声波测距各模块连接图
超声波测距的参考程序代码如下
:
开源硬件项目设计
华
东
师
范
3 超声波传感器引脚 连接到 开发板3号引脚
#defineTrig Trig ArduinoUno
2 超声波传感器引脚 连接到 开发板2号引脚
#defineEcho Echo ArduinoUno
自定义测距函数
floatdis inttrigpin intechopin
大
floatcm temp
给 发送一个低电平
digitalWrite trigpin LOW Trig
2 等待 2
delayMicroseconds μs
给 输入持续至少10 的高电平信号以触发测距
Trig μs 学
digitalWrite trigpin HIGH
10 等待 10
delayMicroseconds μs
给 发送一个低电平
digitalWrite trigpin LOW Trig
= 存储回波等待时间出单位为
temp float pulseIn echopin HIGH μs
= 17 1000 通过回波时间 计算距离
cm temp* μs cm
returncm
版
voidsetup
9600
Serial begin
pinMode Trig OUTPUT
社
pinMode Echo INPUT
voidloop
串口窗口中显示获取的值
Serial println dis Trig Echo
100 延迟100
delay ms
64体 验 思 考
1. 上面程序中计算距离的公式为temp 17/1000该公式是怎么简化得到的
华 * , ?
2. 以上案例使用了超声波来测距 同理 能不能利用光来测距 光的速度对测量距离来说有什么问题
, , ? ?
东
知 识 延 伸 ToF
ToF即time of flight指通过光的传播时间来计算距离 其基本原理是根据发射器发射和接收器接收
, ,
光脉冲的时间差计师算光脉冲的往返时间 进而计算摄像机与物体之间的距离 这种方式要求发射器和接
, 。
收器尽可能地集成 时间测量尽可能准确 这样才能保证距离测量的准确性
, , 。
范
作业练习
当病人在医院输液时 输液速度一般不能及时显示 且结束后需要病人
, ,
大
按动按钮通知护士前来换液 能不能做一个自动装置既可检测输液速度 又
。 ,
可以在输液结束后自动传唤 和同学分组讨论 并提交输液速度提示器的项
? ,
目设计方案
。
学
出
版
社
第二章 开源硬件系统的输入和输出 65第三节 开源硬件系统的输出
多种多样的传感器让机器的输入方式更灵活 机器可以更好地感
,
华
知和响应外界信息 一个完整的机器既有多种输入方式又有多种形
。
式的输出 开源硬件项目中 输出方式分为数字信号输出和模拟信号
。 ,
输出 可以输出各种声光效果 显示图像 做机械动作等
, 、 、 。
东
体 验 思 考
师
如果将机器和人体比较 能否找出与执行部件对应的人体表情语言和肢体动作
, ?
范
一、 数字信号输出
用 可以完成的交互产品有很多 最常见也最常用的是声
Arduino大 ,
光展示 实现灯光效果最常用的是 而能够发出声音的最常用的
。 LED,
元器件是蜂鸣器或音频播放模块 可以用蜂鸣器为机器添加上属于
。
它的 嘴巴 让机器发声
“ ”, 。
学
技 术 支 持 常用元器件及其使用方法
出
1. LED
LED即发光二极管 是半导体二极管的一种 能够将电能转化为可见光 具有体积小 亮度高 功耗低
, , , 、 、 、
效率高 寿命长的特点 LED常在电路及仪器中用作指示灯 或用来显示文字及数字 图2.23是 LED效
、 。 , 。
果图 版
。
LED具有红 绿 蓝等多种颜色 可以根据需要选用 一般来说 外置的 LED接到 Arduino开发板上
、 、 , 。 ,
需要串联限流电阻 Arduino Uno开发板集成了一个可编程控制的LED 常见的LED如图2.24所示
。 。 。
社
图2.23 LED效果图 图2.24 常见的LED
66 开源硬件项目设计2. 蜂鸣器的使用方法
蜂鸣器(如图2.25所示)主要可分为有源蜂鸣器和无源蜂鸣
器两种 有源蜂鸣器内部带有震荡源 只要通电就能发声 而无源
, , ,
蜂鸣器内部不含震荡源 需要以一定频率的方波去驱动才能
,
发声
。
蜂鸣器简单控制程序如下
图2.25 蜂鸣器
:
第二章 开源硬件系统的输入和输出
华
东
=0 80 ++
for i i< i
蜂鸣器连接在8号引脚 高电平时发声音 低电平时不发声音
8
digitalWrite 师 HIGH
1
delay
8
digitalWrite LOW
1 也可试着将参数改为2看能否产生不一样的声音
delay
范
如要让蜂鸣器发出特定频率的声音可使用tone()函数 有以下两种格式
, :
1 tone(pin frequency)向指定引脚发送相应频率的方波 需要执行noTone()函数来停止
() , , , 。
2 tone(pin frequency durat大ion)参数duration是发送方波持续的时间 到时自动停止发送 不需
() , , , , ,
要执行noTone()函数
。
利用tone()函数播放音乐时 各个音符对应的频率可参考表2.7
, 。
学
表2.7 C调各音符频率对照表
高音 1 · 2 · 3 · 4 · 5 · 6 · 7 ·
频率(Hz) 1046 1174 1318 1396 1567 1760 1975
出
中音 1 2 3 4 5 6 7
频率(Hz) 523 587 659 698 783 880 987
低音 1 2 3 4 5 6 7
· · · · · · ·
版
频率(Hz) 261 293 329 349 391 440 493
社
项 目 实 践
做一个简单的音乐播放器 来帮我们缓解学习和工作中的疲劳
, 。
【项目器材】
Arduino Uno开发板 蜂鸣器 杜邦线
、 、 。
67【操作步骤】
按图2.26连接各模块 编写程序 让蜂鸣器发出有规律的乐音
, , 。
【关键代码】
图2.26 音乐播放器实物连接图
开源硬件项目设计
华
250 指定每个节拍250 可自己调节
#defineLength ms
12 指定蜂鸣器接在12号引脚
#definePINOUT
将低音、中
东
音、高音的音符频率分别放入数组中 方便调用
261293329349391440493
intToneL
523587659698783880987
intToneM
1046117413181396156717601975
intToneH 师
将需要发出的音符放入数组 方便调用
1234567
intSound
每个音的节拍数1表示1拍05表示半拍
_ 111111范1
floatToneTime
voidsetup
设定指定引脚为输出模式
pinMode PINOUT OUTPUT
大
voidloop
定义一个循环变量
intj
循环调用音符数组中的每个音符
=0 ++ 学
for inti i a 出PWM
11
analogWrite a
10 当前亮度维持10
delay ms
版
500 每次 呼吸 后等待05
delay s
社
2. 电机
电机俗称 马达 它能将电能转换成动能 电机工作时可以产生
“ ”, ,
驱动转矩 可作为各种机械运动的动力源
, 。
电机有很多分类 按工作电源来划分 可分为直流电机和交流电
: ,
机 按工作原理来划分 可分为异步电机 同步电机 按使用用途划分
; , 、 ; ,
71可分为动力驱动为主的驱动用电机和能进行精细运动控制的控制用
电机 其中控制用电机又可分为步进电机和伺服电机
, 。
(1) 直流电机的驱动
华
直流电机一般只有两个引脚 分别接在相应电源的正负极上 接
, 。
上电源后 直流电机就可旋转 如果将连接两个引脚的电线位置调换
, ,
一下 则直流电机将反向旋转
, 。
东
让直流电机旋转需要较大的功率 所以不能直接用开发
,
板为其供电 我们需要另外连接电源 并搭建相应电路来驱动
, , ,
如三极管放大电路和 桥直流电机控制电路 也可以使用专
H ,
师门的电机驱动模块来驱动直流电机
。
298 是常用的包含 桥的电机控制芯片 如图231所
L N H , .
示 298 作为电机驱动模块 可以独立控制两路电机 驱动
。L N , ,
范两个电机工作
。
298 模块中 1 4则是两路电机输出的转向控制
L N ,IN ~IN
引脚 298 电机驱动模块逻辑功能表如表28所示 当
。L N . 。
1和 2同为高电平或低电平时 电机输出端 连接的电
大
IN IN , A
机都会停止转动 当 1和 2输入信号为一高一低时 输出
; IN IN ,
图2.31 L298N电机驱动模块
端 连接的电机会朝着不同的方向转动 电机输出端 的转
A 。 B
向则由 3和 4以同样的方式控制
IN I 学 N 。
表2.8 L298N电机驱动模块逻辑功能表
直流电机 旋转方式 IN1 IN2 IN3 IN4 ENA ENB
出
正转 高 低 / / PWM信号 /
反转 低 高 / / PWM信号 /
电机A
停止 高 高 / /版PWM信号 /
停止 低 低 / / PWM信号 /
正转 / / 高 低 / PWM信号
社
反转 / / 低 高 / PWM信号
电机B
停止 / / 高 高 / PWM信号
停止 / / 低 低 / PWM信号
这样 我们就可以通过给 298 模块单独供电 并用微控制器给
, L N ,
以及 1 4提供控制信号的方式来实现对电机转向
ENA、ENB IN ~IN 、
转速的控制
。
72 开源硬件项目设计(2) 舵机
舵机是伺服电机的一种 伺服电机的转子转动角
,
度可以精确控制 由内置的伺服算法和齿轮提供位置
,
反馈
。
常见的舵机 如图232所示 由直流电机和电位
( . )
器构成 常被应用在开源硬件项目开发中 其内部结
, 。
构如图233所示 电位器作为反馈控制传感器 可监
. , ,
控内部芯片和调整转子位置 其中位置控制用
图2.32 常用舵机 , PWM
信号 舵机的 输入只是传输一个信号 其脉冲
。 PWM ,
宽度直接对应舵机旋转角度 如图234所示 但它并
( . ),
不输出功率 功率一般直接由电源提供 常见的舵机
, 。
有三个引脚 分别是接地 电源正极和控制端
, 、 。
图2.33 常用舵机的机械结构
图2.34 舵机的旋转角度控制
舵机的控制程序如下
:
第二章 开源硬件系统的输入和输出
华
东
师
范
大
学
< > 引用舵机的头文件
#include Servo h 出
创建一个舵机对象
Servomyservo
=0 定义舵机的初始角度为0
intpos °
voidsetup
版
指定舵机的数据线连接的引脚为9号引脚 其能进行 输出
PWM
9
myservo attach
社
voidloop
舵机从0转动到180 每个角度停留15
° ° ms
=0 =180 +=1 15
for pos pos< pos myservo write pos delay
73项 目 实 践
放在书桌上的小风扇可以帮我们驱散夏日的炎热 自制小风扇 通过一个旋钮来控制风扇的转速 同
华 。 , ,
时LED显示风扇的转速 当风扇转动变快时 LED变亮 风扇转动变慢时 LED变暗
: , ; , 。
【系统框图】
调速小风扇系统框图如图2.35所示
。
东
师
图2.35 调速小风扇系统框图
【项目器材】
Arduino Uno开发板 小型6V直流电机 L298N直流电机驱动模块 外接12V电源模块 红色M5直
、 范、 、 、
插LED 220 电阻 B50K电位器 面包板 杜邦线
、 Ω 、 、 、 。
【操作步骤】
1. 连接好计算机与Arduino Uno开发板
。
2. 按图2.36所示用杜邦线连接各活动
大
器材 注意所有设
。
备均需要公共接地 除电源线外 L298N模块的 IN1和 IN2引
。 ,
脚连接到Arduino Uno开发板的某两个普通数字 I/O接口 这
,
里选择连接到7号引脚和 8号引脚 ENA引脚连接到 Arduino
; 学
Uno开发板的某一个可进行 PWM输出的数字 I/O接口 这里
,
选择6号引脚 电位器中间引脚连接到模拟输入接口A0另外
。 ,
两个引脚分别接地和 5V电压 LED的长脚连接到可进行
。
出
PWM输出的数字I/O接口
。
3. 适当修改示例程序 对程序进行调试 编译 下载
, 、 、 。 图2.36 调速小风扇实物连接图
4. 旋转电位器旋钮 观察风扇转速和LED亮度的变化 同
, ,
时观察串口监视窗口的输出
版
。
【流程示意】
调速小风扇流程示意图如图2.37所示
。
社
图2.37 调速小风扇流程示意图
74 开源硬件项目设计【关键代码】
第二章 开源硬件系统的输入和输出
298 _ 1=8 定义 298 驱动模块 1连接引脚号
constbyteL NIN L N IN
华
298 _ 2=7 定义 298 驱动模块 2连接引脚号
constbyteL NIN L N IN
298 _ =6 定义 298 驱动模块 连接引脚号
constbyteL NENA L N ENA
voidsetup
东298 _ 1
pinMode L NIN OUTPUT
298 _ 2
pinMode L NIN OUTPUT
298 _ 1
digitalWrite L NIN HIGH
298 _ 2 1高电平 2低电平 电机正向旋转
digitalWrite L师NIN LOW IN IN
voidloop
= 0 读取模拟输入接口 0的值 范围应是0 1023
intval analogRead A A ~
范显示出 的值 方便进行调试
Serial println val val
298 _ 4 控制电机转速
analogWrite L NENA val
5 4 控制 亮度
analogWrite val LED
大
体 验 思 考
学
1. 如果要让电机反向旋转 应该如何修改程序
, ?
2. 当用语句analogWrite()函数控制电机时 为什么要将模拟输入接口A0获得值val除以4作为参数
, ?
3. 仔细观察串口监视窗口的输出 当程序中 val的值比较小时 电机是否旋转 如果不旋转 怎样才
, , ? ,
出
能使电机旋转以达到更精细的控制效果
?
版
三、 机器伙伴·番茄钟
项 目 实 践
社
制作一个时间规划机器伙伴 番茄钟 如图2.38所示
——— , 。
【需求分析】
番茄工作法是一种简单易行的 微观的时间管理方法 即将工作或学习的
、 ,
阶段性时间默认为25分钟 规定这段时间内专注于工作或学习 中途不做任
, ,
何与任务无关的事 直到番茄钟响起或提示灯亮起 这样可以暂时休息一下
, , ,
然后准备进入下一个番茄钟时间
。
图2.38 番茄钟
设计一个番茄钟 当把它放在书桌上时 它可以帮我们集中注意力 更
, , ,
75好地规划和管理时间 提高学习效率 养成节约时间和专心学习的习惯 图2.39是番茄钟的使用示意图
, , 。 。
华
东
师
范
图2.39 番茄钟使用
参考图
【功能设计】
大
番茄钟的基本功能有 至少设计两个按钮 一个用来开始或重置计时 另一个具有关闭定时功能 默
: , , 。
认1个学习阶段为25分钟 规定的时间一到 蜂鸣器发声 演奏乐曲 同时LED闪烁
, , , , 。
此外 还可以添加按钮改变定时的时长 添加多个 LED显示剩余时间 也可采用不同颜色的 LED或
, , , ,
根据LED的不同亮度来显示时间 填写表2.9和表2学.10分析项目活动中LED和按钮的功能
。 , 。
表2.9 灯的状态及其含义
灯的状态 出表达含义
红灯亮 计时中
红灯闪烁 时间到
红灯灭 关闭状态
版
……
社
表2.10 按钮及其对应的功能
按钮操作 功 能
按钮1按下 开始计时/重置
按钮2按下 关闭计时
按钮3按下 显示剩余时间
……
76 开源硬件项目设计【软硬件设计】
1 系统框图
()
华番茄钟系统框图如图2.40所示
。
东
图2.40 番茄钟系统框图
2 流程示意师图
()
番茄钟流程示意图如图2.41所示
。
范
大
学
图2.41 番茄钟流程示意图
出
3 硬件模块搭建
()
准备的器材有 按键开关 蜂鸣器 红色 M5直插 LED 220 电阻 10k 电阻 面包板 杜邦线
: 、 、 、 Ω 、 Ω 、 、 。
实物搭建图如图2.42所示
。 版
社
图2.42 番茄钟实物连接图
第二章 开源硬件系统的输入和输出 774 关键代码
()
计时检测部分关键代码如下
:
开源硬件项目设计
= 获取当前系统运行时间
currentMillis millis
当前时间和开始计时时间之差大于预设值时执行相应语句
if currentMillis-previousMillis>Timeinterval
执行具体功能的相应语句
按键检测部分关键代码如下
:
华
东
1 = 1 更新按键状态
buttonLastState butto师nState
1 = 7 检测按键1的电平输入
buttonState digitalRead
按键1刚按下的瞬间7号引脚的输入由低电平变为高电平
1 1
if buttonState&& buttonLastState
执行具体功能范的相应语句
100 隔01 检测一次按键状态
delay s
体 验 思 考 大
1. 参考的关键代码中 检测的是按钮按下瞬间的电平变化 如果要检测按键在手指松开弹起时的电平
, ,
变化 要如何修改程序
学
, ?
2. 流程示意图中 按键检测模块采用不断轮询检查的方式 也就是在程序中读取相应引脚的输入来判
, ,
断是否有按键被按下 即使没有按键被按下 端口的读取还是要进行 试着讨论一下 这样会带来什么问题
。 , 。 , ?
3. 能否采用中断方式来检测按键 这时流程示意图和程序应如何修改
? ?
出
技 术 支 持 millis()函数与外部中断函数
版
millis()函数: 返回Arduino开发板从运行当前程序开始的毫秒数 函数返回值将在约50天后溢出
。
归零
( )。
外部中断函数: 其格式为attachInterrupt(中断号 服务程序名 触发条件) Arduino Uno和Nano只有
, , 。
引脚2和引脚3支持外部中断 中断号分别是0和1 外部中断的触发条件取值及其社含义如表2.11所示
, 。 。
表2.11 不同的触发条件取值及其含义
触发条件取值 含 义
LOW 低电平
CHANGE 引脚电平发生变化
RISING 引脚电平由0变1,即上升沿
FALLING 引脚电平由1变0,即下降沿
78体 验 思 考
华
如果几个按钮同时按下 会产生怎样的运行结果
, ?
东
四、 机器伙伴·安全警示灯
师
项 目 实 践
制作一个安全机器伙伴 安全警示灯
——— 。
【需求分析】 范
当人们在道路上跑步或骑行时 尤其是处在较暗的外界环境中时 一个安全警示灯显得很有必要 它
, , ,
能够发出醒目的灯光 来提醒附近的车辆 从而保障我们的安全
, , 。
【功能设计】
大
可将警示灯做成像章或臂章样式 可以佩戴在衣服或背包上 警示灯可以用多个 LED来组成有个性
, 。
的图案造型 可以将多个颜色的LED按照颜色分组串联 分别控制 把彩色 LED放在图案中心 要能够通
, , , ;
过按钮来控制LED闪烁的频率 如慢闪 快闪 使不同颜色的LED分别点亮等
, 、 , 。
参照图2.43所示安全警示灯造型 小组讨论学用多个LED组成安全警示灯的图案 绘制草图
, , , 。
出
版
图2.43 安全警示灯效果图
社
【软硬件设计】
1 主控板的选择
()
根据项目需求和开源硬件各种开发板的特点 结合表 2.12选择合适的开发板 也可以自己添加需
, , 。
求 思考主控板是否满足
, 。
第二章 开源硬件系统的输入和输出 79表2.12 安全警示灯选材表
主控板是否满足项目要求
考虑因素 项目要求
华
Arduino Uno Arduino Nano 树莓派
尺寸 小型 否 是 否
运算能力 低 是 是 是
东
数字输入接口1个
接口类型与数量 数字输出接口2个
PWM输出接口3个
纽扣电池供电情况 师支持纽扣电池供电
操作系统情况 不需要操作系统支持
范
结论
2 系统框图 大
()
安全警示灯系统框图如图2.44所示
。
学
LED
图2.44 安全警示灯系统框图
出
3 流程示意图
()
安全警示灯流程示意图如图2.45所示
。
版
社
LED
图2.45 安全警示灯
流程示意图
80 开源硬件项目设计4 硬件模块搭建
()
准备的器材有 红色M5直插LED 按键开关 220 电阻 10k 电阻 面包板 杜邦线
: 、 、 Ω 、 Ω 、 、 。
此处以简单的直线型图案为例 实物搭建图如图 2.46 所示 如要实现图 2.43效果图 可在实物板上
, 。 ,
重新摆放LED的位置 使之形成相应图案
, 。
图2.46 安全警示灯实物连接图
5 核心程序
()
第二章 开源硬件系统的输入和输出
华
东
师
范
大
学
=50 预设 闪烁的延迟时间
intdelaytime LED
_ =0 预设 的状态 可通过点击按钮 调用中断处理函数 改变其值
intledstatus LED
出
voidsetup
=3 =14 ++
for inti i< i pinMode i OUTPUT
0 _ 在2号引脚捕捉中断
attachInterrupt Pressbutton RISING
版
voidloop
_ ==0 常亮
if ledstatus LED
=3 =14 ++
for inti i< i digitalWrite i HIGH
社
_ ==1 快闪
if ledstatus LED
=3 =14 ++
for inti i< i digitalWrite i HIGH
delay delaytime
=3 =14 ++
for inti i< i digitalWrite i LOW
delay delaytime
_ ==3 常灭
if ledstatus LED
81开源硬件项目设计
=3 =14 ++
for inti i< i digitalWrite i LOW
华
_ 定义中断处理函数
voidPressbutton
_ = _ +1 3 状态变量在0 2 之间切换
ledstatus ledstatus % ~
东
师
体 验 思 考
能否再增加几种LED的显示效果 如LED慢闪效果或LED逐个点亮的流水灯效果 如何相应地修改
范, ,
程序
?
大
作业练习
经过以上项目实践 我们已经完成了感应节能夜灯 番茄钟和安全警示
, 、
灯的制作 能否把这三个学项目作为三个模块整合在一个作品中 让它能根据
。 ,
实际需要 通过按钮切换到想要的模块 你还能试着再设计一个充满创意的
, ?
机器伙伴吗 和同学分组讨论 并提交相应的项目设计方案
? , 。
出
版
社
82第 三 章
开源硬件系统的模块
扩展和连接
本章学习目标
$
了解开源硬件扩展与连接的基本概念#基本原理!掌握常用的编程方法"
$
能通过扩展模块的连接!运用编程语言!完成开源硬件系统的扩展"
$
结合学习实践!能在不同连接#不同通信方式下搭建由多种传感器#执行
器共同组成的应用系统"信息系统之间的 沟通 被称为通信 开源硬件有许多功能强大的扩展模块 一般都带有特
“ ” , ,
定的通信方式 多个模块之间通过这些特定的通信实现协同工作 从而使信息系统的性能得
。 ,
到整体的提升 在不久的未来 人们将进入一个万物互联的时代 试想一下 一个冰箱可以根
华。 , , :
据用户的需求 结合用户的习惯 给出所缺食物的采购方案 甚至通过网络自动完成订货 一个
, , , ;
蔬菜大棚能够根据环境温度 湿度以及土壤特性等数据 自动进行通风和喷洒灌溉 这些物联
、 , 。
网的应用场景将东不断涌现 而应用往往是由多种复杂的硬件组合而成 硬件之间的通信保证了
, ,
系统的正常运行
。
本章将利用开源硬件及一些扩展模块 通过各种硬件的连接 组合 控制 实现开源硬件系
, 、 、 ,
师
统的扩展与连接 进而构建开源硬件新的应用场景 当同学们拿到一个功能强大的模块的时
, 。
候 别急着去使用 先阅读它的说明书 并进一步思考 这个扩展模块的连接规则是怎样的 如
, , , : ?
何根据需求选择合适的通信方式
范?
大
学
本章知识结构
出
版
社
84 开源硬件项目设计项目主题 开发运动助手
华
项·目·情·境
随着开源硬件的发展和各种传感器的应用 大大小小的开源系统广泛存在于
,
东
我们生活的方方面面 它们作为我们的生活助手 给我们提供帮助 提升我们的生
, , ,
活质量
。
运动是保持健康的重要方法 但有时会遇到一些问题 比如 我们看不到自己
, , :
的运动数据 难以判断是否达成预定的运动目标 跑步时不知道自己的准确位置
师
, ; ,
难以判断运动路程 运动过程中如果身体不适难以提前预警 等等 那么怎样利用
; , 。
开源硬件帮助我们解决这些实际问题呢 这些开源硬件和模块之间是如何通过连
?
接和信息交互 充分发挥各部分的作用 组成一个能实现特定功能的系统的
, , ?
范
在本章的学习中 我们需要在分析需求的基础上 小组合作设计运动助手方案
, ,
作品 运用有线及无线通信 并采用蓝牙 WiFi等通信模块 制作相关产品来解决
, , 、 - ,
问题 可通过连接起更多设备实现万物互联的设计目标
, 。
大
项·目·任·务
学
任务1 任务2 任务3
出
开发一个具有定 开发一个具有显 开发一个具有搜
位功能的运动助手,将 示功能的运动助手,将 寻功能的运动助手,使
北斗定位模块与微控 显示模块与开源微控 用智能手机向连接有
制器模块连接,实现位 制器模块版连接,实现基 蓝牙模块的物件发送
置信息的获取。 本信息显示的功能。 信息,通过智能手机实
现发声和发光等功能。
社
第三章 开源硬件系统的模块扩展和连接 85第一节 通信方式简介
组成开源硬件系统的各个内部模块 系统间都需要信息的交换和
、
华
传递 通过互联可以完成信息互通 实现更复杂 多样的功能 连接系
。 , 、 ,
统的设备数目和种类也会达到更大的规模 进而形成万物互联的物联
,
网 为了合理并可靠地构建开源硬件系统 选择合适的通信方式很重
。 ,
东
要 一般需要考虑通信信道 通信协议和数据传输方式
, 、 。
一、 通信信道的选择
师
借助传输通道 也就是传输媒介 信息的接收方可以接收到来自
( ),
发送方的信息 通道一般分为有线和无线两种 常见的杜邦线
, 。 、USB
线 范信号线都是以其内部的导电金属为媒介完成信息传输通信
、HDMI
的 属于有线通信 蓝牙耳机 手机以电磁波为传输媒介传输信息 属
, ; 、 ,
于无线通信
。
在第一章的大烟雾报警器案例中 烟雾传感器和蜂鸣器通过在印刷
,
线路板上的导线连接到微控制器 它们之间的信号传输采用的是直接
,
连接的有线通信方式 而大楼中的火灾信息系统通过 连接分布
, Wi-Fi
在各楼层的烟雾报警器学采用的是无线通信方式
, 。
在开源硬件系统内部 一般都采用有线的方式连接各个模块 这
, ,
样的有线连接又分为直接连接和总线连接 连接到系统外部的设备或
;
系统时 有线和无线两种方式均可采用
出
, 。
体 验 思 考
版
为避免在公共场合打扰到他人 人们在接听电话或欣赏音乐时都会使用耳机 如果采用连接线直接
, 。
把耳机连接到手机 那么语音信号就通过有线传输的方式传输 蓝牙耳机则是使用无线方式传输语音信
, ;
号 举一些在日常生活中采用有线通信和无线通信传输同类信息的例子 并比较两种传输方式的优
。 , 社
缺点
。
二、 通信协议的选择
当需要传输的信息为单个的数字信号 0 或 1 时 可以将器件或
“” “” ,
者模块的接口通过导线直接连接到微控制器的输入 输出端口 此时
/ ,
86 开源硬件项目设计采用一对一的通信方式 只要微控制器对端口进行一次读或写就可以
,
完成全部信息的传输 通信信道被信息的发送方和接收方独占 无法
, ,
实现更大范围的信息共享 这种方式一般用于短距离传输的场合 比
, 。
华
如 按键开关的闭合或断开的信息可以用一个数字信号表达 所以可
, ,
以把开关直接连接到微控制器的输入端 微控制器可以读取此端口的
,
信息 获得按键开关的状态 这样就完成了信息的传输 如果将微控制
, , ,
东
器的端口直接连接到 就可以通过向这个端口输出高电平或者
LED,
低电平来控制 的亮或灭
LED 。
为了应对复杂的通信环境 也为了更远更有效地传输数据 需要
, ,
师选择合适的通信方式 采用适当的通信协议 借助通信协议的约束
, 。
和规范 信息传输在可靠性 安全性和传输距离等方面都有了保障
, 、 。
不同的通信协议所适用的场合和能够解决的问题都不同 需要根据
,
设范计要求选择 采用总线类型协议可以实现通信信道的共享 连接
。 ,
更多的模块或设备 如图31所示 例如 总线可以同时连接
, . 。 ,USB
符合 接口协议要求的 盘 鼠标 键盘等多种类型的多个
USB U 、 、
设备
大
。
学
出
版
图3.1 某种总线协议的模块连接示意图
社
体 验 思 考
采用红外遥控技术的家电遥控器已经非常普遍 很多家庭都有多个遥控器 通常 这些遥控器都可能
, 。 ,
使用相同波长的红外信号来发送信息 在使用中会发现 与家电配套的遥控器对同品牌的同款家电都可
。 ,
以正确操作 但对其他品牌或不同款的家电无法操作 这是什么原因
, , ?
第三章 开源硬件系统的模块扩展和连接 87三、 数据传输方式的选择
华
数据信息可以逐位顺序的方式传送 此方式称为串行通信 如图
, (
32所示 也可以在同一时间多位数据信息一起传送 这种方式称为
. ); ,
并行通信 如图33所示 串行通信一般用于模块之间 设备之间或
( . )。 、
东
系统之间的数据传输 并行方式主要应用于数据量大 传输距离近的
; 、
器件间或电路板上模块间的信号传输 由于通信技术的发展 单条线
。 ,
上数据的传输速率越来越大 串行通信已经可以满足大多数系统对传
,
师输速率的要求 此外 串行通信可以极大地减少通信接口引脚数目 在
, , ,
高度集成的微控制器应用系统中串行通信已成为各模块间通信的主
要方式
。
图范32给出了8位数据信息以串行通信方式从设备 传送到设
. A
备 的示意图 图33给出了8位数据信息以并行通信方式从设备
B 。 .
传送到设备 的示意图 在串行通信方式下 8位数据将分8次按
A B 。 ,
照排列顺序逐个通过一条信号线传送 在并行通信方式下 8位数据
大
; ,
则分别通过8条信号线一次性完成传送
。
学
出
版
图3.2 串行通信示意图 图3.3 并行通信示意图
社
88 开源硬件项目设计第二节 通信方式应用
在设计开源硬件项目时 常常会通过增加扩展模块来增加系统的
,
华
功能 微控制器与扩展模块之间的通信可以用总线通信的方式来完
,
成 比如为保存系统运行时采集的数据及运算结果 系统的存储容量
。 ,
需要增加 此时就可以添加一个包含存储芯片的存储模块 采用总线
。 ,
东
连接的方法来实现系统的简单扩容
。
常用的总线通信方式分为有线和无线两种 常见的有线连接类型
。
有 串行通信接口 2 总线 总线等 常见的无线连接类型有
UART 、IC 、SPI ;
师蓝牙和 等 传输信息需要考虑传输数据量的大小 传输速率 传
Wi-Fi 。 、 、
输时间延迟 通信信道和功耗等多方面的因素 微控制器的通信接口
、 。
种类及数量 扩展模块具有的接口种类 需要同时连接的模块数目 将影
、 、 ,
响范可选择的总线通信方式的范围 总线通信的具体方案要根据微控制器
。
和扩展模块的通信接口参数 所传输信息的特点等因素综合考虑确定
、 。
一、 运动助手·北斗定位
大
以前人们去一个陌生的地方往往需要带上纸质的地图 现在 人
, ,
们只要打开手机就能查看路线 这不仅更加快捷方便 而且当开启手
学, ,
机上的定位功能 就可以知道自己在哪里 并且可以根据自己的位置
, , ,
搜索周边的景点 餐厅 商城等 而这一切的基础就是定位技术
、 、 , 。
北斗卫星导航系统 简写为
(Be出iDounavigationsatellitesystem, BDS)
是中国自行研制 自主建设 独立运行的全球卫星导航系统 由北斗接
、 、 ,
收模块获得北斗定位卫星发射的信号 据此可实现授时和定位的功能
, 。
安装了北斗接收模块的手机可以实现实时的精确定位 但是 离
版 。 ,
开了手机 我们如何进行定位呢 尝试使用开源硬件及扩展模块设计
, ?
自己的定位仪 并用定位仪获取位置信息
, 。
社
技 术 支 持 UART串行通信接口
通用异步收发传输器 universal asynchronous receiver/transmitter缩写为UART)支持点对点的双向通
( ,
信 因其连接简便 协议易实现而在开源硬件系统中得到了广泛的应用 几乎所有的微控制器都提供UART
, 、 。
串行通信接口(缩写为UART接口)并且内置了专门处理UART通信协议的UART通信模块 以方便用户利
, ,
用此接口扩展系统功能 UART通信模块的功能很多 仅使用UART模块提供的接收数据引脚RX和发送数
。 ,
据引脚TX就可以实现最基本的 UART通信 二者都通过各自的 RX引脚接收对方的 TX引脚发送的数
。
第三章 开源硬件系统的模块扩展和连接 89据 也可以通过各自的TX引脚发送数据到对方的RX引脚 在实际使用时 通信的双方要对 UART串行
, 。 ,
通信接口采用相同的参数配置 以保证数据的正常传输
, 。
华
知 识 延 伸 上位机与下位机
东
自动化控制领域的信息系统往往具备较为复杂的
功能 需要完成数据的采集 分析 汇总 显示 以及对
, 、 、 、 ,
于底层设备的控制等 此外还需要实现人机交互 因此
, ,
师
会使用多个计算设备相互配合来完成 如图 3.4所
。
示 在系统中负责人机交互 发布具体操作指令的计算
, 、 图3.4 上 下位机连接示意图
机被称为上位机 而负责接收命令 承担基础数据采 、
; 、
集 执行控制命令 实现底层操作的计算机或设备被称
范
、 、
为下位机 常用的有微控制器 上 下位机之间交换信息需要通信协议的支持 几乎所有的计算机和微控
, 。 、 ,
制器都具备UART接口 因此UART接口在上 下位机互联中得到广泛应用
, 、 。
大
知 识 延 伸 USB转 UART
学
早期的台式计算机一般会提供符合RS 232电气接口规范的UART接口 为了增强信息传输的抗干
,
扰能力 实现远距离传输 其引脚上的电压范围为-15~15V 台式计算机的 UART接口与 Arduino Uno
, , 。
开发板的UART接口不匹配 二者不可以直接连接 而现在的便携式计算机几乎都取消了 UART接口 但
, , ,
几乎都具备USB接口 因此Arduino Uno开发板上放置了一块出USB转UART芯片 参见第一章图1.17
, ( ),
计算机可以识别此UART接口 并借助它实现与Arduino Uno开发板上的微控制器通信
, 。
版
探 究 活 动
Arduino Uno的板载UART接口和计算机的RS 232串行接口在电气性能方面存在差异 查阅相关
社,
资料并进行学习探究 填写表3.1并思考 UART接口连接两个设备时 需要连接哪些线 为什么
, , : , ? ?
表3.1 RS 232串行接口与UART接口的比较
信号电压范围(V) 信号传输距离(m) 数据传输速率
计算机的RS 232串行接口 —
Arduino Uno的UART接口
90 开源硬件项目设计项 目 实 践
【需求分析】
外出旅游 特别是自驾游时 有了一个定位设备就可以随时知道自己所在的位置 方便规划路径 为旅
, , , ,
行的顺利进行保驾护航
。
【功能设计】
利用北斗接收模块和计算机制作一个旅行必备的定位仪 北斗接收模块与微控制器组成北斗定位模
。
块 可以获得所在地的经 纬度数据 属于系统的下位机 电脑构成上位机 完成显示 后续处理等操作 北
, 、 , ; , 、 。
斗定位模块与计算机通过串口通信的方式连接 实时地将位置数据传送到计算机上显示
, 。
【软硬件设计】
1 器材选型
()
定位模块选用串行接口的北斗定位模块 微控制器选
,
用Arduino Uno 具体器材包括 Arduino Uno北斗接收
。 : 、
模块 USB数据线 2~3米SMA接头的天线 室内用时可
、 、 (
选 计算机
)、 。
2 硬件模块搭建
()
按图3.5所示连接 Arduino Uno和北斗接收模块 供
,
电成功后模块上的TXD指示灯会以1s的时间间隔闪烁
。
3 流程示意图 图3.5 Arduino Uno与北斗接收模块连接图
()
北斗定位程序的流程示意图如图3.6所示
。
图3.6 北斗定位程序流程示意图
4 关键代码
()
编写相关代码 编译并下载到Arduino
, 。
第三章 开源硬件系统的模块扩展和连接
华
东
师
范
大
学
出
版
社
#define BeiDouSerial Serial
=13 指定 指示灯端口为13号引脚
int LED LED
struct
91开源硬件项目设计
_ 80
char BeiDouBuffer
华 获取到 数据时为 真
bool isGetData GPS
解析完成时为 真
bool isParseData
11 获得 时间
char UTCTime UTC
11 获得纬度
char lati东tude
12 获得经度
char longitude
定位信息有效时为 真
bool isUsefull
_
SaveData
师
voidsetup
9600 设置 串口通信参与9600波特 与北斗接收模块 配置一致
BeiDouSerial begin UART UART
范
voidloop
北斗接收模块定位信息的获取、处理、输出等功能已封装成函数 方便使用
* *
大
获取 数据
BeiDouRead GPS
解析 数据
parseBeiDouBuffer GPS
输出解析后的数据
printBeiDouBuffer
学
【调试优化】
1 打开串口监视器 设置串口传输速率为9600bps没有出结束符
() , , 。
2 若模块还未完成定位 会收到如图3.7所示的信息
() , 。
版
社
图3.7 未完成定位时的
提示信息
92若模块完成定位 会收到解析后的定位信息(如图3.8所示)同时北斗模块上的指示灯会以1s的时间
, ,
间隔闪烁
。
华
东
师
范
图3.8 完成定位后的提示信息
大
3 复制得到的经 纬度信息 并至定位网站查询 验证自己得到的定位信息是否准确
() 、 , , 。
学
体 验 思 考
1. 可否带上北斗定位仪出去旅游并用它来记录整个旅游轨迹呢 如何让它实现记录功能呢
出? ?
2. 用北斗模块可以获取经 纬度的数据 如何将其与电子地图结合 设计完成一个专属的导航系统 让
、 , , ,
参观校园的游客可以方便地到达各参观点
?
版
二、 运动助手·电子屏幕
社
信息处理系统项目设计一般通过显示运行结果及数据来实现人
机交互 简单的信息传递可以用 等简单模块直接完成 而复杂一
。 LED ,
些的信息就需要由液晶显示屏 屏和数码管等显示模块来呈现
、OLED ,
这也是开源硬件项目设计中的常见做法
。
这类显示模块安装了显示器件 以 屏为例 屏幕的显示需
, OLED ,
要通过显示的位置 显示的字模 也就是图形 显示的颜色等参数来
、 ( )、
控制 因此会给模块配备一个专用的显示器件控制器 它从微控制器
, ,
第三章 开源硬件系统的模块扩展和连接 93接收显示的命令和数据 完成显示操作 这类专用显示控制器一般会
, 。
包含一个很小的内置常用字库 并留出少量的内存存储不在常用字库
,
内的汉字或图形 以满足更多样的显示需要 该类模块一般都会提供
, 。
华
总线连接接口 方便与微控制器连接
, 。
技 术 支 持 I2C通信接口
东
I2Cinterintegrated circuit是一种串行通信总线 广泛地用于低速模块之间的短距离通信 具有多种
( - ) , ,
传输速率 可连接多个设备 I2C使用两根信号线 分别是串行数据线 SDAserial data和串行时钟线
, 。 , ( )
SCLserial clock 典型的师电压值为3.3V或5V 连接在I2C总线上的所有I2C模块要把各自的数据线
( ), 。
和时钟线分别连接在一起 如图 3.9所示 完成连接后的数据线和时钟线都要设置为高电平 常见的
, , 。
应用包括 EEPROM存储芯片 外置的低速 ADC和 DAC 低速传感器模块 即插即用设备的初始信息
、 、 、
获取等
。 范
I2C总线协议有很多的版本 定义了支持各种不同传输速率的总线工作模式 传输速率覆盖了 100~
, ,
5000Kbps的范围
。
总线上的I2C模块被称为节点 为保障 I2C模块
,
大
正常使用 每个节点都将被赋予一个各不相同的地址
,
值 该地址值就是对应的节点在总线上的唯一标识
, 。
地址值用7个比特表示 其中16个地址值为保留值
, ,
不能用来给节点赋值 因此一条 I2C总线最多可以学
。
包含112个地址不同的模块 只要知道某一节点的地
,
址值 就可以通过I2C总线与之建立通信
, 。
微控制器上的通信端口是非常有限的 如果需要
,
出
用到的扩展模块数量较大 种类较多 可以使用 I2C 图3.9 I2C模块在I2C总线上的连接示意图
、 ,
总线接口来连接 对于前文所述的在系统中添加含
。
I2C总线接口的存储模块的方案 只要每个存储模块都能够配置成各不相同的 I2C总线地址 就可以方便
, ,
地实现系统存储的扩容 同时微控制器可以通过各模块所设定的 I2C总版线地址与之建立通信 实现信息
, ,
交换
。
社
知 识 延 伸 什么是 SPI?
SPIserial peripheral interface是一种同步串行通信总线 包括 时钟信号 主机输入信号 主机输出
( ) , : 、 、
信号和片选信号线 广泛地应用在开源硬件项目设计中 例如应用于SD卡 LCD显示模块等的连接
, , 、 。
94 开源硬件项目设计探 究 活 动
华
1. 某开源硬件项目设计团队正在评估一个设计方案 选取了包含1个UART接口 1个I2C总线接口
, 、
和1个SPI总线接口的微处理器作为开源硬件的控制器 现需要连接9个开源硬件扩展模块 假设这些模
, (
块都有I2C或SPI或UART接口的型号可供选择 选择这些模块的接口需要考虑哪些因素
), ?
如果东其中有1个模块只有UART接口的型号可供选择 试提出尽可能多的微处理器与扩展模块的连
,
接方案 如果其中有1个模块只有SPI总线接口的型号可供选择 试提出尽可能多的连接方案
。 , 。
2. 查阅资料 了解SPI与I2C的特点 比较I2C总线 SPI总线和UART接口 并填写表3.2
, , 、 , 。
师
表3.2 I2C总线 SPI总线和UART接口的比较
、
通信协议 通信速率 节点数量 典型应用场合
I2C 范
SPI
UART
大
知 识 延 伸 学扩展模块驱动程序库
显示模块上的显示屏幕有色彩 分辨率等参数 其上的控制芯片决定了显示屏的功能 芯片的正常工
、 ; ,
作依赖于对微控制器芯片的正确操控 而操控此类显示模块的一系列程序就被称为显示驱动程序 这些程
, 出 ,
序组合在一起就构成了驱动程序库 编写这类程序需要对芯片内
。
部结构 显示模式等诸多条件有足够的了解 编写的难度较大 因
、 , 。
此 一般会选用现成的支持该显示控制芯片的驱动程序库 不同的
, ,
程序库的功能和接口都会有所不同 版
。
图3.10所示的OLED模块的控制芯片为 SSD1306两个开
,
放源代码的 U8g2驱动库和 Adafruit驱动库可以实现常用的功
能 在Arduino IDE菜单项中选取 工具 管理库 打开 库管理
。 “ → ”, “ 社
器 在 主题 中选择 显示 可以很方便地看到能够使用的驱动
”, “ ” “ ”,
程序库并了解其支持的芯片种类 可根据需要添加程序库完成安
。
装 一般还会同时安装有价值的参考例程
, 。 图3.10 I2C接口的OLED模块
第三章 开源硬件系统的模块扩展和连接 95项 目 实 践
【需求分析】
华
生命在于运动 适当的运动有益健康 为方便运动锻炼 需要将运动提醒信息发送到屏幕上 设计一
, 。 , 。
个计时装置 当运动时间达到设定值 该装置可在OLED屏上给出提示语
, , 。
【软硬件设计】
1 器材选东型
()
对所选的关键器件进行评估 此处所选择的显示模块居于重要地位 根据表3.3完成对三种控制芯片
, 。
的评估
。
师
表3.3 电子屏幕选材表
模块名称 关键芯片型号 接口类型 驱动程序支持 评估意见
SSD1306 I2C或SPI 2种以上 合格
范
显示模块
大
准备的器材有 Arduino Uno含I2C总线接口的OLED模块 连接线
: 、 、 。
2 硬件模块搭建
()
本项目中的OLED模块为I2C总线 共有四根线 分别是电源线 接地线 SDA和 SCLArduino Uno
, , 、 、 ;
学
开发板连接插件上的I2C总线 SDA信号引脚编号为A4SCL信号引脚编号为A5
, , 。
按照I2C总线的使用要求 设计连接图并检查其正确性 确认后按图 3.11所示连接 Arduino Uno和
, 。
OLED显示模块
。
出
版
社
图3.11 Arduino Uno与OLED模块连接图
3 总线硬件配置确认
()
当有多个模块连接在一起时 要确保各个模块的地址没有冲突 模块地址的数值一般可通过查阅数
, 。
据手册获知 如果数值是可变的 还需要对照实物确认实际的数值 该OLED模块缺省的电阻焊接位置所
, , 。
对应的是默认的I2C地址 数值为0x78
, 。
96 开源硬件项目设计4 显示驱动库添加
()
点击Arduino IDE主界面的 项目 加载库 管理库 用 U8g2搜索找到库后 点击安装 可以完成
“ → → ”, “ ” , ,
显示驱动库的添加 如图3.12所示
, 。
图3.12 U8g2库的搜索添加
5 例程运行
()
从U8g2的示例程序中选择例程U8g2logo下载后屏幕显示如图3.13这表明硬件连接成功 程序下
, , ,
载正确
。
图3.13 U8g2logo例程的显示结果
6 关键程序
()
第三章 开源硬件系统的模块扩展和连接
华
东
师
范
大
学
出
版
社
<82 > 加载 82库
#includeUglib h Ug
82_ 1306_12864_ _ _ _2 82 82_ 0 5 4 88_ _
UG SSD X NONAMEFSWIC ug UG R A A UX PINNONE
voidsetup
97开源硬件项目设计
82
ug begin
82 8 开启 8支持
ug enableUTFPrint UTF
82 华 82_ _ _ _ 2 调用中文字库
ug setFont ug fontunifonttchinese
82 0
ug setFontDirection
82 清 屏幕
ug clearBuffer OLED
82 015 设定字符的左下角位置
ug setCurso东r
82 输出要显示的内容
ug print "HelloOpenSource"
82 040 设定字符的左下角位置
ug setCursor
82 开源 你好
ug print " "
82
在师屏幕上显示提示信息
ug sendBuffer OLED
5000 欢迎词显示5
delay s
范
voidloop
82 82_ _ _ _ 2
ug setFont ug fontunifonttchinese
82 0
ug setFontDirection
大
82
ug clearBuffer
82 040
ug setCursor
82 每天活动一小时
ug print " "
82 学
ug sendBuffer
5000
delay
【调试优化】
出
1 运行结果
()
程序正常运行后 OLED显示屏显示欢迎词 如图3.14所示
, , 。
版
社
图3.14 OLED屏显示欢迎词 图3.15 OLED屏显示提示信息
5s后 OLED屏显示正常的提示信息 如图3 .15 所 示
, , 。
982 自定义汉字字库
()
U8g2字库除了能显示各种字符外还能显示少量中文 最多几百个字 可以根据需要选用 也可以自
( ), ,
华建字库 自建字库的好处是可以只把需要显示的汉字放入字库中 节约闪存空间 留下更多的空间存放
。 , ,
程序
。
东
作业练习
师利用已经连接好的 Arduino Uno开发板与 OLED模块 再外接一个按
,
键 要求当按键按下时 OLED屏上显示自己喜欢的一句格言
, , 。
范
体 验 思 考
大
1. 查阅资料 比较三种常用的显示器件 填写表3.4
, , 。
表3.4 三种常用显示器件比较
学
名称 显示效果 应用场合 特点
液晶
数码管
出
OLED
2. 计步器可以计量人体运动步数 再通过统计距离 速度 时间等数据 进而估算卡路里或热量消耗
, 、 、 版, ,
可用来控制运动量 防止运动不足或运动过量 计步器大多用到了三轴加速度传感器 可通过公式 消耗
, 。 , “
的卡路里=体重 kg×距离 km ×运动系数 k 来计算相关量 其中跑步的运动系数大于走路 走路的运
( ) ( ) ()” , ,
动系数又大于骑自行车
。
1 通过编程制作一个运动卡路里计算器 并结合自身情况用该计算器估社算一天消耗的卡路里
() , 。
2 查找人体必需营养物质的单位热量 估算自己一天摄入的卡路里 并与 1中估算出的数值比较
() , , () ,
判断摄入的卡路里和消耗的卡路里是否平衡
。
第三章 开源硬件系统的模块扩展和连接 99三、 运动助手·给钥匙打电话
日常生活中我们会遇到需要找一些物件的场合 比如 某些物品可
华 , ,
能被我们随手放置 一时间难以找到 又比如 我们在外出旅行时可能
, ; ,
带了很多的行李 每件行李都照顾周全是件费心力的事情 再如 某时
, ; ,
刻我们想找手机 却怎么也想不起来放在了哪里 将无线信道通信的蓝
, 。
东
牙模块和开源硬件设计结合起来 类似的这些事情都可以很好地解决
, 。
技 术 支 持 蓝牙通信
师
蓝牙是一种无线通信标准 可实现模块间 设备间的短距通信 在无需许可的 2.45GHz开放频段工
, 、 ,
作 蓝牙技术具有功耗低 速率大 支持多设备连接等特点 在计算机 电信 网络与消费性电子产品等领
。 、 、 , 、 、
域得到了广泛的应用 范
。
蓝牙模块并没有集成到Arduino Uno的微控制器中 使用 Arduino时需要外接该模块 其作用是将无
, ,
线信道所接收的数据发送到微控制器或反之 蓝牙模块有无线蓝牙通信和有线通信两个接口 因此 它既
。 , ,
可以通过无线通信接口 也可以通过有线通信接口 与微控制器展开信息交换 而这个接口一般是UART
, 大, , 。
图 3.16所示的是一个技术设计方案的草
图 图中有蓝牙接口的智能手机通过无线信道
。
UART
完成与蓝牙模块的信息交互 , 遵守的是蓝牙协
学
议 与此同时 蓝牙模块通过 UART接口连接
; ,
到Arduino Uno开发板 遵守的是 UART接口
,
图3.16 智能手机控制示意图
协议 微控制器完成信息交互后根据结果操控
。
受控器件
。 出
体 验 思 考
版
1. 观察身边的事物 有哪些使用蓝牙来进行连接的设备
, ?
2. 体验蓝牙通信的性能边界 自由选择以下内容做实验 记录并分析实验数据
, , 。
1 蓝牙通信距离测试 完成蓝牙耳机与手机的连接 在手机上播放音乐 分别社在教室内空地 教室走
() : , , 、
廊 相邻或间隔的教室内等不同距离进行测试 记录所听到音乐的音量 直到音乐完全听不见 分析记录
、 , , 。
的数据 将其绘制成曲线图并作解释
, 。
2 蓝牙天线体验 完成蓝牙耳机与手机的连接 在手机上播放音乐 用各种不同材质 不同密封程度
() : , , 、
的盒子等包裹或放置手机 直到播放的音乐完全听不见 分析实验结果并据此设计一个独特的蓝牙信号
, 。
屏蔽方案
。
3 蓝牙信道传输速率测试 把两部已经用蓝牙连接的手机拉开不同的距离 传输同样数据大小的文
() : ,
件 记录完成时间 分析记录的数据 将其绘制成曲线图并作解释
, 。 , 。
100 开源硬件项目设计项 目 实 践
你是否有过这样的经历 刚刚才看到的钥匙 怎么就找不到了 这个时候多想给钥匙 打个电话 让
华 , , ? “ ”,
钥匙发出铃声回应 通过蓝牙模块与开源硬件 实现用手机找钥匙的功能
。 , 。
【需求分析】
可以先做一个能挂在钥匙串上的小挂件 小挂件在需要时能够发声和发光 方便定位和寻找
, , 。
【功东能设计】
在钥匙串的小挂件上安装蓝牙接收模块 手机可使用内置的蓝牙与其连接 可向其发送命令激活发声
, ,
和发光的功能 示意图如图3.17所示
。 。
师
图3.17 手机控制Arduino示意图
范
【软硬件设计】
1 项目器材
()
大
蓝牙模块 Arduino Nano连接线 智能手机 万用表 示波器
、 、 、 、 、 。
2 硬件模块搭建
()
按图3.18连接好Arduino Nano和蓝牙模块 通电正常后 蓝牙模块上的指示灯会以0.5s的时间间隔
, ,
闪烁 学
。
出
版
社
图3.18 蓝牙模块与Arduino Nano连接图
通过手机自带的蓝牙模块 搜索到与 Arduino Nano连接的蓝牙模块 配对成功后 建立起手机与
, 。 ,
Arduino Nano的信息通道
。
3 流程示意图
()
给钥匙打电话 程序流程示意图如图3.19所示
“ ” 。
第三章 开源硬件系统的模块扩展和连接 101UART
UART
5 s
LED LED
!
图3.19 给钥匙打电话 程序流程示意图
“ ”
4 关键代码
()
编写程序 完成编译和下载 在Arduino Nano的串口上 接收手机通过自带的蓝牙模块发送的控制
, 。 ,
信息 关键程序如下
。 :
开源硬件项目设计
华
东
师
范
大
< >
#include SoftwareSerial h
2
#defineledPin 学
6
#definebuzPin
intval
1011 10为 接 05的 11为 接 05的
SoftwareSerialBT D RX HC TXD D TX HC RXD
出
voidsetup
38400 硬件内置串口
Serial begin
Serial println "BTisready " 版
38400 软件模拟串口
BT begin
pinMode ledPin OUTPUT
社
voidloop
if Serial available
=
val Serial read
向手机传送数据
BT print val Arduino
手机向 传送数据
if BT available Arduino
102第三章 开源硬件系统的模块扩展和连接
=
val BT read
Serial print val
华 ==1' ' 手机向蓝牙发送字符1 命令蓝牙点亮
if val LED
_ 蓝牙接收命令 并向手机发送反馈信息
BT print "LEDON"
点亮
digitalWrite ledPin HIGH LED
2000
d东elay
==2' ' 手机向蓝牙发送字符2 命令蓝牙奏响蜂鸣器
elseif val
_ 蓝牙接收命令 并向手机发送反馈信息
BT print "BUZON"
师 10001000 蜂鸣器奏响1秒钟
tone buzPin
else
范
digitalWrite ledPin LOW
大
5 发送指令
()
打开手机上的蓝牙控制App选择要找的设备 发送相应的控制指令 就可以实现找钥匙的功能 如图
, , , ,
3.20所示
。
学
出
版
社
图3.20 手机APP控制指令及响应
【调试优化】
1 手机通过App发送指令后 用万用表观察连接LED灯的Arduino Nano的D2端口的电平情况
() , 。
2 手机通过App发送指令后 用示波器观察连接蜂鸣器的Arduino Nano的D6端口的信号波形
() , 。
103作业练习
华
1. 查阅关于WiFi模块的资料 想一想 如何利用 WiFi模块实现开关
- , : -
的远程控制
?
2. 设计一个利用开源硬件完成的方案设计 当手机离开你一定的距离
,
东时能够自动地发出提示 提醒你不要遗落手机
, 。
师
探 究 活 动
【需求分析】
范
随着人们对健康越来越重视 越来越多的人加入到锻炼的行列中 长跑作为一项深受人们喜爱的活
, 。
动 参与的人数非常多 这同时也对活动的安全性提出了更高的要求 特别是在长距离 高强度的锻炼或
, , 。 、
比赛中 需要为活动者或比赛选手提供身体状况的检测 警示 减少意外的发生 这样一方面让使用者实
, 、 , 。
时知晓身体状况数据 自行调整运动量 另一大方面 使用者如果出现身体不适 又能够及时报警 尽快获得
, , , , ,
帮助
。
【方案设计】
利用开源硬件并结合脉搏监测传感器 设计一个可以自动测量心率的检测仪 使用者在正常运动时
, 学 : ,
它可以实时显示数据 供使用者参考决定后续的运动量 当数据超过设定的安全值时 它会及时提醒 当使
, ; , ;
用者出现身体不适等紧急情况时 它可以通过 一键求助 的方式将位置信息发送到安全中心 方便救护人
, “ ” ,
员施救
。
出
参考如图3.21所示的方案设计图 完成一个具有脉搏监测和紧急求助功能的运动助手的方案设计 论
, ,
证方案可行性 并绘制详细的实物连接图
, 。
版
社
图3.21 运动助手示意图
104 开源硬件项目设计华
东
师
范
第 四 章
大
学
开源硬件项目设计实践
出
版
本章学习目标
社
了解基于开源硬件的自动驾驶小车的设计方案 理解自动驾驶小车各组
◉ ,
成部分的功能及相互间的连接关系 能根据要求选择合适的开源硬件
,
型号
。
会使用开源硬件的设计工具和编程语言 能根据设计方案实现自动驾驶
◉ ,
小车运动控制和图像识别等功能
。
掌握开源协议的运用 能将自动驾驶小车项目发布至开源社区
◉ , 。开源硬件中各类扩展模块的连接和组合 使人们可以用更灵活多样的方式进行创造 各
, 。
类开源硬件模块结构不同 性能不同 应用场景也不同 它们之间合适的组合和连接 能充分发
、 , , ,
挥各模块的优势 从而形成一个功能更强大的整体 较为复杂的开源硬件项目 往往需要对更
华, 。 ,
多类型的开源硬件进行组合 编制更复杂的程序 制作难度更高的产品造型 进行更细致的调
, , ,
试 在这种情况下 开源硬件项目实施的五个步骤 可以支持项目有计划地推进和实施 作品
。 , , 。
的创意设计和开东发制作往往不是一蹴而就的 而是需要不断优化和迭代
, 。
同学们在本章的学习中 将完成一个以自动驾驶为主题的开源硬件项目的设计和实践 学
, ,
习开源硬件项目设计的方法 体验开源硬件项目设计的完整流程 在设计与制作的过程中 同
, 。 ,
师
学们要进一步思考 开源硬件项目的限制条件有哪些 如何在此基础上进一步明确需求 产
: ? ?
品如何不断优化和迭代 在作品制作过程中 如何进行安全的操作
? , ?
范
大
本章知识学结构
出
版
社
106 开源硬件项目设计项目主题 搭建无人小车
华
项·目·情·境
随着开源硬件的日益普及 开源硬件作品的制作渐渐地从原来的简单小系统
,
东
向更为复杂的系统 从单个独立系统向多个系统相互配合的更高级系统的方向发
,
展 电子技术 智能控制和人工智能等技术快速发展使得越来越多的先进技术运
。 、
用在汽车领域 自动驾驶汽车能够辅助驾驶员驾驶车辆 甚至实现自主驾驶
, , 。
从物流小车到货运重卡 自动驾驶汽车将被应用在更广泛 更复杂的场景中
师
, 、 ,
从而实现新兴的智能交通 构建起新型的未来城市 也许某一天 当你去取快递的
, 。 ,
时候 看到送快递的是一辆自动驾驶送货小车 或者 你在打开出租车门的时候 发现
, , , ,
车上并没有司机 自动驾驶是一个非常复杂的问题 需要环境感知 行为决策 路
…… , 、 、
范
径规划和运动控制等技术的综合运用 如何制作 一个能在限定场景条件下自动驾
。
驶的无人小车 如何模拟无人小车的驾驶环境 如何实现小车的运动控制和图像
? ?
识别功能
?
本章我大们将首先通过设计一个较为简单的基于 Arduino的遥控小车完成初步
的作品制作 体验开源硬件项目设计的流程和方法 在此基础上 用仿真道路模拟
, ; ,
遥控小车的驾驶环境 为遥控小车增加一个专门用于道路识别和标识检测的基于
,
树莓派的模块 实现双机通信 完成制作后通过开源社区分享作品
, , 。
学
出
项·目·任·务
任务1 任务2 任务3
版
制作需求列表、功 利用开源硬件 整理、归档无人小
能列表、外观模型,依 Arduino完成小车的 车项目中的各类文件,
次完成基于开源硬件 组装,进而实现小车的 按照规范将项目发布
社
的无人小车的需求分 前进、后退、转弯等运 至开源社区。
析、功能分 析、外 观 动控制功能;用树莓派
设计。 实现图像识别功能,进
而实现智能控制。
第四章 开源硬件项目设计实践 107第一节 无人小车·整体设计
真实的马路交通情境是复杂多变的 本项目将对一个简易的模拟
,
华
道路进行需求分析 该模拟道路包含一个仿真道路 右转 标志牌
。 、“ ” 、
停止 标志牌和红绿灯 项目的目标是使小车能根据标识前进 右
“ ” 。 、
转 停止等 控制小车的方式包括人工或自动
、 , 。
东
体 验 思 考
师
除了上述交通标志外 你能列举出自动驾驶小车还有哪些物体需要识别
, ?
范
一、 需求分析
在本项目中 自动驾驶小车实际是一辆装上传感器和智能控制系
大
,
统的电动小车 我们将制作一个可不断优化的自动驾驶小车 首先完
。 ,
成蓝牙控制 然后再以图像识别等人工智能的方式进行运动控制 完
, 。
整的需求列表如表41所示
.
学:
表4.1 自动驾驶小车需求列表
小车在平地上启动、向前行驶、右转 采纳
核心需求 出
使用平板电脑通过蓝牙遥控小车 采纳
识别道路、“停止”交通标志 设计迭代时采纳
附加需求 使用语音控制小车 忽略
版
小车刹车、倒车 设计迭代时采纳
在做项目的需求分析时 需要了解各类微控制器的特点 从各种
, 社。
微控制器的优势着手 准确地设计出技术方案 本项目中树莓派能够
, 。
支持自动驾驶小车的图像识别功能 而 不支持 因此需要使
, Arduino ,
用树莓派构建小车的智能控制系统 树莓派虽然也支持小车的动力系
;
统 但不如 连接动力系统方便 因此在运动控制部分选择使
, Arduino ,
用
Arduino。
108 开源硬件项目设计二、 功能设计
华
根据小车的需求分析详细设计功能 首先搭建一个遥控小车 通
。 ,
过人工发送 右转 停止 等指令 控制小车在仿真道路上的行驶 之后
“ ”“ ” , ;
在此基础上搭建人工智能自动驾驶小车 使其在仿真道路上能自动地
,
东
根据交通标志进行判断 完成 右转 等任务 功能设计如表42所示
, “ ” 。 . 。
表4.2 自动驾驶小车功能列表
功能项 师 要 求
小车的基本架构
尺寸 要满足应用场景的要求和限制
结构 既要有一定的承载,又具有较好的灵活拆卸性
范
运动 既要便于控制,又满足运动的灵活操控
通信方式 当小车与控制设备距离较近,且设备间干扰较少时,可以选用蓝牙通信;当距离较远时,可以选用WiFi
-
在选择电池的时候,需要考虑电池的能量密度,能量密度越大,则续航时间越长,体积越小,可选用锂
电池
电池作为系统的动力电池大
电机 在选择电机的时候,需要考虑电机的扭矩,扭矩越大,则负载越大
小车的两种控制体系
“人工”控制 “智能”行驶
学
将信息传送到控制设备后,由控制设备根据这些
小车控制设 由操控者下达指令,指令发送到小车后,再在小
信息,采用智能的方式,经过运算处理后,自动
备 车的主控模块控制下,完成指定的运动
行驶
小车信息的显示要清晰、准确,可以选用液晶出显
人机交互设 在“智能”的运动模式下,交互的方式可以选用语
示屏或OLED屏;同时,下达指令的按键表示要
备 音交互方式
清晰、易懂
版
体 验 思 考
根据上述需求 请通过查找资料 上网搜索等方式 选择合适硬件和对应型号 并给出选择的原因 在
, 、 , , 。
选择硬件的过程中 有哪些性能因素需要考虑 请根据搜索到的硬件情况 填社写表4.3
, ? , 。
表4.3 自动驾驶小车选材表
功能模块 硬件及型号 选择原因
小车动力主控模块 Arduino
小车智能处理模块 树莓派
动力系统
人机交互设备
第四章 开源硬件项目设计实践 109三、 外观设计
华
外观设计包括自动驾驶小车的形状 图案 色彩的设计 其中形
、 、 ,
状设计是指各个3 零件的造型设计 需要充分考虑小车的内部构
D ,
造 确保其能容纳所要用到的电子模块 包括各类电路板和传感器
, ,
东
等 图41是一辆创意自动驾驶小车的效果图
。 . 。
师
范
图大4.1 小车效果图
四、 电子控制系统设计
学
根据功能设计 进一步实现小车的整体制作 设计方案包括上
, 。 、
下位机的选择 各个模块与上 下出位机的连接等
, 、 。
将 通信模块 电机驱动模块等拼接在小车上 构成下位
Arduino、 、 ,
机 完成场地信息的获取 传递 执行运动指令等功能 用 控
, 、 、 。 Arduino
制板连接多种传感器 比如红外传感器 超声波传感器等 以获取场地
版
, 、 ,
信息 通过 控制板连接蓝牙模块 模块 信号连接线等
; Arduino 、Wi-Fi 、 ,
以实现通信 将 控制板连接电机驱动模块等 使小车能执行
; Arduino ,
运动指令
社
。
图4.2 小车控制实现示意图
110 开源硬件项目设计树莓派与语音识别模块 图像识别模块 蓝牙模块 显示模块组
、 、 、
成运动小车的控制设备 构成上位机 可以接收下位机传送的信息
, , 。
根据下位机传送的信息和上位机采集的图像及语音等信息 进行判
,
华
断和处理 人工或自动 后 将结果或后续的小车运动指令传送给下
( ) ,
位机
。
通过上 下位机的协调配合 小车既能由操控者控制 又能自动驾
、 , ,
东
驶 同学们可以循序渐进 依次按需求进行设计 制作
。 , 、 。
作业练习
师
1. 根据小车的设计方案 你能选择适合小车的通信方式吗 请填写表4.4
, ? 。
表4.4 自动驾驶小车通信方式范的选择
通信方式 能否作为小车的通信方式 请选择其一作为通信方式,并写下选择原因
串口通信
蓝牙 大
WiFi
-
I2C
学
2. 语音指令是一种应用场景十分广泛的控制方式 你能说出语音指令控制的优点和缺点吗 请填写
。 ?
表4.5 出
。
表4.5 语音指令控制的优缺点
优 点 缺 点
版
社
第四章 开源硬件项目设计实践 111第二节 无人小车·运动与遥控
遥控小车曾给同学们的童年带来许多的欢乐和惊喜 在这一节
。
华
中 我们首先利用开源硬件及一些模块 制作一个运动的小车 让它在
, , ,
程序的控制下 完成 前进 后退 转弯 等动作 接着利用平板电脑
, “ ”“ ”“ ” ; ,
通过蓝牙与小车实现信息的交互 小车既可以接收平板电脑发出的指
,
东
令 完成指定的动作 又可以将运动状态等信息回传至平板电脑 通
, , 。
过这两个部分的实践 制作一个遥控小车 为后续制作自动驾驶小车
, ,
做准备
。
师
体 验 思 考
范
如果要制作一个具有运动控制功能的小车 应该如何规划小车的运动控制 运动控制由哪些部分
, ?
组成
?
大
为实现上述功能 制作遥控小车所需的器材有
, :
开发板 电机驱动模块 电机 蓝牙模块 传
Arduino 、 、 、 、
感器 车轮 车架等 从整个信息处理系统的组成上
、 、 。
学
看 小车既是一个传感器的载体 利用安装在小
, ———
车上的多个传感器获取需要的信息 又是一个信息
,
处理系统功能的体现者 在控制器的控制下完成
图4.3 运动小车的系统框图
———
出
指定的运动 运动小车的系统框图如图43所示
。 . 。
一、 运动功能
版
小车的主体包括车架 车轮 固定件等 控制部分由
、 、 ,
开发板及电机控制板组成 其他还包括电机 电
Arduino , 、
池 连接线等 运动小车底盘 如图4社4所示 的3个轮子
、 。 ( . )
中的两个后轮分别与两个电机相连 由电机带动轮子的转
,
动 它们作为驱动轮 可以独立控制 前轮是一个万向轮
, , ; 。
因为电机可以正转或反转 所以每个轮子可以完成前进或
,
后退动作
。
图4.4 运动小车底盘图 微控制器的 接口输出不同的信号组合 可以控制每
I/O ,
个电机的转动 继而控制连接在电机上的轮子的运动 两个
, 。
后轮的运动组合可以形成小车的各种运动 如表46所示
( . )。
112 开源硬件项目设计表4.6 轮子转动与小车运动对应关系表
编号 左后轮 右后轮 小车运动
1 前进 前进 小车直线前进
华
2 后退 后退 小车直线后退
3 前进 停止 小车向右转弯
4 停止 前进 小车向左转弯
东 5 前进 后退 小车顺时针转圈
6 后退 前进 小车逆时针转圈
师
体 验 思 考
如果小车有4个轮子 且4个轮子均可以独立控制 分析一下轮子转动与小车运动的对应关系
, , 。
范
项 目 实 践
大
【项目器材】
Arduino开发板 Arduino扩展板 电机驱动模块L298N超声波传感器 光电巡线传感器 车体 车轮 电池
、 、 、 、 、 、 、 。
【操作步骤】
1. 将各种部件正确组装成一辆运动小车 其学中包括底盘 轮子 电机等的安装
, 、 、 。
2. 在制作完成的小车的基础上 将Arduino开发板 电机驱动模块 传感器 电池等安装到小车上 如
, 、 、 、 ,
图4.5所示
。
出
版
社
图4.5 运动小车的完整组装 图4.6 Arduino与电机驱动连接图
3. 各模块按图4.6所示完成电路连接
。
4. 编写小车运动控制程序
。
第四章 开源硬件项目设计实践 113【关键代码】
开源硬件项目设计
自定义小车停止函数
voidcarStop
华 298 _ 1
digitalWrite L NIN LOW
298 _ 2
digitalWrite L NIN LOW
298 _ 0
analogWrite L NENA
东
298 _ 3
digitalWrite L NIN LOW
298 _ 4
digitalWrite L NIN LOW
298 _ 0
analogWrite L NENB
师
自定义小车前进函数
voidcarAdvance intleftSpeed intrightSpeed
298 _ 1 范
digitalWrite L NIN HIGH
298 _ 2
digitalWrite L NIN LOW
298 _ 控制小车前进速度
analogWrite L NENA leftSpeed
大
298 _ 3
digitalWrite L NIN HIGH
298 _ 4
digitalWrite L NIN LOW
为保持小车直行前进 参数 和 应该一样
rightSpeed leftSpeed
298 _
analogWrite L NENB rightSpeed 学
自定义小车左转函数
voidcarTurnLeft intleftSpeed intrightSpeed
298 _ 1 出
digitalWrite L NIN LOW
298 _ 2
digitalWrite L NIN LOW
298 _ 0
analogWrite L NENA
版
298 _ 3
digitalWrite L NIN HIGH
298 _ 4
digitalWrite L NIN LOW
298 _
analogWrite L NENB rightSpeed
社
体 验 思 考
1. 以上程序实现了小车的停止 前进 左转 那么要实现小车的其他运动方式该如何编写程序
、 、 , ?
2. 若在一辆正常向前运动的小车前面放置一块障碍物 如何利用安装的传感器 设计相应的程序 使
, , ,
得小车能够在障碍物前自动停下来
?
114二、 遥控功能
华
小车的遥控可以采用蓝牙或 当控制距离不远时 蓝
Wi-Fi, ,
牙是一种常用的通信方式 可实现平板电脑与小车的信息交互
, 。
利用平板电脑自带的蓝牙模块与遥控小车上的蓝牙模块进行通
东
信 由平板电脑发出指令 控制小车的运动 小车的相关信息 包
, , , (
括传感器测得的数据 也可以通过蓝牙回传到平板电脑
) 。
蓝牙模块与微控制器通过串口连接完成通信 微控制器
,
师向串口发送数据 通过蓝牙模块就可以将信息发送到对应的平
,
板电脑上 微控制器以读取串口数据的方式 得到平板电脑发送
; ,
图4.7 遥控小车通信示意图 来的数据或控制指令 遥控小车通信示意图如图47所示
。 . 。
范
项 目 实 践
在已经制作好的运动小车的基础大上增加蓝牙模块 平板电脑通过蓝牙模块对小车进行遥控
, 。
【项目器材】
Arduino开发板 Arduino扩展板 电池 蓝牙模块 车体 超声波传感器 光电巡线传感器 车轮
、 、 、 、 、 、 、 。
【项目步骤】
学
1. 如图4.8所示 将蓝牙模块连接在安装好的运动小车上
, 。
2. 安装App到平板电脑中
。
出
版
社
图4.8 运动小车与蓝牙模块连接图
3. 编写蓝牙通信程序
。
第四章 开源硬件项目设计实践 1154. 如图4.9所示 将各个部件 模块组装成一辆遥控小车
, 、 。
图4.9 遥控小车的完整组装
【关键代码】
蓝牙接收的程序如下
:
开源硬件项目设计
voidsetup
115200 初始化串口并设置波特率为115200
Serial begin
voidloop
charval
= 微控制器读取串口数据
val Serial read
=-1 当读取到数据
if val
执行相应的程序代码 此处具体代码已略去
蓝牙发送的程序如下
:
华
东
师
范
大
学
出
版
voidsetup 社
115200 初始化串口并设置波特率为115200
Serial begin
voidloop
将变量 对应的数据通过蓝牙发送出去
Serial print val val
500
delay
116本项目中的协议是指通信双方遵循的规则和约定 要使双方协同工作实现信息交换和资源共享 它们
, ,
之间必须有共同的语言 即交流什么 怎样交流 这样才能让双方互相 听懂 对方 比如 平板电脑与小车
, 、 , “ ” 。 ,
华可按表4.7约定 当遥控小车接收到000时 就停止运动
, , 。
表4.7 对遥控小车的约定
000 001 010 011
东
停止 前进 左转 右转
师
体 验 思 考
1. 如果要求平板电脑控范制小车运动的速度 比如要求小车以最高速度的一半前进 该如何设计协议
, , ?
2. 除了蓝牙 对小车的遥控还可以用什么方式 它们分别在何种条件 何种场合适用
, ? 、 ?
大
作业练习
1. 请将小车的组成部件填入表4.8
学。
表4.8 小车组成部件
名称 部件 特点
出
小车基本组件
传感器件
通信器件
版
社
2. 试着设计一个记录小车运动情况的程序 它能将小车的运动数据回
,
传到平板电脑 并记录下来
, 。
第四章 开源硬件项目设计实践 117第三节 无人小车·智能控制
长久以来 机器不能像人类那样轻松地识别交通标志 以至于自
, ,
华
动驾驶研发一直处于瓶颈期 直到近两年 由于人工智能芯片的算力
。 ,
突破和海量数据的累积 自动驾驶迎来了春天
, 。
智能控制是指小车能根据场景信息进行判断 自动完成直行 转
, 、
东
弯等运动控制 在第一节的 电子控制系统设计 中提到 作
。 “ ” ,Arduino
为下位机搭载小车的驱动模块 树莓派作为上位机搭载图像识别等模
,
块 我们已经在上一节中解决了小车的下位机运动控制问题 这一节
。 ,
师我们将利用上位机 也就是通过树莓派 利用图像识别模块 完成小车
, , ,
的智能控制
。
范
体 验 思 考
自动驾驶是依靠人工智能 视觉计算 雷达 监控装置和全球定位系统协同工作 让控制器在没有任何
、 、 、 ,
人操作的情况下自动安全地操控机动车辆 大自动驾驶可以让汽车行驶变得更加节能高效 可以让驾驶员
。 ,
从驾驶操作中解放出来 也将对社会经济 生态环保等领域产生巨大的效益 你认为自动驾驶需要哪些图
, 、 。
像识别技术
?
学
有了图像识别功能 小车就能在一定场景下对图像
,
信息进行逻辑判断 实现真正的 自动 行驶 在之前的
, “ ” 。
出
系统框图上 新增图像识别模块 如图410所示
, , . 。
一、 图像识别
版
自动驾驶小车的图像识别功能有两个重要任务 一
:
图4.10 自动小车图像识别模块 是道路识别 即保证小车根据路况安全行驶 在直道上直
, ,
行 在弯道上转弯 项目将以仿真道社路 如图411所示
, , ( . )
为例进行巡线 二是交通标志识别 即让小车 看懂 交通
; , “ ”
标志 并按标志自动操作 项目将以 停止 标志牌 如图
, , “ ” (
412所示 为例进行识别
. ) 。
118 开源硬件项目设计华
东
图4.11 仿真道路 图4.12 停止 标志牌
“ ”
师
本节的场景设置与技术支持如表49所示
. 。
表4.9 自动驾驶小车场景设置
范
场景 说明 微控制器 核心技术
道路识别 可按道路直行、转弯 树莓派 边缘检测
交通标志识别 可识别“停止”等交通标志 树莓派 目标检测
大
完成这两项任务后 小车就能在道路上巡线行驶 并能自动地根
, ,
据交通标志作出判断
学。
项 目 实 践
出
如果要使自动驾驶小车在道路上安全行驶 那么 怎么用树莓派进行巡线等道路识别呢
, , ?
树莓派的巡线功能主要依靠图像识别技术中的边缘检测技术来完成 在检测到道路边缘后 小车可
。 ,
通过算法 保证车体在道路中央行驶 通过接下来的项目 利用自制的交通地图模拟巡线 使小车能自动
, 。 , ,
版
判别直行 转弯等场景 体验巡线技术
、 , 。
要完成巡线等操作 需要利用Python的图像处理拓展包OpenCV OpenCV具有功能齐全的图像处
, 。
理函数 可支持树莓派进行巡线操作
, 。
【项目器材】 社
遥控小车 树莓派3B+ 仿真地图 摄像头 显示器 含HDMI接口 鼠标 键盘 数据线
、 、 、 、 ( )、 、 、 。
【操作步骤】
1. 用Python的拓展包 OpenCV读取外接摄像头的数据 并完成二值化处理 即把读入的彩色图像
, ,
(如图4.13所示)转成灰度图(如图4.14所示)方便后续计算
, 。
第四章 开源硬件项目设计实践 119图4.13 小车视角下的道路图像 图4.14 二值化后的道路图像
2. 边缘检测 使用OpenCV的边缘检测函数检测车道的边缘 提取车道信息 效果如图4.15所示
。 , , 。
图4.15 边缘检测后的道路图像
3. 判断小车是否在道路中央 若未在中央则进行矫正
, 。
4. 完成矫正后 利用树莓派向Arduino发送前进指令 如果想设置小车以每秒20个编码器脉冲的速
, 。
度前进 则通过树莓派发送指令给Arduino如 m 20 20 Arduino接收到指令后 运行函数 carAdvance
, , “ ”, , ,
进而控制电机的转速
。
【关键代码】
开源硬件项目设计
华
东
师
范
大
学
出
版
importserial
_ = ' 0' 9600 开启串口 社
sera serial Serial dev ttyACM #
_ 20 20 树莓派向 发送命令 20 20
sera write "m " # Arduino m
_ 关闭串口
sera close #
120技 术 支 持 如何进行道路中央矫正
小车在直道 弯道上行驶的过程中需要进行中央矫正
、
处理 当方向与直道不平行时 小车会自动矫正 保持与直
。 , ,
道平行行驶
。
可以观察到 边缘检测后的仿真道路边缘是白色的
, 。
通常的做法是选取图像中的一行像素 计算并判断这一行
,
像素中表示道路的白色像素的中间点 图中蓝色B点 是否
( )
与摄像区域的中间点 图中红色 A点 重合 由此可获知小
( ) ,
车是否在道路中间行驶 如图4.16所示 摄像区域中心点
。 ,
A在道路中心点B的左侧 则让左轮加快转速 使得小车向
, ,
右偏转一点 从而使 AB两点重合 实现道路中央矫正
, 、 , 。 图4.16 道路中央矫正示意图
同理 在弯道时通过类似的算法来完成道路中央矫正
, 。
主要代码如下
:
第四章 开源硬件项目设计实践
华
东
师
范
找到白色像素的中心点 的位置
# B
= 0+ 1 2
center index index
计算出 与视频区域中心点 大的偏移量 假设视频区域中心点的位置为320
# center A
= 320
direction center-
若偏差太大 超过200则使小车停止
#
200
ifabs direction > 学
_ 0 0 树莓派向 发送命令 0 0
sera write "m " # Arduino m
前进
#
==0
elifdirection
_ 20 20 树莓派向 发送出命令 20 20
sera write "m " # Arduino m
向右矫正
#
0
elifdirection>
_ 30 20 树莓派向 发送命令 30 20
sera write "m " # Arduino m 版
向左矫正
#
0
elifdirection<
_ 20 30 树莓派向 发送命令 20 30
sera write "m " # Arduino m
社
项 目 实 践
自动驾驶汽车的安全行驶需要汽车在自动驾驶的过程中准确识别出交通标志 并作出正确反应 识别
, ,
交通标志这一能力需要目标检测技术的支持
。
目标检测是指找出图像中的目标物体 并确定它们的位置和大小 目标检测对于人类来说并不困难
, , ,
121人类的视觉系统很容易识别出某个场景里的目标物体 并对物体进行定位 但对机器而言 由于各类物体
, 。 ,
有不同的外观 形状 姿态 加之成像时的光照 背景等杂乱因素的干扰 目标检测会非常困难 机器需要
、 、 , 、 , 。
通过不华断地 学习 才能更好地进行目标检测
“ ”, 。
在本项目中 树莓派能满足所有图像处理的技术要求 通过连接摄像头 树莓派可以接收摄像头传输
, 。 ,
的数据流 那如何才能让机器 知道 眼前的东西是什么呢 通过本项目 体验让机器 看懂世界 的主要
。 “ ” ? , “ ”
技术 目标检测 要完成目标检测 需要利用Python的拓展包TensorFlow TensorFlow是开源的深
——— 。 , 。
东
度学习框架 可让人工智能工程师轻松构建各种复杂的算法模型
, 。
【项目器材】
遥控小车 树莓派3B+ 停止 标志牌 摄像头 显示器 含HDMI接口 鼠标 键盘 数据线
、 、“ ” 、 、 ( )、 、 、 。
【实物搭建】 师
智能小车实物连接如图4.17所示 包括显示器 摄像头 鼠标 键盘的连接
, 、 、 、 。
范
大
学
图4.17 智能小车实物连接图
出
【操作步骤】
1. 利用手机或电脑收集训练数据 用相关软件做数据标注 并用Python开源的深度学习框架训练模
, ,
型(如图4.18所示)
。
版
社
图4.18 用Python开源
的深度学习框架训练模型
122 开源硬件项目设计2. 在树莓派中安装OpenCV和TensorFlow等 搭建测试环境 安装完成后 就能在树莓派中载入拓
, 。 ,
展包 测试环境如图4.19所示
, 。
图4.19 测试环境
3. 利用树莓派的USB接口连接摄像头 在命令行中运行 Python脚本 detect.py测试模型 如果机
, , 。
器识别达到一定的阈值 则代表标志牌被正确识别 图4.20显示的是目标检测结果
, 。 。
图4.20 目标检测结果
【关键代码】
第四章 开源硬件项目设计实践
while True
= 读取摄像头数据
ret frame camera read #
_ = _ =0 将摄像头的数据转换为模型可接受的输入
frameexpanded np expanddims frame axis #
大小
=
boxes scores classes num sess run
_ _ _ _
detectionboxes detectionscores detectionclasses numdetections
_ = _ _ 运行模型
feeddict imagetensor frameexpanded #
2 ' ' 显示图片
cv imshow trafficsign frame #
树莓派接收到摄像数据后 通过目标检测模型分辨出 停止 标志牌 向 Arduino发送操作指令 如 m
, “ ” , , “
0 0 Arduino接收到指令后 运行事先烧录好的carStop函数 使两个电机的转速为 0从而完成 停止
”。 , , , “ ”
操作
。
华
东
师
范
大
学
出
版
社
importserial
_ = ' 0' 9600 开启串口
sera serial Serial dev ttyACM #
_ 0 0 树莓派向 发送命令 0 0
sera write "m " # Arduino m
123开源硬件项目设计
_ 关闭串口
sera close #
至此 我们完成了图像识别中的目标检测任务 将道路识别与交通标志识别结合在一起 就能实现特
华
, 。 ,
定场景下的自动驾驶了
。
东
体 验 思 考
如图4.21所示 激光雷达(laser detection and ranging简写为LiDAR)凭借其优异性能已成为不可或
, 师 ,
缺的环境感知传感器 车载激光雷达因其具有可准确获取目标的三维信息 分辨率高 抗干扰能力强 探
。 、 、 、
测范围广 近全天候工作等优点 在智能驾驶环境感知系统中占据重要地位
、 , 。
请同学们查阅资料 还有哪些能够提升汽车驾驶环境感知能力的技术
, ?
范
大
学
出
图4.21 激光雷达
版
二、 双机通信
社
树莓派与 的通信共有两种常见的实现方式 一种为
Arduino , USB
连接 一种为串口连接 两个开源硬件的连接遵循一般的通信协议
, 。 ,
如 协议规范20 232串口通信协议等
USB .、RS 。
具有多种多样的外部接口 不同于树莓派的 接口
Arduino , I/O ,
具有模拟输入接口 可以测量 接口上的模拟值
Arduino , I/O 。
与树莓派进行串口通信的方式一般有两种 一是通过树莓派
Arduino :
的 接口进行通信 二是通过 接口进行通信
USB , GPIO 。
1241. 树莓派与Arduino通过USB接口进行通信
通过 数据线把树莓派和
USB Arduino
连接起来 在连接正常的情况下 可以在树
, ,
莓派终端查看两者连接端口的名称 然后
;
编写树莓派和 的通信代码及指
图4.22 树莓派和Arduino通过USB接口进行通信的流程图
Arduino
令 并完成上传 最终在树莓派上测试通信
, ;
结果 流程图如422所示
。 . 。
(1) 用 USB数据线连接树莓派和 Arduino
按照流程图 先用 数据线连接树莓派和 硬件连接
, USB Arduino。
如图423所示
. 。
图4.23 树莓派和Arduino通过USB接口连接的实
物搭建图
(2) 编写树莓派和 Arduino的通信代码及指令
以 接口连接为例 展示核心测试代码 测试内容为树莓派
USB , 。
向 发送字符串 若 回复树莓派
Arduino “HelloArduino”, Arduino
则表示连接成功
“HelloRaspberry”, 。
(3) 主要代码
烧录程序
① Arduino
第四章 开源硬件项目设计实践
华
东
师
范
大
学
出
版
社
voidsetup
9600 指定数据传输速率为9600
Serial begin bps
125开源硬件项目设计
voidloop
if Serial available
== 接收树莓派传来的字符串 进行条件判断
if "HelloArduino" Serial read
回复树莓派
Serial println "HelloRaspberry"
脚本测试树莓派与 的通信
②Python Arduino
华
东
师
importserial 范
_ = ' 0' 9600 开启串口
sera serial Serial dev ttyACM #
_ 树莓派向 发送字符
sera write "HelloArduino" # Arduino HelloArduino
= _ 树莓派读取 回复的字符串
receive sera readline # 大Arduino
打印 回复的内容
print receive # Arduino
_ 关闭串口
sera close #
测试
学
③
若连接树莓派的屏幕上显示了 则说明连接成
“HelloRaspberry”,
功 否则 需逐行排查错误
; , 。
出
2. 树莓派和Arduino通过GPIO接口进行通信
树莓派与 通过 接口进行通信的流程及串口连接
版
Arduino GPIO
分别如图424和图425所示
. . 。
社
图4.24 树莓派和Arduino通过GPIO接口进行通信的流 图4.25 树莓派和 Arduino
程图 的串口连接示意图
通过 接口 能够实现 与树莓派的通信 首先将
GPIO , Arduino 。
接收的数据传输到树莓派中进行处理 再由树莓派发送命令
Arduino ,
给 并根据规定的通信协议执行命令 这样就充分利用了两
Arduino, 。
126种开源硬件的优势 使二者相辅相成 协同完成智能驾驶任务 树莓
, , 。
派与 通过 接口连接如图426所示
Arduino GPIO . 。
华
东
师
图4.26 树莓派与Arduino通过GPIO接口连接
的实物搭建图
范
探 究 活 动
大
下位机 Arduino和上位机树莓派通过串口通信建立信息交互通道 树莓派发送指令给 Arduino
。 ,
Arduino执行相应的动作或者返回传感器信息给树莓派 这需要制定双方共同遵守的通信协议 这类协议
, 。
可以复杂也可以很简单 一般以满足需要并适当考虑使用场合的拓展为宜 可靠性要求高的场合还需要
, 学 。
对发送和接收的数据做校验 以保证数据的完整性
, 。
假设采用以下的通信协议
:
1 命令以字符串的形式发送 命令和数据间用空格分割
() , 。
2 命令由三个字段组成 第一个字段是一个字母长出度的命令位 第二个字段为数据位1第三个字段
() , , ,
为数据位2
。
示例如下 如果想从下位机模拟引脚A3中读取数据 则发送指令 a 3 如果想设置小车以每秒20个
: , “ ”,
编码器脉冲的速度前进 则发送指令 m 20 20 这里的 a m 等指令均可在Arduino上自定义
, “ ”。 “”“ ”版 。
制定表4.10所示的指令说明表 以实现所要求的控制命令
, 。
表4.10 指令说明表
指令 命令位(可自定义) 数据位1(可自定义) 社数据位2(可自定义)
读取AD接口的值 ‘a’ AD接口的引脚号 无
设置I/O接口的值 ‘c’ I/O接口的引脚号 0或者1,0为低电平,1为高电平
读取小车的速度
设置小车的速度
小车左转
小车右转
第四章 开源硬件项目设计实践 127我们在上一节的运动小车的基础上搭载了树莓派 再连
,
接摄像头 就能完成最终的自动驾驶小车了 图427为拼装
, 。 .
完整的实物图
。
华
接下来对小车进行调试 测试与调试自动驾驶小车时
。 ,
经常会遇到一些制作过程中无法想象的问题 例如 在调试
。 ,
过程中经常碰到小车无法正确地执行指令 小车无法正确转
,
东
弯等问题 那么通过什么方式能解决上述类似的问题
。 ?
首先需要知道引发问题的模块有哪些 并进行逐一排查
, 。
然后试着借鉴前人的经验解决问题 借鉴的方式有很多 可以
, ,
师翻阅书籍 或利用互联网上的搜索工具搜索 也可以在开源社
, ,
图4.27 自动驾驶小车
区里提问 最后根据获得的结果 结合自身所遇到的问题 有
。 , ,
针对性地进行调试
。
调范试过程通常分为以下几步
:
1 针对发生问题的模块进行断点调试
() 。
2 通过打印的方式判断错误的类型
() 。
3 重新运行代码 查看修改后的代码是否会引发新的问题
大
() , 。
其中 断点调试是一种很实用的排查错误的技巧 断点调试即在
, 。
程序的某一行设置一个间断点 程序运行到这一行时就会停止 之后
, ,
依次往下对每一行进行调试 如果报错 则打印出程序中变量的值进
学, ,
行分析 并根据错误类型修改代码 我们以图像识别的代码为例 其
, 。 ,
断点调试的方式如图428所示
. 。
出
版
社
图4.28 断点调试 图中红点即
(
为 断点
“ ”)
至此 我们完成了由 运动小车 到 自动驾驶小车 的整个开发过
, “ ” “ ”
程 包括分析 设计 选材 开发 组装 调试 优化等一系列环节 同学
, 、 、 、 、 、 、 。
们可以通过动手实践 设计并开发一辆自动驾驶小车 还可以利用课
, ,
余时间查阅资料 了解自动驾驶相关技术和产业的前沿发展情况
, 。
128 开源硬件项目设计第四节 无人小车·项目发布
发布一个开源项目是人们为开源做贡献的一种直接而有效的途
华
径 不仅可以传播自己的创意 为别人提供思路 也可以收获别人的帮
, 、 ,
助 改进和提高项目的质量 需要注意的是 当一个项目被开源 这意
, 。 , ,
味着任何人都可以查看 运行 修改和发布该项目 因此在开源项目发
、 、 ,
东
布的具体操作流程上必须遵循特定的发布规范 选择合适的社区 相
, ,
关权限可通过附加的开源许可证来规定
。
师
体 验 思 考
如何将项目发布至开源社区 如何更新维护你的开源项目
? ?
范
一、 开大启一个开源项目
如果你乐意让他人对你的工作进行查看和反馈 你就应该开源你
,
的项目 首先 开学源项目都应包括以下文档
。 , :
1 许可证 假如某个项目源代码开放 但是没有任何
() (license)。 ,
的许可协议 那它就不能称为开源项目 所以启动开源项目时 务必选
, , ,
择相应的许可证 出
。
2 自述文件 它不仅用于说明如何使用你的项目
() (README)。 ,
还可以解释你的项目为什么重要 以及该项目可以为你的用户做
,
什么 版
。
3 贡献指南 它告诉项目参与者如何参
() (CONTRIBUTING)。
与你的项目 包括如何提交错误报告 如何建立一个新功能 如何配置
, 、 、
开发环境和运行测试等 社
。
4 行为准则 它主要为项目参与者的行为设定基本规则 比如
() 。 ,
参与社区活动时的一些礼仪 说话方式 行为等 有助于形成一种友好
、 、 ,
的氛围
。
其次 应为项目选择一个容易记住 有创意 能表达项目用意的名
, 、 、
称 但名称不能涉嫌侵权或和已存在的项目冲突
, 。
再次 要保持项目所使用的代码风格一致 项目要有明确的功能
, , 、
方法 代码注释要清晰
, 。
第四章 开源硬件项目设计实践 129最后 将所有内容检查一遍 如果没有问题 点击 完成
, , , “publish”,
发布
。
华
二、 Arduino开源项目发布示例和许可证的选择
图429是 开源项目的文档列表 它包含许可证 自述文
. Arduino , 、
东
件和贡献指南等文件
。
师
范
大
学
图4.29 Arduino开源项目的文档列表
出
许可证分为开源硬件许可证和开源软件许可证 的开
。Arduino
源硬件许可证选用 30 开源软件许可证有两个 即
CCBY SA .; 版 , GNU
20和 21 协议需要把开源者的许可
GPL . GNULGPL .。GPL/LGPL
证复制到项目的 文件里 那么 的软件是参考哪个开
License 。 Arduino
源项目开发的呢
?
社
的发展历史要从 讲起 简单来说
Arduino Processing , ,Processing
是一个开源的集成开发环境 它的开源许可证是 20
(IDE), GNUGPL .,
然后 在 这个 其界面如图430所示 里增加了
Wiring Processing IDE( . )
核心库开源代码 如图431所示 它就继承了 的
( . ), Processing GNU
20协议
GPL . 。
130 开源硬件项目设计华
东
师
范
图4.30 Processing IDE界面 图4.31 Wiring核心库开源代码
大 是基于 开发的 核心库开源代码是
ArduinoIDE ProcessingIDE ,
基于 开发的 所以它也就继承了 和 的
Wiring , Processing Wiring
20协议 同时根据自己的要求新增了 21协
GNUGPL . , GNULGPL .
议 其发展脉络如学图432所示
, . 。
Processing Wiring Arduino
发布于2001年 发出布于2004年 发布于2005—2006年
→ →
GNU GPL 2.0
GNU GPL 2.0 GNU GPL 2.0
GNU LGPL 2.1
图4.32 Arduino IDE的发展脉络
版
以 项目开源为例 开源项目发布前 需要按照规则分类
Arduino , ,
设计文档 选择开源许可证 编写自述文件及其他相关文件等
, , 社。
1 按照规则新建多个文件夹 如专门存放小车3 模型文件的
() , D
3 文件夹 专门存放原理图 等硬件设计资料的 文件夹
“D” , 、PCB “hw”
等 并将各类设计文档放入相应的文件夹内 如图433所示
, , . 。
第四章 开源硬件项目设计实践 131华
东
师
图4.33 文件夹及其保存文件类型
2 选择硬件许可证和软件许可证 并将选定的开源许可证写到
() ,
托管仓范库根目录的 文件夹内 注意不同的许可证有各自不同
License ,
的要求
。
3 编写 文件 保存在托管仓库的根目录下 它是
() README.md , ,
一个介绍性的说明文件 主要解释项目有何用处 为何发起 以及如何
大
, 、 ,
快速入门等 不同的文件夹里需要编写相应的 文件
。 README.md
来说明本文件夹内存放的内容
。
4 编写其他文档 如贡献指南 行为准则以及教程等
() 学, 、 。
5 软件版本更新
() 。
发布一个开源项目以后 要对项目不断地进行迭代和优化 相应
, ,
会产生很多版本 大型的代码托管平台有专门用于版本更新的管理
。 出
工具 例如在国内的码云或国外的 上使用 来上传 更新
, GitHub git ( )
代码
。
完成上述步骤后 自动驾驶小车项目就可以发布至开源社区了
, 版 。
作业练习
社
选择一个开源社区 诸如 GitHub码云等 将本章完成的自动驾驶小车
, 、 ,
项目规范地发布至平台上
。
132 开源硬件项目设计附录 开源硬件平台编程及输入/输出模块简介
1. Arduino编程语法简介
(1) 程序结构
程序的构成
① Arduino
程序必须包括两部分
Arduino :
. 初始化程序 初始化程序代码
a :voidsetup(){ }
. 主体程序 主体程序代码
b :voidloop(){ }
库函数调用
②
用于调取外部的库文件
#include 。
如 调用与温湿度传感器使用相关的
:#include //
库文件
自定义函数调用
③
为了确保程序结构清晰 将程序中可以重复使用或用来独立地完
,
成某个功能的代码 以函数的形式单独放置 这样也可使得程序的可
, ,
读性加强 如
。 :
附录 开源硬件平台编程及输入/输出模块简介
华
东
师
范
大
学
出
版
void loop
社
1
FlashNumber
void FlashNumber intpos
定义常量
④ #define
如 3 将 定义为3方便调用和后期修改
:#defineledPin // ledPin ,
(2) 常用符号
分号 用于表示一句代码的结束
① ;( ): 。
133花括号或称大括号 成对出现 将包含在其中的多条语句
② {}( ): ,
组合成复合语句
。
单行注释 将其所在行后面的文字作为注释 不会被编译
华
③//( ): ,
和被处理器执行
。
多行注释 将 和 包含的多行文字作为
④/* */( ): “/*” “*/”
注释
。
东(3) 流程控制
①if
格式 条件表达式
:if( ){
师 满足条件时执行的语句组
……//
}
②if…else
格范式 条件表达式
:if( ){
满足条件时执行的语句组
……//
}
大
else
{
不满足条件时执行的语句组
……//
学}
③for
格式 初始化语句 循环条件 增量计数
:for( ; ; ){
满足条件时
出……//
重复执行的语句组
}
④while 版
格式 条件表达式
:while( ){
满足条件时重复执行的语句组
……//
}
社
(4) 常用运算
算术运算 赋值 加 减 乘 除 取余
运算符 = + - * / %
关系运算 等于 不等于 大于 小于 大于等于 小于等于
运算符 == != > < >= <=
134 开源硬件项目设计逻辑运算 与 或 非
运算符 && || !
华
(5) 常量表示
引脚电压定义 定义高或低电平 也可直接
① HIGH|LOW( ) // ,
用1或0表示
东
布尔常量 定义逻辑真或假 当结果是0时 为
②true|false( ) // , ,
当结果是非0时 为
false; , true
数字引脚定义
师③INPUT|OUTPUT( )
(6) 常用函数
将指定的引脚 配置成输入或输出
①pinMode(pin,mode): pin ,
即 或
INPUT OUTPUT。
范
读取指定数字引脚 的值 返回 或
②digitalRead(pin): pin , HIGH
LOW。
给一个数字引脚 写入
③digitalWrite(pin,value): pin HIGH
或 大
LOW。
从指定模拟引脚 读取数据值 返回0
④analogRead(pin): pin , ~
1023之间的整数值
。
学 从一个模拟引脚 输出值
⑤analogWrite(pin,value): pin value
最小为0 即占空比为0 最大为255 即占空比
(PWM)。value , ;value ,
为100
%。
返回 开发板从运行当前程序开始的毫
出
⑥ millis(): Arduino
秒数
。
使程序暂停指定的时间 单位
⑦delay(): ( :ms)。
使程序暂停指定的一段时间 单位
⑧delayMicroseconds(): 版 ( :
μs)。
将一个数
⑨ map(value,fromLow,fromHigh,toLow,toHigh):
从一个范围映射到另外一个范围
。 社
当指定引脚
⑩attachInterrupt(interrupt,function,mode):
发生外部中断时 调用一个指定函数 为触发
interrupt , function,mode
条件
。
初始化串口 设置数据传输速率为
Serial.begin(speed): , speed
单位
( :bps)。
从串口打印输出数据 不换行
Serial.print(): , 。
从串口打印输出数据 并换行
Serial.println(): , 。
附录 开源硬件平台编程及输入/输出模块简介 1352. 开源硬件系统中常用的输入模块
华
名称 图片 简 介
东
声音传感器 用于检测周围环境中的声音强度。
师
超声波测距传感器 用于检测传感器与目标物之间的距离。
范
人体红外传感器 用于探测人或动物身体发射的红外线。
大
学
光敏传感器 用于将光信号转换为电信号。
出
气体传感器 用于检测可燃性气体和有毒烟雾。
版
社
温湿度传感器 用于检测环境中的温度、湿度信息。
用于检测物体运动过程中的加速度,获取物体运动姿态
加速度传感器
或运动方向信息。
136 开源硬件项目设计(续 表)
名称 图片 简 介
华
陀螺仪传感器 用于测量角速度,即物体围绕轴旋转的速度。
东
霍尔传感器 用于检测周围磁场强度。
师
用于探测火源或其他波长在 760 1100nm范围内的
火焰传感器 ~
范 光源。
大
土壤传感器 用于检测土壤的水分信息。
学
红外对管传感器 用于实现传输信号、遥控、避障等功能。
出
3. 开源硬件系统中常用的输出模块
版
名称 图 片 简 介
社
LED数码管 多个发光二极管组成数字8形状的显示器件。
液晶屏 LED技术的显示器件(黑白屏)。
附录 开源硬件平台编程及输入/输出模块简介 137(续 表)
名称 图 片 简 介
华
OLED显示屏 OLED技术的显示器件(彩色屏)。
东
弱电(微控制器)控制强电(交流电、大电压、大电流)
继电器
的控制器件。
师
范
MP3播放器 播放MP3音乐文件的器件。
大
直流电机驱动模块和直
能将电能转换为机械能,驱动直流电机运转。
流电机
学
步进电机驱动模块和步 出
通过脉冲信号精确控制角位移,驱动步进电机运转。
进电机
版
控制精度高、响应速度快,用于多足机器人、机械臂
舵机
和监控云台等。
社
138 开源硬件项目设计后 记
华
东
师
本册教科书依据教育部 普通高中信息技术课程标准 2017年版
《 (
2020年修订 编写 并经国家教材委员会专家委员会审核通过 全
范)》 , 。
体编写人员认真领会国家基础教育改革精神 精心研究当代信息社会
,
的人才培养要求 广泛调研上海及各地高中信息技术教育的现状和挑
,
战 深入了解高中学生的学习需求 并汲取了上海市 普通高中信息科
, 大 , 《
技 试用本 的编写经验
( )》 。
编写过程中 上海市中小学 幼儿园 课程改革委员会专家工作委
, ( )
员会 上海市教育委员会教学研究室 上海市课程方案教育教学研究
, ,
学
基地 上海市心理教育教学研究基地 上海市基础教育教材建设研究
、 、
基地 上海市信息科技教育教学研究基地 上海高校 立德树人 人文
、 ( “ ”
社会科学重点研究基地 及基地所在单位华东师范大学等单位给予了
)
出
大力支持 在此表示感谢
, !
本册教科书出版之前 我们已通过多种渠道与教科书选用作品
,
包括照片 画作 的作者进行了联系 得到了他们的大力支持 对此
( 、 ) , 。 ,
我们衷心地表示感谢 恳请尚未联版系到的作者与我们联系 以便出版
! ,
社及时支付相关稿酬
。
我们真诚地希望广大教师 学生及家长在使用本册教科书的过程
、
中提出宝贵意见 我们将集思广益 不断修社订 使教科书趋于完善
。 , , 。
编 者
后 记 139