Python-树莓派编程学习指南-一-

163 阅读1小时+

Python 树莓派编程学习指南(一)

原文:Learn Raspberry Pi Programming with Python

协议:CC BY-NC-SA 4.0

一、树莓派简介

所以,你已经有了一台树莓派迷你电脑,你在想:“现在怎么办?”也许这是一个礼物。也许你听说过这个“覆盆子馅饼”,并决定找出所有的骚动是怎么回事。也许你已经对计算机有经验了,但对 Linux 或 Python 却没有。也许你是一个 Linux 极客,从来没有用几行代码和正确安装的硬件和软件做过伺服运动或点亮过 LED。或者,也许你对电脑的熟悉程度只达到了查看邮件和上网冲浪的程度,但却渴望了解更多。或者(这是我最喜欢的场景之一)你是一名教育家,对教育下一代计算机、编程和一般技术感兴趣。

不管是什么情况,欢迎!你即将加入一个俱乐部——恐怕不是一个特别排外的俱乐部,因为加入的费用只有大约 35 美元和一点创造力,但仍然是一个俱乐部——由学生、教师、业余爱好者、艺术家和工程师组成。作为这个俱乐部的成员,你将能够与任何愿意听你唠叨的人智能地讨论包管理器ARM 处理器点配置文件。你将熟悉伺服系统、发光二极管和单芯片相机。也许最重要的是,您将能够连接到您的新迷你计算机,使用许多编程语言中的一种对其进行编程(尽管本书仅涉及 Python),构建项目,并将这些项目与 Pi 进行交互,使其能够与物理世界进行交互并做一些非常酷的事情。

凭借这本书,我特此介绍你加入这个俱乐部。您的经验并不重要,因为我将一步一步地引导您完成设置 Pi 的过程,这样您就可以轻松地使用它。我将给你一个坚实的 Linux 背景,让你对幕后发生的事情有一个概念,我将用整整一章来讲述 Python,这种看似强大的脚本语言被脸书、谷歌甚至 NASA 这样的科技公司所使用。我还打算向你介绍电子学的基本原理,这是许多技术工程书籍要么掩盖,要么完全忽略的东西。有安全因素要考虑(例如,由于短路脂肪电池,我几乎有几次小爆炸)以及良好的建筑实践;您将了解好的和坏的焊点之间的区别,如何避免用 X-ACTO 刀切掉手指,以及 40ω和 40KΩ电阻之间的区别。

当然,如果你已经熟悉了所有这些介绍性的项目,可以随意跳到好的部分——项目。大部分都可以在一个周末左右完成,我也尽量把成本控制在合理的范围内。所有程序都是用 Python 编写的。在每一章的开始,我会给你一个购物清单和在哪里购买零件的建议,然后我们就开始建造。这些项目不一定要建立在彼此的基础上,也不一定要按顺序进行,尽管从第一个项目到最后一个项目,它们的复杂性会增加。

你能用 Pi 做什么样的项目?一个更好的问题可能是什么样的项目不能用 Pi 来做。它已经被用于从网络服务器到汽车电脑(汽车电脑)到集群计算到嵌入式机器视觉设备到 CNC 控制器的所有东西。。。这个清单还在继续。我希望读完这本书后,你会有自己的一些想法,以及将这些想法付诸实践所需的技能。

不管你拿起这本书的原因是什么,你的主要目标应该是获得乐趣和学习一些东西。希望一路走来能帮上忙!

树莓派的历史

对一些读者来说,树莓派似乎是新的;有相当多的人不知道这是什么。即使是现在,在第一个圆周率产生七年后,大量在线文章的开头都是这样的:“树莓圆周率是一个小型的信用卡大小的计算机,爱好者已经开始使用它了。。."这与 Arduino 形成了鲜明的对比;大多数关注时事的人至少听说过它,即使他们不知道它是什么或它的用途,因为它自 2005 年以来一直存在,并在世界各地的爱好者、极客和自己动手者中获得了巨大的声音追随者。

Arduino

对于那些不知道的人来说,Arduino 是一个微控制器平台,有许多不同的外形和尺寸,安装在 PCB 上,可以轻松插入大多数计算机的 USB 端口。它允许用户通过一种叫做草图的程序中类似 C 的编程语言对板载 Atmega 芯片进行编程来做各种事情。典型的 Arduino 草图可能如下所示:

#include <Servo.h>

void setup()
{
     myservo.attach(9);
}

void loop()
{
    myservo.write(95);
    delay(1000);
    myservo.write(150);
    delay(1000);
}

这个程序将前后移动一个连接的伺服电机(一个可以通过软件精确控制的小电机),两次移动之间有一秒钟的延迟。

在计算能力方面,Arduino 不如 Pi 强大,但它也是一种完全不同的动物,因为它是一个微控制器,而不是一台计算机,所以比较它们有点像比较斑马和鳄梨。然而,这两台机器确实很好地互补,我将在第 14 章讨论如何互补。

正如我所说的,树莓派已经存在了几年——确切地说是七年。有几种不同的型号可供选择,新的改进版本大约每隔一年发布一次。

圆周率的创造者——埃本·厄普顿、罗布·穆林斯、杰克·朗和艾伦·迈克罗夫特——在 2006 年首次提出了教学用廉价电脑的想法。他们都来自英国剑桥大学,他们担心 Commodore 64、Amiga 和 Spectrum 等廉价个人电脑的消亡会对年轻人的编程能力产生负面影响。由于台式机和笔记本电脑的价格高达数百或数千美元,儿童和青少年被禁止在家庭的主电脑上练习编程,因为他们害怕破坏它。

与此同时,厄普顿和其他人意识到许多大学计算机科学课程已经简化为“微软 Word 101”和“如何使用 HTML 创建网页”这四位创始人希望提高新生的编程知识水平,因此,计算机科学和工程课程可能会变得更强大,更适用于现实世界中的 STEM 领域。

显然,更便宜的计算机是必要的。他们尝试了微控制器和各种芯片、试验板和印刷电路板(见图 1-1 ),但直到 2008 年这个想法才变得更加可行。由于移动设备的爆炸,芯片变得更小、更便宜、更强大。这些芯片使他们能够设计一种能够支持多媒体的设备,而不仅仅是命令行编程,他们认为这对于吸引所有年龄的学生很重要。年轻人更有可能对支持媒体的设备感兴趣,因此也更有可能尝试在这种设备上编程。

img/323064_2_En_1_Fig1_HTML.jpg

图 1-1

Eben Upton 的 2006 年树莓派原型(图片树莓派基金会)

2008 年,最初的四位创作者与皮特·洛马斯(Pete Lomas)和大卫·布拉本(David Braben)一起成立了树莓派基金会(the Foundation),三年后第一个大规模生产的 Pi 下线。

注意

名称 Raspberry Pi 是对早期以水果命名的微型计算机数量的认可,如苹果和橘子,而 Pi 来自 Python 脚本语言,这一直是 Pi 设计的一个组成部分。

一年之内,基金会售出了超过一百万台。创始成员已经多次谈到他们是如何被对他们设备的爆炸性兴趣惊呆的。他们最初的目标是把一个便宜的可编程设备放在教育工作者和他们的学生手中,这个目标已经实现了,但是 Pi 的意义还不止于此。显然,他们不是唯一失去在更便宜的机器上编程能力的人;世界各地的爱好者(包括你真正的爱好者)用订单淹没了 element14、Premier Farnell 和 RS Electronics 以至于预购 Pi 的人不得不等待长达 6 个月的时间,以供不应求。(在撰写本文时,Pi 的最新型号之一 Pi Zero W 仍然只能在每个客户一台的基础上提供。)许多客户可能是现在或以前的程序员,渴望玩一台新的、小的、功能强大的计算机。例如,我第一次学会用 BASIC 语言编程是在 Commodore VIC-20 上,这是一台具有令人印象深刻的 5KB 内存的计算机。

除了教育,圆周率还有无数的其他用途,就像树莓圆周率基金会的关于我们页面上写的那样:

  • 我们得到了教育界的极大关注、支持和帮助,对于来自远离我们最初目标的机构和个人的大量咨询,我们感到很高兴,也有点受宠若惊。发展中国家对 Raspberry Pi 感兴趣,将其作为生产力设备,用于那些根本负担不起运行传统台式 PC 所需的电源和硬件的地区;医院和博物馆已经联系我们,了解如何使用 Raspberry Pi 来驱动显示设备。严重残疾儿童的父母和我们谈论过监控和辅助应用;似乎有 100 万人拿着热烙铁想要制造一个机器人。

幸运的是,在很大程度上,供应已经安全地赶上了需求。购买圆周率不再需要等待,除了零 W 之外,每位顾客也不再有购买一个圆周率的限制。有数不清的“帽子”(形状合适的配件市场附加板,具有各种功能),以及一个摄像头板和一个官方触摸屏显示器,它们都可以插入 Pi 上的端口。创始人还积极鼓励其他公司复制他们的模式,这可能是今天有这么多小型单板计算机的主要原因。

探索圆周率

由于有许多不同的设计可供使用,所以不可能只写一个章节来详尽地说明 Pi 的内置部件和设计。不过,我将保持这一节的篇幅,只讨论最近的三个版本:Pi version 3、Zero 和 Zero W,因为 Zero 和 Zero W 的设置几乎完全相同,所以我们只需要描述其中一个。所有这些主板的价格都很低;版本 3 目前约 35 美元,零约 5 美元,零 W 为 10 美元。2018 年 3 月 14 日,也被称为圆周率日,树莓派基金会发布了圆周率第三版的更新,即 3 B+这个新版本对最初的版本 3 进行了一些升级,包括双频 WiFi、稍快的 CPU (1.4GHz)和以太网供电(PoE)功能。由于这个版本仍然是非常新的,因为它的外形几乎与最初的版本 3 相同,并且它的升级不会影响本书中的任何项目,所以我不会在这一点上提及它。

圆周率的大小这些年来没变过。Pi 3 的尺寸与 Pi 1 相同:85.6 毫米 x 56mm 毫米 x 21mm 毫米。Pi Zero 和 Zero W 稍微小一点:30mm x 65mm x 3.5mm(没有 USB 和以太网端口使得厚度差异巨大)。最新的 Pi 重了一点——45 克,而原来的是 31 克——但幸运的是,当你试图将新的 Pi 安装到旧的案例或项目设计中时,重量可能不会成为因素。

看一下图 1-2 ,我将带你从 GPIO 引脚开始,顺时针方向浏览一下电路板。

img/323064_2_En_1_Fig2_HTML.jpg

图 1-2

树莓 Pi 3

GPIO 引脚

正如你在图中所看到的,电路板的小空间里装了很多东西。你可以看到,沿着顶部,从 Pi 的早期版本到当前模型的最大改进之一:从 26 个增加到 40 个 GPIO(通用输入/输出)引脚。这些引脚允许您将 Pi 连接到任何数量的物理扩展,从 led 和伺服电机到电机控制器和扩展板(通常称为“hats”)。对于普通的台式机或笔记本电脑,与这样的物理设备接口几乎是不可能的,因为串行端口在较新的设备上几乎已经消失,并且不是每个人都能够为 USB 端口编写低级设备驱动程序。然而,Pi 带有预安装的库,允许您使用 Python、C 或 C++访问 pin,如果您不喜欢预安装的版本,还可以使用其他库(例如 PiGPIO 和 ServoBlaster)。

USB 和以太网

接下来,我们将沿着外部边缘看到两对 USB 端口和以太网端口。它们都连接到 LAN 9514(USB 端口左侧的芯片),提供 USB2.0 和 10/100 以太网连接。与所有其他 pi 一样,该芯片充当 USB 到以太网的适配器,这使得板载以太网能够工作。

音频插孔

板上的 3.5 毫米音频插孔可用于任何标准耳机。如果可用,HDMI 声音通过 HDMI 接口传送。声音输出也可以通过 I 2 S 实现。I 2 S 不在本书讨论范围内,但它是一种用于将数字音频设备连接在一起的串行接口标准。

相机连接器

板上的摄像头连接器允许您将官方的 Raspberry Pi 摄像头板(图 1-3 )或 NoIR(红外)摄像头板连接到 Pi。

img/323064_2_En_1_Fig3_HTML.jpg

图 1-3

Raspberry Pi 相机板

高清晰度多媒体接口

摄像头电路板连接器后面是 Pi 的 HDMI(高清多媒体接口)端口。许多 Pi 爱好者认为,这是 Pi 从一开始就与众不同的地方,因为它总是能够显示高清图形。最新版本的 Pi 板载 400MHz Broadcom VideoCore IV GPU,使其能够以高达 60fps 的速度输出全高清视频。它可以支持蓝光质量的播放,并在芯片上支持 OpenGL 和 OpenVG 库,虽然它没有 H.265 解码硬件,但 GPU 运行速度足够快,可能能够在软件中解码 H.265。

力量

继续顺时针方向,我们来到微型 USB 电源输入端口。类似于以前版本的 Pi,你可以用一个标准的手机充电器给你的 Pi 供电,但要确保它至少能提供 2A。Pi 3 本身可能不会使用那么多电流,但如果四个设备插入四个 USB 端口,它肯定可以。

你也可以用电池给 Pi 供电(我倾向于用 LiPos),但是有一个警告:*Pi 没有板载电源调节器!*如果你习惯使用 Arduino,你知道你可以插上 9V 电池,然后上路。如果你用圆周率来尝试,迎接你的将是一股神奇的烟雾,你需要买一个新的圆周率。我将讨论移动 Pi 必不可少的项目中的电压调节器。

显示

电路板顶部的最后一个连接器是 DSI 显示器连接器,用于连接官方的 Raspberry Pi 7 "触摸屏显示器。这款显示器于 2015 年发布,最终满足了 Pi 爱好者的需求,他们需要一种简单的方式来与 Pi 交互,而不必带着巨大的显示器和键盘。如果你没有显示器或不需要触摸屏界面,你仍然可以自由使用普通的 HDMI 显示器和 USB 键盘和鼠标。

片上系统

整个 Pi 上最重要的一块是中间的大黑芯片,也称为 SoC ,或 芯片上的系统。Pi 的芯片是 Broadcom PCM2837,配有 1.2GHz ARM Cortex A53 四核集群。这甚至比最近的 Pi 都有了巨大的改进,其中最大的改进是在多线程处理方面。不幸的是,一个代价是新芯片消耗了更多的能量。如果你正在寻找低功耗,你可能会更好地与老型号或与零或零 w。

sd 卡

最后,在电路板的底部是 microSD 卡插槽。Pi 最大的节省空间的特点之一是它没有真正的硬盘。SD 卡的作用类似于固态硬盘(SSD)。这种形式因素在 Pi 版本的过程中有所变化;当前版本只支持 microSD 卡,没有弹簧加载。您需要使用至少 4GB 的卡来最小化安装 Raspbian(Pi 的首选操作系统)以便在 Pi 上工作,建议使用 8GB 的卡。我已经能够在 Pi 上使用高达 64GB 的卡,但是您的结果可能会因卡的制造商而异。如果你担心数据降级或启动失败,坚持使用名牌卡。

不可见

