具体描述
编辑推荐
本书是树莓派实战类图书的经典图书,经过全新的升级,本书针对树莓派3进行了全面、细致的讲解,结合Python语言等编程实例,帮助读者更好地利用树莓派。本书有源代码的支持,读者可以快速上手尝试。非常适合程序员、计算机软硬件爱好者,以及对树莓派感兴趣的读者阅读,也适合作为树莓派相关实践课程的指导用书。 内容简介
树莓派(Raspberry Pi)是一款基于Linux系统的、只有一张信用卡大小的卡片式计算机。研发树莓派的起初目的是通过低价硬件和自由软件来推动学校的基础计算机学科教育,但很快树莓派就得到计算机和硬件爱好者的青睐;他们用它学习编程,并创造出各种各样新奇的、风靡一时的软硬件应用。
本书由多产作家Simon Monk编写,是将内容进行全面升级之后的第2版,囊括了丰富的实践示例,详细讲解了树莓派的配置与管理、网络连接、操作系统及软件。另外,本书还介绍了使用Python进行树莓派开发的各项技巧,书中介绍了有关Python编程的基础知识、列表与字典、Python高级特性。同时,本书还介绍了有关机器视觉、硬件基础、控制硬件、电机、数字输入、传感器、显示设备、物联网及Arduino等相关知识。
本书适合程序员和计算机软、硬件爱好者,以及对树莓派感兴趣的读者阅读,也适合作为树莓派相关实践课程的指导用书。 作者简介
Simon Monk博士(英国普雷斯顿)拥有控制论和计算机科学本科学位以及软件工程博士学位。Simon在回归工业界之前,曾经从事多年的学术研究工作,并与人合作创立了移动软件公司Momote Ltd。
目前,Simon是一位职业作家,撰写包括树莓派和Arduino在内的各种开源硬件方面的作品,以及多部通用电子方面的图书。 目录
第1章 配置与管理 1
1.0 引言 1
1.1 选择树莓派型号 1
1.2 封装树莓派 3
1.3 选择电源 4
1.4 选择操作系统发行包 6
1.5 通过NOOBS刷写microSD卡 7
1.6 装配系统 9
1.7 连接DVI或VGA显示器 10
1.8 使用复合视频显示器/TV 10
1.9 调整显示器中的图像尺寸 12
1.10 优化性能 13
1.11 修改密码 15
1.12 让树莓派开机后直接进入窗口系统 16
1.13 关闭树莓派 17
1.14 安装树莓派摄像头模块 18
1.15 使用蓝牙设备 21
第2章 网络连接 23
2.0 引言 23
2.1 连接有线网络 23
2.2 查看自己的IP地址 25
2.3 配置静态IP地址 26
2.4 为树莓派配置网络名称 28
2.5 配置无线网络连接 29
2.6 使用控制台线联网 31
2.7 利用SSH远程控制树莓派 33
2.8 利用VNC远程控制树莓派 35
2.9 利用RDP远程控制树莓派 36
2.10 在Mac网络中实现文件共享 38
2.11 在Mac上共享树莓派的屏幕 39
2.12 将树莓派用作网络存储服务器 41
2.13 网络打印 44
第3章 操作系统 47
3.0 引言 47
3.1 通过图形界面移动文件 47
3.2 启动一个终端会话 49
3.3 利用终端浏览文件系统 50
3.4 复制文件或文件夹 52
3.5 重命名文件和文件夹 53
3.6 编辑文件 54
3.7 查看文件内容 56
3.8 不借助编辑器的情况下创建文件 57
3.9 创建目录 57
3.10 删除文件或目录 58
3.11 以超级用户权限执行任务 59
3.12 理解文件权限 60
3.13 修改文件的权限 61
3.14 修改文件的属主 62
3.15 屏幕截图 63
3.16 利用apt-get安装软件 64
3.17 删除利用apt-get安装的软件 65
3.18 利用Pip安装Python软件包 65
3.19 通过命令行获取文件 66
3.20 利用Git获取源代码 67
3.21 在系统启动时自动运行程序或脚本 67
3.22 让程序或脚本作为服务自动运行 68
3.23 定期自动运行程序或脚本 70
3.24 搜索功能 71
3.25 使用命令行历史记录功能 72
3.26 监视处理器活动 73
3.27 文件压缩 75
3.28 列出已连接的USB设备 76
3.29 将输出从命令行重定向到文件 76
3.30 连接文件 77
3.31 使用管道 78
3.32 将输出隐藏到终端 78
3.33 在后台运行程序 79
3.34 创建命令别名 80
3.35 设置日期和时间 80
3.36 查看SD卡剩余存储空间 81
第4章 软件 83
4.0 引言 83
4.1 搭建媒体中心 83
4.2 安装Oice软件 84
4.3 安装其他浏览器 86
4.4 使用树莓派商店 87
4.5 打造网络摄像头服务器 88
4.6 运行老式游戏控制台模拟器 90
4.7 运行树莓派版Minecraft 92
4.8 运行Minecraft服务器 93
4.9 运行Open Arena 95
4.10 树莓派无线电发射器 96
4.11 运行GIMP 98
4.12 互联网广播 99
第5章 Python入门 101
5.0 引言 101
5.1 在Python 2和Python 3之间做出选择 101
5.2 使用IDLE编辑Python程序 102
5.3 使用Python控制台 104
5.4 利用终端运行Python程序 105
5.5 变量 106
5.6 显示输出结果 107
5.7 读取用户输入 107
5.8 算术运算 108
5.9 创建字符串 109
5.10 连接(合并)字符串 110
5.11 将数字转换为字符串 111
5.12 将字符串转换为数字 111
5.13 确定字符串的长度 112
5.14 确定某字符串在另一个字符串中的位置 113
5.15 截取部分字符串 113
5.16 使用字符串替换另一个字符串中的内容 114
5.17 字符串的大小写转换 115
5.18 根据条件运行命令 116
5.19 值的比较 117
5.20 逻辑运算符 118
5.21 将指令重复执行特定次数 119
5.22 重复执行指令直到特定条件改变为止 120
5.23 跳出循环语句 120
5.24 定义Python函数 121
第6章 Python语言中的列表与字典 123
6.0 引言 123
6.1 创建列表 123
6.2 访问列表元素 124
6.3 确定列表长度 125
6.4 为列表添加元素 125
6.5 删除列表元素 126
6.6 通过解析字符串创建列表 127
6.7 遍历列表 127
6.8 枚举列表 128
6.9 列表排序 129
6.10 分割列表 130
6.11 将函数应用于列表 131
6.12 创建字典 131
6.13 访问字典 133
6.14 删除字典元素 134
6.15 遍历字典 134
第7章 Python高级特性 137
7.0 引言 137
7.1 格式化数字 137
7.2 格式化时间和日期 138
7.3 返回多个值 139
7.4 定义类 140
7.5 定义方法 141
7.6 继承 142
7.7 向文件中写入内容 143
7.8 读文件 144
7.9 序列化(Pickling) 145
7.10 异常处理 146
7.11 使用模块 147
7.12 随机数 148
7.13 利用Python发送Web请求 149
7.14 Python的命令行参数 150
7.15 从Python运行Linux命令 151
7.16 从Python发送电子邮件 152
7.17 利用Python编写简单Web服务器 153
7.18 同时进行多件事情 154
7.19 让Python无所事事 156
7.20 将Python应用于树莓派版Minecraft 156
第8章 机器视觉 159
8.0 引言 159
8.1 安装SimpleCV 159
8.2 为机器视觉配置USB摄像头 160
8.3 将树莓派的摄像头模块用于机器视觉 162
8.4 数硬币 163
8.5 人脸检测 166
8.6 运动检测 168
8.7 光学字符识别 170
第9章 硬件基础 173
9.0 引言 173
9.1 GPIO连接器使用说明 173
9.2 使用GPIO接口时树莓派的安全保护 176
9.3 配置I2C 176
9.4 使用I2C工具 178
9.5 配置SPI 179
9.6 安装PySerial以便从Python访问串口 180
9.7 安装Minicom以检测串口 181
9.8 使用带有跳线的面包板 182
9.9 使用树莓派的排线连接面包板 183
9.10 使用树莓派Squid 184
9.11 使用Raspberry Squid按钮 186
9.12 利用两个电阻将5V信号转换为3.3V 187
9.13 利用电平转换模块将5V信号转换为3.3V 189
9.14 利用电池为树莓派供电 190
9.15 利用锂电池为树莓派供电 192
9.16 Sense HAT入门指南 193
9.17 Explorer HAT Pro入门指南 194
9.18 RaspiRobot Board入门指南 196
9.19 使用Pi Plate原型板 198
9.20 制作树莓派扩展板(Hardware At Top,HAT) 201
9.21 树莓派的计算模块 204
9.22 Pi Zero 205
第10章 控制硬件 207
10.0 引言 207
10.1 连接LED 207
10.2 让GPIO引脚进入安全状态 209
10.3 控制LED的亮度 210
10.4 制造蜂鸣声 213
10.5 利用晶体管开关大功率直流设备 214
10.6 使用继电器控制大功率设备的开关 216
10.7 控制高压交流设备 219
10.8 编写用于控制开关的用户界面 220
10.9 编写控制LED和电机的PWM功率的用户界面 221
10.10 改变RGB LED的颜色 223
10.11 使用大量LED(Charlieplexing方式) 225
10.12 将模拟仪表用作显示器 228
10.13 中断编程 230
第11章 电机 233
11.0 引言 233
11.1 控制伺服电机 233
11.2 精确控制伺服电机 237
11.3 控制多台伺服电机 239
11.4 控制直流电动机的速度 242
11.5 控制直流电机的方向 244
11.6 使用单极步进电机 248
11.7 使用双极步进电机 252
11.8 利用步进电机HAT驱动双极步进电机 253
11.9 使用RaspiRobot板驱动双极步进电机 256
11.10 打造一款简单的机器人小车 257
第12章 数字输入 261
12.0 引言 261
12.1 连接按钮开关 261
12.2 通过按钮开关切换开关状态 264
12.3 使用双位拨动开关或滑动开关 265
12.4 使用三位拨动开关或滑动开关 266
12.5 按钮去抖 269
12.6 使用外部上拉电阻 271
12.7 使用旋转(正交)编码器 272
12.8 使用数字键盘 275
12.9 检测移动 278
12.10 为树莓派添加GPS 280
12.11 拦截按键 283
12.12 拦截鼠标移动 285
12.13 使用实时时钟模块 286
第13章 传感器 291
13.0 引言 291
13.1 使用电阻式传感器 291
13.2 测量亮度 296
13.3 利用热敏电阻测量温度 298
13.4 检测甲烷 301
13.5 测量电压 304
13.6 为测量而降低电压 306
13.7 使用电阻式传感器与ADC 309
13.8 使用ADC测量温度 310
13.9 测量树莓派的CPU温度 312
13.10 利用Sense HAT测量温度、湿度和气压 313
13.11 利用数字传感器测量温度 315
13.12 利用MCP3008模块测量加速度 318
13.13 使用Sense HAT的惯性管理单元(IMU) 321
13.14 利用Sense HAT寻找磁北 323
13.15 利用簧片开关检测磁铁 323
13.16 利用Sense HAT感应磁场 325
13.17 测量距离 325
13.18 电容式触摸传感技术 328
13.19 显示传感器的值 331
13.20 利用USB闪存驱动器记录日志 332
第14章 显示设备 335
14.0 引言 335
14.1 使用四位LED显示设备 335
14.2 在I2C LED矩阵上面显示消息 337
14.3 使用Sense HAT LED矩形显示器 339
14.4 在Alphanumeric LCD HAT上显示消息 341
14.5 在Alphanumeric LCD模块上显示消息 343
14.6 使用OLED图形显示器 347
14.7 使用可寻址的RGB LED灯条 349
第15章 物联网 355
15.0 引言 355
15.1 使用Web接口控制GPIO输出 355
15.2 在网页上面显示传感器读数 360
15.3 使用IFTTT发送电子邮件及其他通知 363
15.4 利用ThingSpeak发送Tweets 367
15.5 CheerLights 369
15.6 向ThingSpeak发送传感器数据 370
15.7 使用Dweet和IFTTT响应Tweet 373
第16章 Arduino与树莓派 377
16.0 引言 377
16.1 通过树莓派对Arduino进行编程 378
16.2 利用Serial Monitor与Arduino进行通信 380
16.3 配置PyFirmata以便通过树莓派来控制Arduino 382
16.4 通过树莓派对Arduino的数字输出进行写操作 384
16.5 使用PyFirmata与TTL串口 386
16.6 使用PyFirmata读取Arduino的数字输入 388
16.7 利用PyFirmata读取Arduino的模拟输入 390
16.8 模拟输出(PWM)与PyFirmata 391
16.9 利用PyFirmata控制伺服电机 393
16.10 定制基于TTL Serial的Arduino通信 395
16.11 通过I2C自定义与Arduino之间的通信 399
16.12 在树莓派上使用小型Arduino 402
16.13 aLaMode板与树莓派入门 403
16.14 在树莓派和aLaMode板上使用Arduino Shield 406
附录A 配件与供应商 409
附录B 树莓派引脚 415
《嵌入式系统设计与开发:从理论到实践》 一、 概述:开启嵌入式世界的无限可能 在当今高度互联的时代,嵌入式系统无处不在,它们是智能家居、物联网设备、工业自动化、医疗仪器、汽车电子等无数尖端技术的核心驱动力。本书旨在为读者构建一个全面而深入的嵌入式系统知识体系,涵盖从基础理论到高级应用的各个层面,引导读者掌握嵌入式系统设计与开发的完整流程。我们不局限于任何特定的硬件平台,而是着重于传授跨平台、可复用的核心概念和工程实践,让您无论面对何种嵌入式项目,都能游刃有余。 本书将带领您深入理解嵌入式系统的本质,理解其与通用计算机系统的区别与联系。您将学习如何根据项目需求,选择最适合的硬件架构,如何高效地进行软件开发,以及如何优化系统性能、保证系统可靠性。我们坚信,扎实的理论基础结合丰富的实践经验,是成为一名优秀嵌入式工程师的关键。因此,本书在理论讲解的同时,将穿插大量的实际案例分析和代码示例,帮助您将抽象的概念转化为具体的解决方案。 二、 核心内容:构建扎实的嵌入式开发基石 第一部分:嵌入式系统基础理论 1. 嵌入式系统概述与架构: 定义与特点: 深入剖析嵌入式系统的定义、关键特征(如实时性、资源受限性、专用性等)以及其在现代科技中的重要地位。 典型嵌入式系统架构: 详细介绍嵌入式系统的基本组成模块,包括微处理器/微控制器(MCU)、存储器(RAM, ROM, Flash)、输入/输出(I/O)接口、通信接口(UART, SPI, I2C, USB, Ethernet等)以及外围设备。 硬件选型原则: 讲解如何根据应用场景(功耗、性能、成本、实时性要求等)选择合适的微处理器类型(如ARM Cortex-M系列、RISC-V等)、存储器容量和类型,以及必要的外围硬件。 系统总线与中断机制: 理解CPU与外围设备之间的数据传输方式(如AXI, AHB, APB总线),以及中断在嵌入式系统中的作用和实现原理,包括中断向量表、中断服务程序(ISR)等。 2. 嵌入式操作系统(RTOS)核心概念: RTOS的必要性与优势: 解释为什么在许多嵌入式应用中需要使用实时操作系统,以及RTOS如何解决多任务并发、资源管理、实时响应等挑战。 任务(Task)与线程(Thread): 深入理解任务的状态(运行、就绪、阻塞)、创建、删除、切换的机制。 任务调度算法: 详细介绍常见的RTOS调度算法,如优先级调度(抢占式与非抢占式)、轮转调度、先进先出(FIFO)等,并分析其优缺点及适用场景。 进程间通信(IPC)与同步机制: 学习如何利用消息队列、信号量、互斥锁、事件标志组、管道等机制实现任务间的通信与协调,避免数据竞争和死锁。 内存管理: 探讨嵌入式系统中的内存分配与管理策略,包括静态分配、动态分配,以及内存池、内存碎片等问题。 中断处理与RTOS的结合: 理解中断发生时RTOS如何响应,以及如何在中断服务程序中安全地与RTOS内核交互。 经典RTOS解析(不局限于特定产品): 通过分析几个代表性的RTOS(如FreeRTOS, Zephyr, RT-Thread等)的设计理念和关键API,让读者掌握其通用工作原理,而无需被特定OS的功能所限制。 3. 嵌入式开发环境与工具链: 交叉编译环境搭建: 掌握交叉编译器的概念,以及如何为目标嵌入式平台搭建适用的交叉编译工具链(GCC, Clang等)。 集成开发环境(IDE)与编辑器: 介绍常用的嵌入式IDE(如Eclipse CDT, VS Code with extensions)以及强大的文本编辑器(如Vim, Emacs)在嵌入式开发中的应用。 调试技术: 学习使用JTAG/SWD接口进行硬件调试,掌握断点设置、单步执行、变量查看、内存监视等高级调试技巧。 版本控制系统(Git): 强调Git在团队协作和项目管理中的重要性,并介绍其基本命令和工作流程。 构建系统(Make, CMake): 理解Makefile和CMakeLists.txt的作用,学习如何自动化构建和管理复杂的嵌入式项目。 第二部分:嵌入式软件开发实践 1. C/C++语言在嵌入式开发中的应用: 嵌入式C语言特性: 重点讲解C语言在嵌入式开发中的关键特性,如指针、位操作、结构体、联合体、宏定义、预处理器指令等,以及这些特性如何用于硬件控制和底层编程。 内存访问与优化: 深入理解内存地址空间、数据对齐、字节序(Endianness)等概念,学习如何通过精细的内存管理优化程序性能和减小代码体积。 嵌入式C++特性: 介绍C++在嵌入式开发中的优势,如面向对象编程、模板、STL(部分适用)等,以及如何权衡其带来的开销与收益。 硬件抽象层(HAL)设计: 讲解如何设计并实现硬件抽象层,以屏蔽底层硬件细节,提高代码的可移植性和可维护性。 2. 设备驱动程序开发: 驱动程序的作用与分类: 理解设备驱动程序在操作系统和硬件之间的桥梁作用,学习不同类型的驱动程序(如字符设备、块设备、网络设备)。 GPIO(通用输入输出)编程: 学习如何通过GPIO控制LED、读取按钮状态、驱动电机等基本操作。 通信接口驱动: 详细讲解UART, SPI, I2C等常用通信接口的驱动程序开发,包括数据发送/接收、波特率设置、总线仲裁等。 定时器与PWM(脉冲宽度调制): 学习如何利用定时器实现延时、周期性任务,以及如何使用PWM控制电机速度、LED亮度等。 ADC(模数转换器)与DAC(数模转换器): 学习如何采集模拟传感器数据,以及如何输出模拟信号。 中断驱动的I/O: 掌握如何编写高效的中断处理程序,以响应外部事件。 3. 嵌入式系统中的网络通信: TCP/IP协议栈基础: 简要介绍TCP/IP协议栈的基本概念,如IP地址、端口号、TCP/UDP区别、HTTP、MQTT等常用协议。 嵌入式网络接口开发: 讲解如何配置和使用以太网控制器、Wi-Fi模块等网络接口。 Socket编程: 学习使用Socket API进行嵌入式设备间的网络通信,包括TCP客户端/服务器、UDP通信。 轻量级网络协议(MQTT, CoAP): 介绍适用于资源受限设备的MQTT和CoAP协议,以及如何在嵌入式平台上实现这些协议。 Web服务器在嵌入式设备上的实现: 探讨如何在嵌入式设备上运行一个简单的Web服务器,实现远程控制和监控。 4. 嵌入式系统中的数据存储与文件系统: 非易失性存储技术: 介绍EEPROM, Flash(NOR Flash, NAND Flash)等非易失性存储器的原理、特点和使用方法。 嵌入式文件系统: 学习常见的嵌入式文件系统(如FATFS, LittleFS, JFFS2)的概念和应用,如何管理存储介质上的文件。 数据持久化: 掌握如何将应用程序数据、配置信息等保存到非易失性存储中,以实现断电后数据不丢失。 第三部分:嵌入式系统高级应用与工程实践 1. 嵌入式系统安全性: 安全威胁与风险: 分析嵌入式系统面临的常见安全威胁,如代码注入、拒绝服务攻击、数据泄露等。 安全编码实践: 学习编写安全的代码,避免缓冲区溢出、格式化字符串漏洞等。 安全启动与固件更新: 探讨如何实现安全启动机制,以及安全的远程固件更新(OTA)方案。 加密与认证: 简要介绍对称加密、非对称加密、数字签名等基本加密技术在嵌入式安全中的应用。 2. 嵌入式系统性能优化与调试: 性能瓶颈分析: 学习使用工具(如性能计数器、逻辑分析仪)定位代码中的性能瓶颈。 代码优化技巧: 掌握低功耗设计、减少内存访问、算法优化、硬件加速利用等多种性能提升方法。 实时性保障: 深入理解影响系统实时性的因素,并学习如何设计满足严格实时性要求的系统。 功耗管理: 讲解各种低功耗模式(睡眠模式、待机模式等),以及如何通过软件和硬件手段优化功耗。 3. 嵌入式项目开发流程与管理: 需求分析与系统设计: 强调在项目启动阶段进行充分的需求分析和系统架构设计的重要性。 软件开发生命周期: 介绍嵌入式软件开发的典型生命周期模型(如瀑布模型、敏捷开发)。 测试与验证: 学习单元测试、集成测试、系统测试等各种测试方法,以及如何进行有效的回归测试。 代码审查与质量保证: 强调代码审查在提升代码质量、发现潜在问题中的作用。 可靠性与容错设计: 探讨如何设计具备容错能力的系统,提高系统的稳定性和鲁棒性。 4. 前沿技术与发展趋势: 物联网(IoT)与边缘计算: 探讨嵌入式系统在物联网中的角色,以及边缘计算的兴起如何改变嵌入式应用。 人工智能(AI)在嵌入式设备上的部署: 介绍TinyML等技术,以及如何在资源受限的嵌入式设备上运行机器学习模型。 RISC-V架构的崛起: 简要介绍RISC-V指令集架构的特点,以及其在嵌入式领域的潜力。 三、 实践导向:案例驱动的学习模式 本书将贯穿一系列精心设计的实践案例,涵盖从简单的“点亮LED”到复杂的“构建一个简易的传感器数据采集与上传系统”。这些案例将引导读者动手实践,逐步掌握嵌入式开发的核心技能。每个案例都将提供清晰的步骤、详细的代码讲解以及调试指南,帮助读者克服学习过程中的困难,并从中获得成就感。通过这些实践,您将能够: 独立完成硬件配置与软件集成。 编写健壮、高效的嵌入式应用程序。 熟练运用各类调试工具解决实际问题。 将理论知识转化为解决工程问题的能力。 四、 目标读者 本书适合以下人群: 计算机科学、电子工程、自动化等相关专业的学生。 希望转型进入嵌入式开发领域的软件工程师。 正在从事嵌入式硬件设计的工程师,希望加强软件开发能力。 业余爱好者,对嵌入式技术充满好奇并希望进行实践。 五、 结语 《嵌入式系统设计与开发:从理论到实践》不仅仅是一本技术书籍,更是一份引领您探索嵌入式世界奥秘的指南。我们希望通过本书,帮助您建立起坚实的理论基础,掌握丰富的实践技能,最终能够独立设计和开发出具有竞争力的嵌入式产品,在快速发展的嵌入式技术领域创造属于自己的价值。