在 Pi 3 的主板上看不到的一点是它内置的 WiFi 和 ble(蓝牙低能耗)功能。这些由 Broadcom BCM43438 芯片提供,该芯片提供 2.4GHz 802.11n 无线局域网、BLE 和蓝牙 Classic 4.1 无线电支持。对我来说,这是对原始 Pi 的巨大改进,因为我不再需要购买和配置 USB WiFi 转换器,同时失去了 USB 端口,蓝牙兼容性在构建物联网(IoT)应用时是一个巨大的便利。

Pi 零/零 W

这是对 Pi 3 的设置的一个相当详尽的介绍,但如果不看看 Pi 的最新兄弟 Pi Zero 和 Pi Zero W(图 1-4 ),任何新书都不会完整。圆周率零点于 2015 年 11 月推出,随后是零点 W。Zero W 基本上是与 Zero 相同的型号,只是内置了无线互联网。

img/323064_2_En_1_Fig4_HTML.jpg

图 1-4

圆周率零点 W

让我们快速浏览一下 Zero W 提供的一切。

通用输入输出接口

您可能会注意到的第一件事是缺少标题。为了降低成本,因为你只需为 0 支付 5 美元,为 0 W 支付 10 美元,Pi 基金会决定你必须自己焊接接头。这是一个很小的代价,因为它仍然拥有 40 个引脚,引脚排列与全尺寸 Pi 相同。

相机连接器

继续顺时针旋转电路板,您会发现 Pi 相机电路板的连接器。这里的区别是形状因素:Zero 的连接器比 Pi 3 上的连接器薄得多。Zero 仍然使用相同的相机板,但电缆连接不同。如果你打算把你的 Pi 相机和你的 Zero 一起使用,确保你订购了一根适配器线,大多数卖 Pi 配件的地方都有卖。

力量

在电路板的底部,您会看到两个微型 USB 端口。第一个是相机接口旁边的电源接口,就像较大的 Pis 一样。一个标准的手机充电器应该在这里做得很好,因为零不需要太多的电流。再次,像 Pi 一样,它没有而不是有一个电压调节器,所以请确保您只给它一个干净的 5V 电源。

通用串行总线

电源微型 USB 连接器旁边是微型 USB 端口。要在 Zero 上使用大多数外设,您需要购买微型转标准 USB 集线器。确保你得到一个不需要外部电源的,除非你打算使用像网络摄像头这样的耗电设备。在这种情况下,你需要一个有电源的集线器,因为零线不能提供太多的电流。

高清晰度多媒体接口

继续顺时针方向,在微型 USB 端口之后是迷你 HDMI 端口,这(显然)将需要一个迷你 HDMI 适配器。Zero 不像更大的 Pi 那样有单独的 GPU,但它仍然能够通过该端口输出完整的 1080p 输出。

sd 卡

最后,microSD 卡插槽是这个小小的板上的最后一个东西。像更大的 Pi 一样,你至少需要 4GB 的卡才能在 Zero 上做任何有价值的事情,我真的建议 8GB 或更大。

片上系统

电路板中央的黑色大芯片是 Broadcom PCM2835,配有 1GHz 的 ARM11 处理器。如果这些规格听起来很熟悉,它们应该是:它与最初的 Raspberry Pi 上封装的芯片相同,只是运行速度更快一些。价格点已经下降了一点,使其能够放置在像 Zero 这样的低功耗板上。

不可见

像 Pi 3 一样,Zero W 的无名英雄之一是内置的 2.4GHz 804.11n 局域网,BLE 和经典的蓝牙 4.1 功能。无线电芯片和 Pi 3 上的一样,但是天线有点不同,我想它看起来很快。如果你仔细观察 USB 输出和迷你 HDMI 端口之间的电路板边缘,你会看到一个小三角形。那个三角形实际上是在 PCB 的各层中切割出来的,是一个谐振腔,大小正好可以与 WiFi 无线电波进行交互。这是一个巧妙的想法,并有助于保持零小和便宜。

Zero 和 Zero W 都是令人难以置信的廉价设备,如果你打算用 Pi 做任何工作,我强烈建议每样都买一个或多个。对于价格,你真的不能击败你可以用他们两个做什么。

将 Raspberry Pi 与类似设备进行比较

你可能会问,是什么使 Pi 优于其他小型微型计算机,如 Arduino,也许还有 Beagleboard 系列设备?答案是 Pi 不一定比 ?? 更好;这些板中的每一个都占据了一个特定的位置,很难对它们进行比较,尤其是像 Arduino 这样的微控制器。Arduinos 非常适合创建简单的项目,甚至可以控制一个非常简单的机器人,在很多情况下,使用 Pi 来实现这种目的是多余的。至于其他的微型计算机,一个主要的区别是价格。与 Pi 密切相关的是 Beagleboard,但该板的建议价格超过 75 美元——比 Pi 高得多。购买 Raspberry Pi 意味着你在支持一个慈善组织,该组织旨在将廉价电脑送到世界各地的小学生手中,所以这也是存在的。

Pi 入门

我想你会同意,现在是把圆周率从盒子里拿出来的最好时机,如果你还没有的话。在开始之前,请继续阅读。

Pi 的硬件要求

让我们快速看一下 Pi 的要求是什么,然后我们将启动它。为了本章的目的——实际上,这本书的大部分内容——我将假设你,读者,使用的是圆周率 3 而不是零。大多数事情将保持不变;如果有明显的差异,比如在电源要求方面,我一定会提到它们。

连接电源

我已经提到了权力。Pi 需要 5V——不多也不少。再次,因为它值得重复:Pi 没有板载电压调节器!你不能插上 9V 电池或壁式电源插座就指望它能工作。要么使用能输出 5V 电压的手机充电器,要么从网上电子商店或购买圆周率圆周率圆周率圆周率圆周率圆周率圆周率圆周率的地方获得优质电源。电源输出也应至少为1.5A,最好是 2A。如果它没有足够的电源,请准备好面对你的 Pi 的一些古怪行为,比如鼠标和键盘无法工作,甚至完全无法启动。

添加显示器

你需要的下一个外设,至少在一开始,是一个具有 HDMI 或 DVI 功能的显示器。如果你只有 DVI 输入,那也没关系,因为 HDMI-DVI 转换器无处不在。在您设置好它并且安装了所有必要的软件之后,您可以在一个无头配置中运行 Pi。这意味着你可以从同一个网络上的另一台计算机上使用 SSH(安全外壳)甚至 VNC(虚拟网络计算)客户端登录。但是首先你需要一个显示器,这样你就可以看到你在做什么。一步步来。

添加 USB 集线器

虽然 Model 3 有四个 USB 端口,但您可能希望在某个时候添加一个 USB 集线器。如果你使用零,你肯定需要一个,至少在开始的时候。当你添加一个集线器时,性能会变得有点挑剔,因为当涉及到与 Pi 一起工作时,一些 USB 集线器已经被证明比其他的更好地工作*。也许最重要的必要特征是集线器是外部供电的;这将防止你的 Pi 必须提供足够的电力给你那天决定插入的任何耗电设备。如果你没有空闲的网络中心,不知道该尝试什么,树莓派论坛通常是一个开始寻找的好地方( http://www.raspberrypi.org/phpBB3 )。在这里,像你一样的用户已经尝试了无数不同的品牌,并报告了哪些可以,哪些不可以,哪些需要稍微调整。幸运的是,集线器相对便宜,所以如果您尝试的第一个不工作,您可以在其他地方使用它,并用您的 Pi 尝试不同的。*

*我在 Zero 上使用的是 MakerSpot 迷你 USB 集线器(图 1-5 )。

img/323064_2_En_1_Fig5_HTML.jpg

图 1-5

MakerSpot 迷你 USB 集线器

然而,在这里你应该照我说的做,而不是照我做的做,因为这个特殊的集线器是而不是外部供电的。它确实做了我需要它做的一切,而没有导致我的 Zero 遭受停电(由于电量不足而导致的怪异行为),所以请随意用它复制我的成功。

现在您已经为您的 Pi 配备了所有必要的外部部件,您已经准备好开始设置它了。

Pi 操作系统

Raspberry Pi 的默认操作系统(OS)——它设计使用的操作系统——是 Linux。Pi 3 可以运行物联网版本的 Windows 10,但设置它可能有点棘手,以我的经验来看,Pi 在 Linux 上运行得更好。如果你不熟悉 Linux 操作系统,不要担心——我们将在第二章中一探究竟。不过现在,我们知道 Linux 有几种版本,或者说是发行版 : Ubuntu(最流行的版本之一)、Debian、Mint、Red Hat、Fedora 以及其他一些不太知名的版本。Pi 使用了 Debian 的一个版本,名为 Raspbian。

因为 Pi 没有硬盘,所以您必须下载磁盘映像并将其复制到 SD 卡。Pi 将使用该映像进行引导,它还将充当内存/RAM。几乎任何大小的卡都可以,只要它至少有 4GB,如果你打算在卡上加载大量的额外软件,最好是 8GB 以上(是的,你最终会这样做)。正如我前面提到的,高达 64GB 的卡已经被证明可以正常工作;除此之外,你的结果可能会有所不同。建议你用名牌卡,而且应该是4 级,表示卡的速度。

格式化卡片

你的第一个任务是格式化卡,这样你的 Pi 就可以读取它。使用内置 SD 读卡器或 USB 适配器将 SD 卡插入电脑。现在,执行以下操作:

  • 【Windows 用户:在 https://www.sdcard.org/downloads/formatter_4/eula_windows/ 从 SD 协会下载格式化工具程序。使用所有默认设置安装并启动它。在工具的选项菜单中,将“格式大小调整”选项设置为“开”,确保您选择了正确的 SD 卡,然后单击“格式”

  • 对于 Mac 用户:从 https://www.sdcard.org/downloads/formatter_4/eula_mac/ 下载 Mac 版格式化工具。双击下载的.pkg文件,使用所有默认设置安装该工具。一旦安装完毕,打开它,选择“覆盖格式”选项。确保您选择了正确的 SD 卡,然后单击“格式化”

安装操作系统

既然卡已正确格式化,您可以在上面安装操作系统了。大部分用户可以使用 http://www.raspberrypi.org/downloads 的 Pi 基金会的 NOOBS(全新开箱即用软件)。但是,如果您愿意,您可以直接下载 Raspbian 图像本身。甚至还有一个 Raspbian Lite 操作系统,它的内存占用要小得多,非常适合 Zero 和 Zero W 等较小的系统。NOOBS 系统在第一次启动时,实际上会为您提供一个安装操作系统的选择,包括两个版本的 XBMC (Xbox Media Center)、Pidora 和 Raspbian。出于本书和后续章节的目的,我们将安装 Raspbian。

一旦你下载了你选择的操作系统(NOOBS:1.3 GB;Raspbian: 1.7GB),使用您选择的解压缩实用程序将其解压缩(Windows:右键单击,“Extract all”;Mac:双击)。然后,将提取的文件复制到您的 SD 卡上。

就这样。您的 Pi 现在可以启动了。

连接外围设备

准备好连接所有这些美妙的组件了吗?别急,莫克·萨比。连接外设有一个优先顺序。这可能看起来很奇怪,但有可能(即使可能性极小)以错误的顺序连接电源、显示器和其他部件可能会导致电压尖峰并烧毁您的主板。所以,习惯于按照这个顺序把事情联系起来,这样你就不会有潜在的麻烦了。顺序如下:

  1. 插入 SD 卡。

  2. 连接显示器。

  3. 连接 USB 外围设备(键盘、鼠标、集线器)。

  4. 连接以太网电缆。

  5. 连接电源。

事实上,这里要记住的最关键的细节是最后接上电源。你或许可以在其他人身上蒙混过关,但权力应该永远留在最后。

没有开关;一旦你插上电源,板上的 led 应该开始亮起,你应该在你的监视器上短暂地看到一个彩虹屏幕(图 1-6 )。

img/323064_2_En_1_Fig6_HTML.jpg

图 1-6

Pi 彩虹启动屏幕

这个屏幕实际上是由 Pi 的固件在初始化板载 GPU 时生成的。GPU 在屏幕上绘制四个像素,然后对它们进行纹理化,从而产生多色正方形。您应该只看到很短的一段时间,然后随着 Pi 继续其引导过程,出现一个滚动的文本列表。

配置 Pi

当您第一次使用 NOOBS 启动 Pi 时,您会看到一个有六个选项的选择框:Archlinux、OpenELEC、Pidora、RISC OS、RaspBMC 和 Raspbian(尽管这些选项可能会根据您阅读本文的时间而发生变化)。用鼠标选择 Raspbian,然后单击窗口左上角的“安装操作系统”按钮。在随后的弹出框中单击“是”进行确认,然后等待图像写入 SD 卡。这可能值得一看,因为进度窗口有一些提示,你可以在等待时阅读。如果您刚刚下载了 Raspbian 映像,Pi 应该会自动引导到桌面(图 1-7 )。

img/323064_2_En_1_Fig7_HTML.jpg

图 1-7

Pi 的默认桌面

一旦您的 Pi 已经启动,并且您在桌面上,您应该首先访问的是软件配置工具,也称为raspi-config。这可以通过键入

$ sudo raspi-config

在一个终端。(要启动终端,请单击菜单栏中的终端图标。)这个工具允许您对配置进行更改,比如扩展文件系统、启用 SSH 和摄像头,以及设置 Pi 的语言环境。最后一项(可从 Localisation Options 子菜单中访问)比您想象的更重要,因为 Pi 的默认区域设置(以及相关的键盘布局)是在英国,这意味着如果您在美国,当您第一次按 Shift > 2 时,您会感到不愉快的惊讶,因为您以为会得到“@”符号,但却看到双引号(")。

要浏览raspi-config工具(图 1-8 ,用箭头键选择您想要更改的选项,按 Tab 键,然后按 Enter 键选择您的选项。一定要启用摄像头,因为您稍后会用到它,以及 SSH 访问和 VNC 功能——所有这些都可以在接口选项子菜单中找到。我还会启用 I2C、SPI 和串行,因为它们总是很方便,以后还会用到。随心所欲地玩所有的设置,记住你不能真的破坏任何东西。如果你把你的卡做成砖块,使它无法使用,只需使用 SDCard 工具重新格式化它,并把操作系统复制到它上面,这样你就可以重新开始。稍后,你可能要更加小心,但我会告诉你如何备份你的卡,这样你就不会丢失任何设置,如果你做一些愚蠢的事情。

img/323064_2_En_1_Fig8_HTML.jpg

图 1-8

raspi-config

当你玩完raspi-config后,选择“完成”并按回车键。

您的 Pi 现在已经启动并运行。恭喜你,给自己一个鼓励!尽情享受,但不要太舒服。你的下一个任务应该是确保一切都是最新的。大多数 Linux 发行版都会定期发布更新和升级,Raspbian 也不例外。从 Pi 基金会提供 NOOBS 或拉斯扁的图像供下载到今天,很有可能已经对软件和内核进行了几次重要的升级。

要更新 Pi,请确保您的以太网电缆已插入并启动终端(单击终端图标或按 Ctrl–Alt–t)。在提示符下,键入

$ sudo apt-get update

当 Pi 刷新它的软件列表时,你会看到一行行的文本流畅地流过。完成后,将返回“$”提示。此时,键入

$ sudo apt-get upgrade

同样,文本行应该滚动过去。如果可以下载新软件,Pi 会询问您是否要下载并安装它。按 Enter 键(默认选项)。当它完成并返回到$提示符时,一切都应该是最新的版本。根据更新的内容,可能会提示您重新启动。这样做,你就会跟上时代。

注意

当我提示您在终端中输入文本时,当您看到“$”字符时,您实际上不应该键入美元符号。这是由于您使用的 shell 环境而在终端中出现的提示符。

关闭码头

在我们开始讨论 Linux 之前,我们先来讨论一下关机。事实上,关闭 Pi 真的没有必要;这是一个如此低功耗的设备,设计师只是希望你让它运行。不过,你可以把它关掉,为了节省一点钱,也许还有你的 Pi,我建议你在用完之后把它关掉。由于没有“关闭”开关,Pi 实际上被设计为只需拔掉插头就可以关机,应该不会发生什么不好的事情(假设您已经保存了工作,没有在忙什么,等等)。但是仅仅拔掉它就让我们许多电脑类型的人畏缩不前,所以让我教你真正的,正确的关机方法。打开终端,在提示符下键入

$ sudo shutdown now

这将使处理器经历正确的关闭序列,终止正在运行的进程,停止线程,等等。完了,拔下圆周率,真的很安全。

如果希望从终端重新启动,请键入

$ sudo shutdown –r now

将重新启动 Pi。

摘要

现在,您已经了解了 Pi,安装了它的操作系统,并对它进行了更新,使其寿命缩短了一英寸。还向您介绍了raspi-config工具,您甚至还使用了一点命令行界面(CLI)。是时候深入了解一下 Linux 了。*

二、Linux 就在你的身边

Raspberry Pi 使用 Linux 作为它的标准操作系统,这意味着如果你对这个令人敬畏的操作系统一无所知,你将不得不去学习。别担心——我会尽可能让这件事不那么痛苦。

无论你对 Linux 有什么先入之见,你都可以忽略它们。从一开始,Linux 就被认为是“极客的操作系统”,让人联想到穿着短袖衬衫、笔挺的人在键盘上敲敲打打,屏幕上满是文本,在地下室深处的某个地方,一排磁带驱动的电脑硬盘柜开始运转。(见图 2-1 。)在背景中,一个 20 面骰子滚过桌子,还有一个论点的轻声低语:“不,韩先开枪!”

img/323064_2_En_2_Fig1_HTML.jpg

图 2-1

Linux 用户的游乐场(2006 Marcin Wichary)

然而,不要害怕。虽然我们中的一些人仍然热情地拥抱这种文化及其所代表的一切,但这并不意味着你必须这样做。自从 Linux 首次推出以来,它已经走过了漫长的道路,现在它不仅是一个真正的操作系统的发电站,而且非常用户友好(至少,它的大多数发行版都是如此)。Linux 最受欢迎的版本是 Ubuntu 和 Mint。两者在视觉上都与 Windows 和 Mac 非常相似,以至于许多人觉得切换到它们既有趣又容易。另一个流行的 Linux 版本是 Debian,它是 Pi 的操作系统 Raspbian 所基于的发行版。最初,Debian 是唯一一个真正“开放”的 Linux 发行版——允许任何开发者和用户做出贡献。它仍然是非商业实体的最大的 Linux 发行商。

好了,喇叭响够了。为了真正使用 Pi,您至少需要对 Linux 及其工作原理有一个基本的了解。那么,我们开始吧。

Linux 的故事

Linux 是一个松散地基于 Unix 操作系统的操作系统。它一直是免费和开源的,它的创建者 Linus Torvalds 在 1991 年首次发布了它。它是用 C 编程语言编写的,最初设计用于运行在 Intel 基于 x86 的计算机上。在随后的 20 多年里,它被移植到了所有可以想象的设备上,从大型机和超级计算机到平板电脑、电视、冰箱和视频游戏机。Android 操作系统是建立在 Linux 内核之上的,Linux 内核是构建操作系统的代码块。

像大多数计算机软件一样,Linux 并非诞生于黑洞之中。它起源于 Unix、BSD、GNU 和 MINIX 等操作系统和内核。事实上,托瓦尔兹曾经说过,如果 GNU 内核已经完成,或者如果 BSD 在 20 世纪 90 年代早期已经可用,他可能就不会编写自己的内核了。他从 MINIX 开始他的内核工作,并最终添加了许多 GNU 软件应用。他还将自己的许可权转到了 GNU GPL,这表明只要代码是在类似的许可下发布的,就可以被重用。

在接下来的几年里,Linux 在用户接受度和设备方面都得到了普及。上述所有设备都运行 Linux,这是世界上最广泛采用的操作系统。

Pi 上的 Linux 入门

为了与您的 Pi 交互,您将使用终端做大量的工作——也称为命令行界面,或 CLI。启动并运行您的 Raspberry Pi 桌面后,双击终端图标启动它。因为您已经登录,所以不会要求您输入用户名和密码;相反,提示符会显示如下内容:

pi@raspberrypi:~ $

这是命令行界面(图 2-2 )。它告诉您,您是用户“pi”,登录到主目录中的机器“raspberrypi”(终端对“home”的简写)。

img/323064_2_En_2_Fig2_HTML.jpg

图 2-2

树莓码头

如果您在不同的目录中,提示符将显示该目录,例如

pi@raspberrypi:~/Pictures $

Linux 文件和文件系统

作为一个操作系统,Linux 完全是围绕文件和文件系统构建的。文件是由文件名和位置标识的任何信息片段,可以是文本、图像、视频或其他。该位置也称为目录路径,有助于保持每个文件与所有其他文件完全不同,因为该位置在技术上是文件名的一部分。例如,

/wdonat/Desktop/MyFiles/file.txt

不同于

/wdonat/Desktop/MyOtherFiles/file.txt

尽管两者都叫file.txt。文件名也区分大小写;/file.txt不同于/FILE.txt,也不同于/File.txt。您将会熟悉五类文件:

  • 包含您创建的信息的用户数据文件,如文本文件或图像

  • 包含系统使用的信息的系统数据文件,如登录、密码等

  • 目录文件,也叫文件夹,可以包含文件和其他目录。包含在目录中的目录被称为子目录,它们可以嵌套到你所能想到的程度。

  • 代表硬件设备或操作系统使用的一些占位符的特殊文件

  • 可执行文件,即包含操作系统指令的程序或外壳脚本

Linux 中的整个文件系统都包含在一个根文件夹中,用一个/表示。在该文件夹中有子文件夹,例如bin/home/proc/var/dev/。每个目录下都有更多的子目录。事实上,如果您可以缩小并以三维方式查看文件系统,它看起来就像一棵巨大的倒置的树。/home/文件夹是您的默认主目录,每个用户在 Linux(和 Unix)系统上都有一个。在该目录中,您可以自由地创建、执行和删除文件。如果您需要操作、编辑或删除系统文件,您可能需要作为根用户登录或者执行命令sudo

Root 用户对 sudo

在每个 Linux 安装中,都有一个被指定为 root 的用户,他能够管理系统上的所有文件,包括系统级文件。例如,大多数用户帐户不能编辑/var/目录中的文件,但是根用户可以。由于这种能力和误用它的可能性(甚至是意外),Linux 用户不会以 root 身份登录,除非绝对必要;当他们这样做时,他们登录,做他们需要做的事情,然后再次注销。Linux 极客中有句话:“只有 noobs 才以 root 身份登录”;换句话说,只有新手才能作为根用户登录并保持登录状态。

不过,作为根用户登录有一个快捷方式:sudo. sudo代表superuserdo,它只是告诉系统像根用户一样执行命令。系统将询问 root 密码,然后执行该命令。同样,系统不会仔细检查你是否真的想这么做,所以当你使用sudo时,要加倍小心,在你按下 Enter 键之前,你要知道你刚刚输入的命令的结果!

命令

为了使用 Linux CLI,您可以使用诸如cdls这样的命令在文件系统中导航。运行程序的命令也是从终端运行的。表 2-1 中包含了您将经常使用并且应该学习的常用命令。

表 2-1

常见的 Linux 命令

|

命令

|

意义

| | --- | --- | | 限位开关(Limit Switch) | 列出当前目录中的文件 | | 激光唱片 | 更改目录 | | 显示当前工作目录 | 打印工作目录 | | rm 文件名 | 删除文件名 | | mkdir 目录名称 | 将目录命名为目录名 | | rmdir 目录名 | 删除空目录 | | 类别文本文件 | 在终端显示文本文件的内容 | | mv oldfile newfile | 移动(重命名)旧文件新文件 | | cp oldfile newfile | 将旧文件复制到新文件 | | 人工命令 | 显示命令的手册 | | 日期 | 读取系统日期/时间 | | 回声 | 回显终端中键入的内容 | | 可做文件内的字符串查找 | 使用正则表达式的搜索程序 | | 日本首藤 | 作为根用户执行 | | 。/ 程序 | 运行程序 | | 出口 | 退出终端会话 |

表 2-1 中列出的大多数命令都是不言自明的,但有些命令需要更多的解释:

  • 毫无疑问,这是最重要的命令。如果您不确定一个特定的命令做什么或者它使用什么参数/标志,在您的终端中键入man command会显示 Unix 手册页,其中包含您想知道的所有信息。当您打开一个页面时,它通常以命令的名称开始,然后是命令的各种排列的概要、命令的详细描述、所有选项和标志,以及这些选项和标志的作用。当你处于手动视图时,只需按回车滚动,然后按 q 返回终端。

  • 这个命令列出了你所在的任何目录下的文件;使用像–l–a这样的标志包括文件许可和修改日期等信息。当您使用–l标志时,每个条目的第一部分显示如下

    drwxr-xr-x
    
    

    在这种情况下,这意味着条目是一个目录(d);拥有者可以读、写、执行文件(rwx);群组成员可以读取和执行文件(r-x);所有用户都可以读取和执行文件(r-x)。在我们使用 Pi 的大部分工作中,您将是文件的所有者,因此文件权限应该不会对您有太大影响。然而,有时你需要使一个文件可执行;这就是chmod命令的用途,但是我们将在另一章中进行讨论——比如处理家庭媒体服务器的那一章(第七章)。ls还有一些其他非常有用的标志。ls –F列出目录中的当前文件,但在所有本身是目录的内容后有一个尾随的“/”。ls –a列出所有文件,包括“隐藏”文件(名称以句点[ . ]或双句点[ .. ]开头的文件,通常不会在标准的ls显示中显示)。

  • 这个命令带你到你命名的目录,就像你想的那样。几个特殊的目录名包括cd ~,它带您到您的主目录(“”,或波浪符号,表示您的主目录),和cd ../,它带您到文件夹结构中的一个目录。换句话说,如果你在~/Desktop/MyFiles/目录中,输入

    cd ../
    
    

    会把你放在~/Desktop/目录中

    cd ../../
    
    

    会将您置于您的主目录(~/)中,并键入

    cd ../MyOtherFiles/
    
    

    会将您从桌面上的MyFiles目录中取出,放入桌面上的MyOtherFiles目录中。

小费

如果你简单地键入cd并按回车键,你将被带回你的主目录,无论你在哪里。

  • 这是一个需要知道的好命令。当你迷路时,pwd简单地告诉你你在哪个目录,给出的答案是从根目录开始的路径。当您在一个可能有重复文件夹名称的目录结构中有四五个文件夹时,这尤其有用,比如

    /Users/wdonat/Desktop/MyApplication/bin/samples/Linux/bin/
    
    

    终端提示符简单地显示

    pi@raspberrypi: /bin $
    
    
  • rm:使用命令rm就像把一个文件拖进垃圾箱,有一个重要的区别:对于所有的意图和目的,你不能撤销它,所以确定你真的想删除那个文件!

  • mkdirrmdir:命令mkdirrmdir创建和删除目录。rmdir的警告是目录必须是空的,否则操作系统不允许你删除它。但是,您可以将–p选项与rmdir一起使用,这将删除一个文件夹的(也是空的)父文件夹。例如,打字

    rmdir –p /foo/bar/this_directory
    
    

    将依次删除this_directory/bar/foo/

  • mvcp:命令mvcp虽然相当简单,但需要一些时间来适应。mv不移动文件,而是重命名文件,同时销毁旧文件。打字

    mv myfile.txt myfile2.txt
    
    

    myfile.txt重命名为myfile2.txt。在mv命令结构中,你可以指定目录级别,所以在某种意义上你可以mv将一个文件从一个文件夹转移到另一个文件夹。例如,假设你桌面上的MyFiles文件夹中有一个名为myfile.txt的文件。您可以通过键入以下内容来移动和重命名它(从文件夹内)

    mv myfile.txt ../MyOtherFiles/myfile2.txt
    
    

    myfile.txt将会从你当前的目录中消失,而它的副本,名为myfile2.txt,将会出现在你桌面上的MyOtherFiles文件夹中。

    cp类似于 mv,但它是复制而不是重命名,所以你不会丢失原始文件。同样,您可以指定目录级别,因此cp便于跨文件夹复制。例如,打字

    cp myfile.txt ../myfile.txt
    
    

    在你的桌面上放一份myfile.txt的拷贝(假设你还在Desktop/MyFiles/目录中)。)

  • cat:使用cat可以快速预览一个文件,比如一个文本文件,而不需要在文本编辑器中打开它。输入cat filename将会在你的终端上显示一个文件的内容,即使它不是文本文件。(试着对一个图像文件执行cat,会看到一堆乱码。)如果您想逐行预览文件,而不是一次将整个文件输出到您的终端,请使用more命令,或者使用less命令。这将用第一批文本填充屏幕,按下 Enter 键将在文件中前进,一次一行。

  • date:使用 date(不带参数)简单地将系统的日期和时间打印到终端。通过参数,它允许您设置日期和时间。

  • 这个命令仅仅是回应你在终端中输入的内容。在终端交互会话中,这不是一个非常有用的命令,但是当您编写 shell 脚本(在终端中运行的预先编写的命令集)时,它类似于计算机编程语言的print语句。

  • 虽然man可能是这些命令中最重要的,grep可能是最强大的。这是一个搜索程序,可以搜索文件和目录,使用你以正则表达式的形式给它的任何输入,并“管道”输出到屏幕或另一个文件。正则表达式的使用使得它如此强大;如果您不熟悉它们,正则表达式是构成搜索模式的一系列字符,通常这一系列字符看起来像外语。举个简单的例子,

    grep ^a.ple fruitlist.txt
    
    

    将在fruitlist.txt中搜索以“a”开头、后跟一个字符、后跟“ple”的所有行,并将结果打印到屏幕上。使用|管道,允许你将那些结果发送到不同的输出,比如一个文本文件。grep的力量和复杂性让你可以写下关于它的章节;现在,只要意识到它的存在。

  • ./ program:运行一个可执行文件的命令非常简单——只需键入一个句点,后跟正斜杠,再后跟程序名。请注意,这只适用于通过您的用户名可执行的文件;如果文件没有正确的权限或者根本不是可执行文件,它会给你一个错误。

  • exit:最后的重要命令简单来说就是exit。这会停止终端中正在运行的任何作业(也称为 shell ,并关闭终端本身。

练习:在 Linux 文件系统中导航

在下面的介绍性练习中,让我们练习用命令行在 Linux 的文件系统中移动。双击 Pi 桌面菜单栏上的终端图标,打开终端提示符(命令行提示符)(如图 2-3 所示)。

img/323064_2_En_2_Fig3_HTML.jpg

图 2-3

终端图标

当它打开时,通过键入以下命令确保您位于主目录中

cd ~

然后键入

pwd

终端应该打印出

/home/pi

现在,通过键入以下命令创建一个目录

mkdir mydirectory

然后,在不输入它的情况下,通过键入

mkdir mydirectory/mysubdirectory

如果您现在输入ls,您应该看到mydirectory被列为可用目录。你现在可以打字了

cd mydirectory/mysubdirectory

您将位于新创建的子目录中。

让我们测试一下echo函数。在终端中,键入

echo "Hello, world!"

终端应该响应

Hello, world!

顾名思义,echo只是重复你给它的论点。但是,您也可以将某些内容“回显”到其他输出格式;默认只是碰巧是屏幕。例如,您可以使用echo和‘>’操作符创建一个文本文件。类型

echo "This is my first text file" > file.txt

如果您随后通过键入ls列出您的目录的内容,您将会看到file.txt被列出。类型

cat file.txt

看到它的内容,你应该看到

This is my first text file

在终点站。输入以下命令,创建另一个名为file2.txt的文本文件

echo "This is another file" > file2.txt

现在,通过键入以下命令将第一个文件重命名为file1.txt

mv file.txt file1.txt

如果您现在列出当前目录的内容,您会看到file1.txtfile2.txt。你可以cat每个文件,以确保它们是你创建的。

接下来,让我们将file1.txt复制到文件夹结构中的上一级目录。类型

cp file1.txt ../file1.txt

如果您现在通过键入以下命令列出您的主目录的内容

ls ../../

你会看到file2.txt还在,虽然它已经从你当前的目录中消失了。恭喜你!现在,您已经成功地在 Linux 命令行(或 shell)中完成了最常见的文件操作!

说到 shells,Linux 在大多数发行版中都有几个可用的。

Linux 中的 Shells

Linux 中的 shell 有类似于 Bourne shellC shellKorn shell 的名字。shell 只是用户和操作系统之间基于文本的界面,允许用户直接对文件系统执行命令。每种外壳都有其优点和缺点,但是如果说一种外壳比另一种外壳更好,那将是一种误导。它们只是提供了做同一件事的不同方式。 Bourne-again shell ,也称为 bash ,是 Bourne shell 的替代版本,是大多数 Linux 版本的默认版本,包括 Pi 的 Raspbian。它可以通过其登录提示“$”来识别。Bash 有一些键盘快捷键,如果您在终端中进行大量编辑和文件操作,它们会变得非常方便,就像我们在项目中将要做的那样。(参见表 2-2 。)

表 2-2

Bash 键盘快捷键

|

键或组合键

|

功能

| | --- | --- | | Ctrl + A | 将光标移动到行首 | | 控制 + C | 停止当前正在执行的进程 | | Ctrl + D | 注销;相当于退出 | | Ctrl + E 组合键 | 将光标移动到行尾 | | 控制 + H | 删除光标前面的字符 | | Ctrl + L | 触发器的清零端 | | 控制 + R | 搜索命令历史记录 | | Ctrl + Z 组合键 | 暂停一个项目 | | 向左/向右箭头 | 将光标向左/向右移动一个字符 | | 向上/向下箭头 | 滚动浏览以前的命令 | | Shift +向上翻页/向下翻页 | 在终端输出中向上/向下移动一页 | | 标签 | 命令或文件名完成 | | 标签标签 | 显示所有命令或文件名的可能性 |

同样,大多数快捷方式都是不言自明的,但最后两个需要一些额外的解释:

  • 当你正在键入一个长文件名时,按下 Tab 键将会为你完成文件名或者为你提供一个选择列表。例如,如果你在/Desktop/MyFiles/目录下,想快速浏览myextralongfilename.txt文件,只需输入cat myextr,然后按 Tab 键。Bash 将为您填写文件名,假设没有其他文件有类似的开头。如果还有其他以myextr开头的,bash 会发出报错声;在这种情况下,再次按 Tab 键可查看选项列表。

  • 这个快捷键也适用于命令。在您的终端中,键入l并按 Tab 键两次。Bash 将用所有以“ l 开头的可用命令来响应(这可能是一个相当长的列表。)您可以通过一次添加一个字母并再次按 Tab 键两次来重复该过程。shell 将填充所有可能的命令或文件,为您提供所有可能结果的预览。

包管理器

当您需要在 Windows 中从在线源安装程序时,通常会下载一个。exe 或。msi 文件,双击它,并按照说明安装程序。类似地,如果你使用的是 Mac,你可以下载一个. dmg 文件,然后将解压后的文件复制到你的硬盘上,或者使用附带的安装包。

然而,Linux 有一点不同。Linux 使用包管理系统或包管理器来跟踪它的软件。软件包管理器用于为操作系统下载、安装、升级、配置和删除程序。大多数软件包管理器维护一个已安装软件的内部数据库以及所有的依赖和冲突,以防止安装软件时出现问题。包管理器因发行版而异。Debian(和 Pi)使用 aptitude,而 Fedora 使用 RPM 包管理器,Puppy Linux 使用 PETget。如果你有玩下载游戏的经验,可能对 Steam 游戏比较熟悉;你可能会惊讶地发现 Steam 的接口是一个包管理器的变种。大多数包管理器都有命令行和图形界面。例如,Ubuntu 使用 Synaptic 前端作为其智能管理器。

像 Ubuntu 一样,Raspberry Pi 使用 aptitude 包管理器,你可能会在终端中使用它来完成大部分工作。安装一个软件的常用命令是

sudo apt-get install package name

这将指示经理执行以下操作:

  1. 确定哪个软件源或存储库中有请求的文件。

  2. 联系存储库并确定需要哪些依赖项。

  3. 下载并安装这些依赖项。

  4. 下载并安装所需的软件。

如果这看起来很容易,那就应该——应该是这样。当您请求一个不包含在您已安装的软件库中的软件时,您可能会遇到问题,但是即使这样通常也是一个简单的解决方法。如果发生这种情况,只需键入

sudo add-apt repository repository name

进入你的终端。完成后,输入

sudo apt-get update

让您的软件包管理员了解新的存储库并从中获取可用软件包的列表,然后输入

sudo apt-get install package name

又来了。幸运的是,Raspbian 中包含的默认存储库(或 repos )包含了你需要的大部分软件,所以(至少对于这本书来说)你可能不会遇到这个问题。

文本编辑器

不像 Windows 和 Mac 有记事本、写字板和文本编辑,Linux 有几种可能的文本编辑器。大多数发行版上都安装了一个名为 gedit 的标准编辑器。它不仅相当轻便,而且也不包括在 Pi 中。Pi 的内置文本编辑器 Leafpad 相当不错。您可能还会发现自己对 nano 越来越熟悉,nano 是 Pi 上预装的另一个文本编辑器,具有非常直观的界面。但是如果您在 Pi 上做任何严肃的编程工作,您可能最终想要升级到 Linux 的两个强大功能之一:vi 或 emacs。

vi 和 emacs 不仅是强大的编辑器;它们也可以用作 ide(集成开发环境),带有关键字文本着色/语法突出显示和单词补全。两者都是可扩展和可定制的;例如,emacs 有 2000 多个内置命令,而 vi 可以通过其许多端口和克隆进行定制。事实上,vi 的克隆版本之一 Vim (Vi 改进版)几乎包含在每个 Linux 发行版中,也是我在这里要讨论的版本,因为它比它的前身 Vi 更像一个 IDE。Emacs 可以由用户使用 Lisp 扩展进行编程,但是对于您可能有的每一种美感来说,它都非常类似于 vi。

然而,emacs 和 Vim 之间正在进行一场战争。Linux 和 Unix 用户强烈喜欢其中的一个,当讨论/争论各自的利弊时,他们会变得异常兴奋。作为一个认真的作者,我将在这里向您介绍这两个程序,但是作为一个铁杆 emacs 用户,我将尽我所能使您的选择远离 Vim 这个垃圾。当我们在整本书中讨论程序和脚本时,我不会提及它们是如何编写的,而仅仅是最终结果是什么样子。您甚至可以决定您喜欢 Pi 的默认文本编辑器,这也完全没问题。

Vim 对 emacs 对 nano

Vim 是一个模态编辑器。它有两种模式:插入正常。在插入模式下,您的击键成为文档的一部分。正常模式用于控制编辑会话。例如,如果您在正常模式下键入“I ”,它会将您切换到插入模式。如果你再次输入一个“I ”,一个“I”将会出现在光标的位置,就像你所期望的文本编辑器一样。通过在这两种模式之间来回切换,您可以创建和编辑您的文档。

另一方面,Emacs 有更直观的界面。您可以使用箭头键在整个文档中移动,当您按下一个键时,您可以期望它出现在光标碰巧出现的任何地方。像复制/粘贴、保存等特殊命令是通过按 Control 键调用的,后面是一系列其他命令,通常以“x”开头。例如,如果您想保存当前文档,您可以按 Ctrl-x,然后按 Ctrl-s,在 emacs 菜单中突出显示为 C-x C-s。

另一方面,Nano 比其他两个更直观。您可以像在任何其他编辑器中一样输入文本,并且您使用的命令总是显示在屏幕的底部。

如果你想尝试其中一个或者全部三个(在你下定决心之前总是一个好主意),确保你已经安装了所有的软件。为此,首先输入

sudo apt-get install emacs

sudo apt-get install vim

Nano 应该预装在 Pi 上;然而,emacs 和 Vim 不是。请注意,emacs 是一个相当大的下载,所以安装它和它的依赖项可能需要一些时间。去喝杯咖啡或者吃顿饭,当你回来的时候,它应该已经在等你了。

使用 Vim

正如我所说的,Vim 是一个模态编辑器,意味着您可以在插入和正常模式之间切换。要启动测试文件,请导航到您的桌面并键入

vim testfile.txt

Vim 不是打开另一个窗口,而是在终端中打开,如果您不习惯,这可能会让人感到困惑。您应该会看到一个类似于图 2-4 所示的窗口。

img/323064_2_En_2_Fig4_HTML.jpg

图 2-4

Vim 中的 Testfile.txt

Vim 以正常模式打开,这意味着您不能立即编辑该文件。为此,您必须通过键入“I”进入插入模式。单词“INSERT”将出现在左下角——这是一种提醒您处于插入模式还是正常模式的便捷方式。键入完毕后,按下 Esc 键返回正常模式。在普通模式下,您可以使用箭头键在文档中移动,就像在插入模式下一样,但是在您键入“I”之前,您不能更改或添加任何内容。若要保存文件,请至少按一次 Esc 键,确保您处于正常模式。然后,键入“:w”(不带引号),并按 Enter 键。要同时保存和退出,请键入“:x”(还是不带引号),然后按 Enter 键。显然,如果您在输入这些字符时处于插入模式,那么您所能做的就是将:w 或:x 添加到文档中。

Vim 需要很长时间来适应,许多人很难适应这两种不同的操作模式。如果你决定喜欢它,网上有很多教程教你如何充分发挥它的潜力。

使用 emacs

Emacs(至少对我来说)比 Vim 更直观一些,尤其是当您第一次开始使用它的时候。首先,打开一个终端并导航到您想要测试文件的位置,比如桌面。在那里,输入

emacs testfile.txt

Emacs 会寻找testfile.txt,存在就打开,不存在就创建打开。然后你会看到一个空白页,如图 2-5 所示。

img/323064_2_En_2_Fig5_HTML.jpg

图 2-5

emacs 中的 Testfile.txt

你可以立即开始打字。表 2-3 列出了 emacs 中最常见的命令。

表 2-3

emacs 中的常用命令

|

命令

|

击键

| | --- | --- | | 打开/新建 | Ctrl+x + Ctrl+f | | 关闭 | Ctrl+x + Ctrl+c | | 救援 | Ctrl+x + Ctrl+s | | 切口 | Ctrl+w 组合键 | | 复制 | Alt+w* | | 粘贴 | Ctrl+y | | 跳到行首 | Ctrl+a | | 跳到行尾 | Ctrl+e 组合键 | | 开始/结束选择 | ctrl+空格键 |

** Alt 键在大多数键盘上被定义为 Escape 键*

因此,举例来说,如果你想移动一行文本,把你的光标移到行首。按 Ctrl 和空格键;窗口左下角的状态文本将显示“标记已激活”然后,使用 Ctrl 和“e”将光标移动到行尾。状态文本将消失。现在,通过按 Ctrl+w 剪切选定的文本,将光标移动到要粘贴它的位置,然后按 Ctrl+y。

这确实需要一些时间来适应,所以如果你决定喜欢 emacs,网上有很多教程可以帮助你学习击键。一旦你学会了它,它会变得非常强大,但是请永远记住:这些命令中的大部分(如果不是全部的话)都可以从菜单中访问。

使用纳米

如前所述,nano 可能是三个编辑器中最容易使用和习惯的。要在 nano 中启动文件,只需输入

nano testfile.txt

进入您的终端,您应该会看到如图 2-6 所示的屏幕。与其他两个编辑器一样,如果指定的文件存在,nano 将打开它;否则,nano 会为您创建它。

img/323064_2_En_2_Fig6_HTML.jpg

图 2-6

nano 中的 Testfile.txt

如您所见,常用命令列在底部,脱字符(^)表示 Ctrl 键。要保存文件,请键入 Ctrl+X 退出。系统会询问您是否要保存该文件以及以什么名称保存。一般来说,键入“Y ”,然后按回车键保存您打开或创建的文件。

默认文本编辑器

Pi 曾经有一个名为 Leafpad 的编辑器,但现在它只是一个功能齐全但没有名字的轻量级编辑器,类似于 Ubuntu 的 gedit,Mac 的 TextEdit 或 Windows 的 TextPad。要打开它,点击 Pi 桌面左上方的树莓图标,然后选择“文本编辑器”(图 2-7 )。

img/323064_2_En_2_Fig7_HTML.jpg

图 2-7

打开默认文本编辑器

正如您将看到的,看起来您所熟悉的大多数编辑器。如果你习惯使用它,请使用它。我没有提到它太多,因为它的一个主要缺点是,它只有在 Pi 的图形桌面上工作时才可用。如果您远程登录到 Pi,并且只通过命令行工作,那么文本编辑器是不可访问的。

摘要

您对 Linux 的介绍到此结束。虽然这并不能让你成为专家,但它应该让你对这个强大的操作系统所能做的一切有一个健康的认识。您学习了如何仅使用命令行浏览文件系统的基础知识,并了解了 shell。还向您介绍了可用的文本编辑器,并且希望您已经选择了一个您熟悉的编辑器。一旦您在您的 Pi 上对它有了足够的了解,您可能会发现自己正在一台或多台其他机器上安装 Linux。没关系,我不会告诉任何人。

在下一章,我将尽我所能给你一个坚实的 Python 介绍。

三、Python 简介

你可能记得从第一章开始,Raspberry Pi 的创造背后的动力是让编程对每个人来说更容易理解,尤其是孩子。为此,创造者希望发布一款相对强大的计算机,它不会花很多钱,任何人都可以简单地连接到键盘、鼠标和显示器并开始编程。

这一创造的另一个方面是使编程更容易,因此 Eben Upton 和他的同伴决定将 Python 作为 Pi 操作系统的一个组成部分。他们认为,Python 是一种强大的语言,但它足够简单,没有任何编程经验的人也能很快掌握。

在这一章中,我将向您简要介绍 Python,带您完成创建几个脚本、运行它们的过程,并在此过程中学习这种强大语言的一些基础知识。我假设你至少对什么是 Python 有一点点了解,也许对编程有一点点了解,但仅此而已,因为——让我们面对现实吧——这就是你买这本书的原因。

脚本与编程语言

Python 是一种脚本语言。有些人可能会对它是编程语言还是脚本语言吹毛求疵,但是为了让严格的技术专家满意,我们称它为脚本语言。

脚本语言在几个方面不同于真正的编程语言。当您阅读以下比较时,请注意斜体部分:

  • 编程语言是编译的,不像脚本语言。像 C、C++和 Java 这样的通用语言必须由编译器编译。编译过程会产生一个机器代码文件,人类无法读取,但计算机可以读取并遵循。当你用 C 写一个程序并编译它时。o 文件是计算机读取的内容。这样做的副作用/结果之一是编程语言可能产生更快的程序,这既是因为编译只发生一次,也是因为编译器经常在编译过程中优化代码,使其比最初编写时更快。

    另一方面,脚本语言在每次运行时都会被读取、解释和执行。它们不产生编译的文件,并且完全按照编写的指令执行。如果你写草率的代码,你会得到草率的结果。出于这个原因,脚本语言导致程序变慢。

  • 编程/编译语言通常直接运行在编写它们的硬件之上。当你用 C++编写和编译一个程序时,产生的代码直接由你的台式机上的处理器执行。

    脚本语言通常在另一个程序“内部”运行,这个程序负责刚才提到的编译步骤。PHP 是一种常见的脚本语言,运行在 PHP 脚本引擎内部。Bash 脚本在 bash shell 中运行,这在前一章中已经介绍过了。

  • 编程语言往往更复杂,更难学。脚本语言可读性更强,语法要求更少,对非程序员来说也不那么可怕。

    仅仅因为这个原因,脚本语言经常在学校的入门编程课程中教授,直到学生掌握了编程的基础知识,才会向他们介绍更严格的语言,如 C 或 Java。

然而,两者之间的界限在过去的几年里变得如此模糊,以至于两者之间的区别几乎完全消失了。列举如下:

  • 虽然严格的编程语言是编译的,而脚本语言不是,但当今计算机中处理器速度和内存管理的进步几乎使编译语言的速度优势过时了。一个用 C 语言编写的程序和一个用 Python 编写的程序可能都执行相同的任务,而速度上的差异几乎可以忽略不计。某些任务可能确实更快,但不是全部。

  • 是的,脚本语言运行在另一个程序中。然而,Java 被认为是一种“真正的”编程语言,因为它必须在运行时进行编译,但它是在每个设备上的 Java 虚拟机内部运行的。事实上,这就是 Java 如此可移植的原因:代码是可转移的,只要某个版本的虚拟机运行在您的特定设备上。C#也是一种编译语言,但是它运行在另一种编程环境中。

  • 好吧,我真的不能否认这样一个事实:编程语言往往更复杂更难学,脚本语言的确更容易阅读和学习,语法规则更少,上下文更像英语。以下面两种打印“Hello,world!”的方式为例对着屏幕。**

    在 C++中,您应该写:

    #include <iostream>
    int main()
    {
    std::cout << "Hello, world!" << std::endl;
    return 0;
    }
    
    

    在 Python 中,您可以编写:

    print "Hello, world!"
    
    

    当然也有例外;我见过几乎难以辨认的 Python 脚本。同样,也有一些非常可读的 C 程序在流传。但是,总的来说,脚本对于程序员新手来说更容易学习,并且它们可以像编译的代码一样强大。

    是的,你可以用 C,C++,甚至 Java,或者(如果你特别喜欢)汇编语言来编写 Pi。但是现在你已经知道并看到了编程和脚本语言之间的区别,难道你不想使用 Python 吗?

    使用 Python 对 Pi 编程意味着,许多从未梦想过对计算机编程的人可以拿起一个 Raspberry Pi,用它做一些非常酷的事情,比如构建本书中介绍的一个项目,而无需学习一门困难的语言。毕竟,这就是 Pi 存在的原因——让更多的学生可以使用编程——因此 Python 被预装在 Pi 上。

Python 哲学

在脚本语言的世界中,Python 相对来说是一个新人,尽管它并不像许多人认为的那样新。它是在 20 世纪 80 年代后期开发的,可能比 Unix 的概念晚了 15 年。

其主要作者 Guido Van Rossum 于 1989 年 12 月实施了该计划。他一直积极参与 Python 的开发和进步,他对这种语言的贡献得到了 Python 社区的奖励,社区授予他终身慈善独裁者(BDFL)的称号。

Python 的哲学一直是让代码可读和可访问。Python 的“PEP 20(Python 的禅)”文档总结了这一理念,内容如下:

  • 漂亮总比难看好。

  • 显性比隐性好。

  • 简单比复杂好。

  • 复杂总比复杂好。

  • 扁平的比嵌套的好。

  • 疏比密好。

  • 可读性很重要。

  • 特例不足以特殊到打破规则。

  • 虽然实用性战胜了纯粹性。

  • 错误永远不应该无声无息地过去。

  • 除非明确沉默。

  • 面对暧昧,忍住猜测的诱惑。

  • 应该有一种——最好只有一种——显而易见的方法来做这件事。

  • 尽管这种方式一开始可能并不明显,除非你是荷兰人。

  • 现在总比没有好。

  • 虽然永远也不会比现在的好。

  • 如果实现很难解释,这是一个坏主意。

  • 如果实现很容易解释,这可能是一个好主意。

  • 名称空间是一个非常棒的想法——让我们多做一些吧!

除了这些戒律之外,Python 还有一个“包含电池”的思维模式,这意味着无论你需要在 Python 中做什么奇怪的任务,很有可能已经有一个模块可以完成,所以你不必重新发明轮子。

Python 入门

我们开始吧。在您的 Pi 上运行 Python 有三种方式:使用内置的解释器空闲、在终端窗口中或者作为脚本。我们将从使用 IDLE 开始。

使用 IDLE 运行 Python

空闲解释器是一种“沙箱”,在这里你可以与 Python 交互地工作,而不必编写整个脚本来查看它们做了什么。IDLE 这个名字代表“集成开发环境”,但它也向英国喜剧团体 Monty Python 的创始人之一埃里克·艾多尔致敬。(见侧栏“给我一个灌木林!”)

因为这是对用户最友好的测试代码的方式,所以让我们先使用 IDLE。点击菜单栏左上方的树莓图标,然后打开编程子菜单就可以找到了(见图 3-1 )。选择 Python 2(空闲)选项,因为我们将在 Python 2 中进行所有的 Python 编程(参见侧栏)。你应该会看到如图 3-2 所示的窗口。

img/323064_2_En_3_Fig2_HTML.jpg

图 3-2

空闲窗口

img/323064_2_En_3_Fig1_HTML.jpg

图 3-1

查找空闲接口

为了遵循伟大的编程传统,让我们从程序员用任何语言编写的第一个程序开始。在提示符下,键入

>>> print "Hello, world!"

然后按回车键。你应该立即受到问候

Hello, world!

这是 Python 的print语句,默认选项是到屏幕。现在打字

>>> x=4

然后按回车键。提示符将会返回,但没有任何反应。实际发生的是 Python 的解释器现在已经将x4关联起来。如果你现在打字

>>> x

迎接你的将是

4

同样,如果你输入

>>> print x

你会再次受到欢迎

4

这说明了 Python 另一个很酷的方面:动态类型化。在像 C 这样的语言中,必须在声明变量之前定义变量的类型,如下所示:

string x = "This is a string.";

或者

int x = 5;

注意

有关字符串的更多信息,请参阅本章后面的“字符串”一节。

当你告诉 Pythonx = 4的时候,python“知道”了x是一个int(整数)。

尽管是动态类型的,Python 是强类型的。这意味着它会抛出一个错误,而不是允许你做一些事情,比如给一个string添加一个int。您也可以使用类定义自己的类型;Python 完全支持面向对象编程(OOP)。我稍后会谈到这一点,但简而言之,这意味着您可以创建一个可能是整数、字符串和其他类型混合的对象,并且该对象将是它自己的类型。Python 有几种内置的数据类型:数字、字符串、列表、字典、元组、文件和其他一些类型(比如布尔)。我们将在本章的后面简要地介绍每一个。

接下来,让我们尝试在 IDLE 中使用一些变量和操作。打字

>>> print x+5

会返回9;然而,打字

>>> x + "dad"

会导致错误。然而,在这种情况下,打字

>>> "DAD" + "hello"

给你

'Dadhello'

因为对于 Python 来说,添加字符串等同于连接字符串。如果你想列一个清单,用方括号把它括起来:

>>> y = ['rest', 1234, 'sleep']

此外,字典(一种由相关的键和键值组成的文件)必须用花括号括起来:

>>> z = {'food' : 'spam', 'taste' : 'yum'}

注意

键和键值是 Python 字典不可或缺的一部分。它们只是相互关联的价值对。例如,在前面代码示例中的z字典中,'food''spam'分别是一个键和一个键值。同样,'taste''yum'是一个键和一个键值。要使用字典,需要输入它的键,然后返回相关的键值。

给我一根灌木!

Python 是而不是以蛇命名的;更确切地说,它的创造者范·罗森以 BBC 喜剧团的巨蟒剧团命名,他是该剧团的超级粉丝。因此,语言中大量引用了 Monty Python。在其他程序中用来说明代码的传统“foo”和“bar”在 Python 示例中变成了“spam”和“eggs”。如果你是 Monty Python 的粉丝,你会看到“Brian”、“ni”和“bushebry”的引用,所有这些对你来说都很有意义。就连翻译 IDLE 也是以议员埃里克·艾多尔的名字命名的。如果你不熟悉他们的作品,我劝你放下这本书,去看一些他们的草图。我强烈推荐《死鹦鹉小品》和《傻瓜式行走部》。学习这门语言不一定要熟悉他们的作品,但这可能有助于增加你的乐趣。

Python 2 对 Python 3

Python 在编程语言中有些独特,因为它有两个当前可用的受支持版本:版本 2 和版本 3。前者是 2.7.14 版本,Python 3 目前是 3.6.4 版本。Python 3 发布于 2008 年;2.7 是在 2010 年发布的,不会有更多的主要版本(即,不会有 2.8 版本)。Python 的创造者决定用第 3 版“清理”这种语言,对向后兼容性的考虑比你预期的要少。

最大的改进是 Python 3 处理 Unicode 的方式,该语言的几个方面对初学者来说更加用户友好。不幸的是,由于向后兼容性有限,有许多用 Python 2 编写的 Python 软件如果不进行一些重大的修改就无法在 Python 3 中运行,坦率地说,这并不是很有吸引力,尤其是因为 Python 2 仍然受支持。

我的建议是,集中精力学习 Python 2,因为 3 并没有太大的不同。在这本书里,我将使用 Python 2,但是如果你觉得有必要的话,可以随意翻译成 Python 3。

使用终端运行 Python

让我们快速访问一下 Python 的另一种使用方式,那就是使用终端。打开 Pi 桌面上的终端,在提示符下键入python。你会看到与打开空闲窗口相同的介绍性文本和相同的交互式>>>提示。此时,您可以发出与上一节“使用 IDLE 运行 Python”中讨论的相同的命令,并获得相同的结果。

使用脚本运行 Python

IDLE 和 terminal 的问题都是你写不出真正的脚本。一旦你关闭了窗口,你声明的所有变量都消失了,并且没有办法保存你的工作。在文本编辑器中编写 Python 的最后一种方法解决了这个问题。你可以写一个完整的程序,用一个.py扩展名保存,然后从终端运行它。

让我们使用 Pi 的默认文本编辑器编写一个非常短的脚本。从附件菜单中打开它(图 3-3 )。

img/323064_2_En_3_Fig3_HTML.jpg

图 3-3

访问文本编辑器

在出现的窗口中,键入以下内容:

x = 4
y = x + 2
print y

将其保存到您的桌面上作为test.py。现在,打开终端,通过键入以下命令导航到您的桌面

cd ~/Desktop

您现在可以通过键入以下命令来运行您的脚本

python test.py

你应该会看到号码6。恭喜你!您刚刚编写、保存并运行了您的第一个 Python 脚本!

当您编写本书中的脚本时,可以随意使用任何文本编辑器。如果您习惯使用默认的文本编辑器,那就使用它吧。我倾向于使用基于终端的编辑器 nano 或 emacs,因为我经常远程登录到我的 Pi,并且默认编辑器不能在远程登录会话中运行。出于这个原因,我经常告诉你像这样编辑文件:

sudo nano spam-and-eggs.py

你想用哪个编辑器就用哪个编辑器。

接下来,让我们简单地看一下每种数据类型,看看您可以对每种类型做些什么。

探索 Python 数据类型

如前所述,Python 为您提供了几种内置的数据类型。在下面几节中,您将了解数字、字符串、列表、字典、元组和文件。

民数记

数字似乎是不言自明的,事实上,如果您有编程经验,您会认识到 Python 的数字类型:整数、短整型、长整型、浮点型等等。Python 有表达式运算符,允许您对此类数字进行计算;这些包括+-/, *%;比较运算符,如>>=!=orand;和许多其他人。

所有这些操作符都是内置的,但是您可以通过使用 Python 的另一个伟大特性来导入其他操作符:导入模块。模块是额外的库,可以导入到脚本中,增加 Python 的本地功能。在这方面,Python 很像 Java:如果你想做某件事,很有可能有一个库的存在使它变得更容易。例如,如果您想解析文本,如网页,您可以查看漂亮的 Soup 模块。需要登录到一台远程计算机上(对于某些项目,您会这样做)?导入 telnetlib 模块,需要的都有了。对于数字,math 模块有各种数学函数,增加了 Python 的数字功能。你可以自己试试。在空闲会话中,键入

>>> abs(-16)

并且你应该得到结果16。这是因为绝对值函数(我将在本章后面的独立章节中讨论函数的主题)已经包含在 Python 的默认库中。然而,打字

>>> ceil(16.7)

将返回一个错误,因为在那些默认库中,上限函数是而不是。肯定是进口的。现在打字

>>> import math
>>> math.ceil(16.7)

终端将返回17.0—x 的上限,或者大于 x 的最小整数。虽然您可能不需要使用ceiling函数,但简单地导入math模块将为您提供各种额外的功能,如对数和三角函数以及角度转换,所有这些都只需要一行代码。

用线串

在 Python 中,字符串被定义为用于表示基于文本的信息的字符的有序集合。Python 不像 C 和其他语言那样有char类型;单个字符就是单个字符的字符串。字符串可以包含任何可视的文本:字母、数字、标点符号、程序名等等。当然,这意味着

>>> x = 4

>>> x = "4"

不是一回事吗?您可以将3添加到第一个示例x中,但是如果您尝试使用第二个示例,Python 将会给出一个错误— x指向一个值为4的字符串,而不是一个整数,因为4被括在引号中。Python 不区分单引号和双引号;您可以在任一个中包含一个字符串,它将被识别为一个字符串。这有一个很好的副作用:您可以在字符串中包含另一种类型的引号字符,而不必像在 c 语言中那样用反斜杠进行转义。例如:

>>> "Brian's"

给你

"Brian's"

不需要任何转义字符。

在您的 Python 生涯中,有一些基本的字符串操作您可能会用到很多次,比如len(字符串的长度)、连接、迭代、索引和切片(Python 的 substring 操作的等价物)。举例来说,在空闲会话中键入以下代码,注意结果与您在这里看到的输出相匹配:

>>> len('shrubbery')

9

'shrubbery' is 9 characters long.

>>> 'spam' + 'and' + 'eggs'

'spam and eggs'

'spam', 'and', and 'eggs' are concatenated.

>>> title = "Meaning of Life"
>>> for c in title: print c,
(hit Enter twice)

M e a n i n g  o f  L i f e

对于'title'中的每个字符,打印出来。(注意print c后的逗号;它告诉解释器一个接一个地打印字符,而不是按向下的列打印。)

>>> s = "spam"
>>> s[0], s[2]
('s', 'a')

spam”的第一([0])和第三([2])字符是“s”和“”。

>>> s[1:3]
'pa'

第二个第四个字符是“pa”。(在命名字符串或其他数组中的一系列字符时,第一个参数是包含性的,第二个不是。)

当您有一个当前类型为 string 的整数(如"4")并且您想要执行一个操作(如求平方)时,您还可以在 string 对象和 string 对象之间进行转换。要做到这一点,就像打字一样简单

>>> int("4") ** 2
16

只要使用 Python 的内置字符串库,您就可以在 ASCII 代码之间进行转换,使用像%d 和%s 这样的转义字符进行格式化,从大写转换为小写,以及一系列其他操作。

列表

列表和字典可以说是 Python 内置数据类型中最强大的。它们实际上是其他数据类型的集合,非常灵活。它们可以根据需要改变位置、增长和收缩,以及包含和被包含在其他种类的对象中。

如果您有使用其他编程语言的经验,您可能会认为 Python 列表相当于 C 语言中的指针数组,事实上,列表实际上是 Python 解释器中的 C 语言数组。因此,它们可以是任何其他类型对象的集合,因为它们包含的指针对象可以指向任何其他数据类型,包括其他列表。它们也是可索引的——和索引 C 数组一样快。它们可以像 C++和 C#的列表一样伸缩;它们可以被分割、切块和连接——几乎任何你对字符串做的事情,你都可以对列表做。

要创建一个列表,用方括号([])声明它,如下所示:

>>> l = [1, 2, 3, 4, 5]

或者

>>> shrubbery = ["spam", 1, 2, 3, "56"]

声明它们之后,你可以用它们玩各种游戏,比如连接等等:

>>> l + shrubbery
[1, 2, 3, 4, 5, 'spam', 1, 2, 3, '56']

>>> len(shrubbery)
5

>>> for x in l: print x,
...
1 2 3 4 5

>>> shrubbery[3]
3

(您可能还注意到,列表和数组一样,是从 0 开始索引的。)通过使用索引和切片操作,您可以通过组合删除和插入来就地更改列表:

>>> cast = ["John", "Eric", "Terry", "Graham", "Michael"]
>>> cast[0:2] = ["Cleese", "Idle", "Gilliam"]
>>> cast
['Cleese', 'Idle', 'Gilliam', 'Graham', 'Michael']

列表还允许你使用与它们相关的特定函数调用,比如appendsortreversepop。更新名单(没有双关语!list的功能,键入

>>> help(list)

注意

Python 的help函数极其有用。如果你不知道如何做某事,或者有什么可用的,或者如何使用一个特定的功能,在提示符下键入help(<confusing object>)可以给你很大的帮助。(参见侧栏“Python 帮助”)

Python 帮助

如果您曾经沉迷于 Python,它的在线文档是非常有用的资源。将您的浏览器指向 http://docs.python.org/2/library/stdtypes.html 以阅读所有可用的标准数据类型以及如何使用它们。同样, http://docs.python.org/2/library/functions.html 会显示所有可供您使用的功能。它内置的帮助功能也很彻底。要尝试它,在空闲会话类型中

>>> import string

然后

>>> help(string)

你会得到你想知道的关于弦的一切。同样,打字

>>> help(string.capitalize)

将向您展示如何使用大写功能。

字典

像列表一样,Python 字典是极其灵活的对象集合。字典的不同之处在于,不像列表,它们是无序的;你可以通过索引来访问列表中的条目,但是字典中的条目是通过键来访问的。换句话说,字典包含键值对;请求该键将返回与该键相关联的值。例如,在下面的字典中,值'spam'可以通过它的键']'来访问:

>>> dict = {'food': 'spam', 'drink': 'beer'}
>>> dict['food']
'spam'

像列表一样,字典可以嵌套:

>>> dict2 = {'food': {'ham': 1, 'eggs': 2}}

这意味着键'food'有一个关联的键值{'ham': 1, 'eggs': 2},它本身就是一个字典。

字典有特定的方法调用:

>>> dict.keys()
['food', 'drink']

这列出了dict中的所有键。

>>> dict.has_key('food')
True

如果dict包含关键字“food”,则返回True,否则返回False

字典可以就地更改:

>>> dict['food'] = ['eggs']
>>> dict
{'food': ['eggs'], 'drink': 'beer'}

这将把'food'的键值从'spam'更改为'eggs'。(在这里,你会注意到']'除了是一个普通的项目,也是一个单项式列表。)

注意

正如您在这里看到的,键并不总是字符串。你可以使用任何不可变的对象作为键;如果您碰巧使用整数,字典的行为更像一个列表——也就是说,是可索引的(通过整数键)。

元组和文件

这里我要提到的最后一种主要数据类型是元组和文件。元组是不能更改的其他对象的集合,文件是指计算机上文件对象的接口。

元组是对象的有序集合。它们很像列表,但是不像列表,它们不能在适当的位置改变,并且用圆括号写,而不是方括号,像这样:

>>> t = (0, 'words', 23, [1, 2, 3])

这里,t包含两个整数、一个字符串和一个列表。您可以嵌套元组、索引它们、分割它们,以及做几乎任何您可以用列表做的事情,除了就地改变它们。

那么,如果元组几乎和列表一模一样,为什么还会有元组呢?最普遍接受的答案是*,因为*它们是不变的——它们不能被改变。通过将对象集合声明为元组而不是列表,可以确保该集合不会在程序的其他地方被更改。这有点像在 C 语言中把某个东西声明为const——如果你以后试图改变它,编译器会给你一个错误。

回想一下,我在第二章中谈到了文件,所以这个概念你应该很熟悉。Python 有一个内置函数open,它创建一个文件对象,该文件对象链接到计算机内存中的一个文件。文件对象与其他类型有点不同,因为它们实际上只不过是可以在那些外部文件上调用的函数的集合。这些函数包括readwriteopenclose,以及对文本文件的各种解析函数。举例来说,下面几行打开一个文件test.txt(如果它不存在,则创建它)进行写入,向其中写入一行文本(以换行符结束),然后关闭该文件:

>>> myfile = open('test.txt', 'w')
>>> myfile.write('Hello there, text file!\n')
>>> myfile.close()

当您执行命令时,所有这些都发生在您所在的目录中。

然而,请注意,如前所述,如果test.txt已经存在,其内容将被myfile.write()调用覆盖。如果您想要附加到文件而不是覆盖它,请在打开文件时使用“a标志,而不是“w”。

一旦打开了一个文件,您就可以读取和写入它,记住您只能从 file 对象中读取 string 对象。这仅仅意味着,在对文件中的所有对象执行任何操作之前,必须将它们转换成“真正的”数据类型;如果myfile.readline()返回“456”,如果要对其进行计算,必须用int()将 456 转换成整数。

文件操作非常有用,因为它们允许你创建和写入文本文件,但是它们超出了本章介绍的范围。当我们在项目中使用它们时,我们将在后面重新讨论它们。

正如您所看到的,Python 的内置数据类型可以做“真正的”编程语言可以做的任何事情——有时更容易也更经济。通过组合这些类型,您可以用 Python 完成一些真正强大的过程,接下来您将看到这一点。

用 Python 编程

现在您已经看到了数据类型,让我们研究一下如何在实际程序中使用它们。要创建 Python 程序,必须退出解释器并打开文本编辑器,如 emacs 或 Pi 的 Leafpad。创建程序后,用扩展名.py保存它。然后,您可以通过键入以下命令来运行它

$ python myprogram.py

Python 在语法上是编程语言中独一无二的,因为它使用空白或缩进块来屏蔽代码。像 C 这样的语言用花括号括起了一个代码块,比如一个if语句;Python 使用冒号和缩进来描述块。

C 语言中的代码如下所示:

if (x==4)
{
    printf("x is equal to four\n");
    printf("Nothing more to do here.\n");
}
printf("The if statement is now over.\n");

Python 中的相同代码如下所示:

if x == 4:
    print "x is equal to four"
    print "Nothing more to do here."
print "The if statement is  now over."

您可能会注意到关于 Python 程序的两个附加细节。首先,if语句中的括号是不必要的。在 Python 中,括号是可选的,但在大多数情况下,使用括号被认为是良好的编程实践,因为它增强了代码的可读性。您还会注意到,大多数其他语言都以分号结束它们的代码行;Python 没有。这可能需要一些时间来适应,但这是一个很好的改变,不会因为某个地方的分号放错位置或丢失而导致程序编译失败。在 Python 中,行尾就是语句的结尾——就这么简单。

您已经看到了一些语句,例如

x = 4
y = "This is a string."

如前所述,Python 不需要声明来告诉它x是一个整数而y是一个字符串——它只需要知道。这些语句被称为赋值,其中右边的值被赋给左边的变量。不同的语言有不同的变量命名约定,但是我能给你的最好的建议是选择一个约定并坚持下去。如果你更喜欢帕斯卡格(ThisIsAVariable),就用它;如果你喜欢驼背(thisIsAVariable),就用那个。保持一致——你以后会感谢自己的。在任何情况下,赋值就是这样做的:给一个变量赋值,不管这个变量是数字、字符串、列表还是其他什么。这是最简单的编程功能。

IF 测试

我们要看的下一个编程功能是if语句和它的派生物——elifelse。正如您所料,if执行一个测试,然后根据测试结果从备选方案中进行选择。最基本的if语句是这样的:

>>> if 1:
... print 'true'
...
true

1与布尔值true相同,所以前面的语句将总是打印true

注意

当您在终端(或空闲状态)的 Python 提示符下键入if语句并以冒号结尾时,下一个提示符将总是省略号(...),这意味着 Python 需要一个缩进的块。如果你完成了缩进块,只需再次按回车键结束它。如果你在文本编辑器中写程序,确保你缩进了你需要缩进的块。

从现在开始,我将格式化代码,就像它在文本编辑器中一样,并打印输出,就像您运行了脚本一样。

更复杂的测试使用elifelse,如下所示:

x = 'spam'
if x == 'eggs':
    print "eggs are better when they're green!"
elif x == 'ham':
    print 'this little piggy stayed home."
else:
    print "Spam is a wonderful thing!"

很明显,这段代码输出的是“垃圾邮件是个奇妙的东西!”当程序执行时,计算机检查第一个if。如果该语句被确定为真,它就直接执行其后的缩进块。如果该语句为 false,它将跳过缩进的块并查找一个elif,然后对其求值。同样,如果确定为真,或者没有elif,计算机执行下面的块;如果没有,它跳过那个块,寻找另一个elif或一个else

这里有三点很重要,值得一提。首先,请记住,如果一个if语句被确定为假,那么下面缩进的块中的不会被执行——计算机直接跳到下一个未缩进的行。

其次,Python 和其他语言一样,使用双等号来表示对相等性的测试。单个等号用于赋值;替身是一种考验。我提到这一点是因为每个程序员——我指的是每一个程序员——都在某个时候在一个if语句中使用了一个等号,结果他们的程序做了各种奇怪的、意想不到的事情。你也会这么做的,但我希望至少能提前给你省下一点恼怒。

第三,Python 忽略空行和空格(当然,除了交互提示和缩进块)以及注释。这一点很重要,因为它让你可以确保你的代码对其他程序员来说是可读的,即使那个程序员是你。

注意

Python 中的注释前面有一个#;程序忽略该行后面的任何内容。

代码的可读性非常重要;希望我定期向你灌输这一点。您更愿意尝试调试前面的程序还是类似这样的程序:

x='this is a test'
if x=='this is not a test':
    print"This is not "+x+" nor is it a test"
    print 89*2/34+5
else:
    print x+" and I'm glad "+x+str(345*43/2)
print"there are very few spaces in this program"

虽然你肯定可以读第二个,但这并不有趣,在没有空格、空行或注释的数百行代码之后,你的眼睛会感谢你——相信我。如果使用空格,请注意倒数第二行的不同之处:

print x + " and I'm glad " + x + str(345 * 43 / 2)

你可以使用空格,所以请随意使用!

我想提到的if语句的最后一部分是布尔运算符。在真值测试中,如果 X 和 Y 都为真,则 X and Y 为真。如果 X 或 Y 为真,X or Y 为真,如果 X 为假,Xnot为真。Python 使用单词,而不是 C 或 C++的&&||!操作符。学习这些运算符;它们会很有用的。

通常,一个程序从上到下执行,一次一行。但是,某些语句会导致程序执行到处乱跳;这些控制流语句包括if / then和循环。

最简单的循环可能是执行固定次数的代码块,例如

for x in range (0, 10):
    print "hello"

这只是打印

hello
hello
hello
hello
hello
hello
hello
hello
hello
hello

您还可以使用for循环来遍历可迭代的项,比如一个字符串甚至一个列表:

for x in "Camelot":
    print "Ni!"

Ni!
Ni!
Ni!
Ni!
Ni!
Ni!
Ni!

或者,迭代并打印字符本身:

for x in "Camelot":
    print x

C
a
m
e
l
o
t

虽然for循环的语法与 C 或 Java 有点不同,但是一旦你习惯了,使用语法就成了你的第二天性。

另一个循环语句是while语句。该语句计算一个条件,只要该语句为真,就继续执行缩进块:

x = 0
while (x < 10):
    print x
    x = x + 1

0
1
2
3
4
5
6
7
8
9

与您预期的不同,这段代码不会打印“10”,因为 x 在打印后会递增。在第十次迭代时,解释器打印“9 ”,然后将x增加到 10。此时,while条件不再为真,所以块内的代码永远不会被执行。

如果你在等待某个特定事件的发生,比如按键或用户按“Q”退出,语句会很有用。这方面的一个例子如下:

while True:
    var = raw_input("Enter something, or 'q' to quit):
    print var
    if var == 'q':
        break

关于这个脚本有两个细节需要注意:首先,在 Python 2.x 中,命令raw_input用于从用户那里获取输入。在 Python 3.x 中,这个命令被简单地改成了input。第二,记住break的命令。这个命令实际上打破了您碰巧所在的循环。所以,在这种情况下,循环的while部分使它永远运行下去,但是如果检查var == 'q'返回true,脚本就会跳出循环并结束程序。

功能

函数允许程序员重用代码,提高效率。一般来说,如果你发现你需要在你的代码中执行一个特定的任务超过两次,那么这个任务很可能是一个函数的候选者。

假设你写了一个简单的程序来计算一个矩形的面积和周长。它要求用户输入矩形的高度和宽度,然后执行必要的计算。最简单的方法之一是创建一个函数,将矩形的高度和宽度作为输入参数。然后打印矩形的面积和周长,并返回程序。为此,我们使用一个复合语句块,以def赋值开始。def赋值是我们如何定义一个函数,语法是def functionname (firstparameter, secondparameter):

def AreaPerimeter (height, width):
    height = int(height)
    width = int(width)
    area = height * width
    perimeter = (2 * height) + (2 * width)
    print "The area is:" + area
    print (The perimeter is:" + perimeter
    return

while True:
    h = raw_input("Enter height:")
    w = raw_input("Enter width:")
    AreaPerimeter (h, w)

这个小程序只是简单地接受你输入的数字并返回计算结果。虽然这可能不是最好的例子(你可以用更少的代码进行动态计算),但它说明了代码重用的思想。有了这个函数,无论你在程序中的什么地方需要计算面积或周长,你只需要用“height”和“width”两个参数调用AreaPerimeter,就为你完成了。

这里要注意一点:raw_input总是返回一个字符串,即使你输入了数字。这就是为什么在进行任何计算之前,AreaPerimeter中的heightwidth变量必须转换成int s。

如果您熟悉其他语言,Python 的函数与其他语言中的方法、函数和过程略有不同。首先,在 Python 中,所有函数都是引用调用。在不深入编程的情况下,这意味着当你传递一个参数给一个函数时,你实际上只传递了一个指向变量的指针,而不是变量本身。这有助于使 Python 对内存更加友好——例如,您不必随意地复制整个列表,并将它们来回传递给函数。相反,如果一个函数把一个列表作为参数,你把列表第一项的内存位置传递给它,它就根据这个位置和项做它需要做的事情。

函数的另一个有趣的方面是它们是可执行的语句。例如,这意味着函数定义实际上可以在一个if语句中声明和调用。虽然不正常,但这样做是合法的(有时是有用的)。def可以嵌套在循环、其他def甚至列表和字典中。

我们将在项目中再次访问函数;现在,请注意它们的存在,它们是你编写的任何程序中非常有用的部分。

对象和面向对象编程

在这篇 Python 简介中,我想说明的另一个重要事项是它运行面向对象代码的固有能力。虽然面向对象编程(OOP)可能是一个高级主题,并且可能超出了本书的范围,但我认为它是一个足够重要的主题,可以轻松地浏览一下。

OOP 是一种范例,其中程序数据被分成混合的对象和函数或方法。对象是一种数据类型——通常是其他数据类型的集合,如整数、字符串等等。对象通常是的一部分,这些类有关联的方法可以作用于该类的成员。

也许说明这一点最简单的方法是用一个使用形状的例子。在这个例子中,形状是一类对象。那个类有相关的值,比如namenumberOfSides。那个类也有相关的方法,比如findArea或者findPerimeter

shape类有子类,更具体。正方形是一个shape对象,其值shapeType等于square,numberOfSides等于4。它的findArea方法获取lengthOfSides值并求平方。同时,triangle对象对于nameshapeTypenumberOfSides有不同的值,其findArea方法也不同。

这个例子在快速介绍对象的同时,也说明了继承的概念,继承是 OOP 不可分割的一部分。三角形对象从其shape继承namenumberOfSidesfindArea部分(尽管这些部分有不同的值和实现)。如果一个对象从shape类继承,它也将继承那些部分。它不一定那些零件,但它有。它可能有额外的部分(例如,circle对象可能有一个radius值),但是它总是有那些部分。

如果你开始在编程中使用类,Python 比它的同类,如 C++或 Java,更容易理解。您几乎可以用语法object.attribute命名任何对象或方法,无论该属性是对象还是方法。如果你有一个名为holyGrailcircle物体,它的半径是holyGrail.radius。名为unexplodedScotsmansquare具有由unexplodedScotsman.findArea定义的区域。

就像我说的,OOP 超出了本书的范围。然而,像函数一样,它也非常有用,尤其是在更长、更复杂的程序中。随着您在 Python 研究方面的进步,您可以随时进行进一步的研究。您会发现 Python 也是一种非常通用的语言,甚至允许您执行函数和其他高级编程任务。

摘要

在这一章中,我给了你一个简短而实用的 Python 介绍,从它的一点历史开始,然后继续讲述如何与 Python 提示符交互,帮助你学习它的一些数据类型,然后向你展示一点使用编辑器编写脚本。如果你不能一下子理解所有这些信息,不要担心。这里有很多要学的东西,我会在我们进行书中的项目时解释我在做什么。与此同时,Python 上有数以千计的书籍和课程,所以如果你想了解更多,请随意在网上和当地的书店里寻找。

在下一章,我们将学习电子学 101。毕竟,你将会进行项目建设,在此之前,你应该对电、动力以及各种电子部件和小发明有一个基本的了解。

四、时速 100 英里的电子设备

您购买这本书是为了学习使用 Python 编程,并了解 Raspberry Pi。您还想构建一些很酷的项目,了解 Pi 如何运行 Linux,以及如何使用 Python 与 Pi 和各种附加组件进行交互。

我们会谈到这一点,但在此之前,我需要解释一些其他重要的先决条件,即电子和电气规则、工具、安全规则以及一些操作方法。它们可能不是最性感的话题,但任何涉及建筑电子项目的书都应该至少有一章涉及像欧姆定律和 ?? 如何焊接这样的概念,事实是,是的,?? 完全有可能用 9V 电池电死自己。(见侧栏。)更不用说,我不希望我的读者因为我没有做足够的安全指导而受到任何身体伤害。所以,如果这些信息对你来说是全新的,请至少浏览一下这一章并做些笔记。如果你读完这一章,觉得有必要穿得像图 4-1 那样来保护自己,那完全没问题。

img/323064_2_En_4_Fig1_HTML.jpg

图 4-1

可能的实验室安全装备

达尔文奖

如果你还不知道的话,达尔文奖是一个幽默的奖项,每年颁发给那些由于自己的愚蠢,通过死亡或绝育,成功将自己从基因库中移除的人类成员。过去的获奖者包括在从变电站偷铜线时触电身亡的小偷,在高速行驶时与乘客交换位置的司机,以及在静脉中注射罂粟籽的吸毒者。

9V 电池电死事件发生时,一名海军水手试图测量他的身体电阻,将他的 9V 万用表的尖头插入他的拇指,使他的血液成为完美的导体。电流穿过他的心脏,扰乱了他的心跳,杀死了他。

你可以在达尔文奖的网站上了解更多关于达尔文奖的信息: www.darwinawards.com

基本电学概念

。。。他说,他是这样说的:"只有一个定律,这个定律是欧姆定律,那就是 V 等于 I 乘以 r。"

好吧,我知道这个报价有些俗气;但是,欧姆定律确实是任何一个电气工程专业的学生学习的第一件事,它影响着你在电子学方面所做的一切。这意味着总电压(V;用伏特测量)等于电路中任何一点的电流(I;测量单位为安培)乘以电阻(R;以欧姆测量)。 I 代表电感,这就是为什么它是 I,而不是 c。因此,如果有一个 200 欧姆的电阻,有 0.045 安培的电流流过它,该电阻上的电压等于 9 伏。像任何好的代数方程一样,它是可以互换的:

  • V=I×R I=V**R R=V**I

电路中的另一个重要变量是功率,用 P 表示,单位是瓦特。功率等于电压乘以电流,电压的平方除以电阻,或者电流的平方乘以电阻。如果这令人困惑,使用图 4-2 中的图表来更好地想象这些关系。

img/323064_2_En_4_Fig2_HTML.jpg

图 4-2

常见电气方程

举例来说,说明不同电气概念的常见方式是用水和不同尺寸的管道。在“水回路”中,水力是由水泵提供的。在电路中,电源由电池提供。在水回路中,泵在低压下取水,增加压力,并将水沿着回路输送。在电路中,电池获得“低压”电压,增加电压,并在电路中传输。在这两种情况下,电流意味着电路周围的电子或水的流动。电路的电阻类似于水管有多大。如果管子很大,它对水流的阻力就较小。在电路中,如果导线的电阻较小,电子就可以更自由地流动。这反过来影响了的力量

功率随着电阻和电流的增加而增加。把功率想象成电的“速度”;如果有一定量的水从软管的一端流出,你把手指放在软管的一端,增加阻力,水的速度就会增加。增加电路的电阻会增加功率。当然,这也有副产品。部分堵塞软管末端会增加软管口处的摩擦,从而增加热量。同样,增加电路的电阻通常意味着增加热量。热量对电路不利,尤其是像集成电路(ic)这样的易碎物品,因此许多产生热量的电子元件(由于内阻等原因)通常内置有散热器来散发它们产生的热量。

从最基本的角度来说,电只不过是电子沿着电线或其他路径来回移动。该路径总是阻力最小的路径。给定两种旅行方式的选择,电子将总是选择最容易的路径,无论是通过导线、螺丝刀还是人类躯干。当与这些电子一起工作时,你的目标是确保最容易的路径不涉及你的身体。你不会永远成功;我被电击的次数都数不清了。(事实上,除了我经历过的电池和电源的多次电击之外,我实际上还被闪电击中过三次。)一个有良知的实验者应该努力减少这些事件,如果没有别的原因,仅仅是因为它们会伤害!橡胶手套会有帮助(尽管一直戴着有点不切实际),橡胶靴或橡胶底鞋也可以。橡胶靴之所以是个好主意,除了它们非常时尚之外,还因为电子总是想接地。该“地”可以是电源地,如电池的端子;底盘接地,就像汽车中的发动机组;或者实际接地,称为接地。你和地面之间的橡胶屏障阻止了这些电子通过你的身体。

了解了电学基础知识之后,让我们来谈谈构建项目所需的工具。

机器人所需的工具

所有的工程师都需要好的工具,作为一个初露头角的爱好者/实验者/工程师,你也不例外。放在你厨房垃圾抽屉里的那个凹陷的、破损的螺丝刀可能可以用来撬墙钉,但如果你试图用它来做你项目中的任何精细工作,你只是在自找麻烦。同样,当你试图在计时器到达零点之前伸进一个小孔去剪断红线时,一把齿缝很大的钢丝钳不会给你带来任何好处。要做酷的东西,你需要好的工具。以下部分将描述您应该拥有的必要工具。

螺丝刀

你需要一套好的小型珠宝商螺丝刀。多花 10 美元,买一台质量好、能用很长时间的电视机,最好是由淬火钢制成的。该套件应至少有三把普通螺丝刀和三把十字螺丝刀,普通尺寸从 3/64 英寸到 1/8 英寸,十字尺寸包括#0 和#1。一把好的螺丝刀价值相当于黄金,因为它不太可能剥开螺丝或出现损坏的尖端,根本抓不住螺丝。

此外,确保你手头有一把标准尺寸的普通螺丝刀和一把 2 号十字螺丝刀,因为你很容易组装/拆卸普通尺寸的物品和微型物品。我建议你买一把带有不同刀头的棘轮螺丝刀,这样你就可以为大部分项目做好准备。

钳子和剥线钳

同样,把钱花在好的钳子和剥线钳上,因为物有所值。你肯定需要一把好的尖嘴钳(如图 4-3 所示),它可以被用作镊子或者用来弯曲零件。

img/323064_2_En_4_Fig3_HTML.jpg

图 4-3

尖嘴钳

没有普通的钳子,你可能也能逃脱,尽管我不建议你这么做。好好照顾你的钳子,它们也会好好照顾你。用一把有缝隙或不能正确闭合的钳子很难弯曲电线或切断触点。

你还需要一些剥线钳。是的,你可以用钳子上的钳子小心地刻划电线绝缘层并将其剥去,但是当你每次需要电线末端时都必须重复这样做,这很快就会变得乏味。找些剥线钳,省得你头疼。无论是图 4-4 所示的那种还是图 4-5 所示的那种都可以——只要确保你知道如何使用它们。

img/323064_2_En_4_Fig5_HTML.jpg

图 4-5

剥线器,版本 2

img/323064_2_En_4_Fig4_HTML.jpg

图 4-4

剥线钳,版本 1

我实际上两者都用,因为虽然我很高兴能够在图 4-4 所示的线对中选择我的线尺寸,但我经常遇到不适合该型号任何预定尺寸孔的奇数尺寸线。这就是图 4-5 所示的剥离器发挥作用的地方。这些工具使用起来要快得多,如果你一次剥开很多电线,你会体会到它的速度和方便。

钢丝钳

你需要两种类型的刀具:普通刀具(图 4-6 )和精细刀具(图 4-7 )。

img/323064_2_En_4_Fig7_HTML.jpg

图 4-7

细钢丝钳

img/323064_2_En_4_Fig6_HTML.jpg

图 4-6

剪钳

常规尺寸的刀具非常适合日常工作,但是当你必须剪断微小的断裂焊点或 24 号线的磨损末端时,较小的刀具是非常宝贵的。

文件

当涉及到锉刀时,你不需要任何花哨的东西,只需要一套具有不同切口或粗糙度的小锉刀。较细的切口可用于在焊接前使接头变粗糙,或者在将导线插入试验板之前从导线末端去除一点焊料,而较粗的切口可用于重塑金属和塑料外壳、增加孔的尺寸以及各种其他任务。

放大镜

你将与许多非常小的物体打交道,从电阻到电线到伺服连接,你的眼睛很快就会疲劳。一盏内置放大镜的可调节台灯是非常有价值的投资。我使用的是专为珠宝商和珠饰商设计的,当我试图处理微型作品时,它的作用是不言而喻的。(参见图 4-8 。)

img/323064_2_En_4_Fig8_HTML.jpg

图 4-8

放大镜

热胶枪

在某些情况下,你需要将一些东西粘到其他东西上,比如将一个伺服系统粘到另一个伺服系统上,或者将印刷电路板(PCB)粘到机器人的平台主体上,而使用螺钉或螺栓可能并不可行。最好的方法之一是用热胶枪。忽略剪贴簿和纸板/通心粉设计的耻辱,得到一个好的胶枪。热熔胶在各种应用中的效果令人惊讶——木材与塑料、塑料与塑料、木材与金属等等。

各种胶水

说到胶水,你可能会想买一种其他的非热胶枪胶水。强力胶是必备的(不过要买名牌的,不要买商店里的牌子),建模水泥也是。我还储备了五分钟环氧树脂和橡胶胶水,最近发现大猩猩胶水是迄今为止最棒的胶水之一。你可能还会发现这些冷焊棒的用途——将两种类似油灰的物质混合在一起,形成一种“粘土”,硬化成钢铁般的稠度。

将磁带也添加到该列表中;准备一些普通的透明胶带、双面胶、遮蔽胶带、绝缘胶带,当然还有管道胶带。

万用表

万用表测量电路的不同方面——某些点上的电压、电流和电阻(见图 4-9 )。你是得到一个模拟还是数字版本取决于你,但准备花一点钱,因为一个好的万用表是一个非常有价值的工具。它可以用来跟踪电路短路,确保您使用正确的电压,并计算出电路中两点之间存在多大的电阻。

img/323064_2_En_4_Fig9_HTML.jpg

图 4-9

模拟和数字万用表( www.digimeter.com )

当选择你的万用表时,确保它能测量交流和 DC 电压水平,因为在某些时候你可能会同时使用这两种电压。它应该能够测量电阻和连续性以及电流。当你试图追踪系统中的电线或短路时,两点连接时发出声音的仪表非常有用。然而,最重要的特征是易用性。如果你不知道如何使用万用表,你就不会使用它,你就浪费了一个重要的工具。所以,买一个你喜欢的,对你有意义的,然后花些时间学习如何使用它。

电力供应

当涉及到为您的实验和项目提供动力时,有几种不同的途径可供您选择。显然,您将经常使用电池或电池组,我将针对每个具体项目讨论这些内容。然而,当涉及到为原型供电或只是确定特定配置是否工作时,你不能错过壁式电源——目前几乎所有电子设备都配备的交流 DC 转换器。

你可以在我推荐的电子商店买到可调节的壁疣,但是你也可以去当地的旧货店。在电子产品后面的某个地方,你可能会发现一个装满废弃电源的箱子,每个大约一美元。您可以切断连接器,这样就可以直接将其插入您的试验板,或者使用如图 4-10 所示的适配器。

img/323064_2_En_4_Fig10_HTML.jpg

图 4-10

电源插头适配器

每当我看到电源时,我都会捡起来,或者当我把设备扔在家里时,我会保留它们,所以我有一个相当好的分类。尝试找到至少 9V 和 12V 的不同额定电流,因为它们是常见的电压源。例如,如果你的设备在 12V 电源下运行良好,这意味着它在你的车上也可能运行良好。如果你碰巧遇到一个不常用的电源,比如交流到交流的变压器,一定要保留它——它可能会派上用场!

面包板

在开始焊接和永久化之前,当你把电子设备组装在一起,看看一切是否正常工作时,试验板是另一个必须拥有的东西。你可以全力以赴,用一个有电源连接和仪表以及各种铃铛和哨子的豪华模型(如图 4-11 所示)。

img/323064_2_En_4_Fig11_HTML.jpg

图 4-11

原型试验板设置

或者你可以选择一个更老派的版本,如图 4-12 所示。

img/323064_2_En_4_Fig12_HTML.jpg

图 4-12

模拟试验板

无论哪种方式,只要确保可以将电阻和 IC 等器件插入其中,并且可以使用跳线连接这些器件即可。随着你技能的提高和兴趣的多样化,做好准备,有一天你的实验板会看起来像图 4-13 中的图片。

img/323064_2_En_4_Fig13_HTML.jpg

图 4-13

面包板出了大问题

是的,你要调试那团电线,不,我帮不了你。但是我同情你——真的。

工具

你需要一个电源板,但不需要任何复杂的东西。把你所有的电子产品——台灯、烙铁、Pi 等等——都插在一个电源上是个好主意,这样你就有了一个安全的方法,可以在需要的时候中止。一按开关,一切都停止了。如果可以的话,买一个内置电涌保护器的。

烙铁

你清单上的另一个关键工具应该是烙铁,这是一个你不应该吝啬成本的东西。你可以在当地百货商店买到的 9.99 美元的烙铁可能适合修补房子周围的一些电路,但如果你是一个认真的建筑者/爱好者,你需要一个高质量的可调烙铁。我有一把威勒 WES51(如图 4-14 )。

img/323064_2_En_4_Fig14_HTML.jpg

图 4-14

焊接站

这无疑是我电子职业生涯中花得最值的 100 美元。买一个带支架、可调节热度和可以互换小费的。相信我:当你可以使用正确的温度使焊料熔化而不熔化你的电路,或者当你可以使用均匀的热量来消除一个坏的焊点时,你的项目将会感谢你。

当你买熨斗的时候,也买一些焊接附件。吸钎器(一种从焊点移除熔化焊料的手持式真空泵)是必备工具,辅助工具也是必备工具(见图 4-15 )。

img/323064_2_En_4_Fig15_HTML.jpg

图 4-15

助人工具

当你需要两只手握着一个接头,另外两只手焊接那个接头,而你又烧伤了你妻子的手指很多次而你的孩子又无处可寻时,一个帮助的工具就非常方便了。你甚至可以用硬铁丝、鳄鱼夹和一个木架来制作自己的东西。

一般安全规则

在这里我可以像你妈妈一样问你是否安全。毕竟,尽管我们在本书中构建相对无害的项目,但您仍然要处理一些可能严重伤害您的组件。例如,烙铁的尖端平均温度约为 450 华氏度,热熔胶,即使是低温胶,也能在 250 华氏度左右融化。当然,编程是一项相当无害的活动,但你也会进行切割、钻孔、打磨以及其他任何可能对你造成严重伤害的工作。所以,请认真对待这次安全讲座。

加热工作

时刻记住,你周围都是会变得很热的工具和组件,你应该记住它们是什么,并相应地对待它们。不仅烙铁是热的,而且你正在使用的焊料在 350 华氏度左右熔化,这意味着你刚刚焊接的部分是热的!在触摸它之前,给它几秒钟冷却,看看你的关节是否牢固。等到你的热胶水冷却到至少凝胶状的状态,再去触摸它。从个人经验来说:热胶水最糟糕的地方是,当你把它粘在手指上时,你不能把它抖掉。相反,它会留在你的手指上,然后发出嘶嘶声

处理尖锐物体

这应该是不言而喻的,但当涉及到您的切割工具时,遵循良好的安全实践也是必要的。这意味着:

  • 从你的身体上切掉。

  • 保持你的工具锋利。

向自己砍去,即使是轻轻的或者很小的一刀,都是自找麻烦。用 X-ACTO 刀滑了一下,你可能会切腹自杀,或者至少去急诊室缝针。相信我,缝针一点都不好玩,尤其是当医生在伤口注射麻醉剂的时候。如果你完全失去一根手指,机器人实验将立即变得更加困难至少 10 %,因为你将只有 9 根手指而不是 10 根——立即减少 10%。

保持刀刃锋利,因为任何厨师都知道,钝刀是一把危险的刀。如果你的美工刀变钝了,换一个新的。同样的事情也适用于你的 X-ACTO 刀片。一把钝刀片更有可能滑倒并割伤你,而一把锋利的刀只会在你正在砍的东西上割得更深。

佩戴安全眼镜

准备一副安全眼镜或护目镜。这是没有商量余地的——如果你没有一双,在做任何实验之前先买一双。你的视力太重要了,不能因为你的钢丝钳上的一个金属飞点或者你的砂轮上的一个火花而失去它。如果你有一双不舒服的,那就换一双——如果合适,你更有可能穿上它们。我更喜欢安全眼镜,但许多人更喜欢用松紧带固定在头上的护目镜,因为它们不会脱落。无论你喜欢哪一种,都要小心保管,以避免划伤和破损,并且在工作时佩戴它们。

准备好灭火器

我给你讲个小故事吧。当我用 Pi 制作我的第一个小移动机器人时,我第一次使用锂聚合物(LiPo)电池。这是一个 11.1 伏,1300 毫安时的小电池。我把它连接到我的伺服电机上,我设法用鳄鱼夹把正负极短接在一起。

紧接在响亮的砰砰声之后!和火花,包装开始迅速升温,包装开始膨胀。我尽可能快地思考,设法断开鳄鱼夹,把包扔到地板中间,并把一杯水泼到电池上。我侥幸躲过了一次爆炸,后来我发现那些脂肪电池威力很大。

这个故事的寓意是,虽然我用了一杯水,但我身边有一个灭火器,如果需要的话,我随时可以使用,你也应该这样做。它们并不贵,而且当谈到可能从火灾中拯救你的房子或车间时,它们是非常值得的。准备一个灭火器,并确保它充满电。

另外,在你需要灭火器之前,一定要学会如何使用它。想象一下,当你在阿拉斯加的野外徒步旅行,需要避开一只熊的时候,它就像是熊喷雾。你肯定会在徒步旅行前练习使用它,因为在逃离愤怒的灰熊时阅读方向是非常困难的。你的灭火器也是类似的——当你的车间变成一个高耸的地狱的翻版时,阅读和遵循说明书会非常困难。熟悉它,希望你永远不会用到它。

手边放一个急救箱

尽管这是不言而喻的,但你要在身边准备一个急救箱。你不需要一个完整的 1 级应急装备包来进行南极探险,但是一个小的、储备充足的装备包应该在附近的某个地方。工具包里应该有一些创可贴、酒精、棉签,也许还有一些其他零碎东西。当你全身都是血时,很难焊接起来。

在通风区域工作

工作时要记住的一个重要细节是保持工作间通风良好,因为你很可能会进行打磨、油漆、锯木和其他各种可能使空气(和肺部)充满危险物质的活动。举例来说,你可能没有刷足够多的油漆来担心油漆味,但是你肯定会接触到焊料味。焊料含有铅——不多,但有一些——而且铅是有毒的。如果你接触太多太频繁,它会导致铅中毒。症状包括腹痛、意识模糊、头痛和易怒。在严重的情况下,它会导致癫痫发作甚至死亡,这两种情况都不利于进一步的机器人实验。

尽管你不太可能在焊接时接触到足以毒死自己的铅,但要知道它是有毒的。不要吸入烟雾,在接触焊接部件后,要经常彻底洗手。你应该在通风良好的地方工作,开着窗户,或者至少开着风扇。一些实验者将一个旧的电脑风扇连接到一个干燥通风软管上,以定制一个除烟解决方案。

组织你的工作场所

随着你通过购买额外的工具、零件、芯片、电路板等等来进行实验,你将需要一种方法来组织这一切。保持你的工作区域有条不紊也很容易安全,因为把所有东西都整齐地存放在原处也可以消除工作场所的危险。

至少,买几个不同尺寸的三明治袋子,这样你就可以把不同的部分分开,但是当你过了不能回头的时候,看看储存的方法。我在当地工艺品商店的串珠区运气不错,因为许多电子零件都和珠子差不多大。我的一个存储区如图 4-16 所示,而另一个存储区如图 4-17 所示。

img/323064_2_En_4_Fig17_HTML.jpg

图 4-17

项目存储区

img/323064_2_En_4_Fig16_HTML.jpg

图 4-16

小型零件储存区

注意标签;给自己买个标签制作机吧!很容易,这是我最好的一次购买——你可以给抽屉、电源、电线、孩子贴上标签。。。可能性是无限的。此外,一旦你开始着手并同时有多个项目在进行中,你会发现按项目而不是按部分来划分更容易,至少有时是这样。有些东西,比如开关,到处都在使用,但是我知道当我再次攻击我的时间喷泉或者做更多的光画的时候,我可以在那些各自的盒子里找到我一直在使用的所有部件。

我必须在这里补充一点,当谈到组织一个商店时,特别是在工具方面,可以看看亚当·沙维奇在 YouTube 上的测试系列。在许多视频中,他解释了如何整理工具,以及如何建造(如果有必要的话)存放设备的容器。它鼓舞人心,一定会给你很多灵感,即使你只是利用厨房后面的一个小角落。

总的来说,保持你的区域干净就行了。不仅在它们应该在的地方找到它们更有效率,而且在拿着 X-ACTO 刀时被电源线绊倒可能是一个危险的事件。把你的工具或零件从原处拿走,使用它,然后放回原处。(这是另一个你可能必须照我说的做,而不是照我做的地方。在整本书中,你会看到我工作空间的照片,我不能保证它永远是最整洁的地方。当我工作时,我倾向于散开。但是你明白了。)

奖励:焊接技术

在这最后一节介绍电子章节,我会给你一些提示如何焊接。焊接是一门艺术,也是一项技能,它需要练习。如果你以前从来没有焊接过,你的第一个接头肯定是凹凸不平的,丑陋的团块,但是如果你坚持下去,改善会很快。当你在一个真实的项目中完成时,仅仅花几个小时将元件焊接在一起的练习就能产生巨大的不同。

焊接基本上分为四个步骤:准备表面,必要时上锡,连接零件,加热:

  1. 准备好你的 。如果你要连接电线——连接到其他电线或另一个表面——剥去最后半英寸左右的绝缘层,将线束缠绕在一起,形成一个紧凑的线束。其他金属部件可能需要清洁,如果是特别光滑的表面,用砂纸打磨可能有助于焊料更好地附着在上面。

  2. 必要时上锡。在一个表面上镀锡就是在你把它粘在另一个表面上之前在上面熔化一点焊料。例如,在将电线连接到 IC 引脚时,这是一个很好的实践。给电线上锡时,用烙铁从底部加热,然后将焊料保持在顶部。当电线变得足够热时,焊料就会融化进去。

  3. 连接零件。如果可以的话,用机械方式连接这些部件——将电线缠绕在一起,将电线缠绕在 IC 引脚上,等等。如果这是不可能的,这就是你的帮助工具发挥作用的地方——用它来把各部分结合在一起。

  4. 热度 零件。用一个清洁的烙铁头,加热焊点,同时将焊料保持在焊点上。当连接足够热时,焊料会熔化并流到接头上。

最后一步可能是最重要的。你的熨斗尖应该是干净的;养成习惯,每当你吸完一口,开始吸另一口之前,用湿海绵擦拭。干净的尖端会更好地传热。你还应该加热接头,而不是焊料。不要将焊料熔化到烙铁的尖端,然后涂抹到连接处——你可能会产生冷焊点(如图 4-18 ),这最终肯定会失败。记住:加热零件,而不是焊料。如果你很难将焊点加热到足以让焊料熔化,你可以在接触焊点之前在烙铁顶端熔化一点焊料,因为焊料会更有效地传递热量。你应该得到一个看起来像图 4-19 中的关节。

img/323064_2_En_4_Fig19_HTML.jpg

图 4-19

良好的焊点

img/323064_2_En_4_Fig18_HTML.jpg

图 4-18

冷焊点。注意不良连接。

同样,不要过分强调你的焊接技能或缺乏焊接技能。稍加练习,你就会像专家一样焊接电路。

除了动手之外,也许学习焊接的最好方法就是观看,YouTube 的魔力让这成为可能。快速搜索“如何焊接”会出现 30 多万个结果。我不能挑出任何两三个突出的,但如果你看一些,你应该得到的想法。Makezine 是一个信息量惊人的在线博客,它有一个很好的页面,上面有学习如何焊接的资源。它位于 http://makezine.com/2006/04/10/how-to-solder-resources/

摘要

在了解了一些基本的电学原理后,你了解了实验室中一些常见的电子工具,并了解了如何安全使用它们的基本知识。我还向您介绍了焊接,并为您指出了一些可以帮助您更好地学习焊接的资源。

让我们带上工具,进入项目,从一个不需要任何工具的简单项目开始 WebBot。