Skip to content

Latest commit

 

History

History
768 lines (478 loc) · 51.9 KB

File metadata and controls

768 lines (478 loc) · 51.9 KB

七、将你的树莓派连接到物理世界

在本章中,我们将探讨与将 Raspberry Pi 连接到物理世界相关的硬件和软件概念。我们将介绍 GPIO 库用于引用 Raspberry Pi 上的 GPIO 头引脚的流行编号方案,并提供流行 GPIO 库的概述,以及我们在前面章节中使用的 GPIOZero 和 PiGPIO 库。我们将了解到,理解 GPIO 编号方案对于确保您了解 GPIO 库如何使用 GPIO 引脚至关重要。

我们的旅程还将包括一个概念性概述,并讨论电子设备与我们的 Raspberry Pi 接口的多种不同方式,然后我们将完成两个重要电子概念的详细练习和实践演示-脉宽调制PWM)以及模数转换。

本章将介绍以下主题:

  • 理解树莓皮管脚编号
  • 探索流行的 Python GPIO 库
  • 探索树莓皮电子接口选项
  • 与模数转换器的接口

技术要求

要执行本章中的练习,您需要以下内容:

  • 树莓皮 4 B 型
  • Raspbian OS Buster(带桌面和推荐软件)
  • Python 3.5 版的最低版本

这些需求是本书中代码示例的基础。只要您的 Python 版本是 3.5 或更高版本,就可以合理地期望代码示例在 Raspberry Pi 3 Model B 或不同版本的 Raspbian OS 上无需修改即可工作。

您可以在 GitHub 存储库中的chapter05文件夹中找到本章的源代码,网址如下:https://github.com/PacktPublishing/Practical-Python-Programming-for-IoT

您需要在终端中执行以下命令,以设置虚拟环境并安装本章代码所需的 Python 库:

$ cd chapter05              # Change into this chapter's folder
$ python3 -m venv venv      # Create Python Virtual Environment
$ source venv/bin/activate  # Activate Python Virtual Environment
(venv) $ pip install pip --upgrade        # Upgrade pip
(venv) $ pip install -r requirements.txt  # Install dependent packages

以下依赖项是从requirements.txt安装的:

除上述安装外,我们还需要一些物理电子元件用于本章的练习:

  • 1 x 5 毫米红色发光二极管
  • 1 x 200Ω电阻器-其色带将为红色、黑色、棕色,然后是金或银
  • 1 个 ADS1115 ADC 断开模块(例如,https://www.adafruit.com/product/1085
  • 2 x 10 kΩ电位计(10K 至 100K 范围内的任何值都适用)
  • 试验板
  • 公-母和公-公跨接电缆(也称为杜邦电缆)

理解树莓皮管脚编号

到现在为止,你已经注意到你的树莓圆周率有很多针伸出来了!自第 2 章开始学习 Python 和 IoT以及所有后续章节以来,我们通过引用这些引脚来引用它们,例如,作为GPIO 引脚 23,但这意味着什么?是时候让我们更详细地了解这一点了。

参考树莓 Pi 的 GPIO 引脚有三种常见方式,如图 5.1 所示:

Figure 5.1 – GPIO pin numbering schemes

在前面的所有章节中,我们都从 PiGPIO 的角度讨论了 GPIO 引脚,PiGPIO 使用BroadcomBCM****编号方案。BCM 是基于 Python 的 GPIO 库中使用的最常见的方案,我们稍后将讨论的 GPIO 库都只使用 BCM 或默认使用 BCM。但是,了解其他方案的存在是很有用的,因为它在读取或调试您在 internet 和其他资源上遇到的代码片段时会有所帮助。

**The terms GPIO and pin can be rather loosely used when it comes to identifying pins. You need to interpret wording such as GPIO 23 or Pin 23 with consideration of the context and scheme in which it is being used.

让我们来探索这些备选方案,如图 5.1 所示:

  • Broadcom/BCM 编号:指您的 Raspberry Pi 中 Broadcom 芯片的 GPIO 编号。对于 BCM 编号,当我们说GPIO 23 时,指的是 BCM 引脚输出图中标记的GPIO 23。这是我们在本书中介绍的 GPIOZero 和 PiGPIO 示例中使用的方案。
  • 物理/线路板/P1 头:在该编号方案中,使用 P1 头的物理管脚号,例如 BCM GPIO 23=物理管脚 16。
  • WiringPi:这是一个流行的 C GPIO 库,名为 WiringPi,它引入了自己的 pin 映射方案。由于 WiringPi(有一个 Python 端口)的成熟,您将不时遇到这个方案-继续我们的示例,BCM GPIO 23=物理引脚 16=WiringPi 引脚 4。

还有其他用于参考管脚和接口的方法和命名方法需要注意,它们包括以下内容:

  • 虚拟文件系统:在/sys有一个虚拟文件系统,用于一般 GPIO 访问,/dev/*i2c用于 I2C,/dev/*spi*用于 SPI,/sys/bus/w1/devices/*用于单线设备。
  • 替代引脚功能图 5.1前面的 BCM 图中列出了 GPIO 引脚编号,括号中还列出了 PWM0、I2C0、SPI0 等替代引脚功能。这些代表了 pin 除了基本数字 I/O 之外可以执行的其他角色。
  • 总线/通道号:对于 SPI 和 I2C 接口以及硬件 PWM,库通常使用总线或通道号。例如,我们可以使用 BCM GPIO 18 作为通用数字输入和输出,也可以在其替代功能模式下使用它作为硬件 PWM 输出作为 PWM 通道 0。

The pinout.xyz website is a great resource for exploring pin naming, alternative functions, and scheme mappings.

现在,您已经了解了可用于引用 Raspberry Pi 上的 GPIO 引脚的不同方案。虽然 BCM 方案往往是基于 Python 的 GPIO 库中最常见和最通用的方案,但绝对不能假设您正在使用的 GPIO 库、代码示例,甚至是实验板布局或原理图使用 BCM 方案引用 GPIO 引脚。代码中使用的方案与将电子设备实际连接到 Raspberry Pi 的 GPIO 引脚的方案不匹配是导致电路无法工作的常见错误。

I often see people (and I've done the same!) blame their wiring or believe an electronic component must be faulty when their circuit does not work with a code example they found somewhere online. As a first step toward diagnosis, check that the pin numbering scheme the code is using matches the scheme you used to wire the circuit to the Raspberry Pi's GPIO pins.

现在,我们已经了解了不同 GPIO 编号方案的用途和重要性,接下来让我们回顾一下流行的 Python GPIO 库。

探索流行的 Python GPIO 库

如果你和我一样,当你第一次用树莓皮开始的时候,你可能只是想控制事情。今天,对于许多开发人员来说,他们与使用 Raspberry Pi 的物理计算的第一个接触点将是通过 Raspberry Pi 官方网站和 GPIOZero 库。然而,在你对简单的电子产品如按钮、LED 和电机进行了一段时间的修补之后,你会想要进行更复杂的接口。如果您已经采取了这一步或即将采取这一步,您可能会发现自己陷入了 GPIO 库和选项的混乱世界。本节通过介绍更流行的选项来帮助您导航此路径。

I maintain a summary and comparison table of Python GPIO libraries (including additional libraries not listed in the following sections) at https://10xiot.com/gpio-comp-table.

我们将从 GPIOZero 开始我们的 GPIO 库概述。

回顾 GPIOZero–面向初学者的简单界面

GPIOZero 库的重点是简单性,使其成为物理计算和接口电子学初学者的无需大惊小怪的库。它通过抽象出潜在的技术复杂性来实现易用性,并允许您编写处理设备外围设备的代码,如 LED、按钮和常见传感器,而不是编写直接管理管脚的低级代码。

从技术上讲,就如何与 GPIO 引脚硬件交互而言,GPIOZero 实际上并不是一个成熟的 GPIO 库。它是一个简化的包装器,围绕着其他用于执行实际 GPIO grunt 工作的 GPIO 库。在第 2 章开始学习 Python 和 IoT中,我们在 GPIOZero 和 PiGPIO 中看到了一个按钮和 LED 示例,说明了这一点。

简而言之,以下是 GPIOZero 的主要亮点:

  • 说明:为初学者设计的高级 GPIO 库
  • 优点:易于学习和使用,有优秀的文档和许多示例
  • 缺点:仅限于简单电子接口之外的使用范围
  • 网站https://gpiozero.readthedocs.io

接下来,我们将回顾 RPi.GPIO,一个流行的低级 GPIO 库。

回顾 RPi.GPIO–初学者的低级 GPIO

我们之前提到过,GPIOZero 的本质是编写处理设备和组件的代码。嗯,RPi**。**GPIO 采用了一种不同的、更经典的方法,我们编写的代码可以直接使用和管理 GPIO 引脚。GPIO 是对 Raspberry Pi 和 electronics 的一个流行的低级介绍,因此您可以在 internet 上找到许多使用它的示例。

GPIOZero 文档中有一个关于 RPi.GPIO 的重要部分,其中解释了 GPIOZero 和 RPi.GPIO 中的等效代码示例。这是开始学习低级 pin 级编程概念的一个很好的资源。

There is also a library named RPIO that was created as a performance drop-in replacement for RPi.GPIO. RPIO is not currently maintained and does not work with the Raspberry Pi Model 3 or 4.

简而言之,以下是 RPI.GPIO 的主要亮点:

  • **说明:**轻量级低级 GPIO
  • 优点:成熟的库,在互联网上可以找到很多代码示例
  • 缺点:轻量级意味着它不是面向性能的库,也没有硬件辅助的 PWM
  • 网站https://pypi.python.org/pypi/RPi.GPIO

接下来,我们将研究另一个用于控制复杂设备的高级库。

回顾电路 Python 和 Blinka–复杂设备的接口

Blinka 是 Circuit Python(circuitpython.org的 Python 兼容层,后者是专为微控制器设计的 Python 版本。它由电子公司 Adafruit 创建和支持,该公司经销许多电子转接板和小工具。Adafruit 为其许多产品线提供高质量的高级电路 Python 驱动程序,本质上将 GPIOZero 易用性思想推广到更复杂的设备。

在本章后面,我们将使用 Blinka 和用于 ADS1115 ADC 断开模块的电路 Python 驱动程序库为 Raspberry Pi 添加模拟到数字功能。

简而言之,以下是 Blinka 的主要亮点:

  • 总结:用于控制复杂设备的高级库
  • 优点:无论您的经验水平如何,使用受支持的设备都非常容易
  • 缺点:对于基本 IO,它使用 RPi.GPIO,所以它有相同的基本限制
  • 网站https://pypi.org/project/Adafruit-Blinka

接下来,我们将介绍 Pi.GPIO,这是一个功能强大的低级 GPIO 库。

回顾 PiGPIO–一个低级 GPIO 库

就功能和性能而言,PiGPIO 被认为是 Raspberry Pi 最完整的 GPIO 库选项之一。它的核心是用 C 实现的,Python 有一个官方端口。

在架构上,PiGPIO 由两部分组成:

  • PiGPIO 守护程序服务提供对底层 PiGPIO C 库的套接字和管道访问。
  • PiGPIO 客户端库使用套接字或管道与 PiGPIO 服务交互。正是这种设计使得通过 PiGPIO 在网络上实现远程 GPIO 功能成为可能。

简而言之,以下是 PiGPIO 的主要亮点:

  • 说明:一个高级的底层 GPIO 库
  • 优点:可用功能数量
  • Cons:需要额外设置;简单的文档假定了解基本概念
  • 网站(Python 端口)http://abyz.me.uk/rpi/pigpio/python.html

在我们继续下一个库之前,我想提请您注意这个库特有的一个功能,它是非常有用的远程 GPIO。

使用 PiGPIO(和 GPIOZero)探索远程 GPIO

一旦您在 Raspberry Pi 上启动了 pigpiod 服务(见*第 1 章、设置您的开发环境*),有两种方法可以使您的代码远程运行,而通过远程,我的意思是您的程序代码可以在任何计算机上运行(不仅仅是 Raspberry Pi)并控制远程覆盆子 Pi 的 GPIOs。

方法 1:此方法涉及将远程 R ASPPI 的 IP 或主机地址传递给 PiGPIO 构造函数。使用这种方法,您还可以通过创建额外的pigpio.pi()实例来与多个 Raspberry Pi GPIO 交互。例如,在下面的示例中,pi实例上调用的任何方法都将在运行 PIGPOID 服务的192.168.0.4主机上执行:

# Python Code.
pi = pigpio.pi('192.168.0.4', 8888) # Remote host and port (8888 is default if omitted)

方法 2:第二种方法是在计算机上设置环境变量并运行 Python 代码(Python 代码只需要使用默认的 PiGPIO 构造函数pi = pigpio.pi()

# In Terminal
(venv) $ PIGPIO_ADDR="192.168.0.4" PIGPIO_PORT=8888 python my_script.py

远程 GPIO 可能是一个很好的开发工具,但当数据通过网络传输时,会增加代码与 GPIO 引脚交互的延迟。这意味着非开发版本可能不需要它。例如,按钮按下可能感觉不太灵敏,对于快速计时很重要的用例,远程 GPIO 可能不切实际。

You may remember from Chapter 2, Getting Started with Python and IoT, that GPIOZero can use a PiGPIO Pin Factory, and when it does, GPIOZero automatically gets remote GPIO capabilities for free!

最后,因为它是 PiGPIO 库的一个独特功能,所以如果我们需要远程 GPIO 功能,您的所有代码都必须使用这个库。如果安装第三方 Python 库来驱动电子设备,并且该设备使用(例如)RPi.GPIO,则该设备未启用远程 GPO。

接下来,我们将介绍两个用于 I2C 和 SPI 通信的通用底层库。

回顾 SPIDev 和 SMBus–专用 SPI 和 I2C 库

在使用支持 I2C 和 SPI 的设备时,您会遇到 SPIDev 和 SMBus 库(或类似的替代方案)。SPIDev 是一个流行的用于 SPI 通信的低级 Python 库,而 SMBus2 是一个流行的用于 I2C 和 SMBus 通信的低级 Python 库。这两个库不是通用库-它们不能用于基本的数字 I/O 引脚控制。

刚开始时,您不太可能希望或需要直接使用 I2C 或 SPI 库,比如这些。相反,您将使用更高级别的 Python 库来处理支持 SPI 或 I2C 的设备,该设备下面将使用像这样的低级别库来与物理设备通信。

以下是 SPIDev 和 SMBus2 的主要亮点:

  • 说明:这些是 SPI 和 I2C 接口的底层库。
  • 优点:使用较低级别的库可以完全控制 SPI 或 I2C 设备。许多高级便利包装仅公开最常用的功能。
  • 缺点:利用这些低级库需要您理解如何使用低级数据协议和位操作技术与电子设备接口。
  • SPIDev 网站https://pypi.org/project/spidev
  • 中小企业 2 网站https://pypi.org/project/smbus2

为了完成关于 GPIO 库的这一部分,让我简单地讨论一下为什么这本书主要基于 PiGPIO 库。

为什么是 PiGPIO?

您可能想知道,在所有选项中,我为什么选择在本书中主要使用 PiGPIO。作为本书的读者,我假设您在编程和技术概念方面有良好的基础,并且与 PiGPIO 这样的库一起工作和学习并不超出您的能力范围。PiGPIO 是一个综合性的库,如果您打算将您的学习扩展到 GPIOZero 和 RPi.GPIO 等库提供的基础知识之外,并用 Python 构建更复杂的 IoT 项目。

您会发现 PiGPIO API 和文档分为初学者、中级和高级部分,因此在实践和学习过程中,您可以根据您的经验水平和需要混合使用库 API。

现在,我们已经完成了对几个流行 GPIO 库的探索,并回顾了它们的基本架构和设计。接下来,我们将把注意力转向其他方法,通过这些方法,我们可以用树莓 Pi 连接和控制电子设备。

探索树莓皮电子接口选项

我们刚刚讨论了 GPIO 的软件方面,所以现在我们将把注意力转向电子方面。Raspberry Pi 提供了许多标准方法来连接简单和复杂的电子设备。通常,您对电子元件和模块的选择将决定您需要使用哪种接口技术,而有时您可能会得到选择。

无论您是否有选择,您对不同选项的了解将帮助您了解电路及其附带代码背后的方式和原因,并帮助您诊断和解决可能遇到的任何问题。

在下一节中,我们将探讨这些概念,然后是一个实践练习。我们将从数字 IO 开始。

理解数字 IO

每个 Raspberry Pi GPIO 引脚都可以执行数字输入和输出。数字仅仅意味着某些东西要么完全打开,要么完全关闭,没有中间地带。在前几章中,我们一直在使用简单的数字 IO:

  • 我们的 LED 灯不是亮就是灭。
  • 我们的按钮不是按(开)就是不按(关)。

您将遇到几个用于描述数字状态的可互换术语,包括:

  • 开=高=真=1
  • 关=低=假=0

数字 IO 是基本 IO 的一种形式。模拟 IO 是另一种,因此我们将在下一步对其进行探讨。

理解模拟 IO

数字处理的是完全开和关的状态,而模拟处理的是开、关或介于两者之间的度数。想想你家的窗户。在数字世界中,它可以是完全开放的(数字高)或完全封闭的(数字低);然而,在现实中,它是类似的,我们可以在完全关闭和完全打开之间打开它,例如,四分之一打开。

模拟电子元件的简单和常见示例包括:

  • 电位计(也称为电位器):这是一个产生一系列电阻值的刻度盘或滑块。现实世界中的示例包括音量控制和收割台恒温器控制。
  • 光相关电阻器(LDR):这些是用来测量亮度的电子元件,你可以在自动夜灯中找到它们。
  • 热敏电阻:这些是用于测量温度的电子元件,可以在加热器、冰箱或任何测量温度的地方找到。

Raspberry Pi 不具备模拟 IO 功能,因此我们需要使用称为模数转换器ADC)的外部电子设备来读取模拟输入,这将是本章后面标题为一节中一个实际示例的核心重点与模数转换器接口。

为了输出模拟信号,我们有两种选择,一种是使用数模转换器DAC),另一种是使用称为 PWM 的数字技术从数字输出产生模拟型信号。在本书中,我们将不介绍 DAC;然而,我们将深入探讨 PWM,我们将在下一步做。

理解脉宽调制

脉冲宽度调制PWM是一种通过快速脉冲引脚接通和断开,在引脚上产生介于完全接通(高)和完全断开(低)之间的平均电压的技术。通过这种方式,它有点像从数字管脚提供伪模拟输出,用于各种控制应用,如改变 LED 的亮度、电机速度控制和伺服角度控制。

PWM 由两个主要特征定义:

  • 占空比:引脚高的时间百分比
  • 频率:占空比重复的时间段

图 5.2所示(对于设定频率),50%的占空比意味着引脚在一半时间内处于高位,在一半时间内处于低位,而 25%的占空比意味着引脚在一半时间内处于高位。虽然图中未显示,但 0%的占空比意味着引脚在 0%的时间内处于高位(始终处于低位),因此它实际上处于关闭状态,而 100%的占空比始终处于高位:

Figure 5.2 – PWM duty cycles The preceding diagram is taken from https://en.wikipedia.org/wiki/File:Duty_Cycle_Examples.png, author, Thewrightstuff. It falls under CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/deed.en.

在 Raspberry Pi 上使用 PWM 是很容易的,尽管有创建 PWM 信号的替代方法,我们将在下面介绍。

产生 PWM 信号

不同的 GPIO 库以不同的方式生成 PWM 信号。以下是三种常见技术:

  • 软件 PWM:PWM 信号的频率和占空比定时以代码形式产生,可在任何 GPIO 引脚上使用。这是创建 PWM 信号的最不精确的方法,因为繁忙的 Raspberry Pi CPU 会对定时产生不利影响。
  • 硬件定时 PWM:使用 DMA 和 PWM/PCM 硬件外围设备执行 PWM 定时。它非常精确,可用于任何 GPIO 引脚。
  • 硬件 PWM:硬件 PWM 完全通过硬件提供,是产生 PWM 信号最准确的方法。Raspberry Pi 有两个专用硬件 PWM 通道,通过 GPIO 引脚 18 和 12 标记为 PWM0,通过 GPIO 引脚 13 和 19 标记为 PWM1(参考图 5.1

It's not enough to just connect something to GPIOs 12, 13, 18, or 19 in order to get hardware PWM. These GPIOs are the BCM GPIOs that have PWM listed as their alternative functions. If you want to use hardware PWM, then two basic requirements must be met. Firstly, t he GPIO library you are using must provide support for hardware PWM. Secondly, y ou must use the library and its hardware PWM functionality correctly, which would be detained in the library API documentation. Pins that share a common hardware PWM channel both get the same duty cycle and frequency applied to them, so while there are four hardware PWM pins, there are only two unique PWM signals.

使用哪种 PWM 技术将始终取决于您尝试构建的内容以及 PWM 信号的精度。有时,您可以直接控制在项目中使用哪个 GPIO 库(以及 PWM 技术),而其他时候,尤其是在使用第三方高级 Python 库时,您将被迫使用库开发人员使用的任何 PWM 技术。

一般来说,当我控制 GPIO 库选择时,我尽可能避免使用软件 PWM。如果我使用 PiGPIO 进行开发,那么我更喜欢硬件定时 PWM,因为我可以在任何 GPIO 引脚上使用它。

关于我们前面介绍的 GPIO 库,它们对 PWM 的支持如下:

  • GPIOZero:继承其引脚工厂实现的 PWM 方法
  • RPi.GPIO:仅限软件 PWM
  • PiGPIO:硬件定时 PWM 和硬件 PWM
  • Blinka:仅限硬件 PWM

You can attach external hardware PWM modules to your Raspberry Pi (usually by I2C) that will give you more hardware PWM outputs.

现在我们已经了解了创建 PWM 信号的三种方法,接下来我们将介绍 SPI、I2C 和单线接口。

了解 SPI、I2C 和单线接口

串行外围接口电路SPI)、集成电路I2C)和单线是标准化的通信接口和协议,允许非平凡的电子设备相互通信。这些协议可以通过一些操作和数学直接在较低级别上使用,也可以通过使用较高级别的第三方 Python 驱动程序模块与电子外设一起工作间接使用,后者更常见于一般用例。

通过这些协议工作的设备示例包括:

  • 模数转换器(SPI 或 I2C)
  • LED 照明条和 LCD 显示器(SPI 或 I2C)
  • 环境传感器,如温度传感器(单线)

在本章后面,我们将在将模数转换器连接到 Raspberry Pi 时更详细地探讨 I2C。

最后,我们有串行通信和 UART。

理解串行/UART 协议

通用异步收发信机UART)是一种串行通信协议,在 USB 普及之前已经存在了很长一段时间并普遍使用。UART 实际上是指用于实现串行协议的电子硬件,尽管它可以用纯软件实现。

如今,SPI 或 I2C 倾向于优先使用 UART。GPS 接收机是串行通信仍然盛行的常见示例。如果您曾经将 Arduino 连接到 PC 进行闪存或调试,则设备使用的是串行通信协议,Arduino 中存在 UART 硬件。

我们现在已经学习了许多标准方法,可以用来将电子设备与 Raspberry Pi 接口,包括模拟和数字电子设备、PWM、导线协议(如 I2C 和 SPI)以及串行通信。我们将开始在实践中看到许多接口选项,并在阅读本书的过程中感受到什么类型的电子设备使用什么类型的接口。

接下来,我们将通过在 Raspberry Pi 中添加一个模数转换器来了解到目前为止在本章中介绍的一些概念。

与模数转换器的接口

恭喜你走到了这一步。读了这么多之后,我怀疑你很想了解一些代码!

我们现在将改变速度,应用刚才介绍的一些知识,将 ADS1115 模数转换器添加到您的 Raspberry Pi 中。典型 ADS1115 分接模块的示例如图 5.3 所示:

Figure 5.3 – ADS1115 breakout module

ADC 是一个非常方便的附加组件,因为仅此一项就为您打开了模拟组件和小工具的世界,而这些组件和小工具在其他情况下无法与 Raspberry Pi 一起使用。

作为本实践练习的一部分,我们将把两个电位计(也称为 pots)连接到 ADS1115,并用 Python 读取它们的值。我们将使用这些值通过改变占空比和频率来创建 PWM 信号。我们将通过观察这些参数对 LED 的影响以及 PiScope 程序(PiGPIO 实用程序系列的一部分)中波形的变化来了解这些参数变化的效果。

We'll revisit potentiometers in more detail in Chapter 6, Electronics 101 for the Software Engineer.

要执行以下练习,请记住,我们需要本章开头的技术要求部分中列出的电子部件,包括 ADS1115 分接模块。ADS1115 是一种通用且功能强大的模数转换器,它使用 I2C 连接到其主机(在我们的例子中是一个树莓 Pi)。

以下是从数据表中提取的 ADS1115 的核心规范,我们在练习中需要这些规范:

  • 工作电压:2 至 5 伏(因此我们知道它将与树莓 Pi 的 3.3 伏逻辑一起工作)
  • 接口:I2C
  • 默认 I2C 地址:0x48

ADS1115 上的端子如下所示:

  • Vcc&GND:设备电源。
  • SCL:时钟信号,用于主从机通信同步。
  • SDA:数据信号,用于树莓 Pi 与 ADS1115 之间的数据发送。
  • 地址:此终端可根据需要更改默认地址。
  • ALTR:高级使用的警报信号(我们不需要这个)。
  • A0-A3:模拟输入通道(我们将 Pots 连接到 A0 和 A1)。

Make sure you have the I2C interface enabled on your Raspberry Pi before proceeding. We covered the steps to enable interfaces, including I2C, in Chapter 1, Setting Up Your Development Environment.

首先,让我们从在试验板上构建所需的电路开始。

ADS1115 模数转换器电路的构建

让我们为本章的练习构建实验板电路。我们将通过一系列步骤构建电路,首先放置核心组件,如下图所示:

Figure 5.4 – Breadboard ADC circuit (part 1 of 3) The overall arrangement and placement of discrete components and wires on a breadboard are not overly important. However, the connections created between the components and wires are vitally important! If you need a refresher on breadboards, how they work, and, most importantly, how the holes are electrically connected, please refer back to Chapter 2, Getting Started with Python and IoT .

下面是如何在试验板上布置组件。以下步骤编号与图 5.4中编号的黑色圆圈相匹配:

  1. 将 ADS1115 放在试验板上。
  2. 将电位计 VR1 放置在试验板上。图示电位计为全尺寸电位计。如果您有不同的尺寸,他们的腿配置可能跨越更少的试验板孔。
  3. 将电位计 VR2 放置在试验板上。
  4. 将电阻器放在试验板上。
  5. 将 LED 置于试验板上,注意确保其阴极支腿与电阻器共用同一行(如 D29 和 E29 孔所示)。

接下来,我们连接 ADS1115,如图所示:

Figure 5.5 – Breadboard ADC circuit (part 2 of 3)

以下是要遵循的步骤。这一次,以下步骤编号与图 5.5中编号的黑色圆圈相匹配:

  1. 将 Raspberry Pi+3.3 伏针脚连接至试验板正极电源导轨。
  2. 将 ADS1115 上的 VDD 端子连接至试验板正极电源导轨。
  3. 将 ADS1115 上的 GND 端子连接至试验板负极电源轨。
  4. 将 Raspberry Pi GND 引脚连接至试验板负极电源导轨。
  5. 将 Raspberry Pi 上的 SCL 引脚连接到 ADS1115 上的 SCL 端子。
  6. 将 Raspberry Pi 上的 SDA 引脚连接到 ADS1115 上的 SDA 终端。

最后,我们将 LED、电阻器和电位计连接起来,如下图所示:

Figure 5.6 – Breadboard ADC circuit (part 3 of 3)

以下是要遵循的步骤。这一次,以下步骤编号与图 5.6中编号的黑色圆圈相匹配:

  1. 将 ADS1115 上的 A0 端子连接至电位计 VR1 的中心支腿。
  2. 将 ADS1115 上的 A1 端子连接至电位计 VR2 的中心支脚。
  3. 将电位计 VR1 的上支腿连接到试验板负极电源导轨上。
  4. 将电位计 VR1 的下支腿连接到试验板正极电源导轨上。
  5. 将电位计 VR2 的上支腿连接到试验板负极电源导轨上。
  6. 将电位计 VR2 的下支腿连接到试验板正极电源导轨上。
  7. 将电阻器的上支腿连接到试验板负极电源导轨上。
  8. 将 LED 的阳极支脚连接到 Raspberry Pi 上的 BCM GPIO 12/PWM 0。

做得好!您现在已完成此回路。图 5.7中显示了描述试验板电路的语义图,供您参考。

As a reminder, we covered an example on how to read a semantic diagram back in Chapter 2, Getting Started with Python and IoT.

我鼓励您在参考试验板布局的同时跟踪此语义图,以了解图上的线条和标签如何与图中所示的试验板上的组件和导线相关联。花时间了解成对示意图和试验板电路之间的关系将有助于并提高您直接从示意图创建试验板布局的能力:

Figure 5.7 – ADC circuit semantic diagram

电路完成后,让我们检查一下我们的树莓 Pi 是否可以看到 ADS1115。

确保 ADS1115 已连接到覆盆子 Pi

I2C 设备通过唯一地址标识到其主设备(即我们的 Raspberry Pi),ADS1115 的默认地址为 0x48。由于 I2C 设备被寻址,多个设备可以在 Raspberry Pi 上共享相同的 I2C 通道(引脚)。

You can change the I2C devices on most IC2 devices if you have multiple devices sharing the same address. This is the purpose of the ADDR terminal on the ADS1115, and you can find instructions for its use in the ADS1115 datasheet.

Raspbian 操作系统包含i2cdetect实用程序,用于查询 Raspberry Pi 的 I2C 接口以查找连接的设备。在终端中运行以下操作:

$ i2cdetect -y 1

-y选项假设我们对任何提示回答是。1是 I2C 总线号。它总是1在树莓皮 3 或 4 上。我们希望看到如下输出:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 70: -- -- -- -- -- -- -- --

我们看到的48(十六进制地址)表明我们的树莓 Pi 已经检测到 ADS1115。如果您没有得到这个结果,请检查您的接线,并确保 I2C 已按照第 1 章设置您的开发环境中的说明启用。

现在我们已经验证了我们的 ADS1115 对 Raspberry Pi 是可见的,让我们继续读取两个电位计作为模拟输入。

用 ADS1115 读取模拟量输入

现在,我们已经将 ADS1115 连接到 Raspberry Pi,是时候学习如何使用它来读取模拟值,特别是两个电位计产生的模拟值了。我们将很快使用这些模拟值来产生 PWM 信号,进而控制 LED 的亮度。

我们将要介绍的代码可以在文件chapter05/analog_input_ads1115.py中找到。请在继续之前查看此文件。

  1. 首先在终端中运行程序:
(venv) $ python analog_input_ads1115.py
  1. 您应收到类似于以下内容的输出流(您的值和伏特数将不同):
 Frequency Pot (A0) value=3 volts=0.000 Duty Cycle Pot (A1) value= 9286 volts=1.193
 Frequency Pot (A0) value=3 volts=0.000 Duty Cycle Pot (A1) value= 9286 volts=1.193
 ...truncated...
  1. 转动两个电位计并观察输出变化,您会注意到数值和电压变化报告的数字。该值和电压将在以下范围内:

输出结果如下:

 Frequency Pot (A0) value=3 volts=0.000 Duty Cycle Pot (A1) value= 9286 volts=1.193
 Frequency Pot (A0) value=4 volts=0.001 Duty Cycle Pot (A1) value=26299 volts=3.288
 ...truncated...

正如我们将在第 6 章电子 101 中为软件工程师所讨论的,模拟输入是关于读取电压的,在这里的例子中,是 0 伏/GND(我们的参考电压)和+3.3 伏之间的电压。整数值是 ADS1115 的原始输出,其最大值取决于 ADS1115 IC 的配置(我们使用默认值)。电压值是基于 ADS1115 配置,使用数学方法从该原始值导出的。如果您感兴趣,ADS1115 数据表和库源代码中提供了所有有用的详细信息。

Beneath the surface of a high-level ADC library, many low-level settings influence how the ADC chip works (just check its datasheet). Different library authors may implement these settings differently or use different default settings. What this means in practice is that two libraries for the same ADC might output different raw values (and some libraries might not even provide this value to the programmer). So, never make assumptions about what the expected raw output value will be, and instead rely on the voltage measurement, which is always the source of truth.

当您调整两个电位计时,如果这些范围的精确端点没有精确匹配到 0 和 3.3 伏,或者如果值随机抖动一点,请不要担心。当我们处理模拟电子学时,这种模糊结果是预期的。

接下来,我们将检查代码。

理解代码

现在我们已经了解了 ADS1115 ADC 的基本操作,现在是时候看一下附带的代码,以了解如何用 Python 查询 ADS1115 以获得模拟读数。我们在下面学到的内容将为我们将在本书第 3 部分中看到的模拟接口程序奠定基础。

我们将开始我们的代码演练与进口。

进口

有两种方法可以将 ADS1115 与带 Python 的 Raspberry Pi 结合使用:

  • 阅读 ADS1115 数据表,并使用较低级别的 I2C(如 SMBus)实现设备使用的数据协议。
  • 通过 PyPi 找到一个现成的 Python 库,我们可以使用pip安装该库。

有几个现成的 Python 模块可用于 ADS1115。我们正在使用本章开头通过requirement.txt安装的 Adafruit Binka ADS11x5 ADC 库:

import board                                      # (1)
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

从第(1)行开始,我们可以看到从 Circuit Python(Blinka)导入的boardbusio,而以adafruit开头的最后两个导入来自 Adafruit ADS11x5 ADC 库,用于配置 ADS1115 模块并读取其模拟输入,我们将在下一步进行介绍。

ADS1115 设置和配置

在下面代码块的第(2)行,我们使用busio导入来创建一个带有电路 Python/Blika 的 I2C 接口。board.SLCboard.SDA参数表明我们正在 Raspberry Pi 上使用专用 I2C 通道(GPIO 2 和 3 的替代功能):

# Create the I2C bus & ADS object.
i2c = busio.I2C(board.SCL, board.SDA)      # (2)
ads = ADS.ADS1115(i2c)

接下来,我们使用预配置的 I2C 接口创建一个ADS.ADS1115实例,并将其分配给ads变量。从代码的这一点开始,当我们与 ADS1115 模块交互时,我们将使用这个实例。

接下来,让我们考虑全局变量。

全局变量

在下面代码片段的第(3)行,我们从几个准常量开始,这些准常量定义了我们期望通过模拟输入接收的最大和最小电压。当您之前运行代码时,您的终端电压可能不完全是 0 和 3.3 伏。这种情况是意料之中的,它会让程序感觉到锅没有达到旋转的终点。分配给A_IN_EDGE_ADJ的值用于在代码中对此进行补偿。我们将在下一节中重新讨论此变量:

A_IN_EDGE_ADJ = 0.002                     # (3)
MIN_A_IN_VOLTS = 0 + A_IN_EDGE_ADJ
MAX_A_IN_VOLTS = 3.3 - A_IN_EDGE_ADJ

接下来,从第(4)行开始,我们创建两个与连接到 Pots 的 ADS1115 的A0A1输入相关的AnalogIn实例。通过这些变量,我们可以确定用户旋转频率和占空比电位计的程度:

frequency_ch = AnalogIn(ads, ADS.P0)  #ADS.P0 --> A0    # (4)
duty_cycle_ch = AnalogIn(ads, ADS.P1) #ADS.P1 --> A1

接下来,我们来到程序的入口点,在那里我们将读取模拟输入。

程序入口点

我们的程序不断循环,读取每个 pot 的模拟输入值,并将格式化输出打印到终端。

在第(5)行,我们看到如何使用frequency_ch.value从频率电位器获取整数值,使用frequency_ch.voltage获取电压值:

if __name__ == '__main__':
   try:
       while True: 
           output = ("Frequency Pot (A0) value={:>5} volts={:>5.3f} "
                     "Duty Cycle Pot (A1) value={:>5} volts={:>5.3f}")
           output = output.format(frequency_ch.value,          # (5)
                                  frequency_ch.voltage,
                                  duty_cycle_ch.value,
                                  duty_cycle_ch.voltage)
           print(output)
           sleep(0.05)
   except KeyboardInterrupt:
       i2c.deinit()                                            # (6)

最后,请注意,程序被包装在一个 try/except 块中,该块将捕获Ctrl+C,以便我们可以使用i2c.deinit()执行清理。

现在我们已经了解了如何使用 ADS1115 读取模拟输入,接下来,我们将集成 LED。

用 PWM 控制 LED

现在,我们将把 LED 添加到代码中,只是我们将以不同于前几章的方式来做。本练习中 LED 的目的是直观地看到改变 PWM 占空比和频率特性的效果。我们将使用两个 POT 的模拟输入来定义 PWM 占空比和频率。

本节中讨论的代码扩展了chapter05/analog_input_ads1115.py中刚刚介绍的模拟代码示例,使用 PiGPIO 创建硬件 PWM 信号。

本书还提供了两个附加源代码文件,它们使用 PiGPIO 实现硬件定时 PWM,使用 RPi.GPIO 实现软件 PWM:

  • chapter05/pwm_hardware_timed.py
  • chapter05/pwm_software.py

它们的总体代码是相似的,不同之处在于用于调用 PWM 的方法和输入参数。我们将在下一节可视化软件和硬件定时 PWM中再次访问这些文件。

我们将要介绍的代码可以在chapter05/pwm_hardware.py文件中找到。继续之前,请查看此文件:

  1. 在终端中运行程序并观察输出:
(venv) $ python pwm_hardware.py
Frequency 0Hz Duty Cycle 0%
... truncated ...
Frequency 58Hz Duty Cycle 0%
Frequency 59Hz Duty Cycle 0%
... truncated ...
  1. 调整 Pots,直到频率读数为 60 Hz,占空比读数为 0%。LED 不应点亮。LED 未点亮,因为占空比为 0%,因此 GPIO 12(PWM0)始终较低。非常缓慢地转动占空比电位计以增加占空比,并观察 LED 亮度缓慢增加。在 100%占空比下,GPIO 12(PWM0)始终在 100%的时间内保持高亮度,LED 处于全亮度。

If you are finding that the duty cycle printed on the Terminal does not reach 0% or 100% at either end of the Pot's movement range, try increasing the value of A_IN_EDGE_ADJ in your code (try +0.02 for starters). Also, tweak this adjustment if you experience a similar issue with the frequency range and dial.

  1. 旋转占空比刻度盘,直到其读数小于 100%(例如,98%),然后调整频率刻度盘。LED 以该频率闪烁和熄灭。当频率降至零时,LED 闪烁变慢。对于大多数人来说,在 50-60 赫兹的频率下,LED 会闪烁得很快,看起来好像刚刚亮起。请记住,如果占空比为 0%或 100%,则频率刻度盘不工作!这是因为在占空比的任一端,PWM 信号完全关闭或打开,它没有脉冲,因此频率没有意义。

让我们来检查使其工作的代码。

理解代码

本例使用 PiGPIO 提供的硬件 PWM 功能。与 ADS1115 相关的代码与我们前面的示例相同,因此我们在此不再讨论它。我们将从查看其他全局变量开始。

全局变量

在以下代码块的第(1)行和第(2)行,我们定义了两个变量,用于最小和最大占空比和频率值。这些值来自 PiGPIOhardware_PWM()方法的 API 文档,我们将很快在使用中看到:

MIN_DUTY_CYCLE = 0            # (1)
MAX_DUTY_CYCLE = 1000000
MIN_FREQ = 0                  # (2)
MAX_FREQ = 60 *# max 125000000*

我们已经将MAX_FREQ上限设置为 60 Hz,以便我们的人眼可以观察 LED 的效果。

接下来,我们有一个自定义函数来映射值范围。

范围映射函数

在第(3)行,我们有一个名为map_value()的函数:

def map_value(in_v, in_min, in_max, out_min, out_max):           # (3)
    *"""Helper method to map an input value (v_in)
       between alternative max/min ranges."""* v = (in_v - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
    if v < out_min: v = out_min elifv > out_max: v = out_max
    return v

此方法的目的是将一个输入值范围映射到另一个值范围。例如,我们使用此功能将模拟输入电压范围 0-3.3 伏映射到频率范围 0-60。在处理模拟输入时,您将经常使用这样的值映射函数,将原始模拟输入值映射为代码中更有意义的值。

接下来,我们准备创建 PWM 信号。

产生 PWM 信号

下一个代码片段位于主while循环中。

在第(4)行和第(5)行,在使用map_value()功能将 0-3.3 伏的电压范围转换为我们所需的频率和占空比范围(我们将其定义为全局变量)之前,我们正在读取频率和占空比电位器中的电压值。请注意,出于显示目的,我们还将占空比格式化为百分比值:

frequency = int(map_value(frequency_ch.voltage,                # (4)
                          MIN_A_IN_VOLTS, MAX_A_IN_VOLTS,
                          MIN_FREQ, MAX_FREQ))
 duty_cycle = int(map_value(duty_cycle_ch.voltage,              # (5)
                           MIN_A_IN_VOLTS, MAX_A_IN_VOLTS,
                           MIN_DUTY_CYCLE, MAX_DUTY_CYCLE))

duty_cycle_percent = int((duty_cycle/MAX_DUTY_CYCLE) * 100)
 pi.hardware_PWM(LED_GPIO_PIN, frequency, duty_cycle)           # (6)

在第(6)行,我们使用pi.hardware_PWM()使用 Raspberry Pi 的 PWM 硬件在 LED 引脚上生成 PWM 信号。

现在我们已经看到了改变 LED 频率和占空比的效果,我们将执行一个练习,用逻辑分析仪显示 PWM 信号。

用 PiScope 直观探索 PWM

让我们做一个练习,看看逻辑分析仪中的 PWM 波形,这是一种用于可视化电子信号的设备。虽然 PWM 背后的一般原理在技术上很简单,但为了帮助在启动时进行学习,可以将 PWM 信号的外观可视化,并观察其占空比和频率变化时的视觉变化。

PiGPIO 包含一个可用于此目的的软件逻辑分析仪。现在,我需要指出的是,它是一个基本的软件逻辑分析仪,无法与专业级设备相比,但是,对于我们的例子和教育来说,它会起到很好的作用,并且不会花费任何费用。

让我们下载、安装并运行 PiScope。以下是要遵循的步骤:

  1. 首先,我们必须安装 PiScope。运行以下命令下载、编译和安装 PiScope:
# Download and install piscope
$ cd ~
$ wget abyz.me.uk/rpi/pigpio/piscope.tar
$ tar xvf piscope.tar
$ cd PISCOPE
$ make hf
$ make install
  1. 使用以下命令运行 PiScope:
$ piscope

我建议在启动 PiScope 并执行此练习之前关闭所有资源密集型应用程序。下面的屏幕截图没有显示默认情况下与您类似的所有 GPIO,因为我已通过菜单 Misc | GPIOs**关闭了一些 GPIO。**如果您也关闭了显示器上的 GPIO,请记住在本练习中打开 SDA(GPIO 2)和/或 SCL(GPIO 3),因为这会为 PiScope 创建一个连续的输入信号,从而保持显示器及时移动。如果没有这种连续输入,PiScope 将在没有信号输入时暂停显示,因此我们的示例将在占空比或频率为 0 时继续暂停显示,这将使演示感觉笨拙。

  1. 确保 chapter05/pwm_hardware.py 程序正在终端中运行。

  2. 缓慢转动占空比和频率旋钮,观察第 12 行上 PWM 信号的变化。保持我们的频率范围非常低(例如,0 到 60 Hz)意味着我们可以在 PiScope 逻辑分析仪中轻松观察 PWM 信号:

Figure 5.8 – 25% duty cycle at 10 Hz

前面的屏幕截图显示了 10 Hz 时 25%的占空比。如果查看屏幕截图中的最后一行,您会注意到 GPIO 12 在单个周期的 25%中为高,在 75%中为低。

以下屏幕截图显示了 10 Hz 时 75%的占空比。如果您查看屏幕截图中的最后一行,您会注意到 GPIO 12 在单个周期的 75%时为高,在 25%时为低:

Figure 5.9 – 75% duty cycle at 10 Hz

现在,我们已经使用 PiScope 直观地看到了 PWM 信号波形,PiScope 是 PiGPIO 开发人员提供的免费基本软件逻辑分析仪。我们将 PWM 信号可视化为练习的主要目的是提供视觉帮助,帮助您了解 PWM 及其占空比和频率特性。

在实践中,当您开始与基本电子设备集成时,您可能不需要逻辑分析仪,甚至不需要可视化信号。然而,随着您的知识不断提高,以及您需要在电子水平上调试电子集成问题,我希望这篇关于逻辑分析器使用的基本介绍证明是有用的,并为您提供了进一步查询的正确方向。

接下来,我们将向您介绍演示替代 PWM 技术的 Python 源文件。

可视化软硬件定时 PWM

前面章节中的代码示例,使用 PWM 控制 LED使用 PiScope直观探索 PWM,都使用 Raspberry Pi 的 PWM 硬件创建了 PWM 信号。随本章代码一起提供并在下表中列出的是演示使用硬件定时和软件生成 PWM 信号的替代实现。您可能还记得,我们在题为创建 PWM 信号的章节中讨论了这些备选方案:

|

文件

|

细节

| | --- | --- | | pwm_hardware.py | 这是使用 PiGPIO 的硬件 PWM(这是我们在本章中看到的代码)。必须使用 PWM 硬件 GPIO 引脚 12、13、18 或 19。 | | pwm_hardware_timed.py | 这是一个使用 PiGPIO 的硬件定时 PWM。这将适用于任何 GPIO 引脚。 | | pwm_software.py | 这是使用 RPi.GPIO 的软件 PWM(PiGPIO 不提供软件 PWM)。这将适用于任何 GPIO 引脚。 |

从功能上讲,这些例子是相同的,因为它们会改变 LED 的亮度,我预测您会发现硬件和软件 PWM 的性能类似。当您转动频率电位器的刻度盘时,LED 和 PiScope 的变化将感觉平稳,而硬件定时 PWM 将感觉有点笨重。这是因为硬件定时频率(在 PiGPIO 中)必须是 18 个预定值中的 1 个,因此调整 pot 时的频率进程不是增量和线性的,而是跳到/跳到下一个预定义频率。您将在pwm_hardware-timed.py中的数组中看到这些预定义频率。

如前所述,软件 PWM 是产生 PWM 信号最不可靠的方法,因为如果您的 Raspberry Pi 的 CPU 繁忙,它很容易失真。

您可以尝试通过以下步骤创建和可视化 PWM 失真:

  1. 运行pwm_software.py并将占空比设置为高(例如 98%),频率设置为 60 Hz。不要使用 100%的占空比,因为这是一个完全开启的状态,你会看到一条水平线,而不是重复的方波。

  2. 在 Raspberry Pi 上启动一个资源密集型程序,这会给 CPU 带来负载。例如,尝试关闭并重新启动 Chrome web 浏览器。

  3. 如果仔细观察 LED,它可能会因 PWM 信号失真而偶尔闪烁。或者,您可以在 PiScope 中观察波形扭曲,如以下屏幕截图中的箭头所示。当信号失真时,您会注意到条的宽度不均匀:

Figure 5.10 – Distortions in the PWM signal, 50% duty cycle at 50 Hz

做得好。您刚刚完成了一个详细的实践练习,使用 ADS1115 扩展 Raspberry Pi,以便还可以将其与模拟电子设备连接。在此过程中,您还学习了如何使用 Python 生成 PWM 信号,了解了在 LED 上改变此信号的效果,并使用 PiScope 直观地观察信号。

总结

干得好,走到这一步,因为肯定有很多事情让我们的头脑!作为总结,我们探讨了引用 GPIO 引脚的常见编号方案,并回顾了流行的 Python GPIO 库。我们还研究了用于将电子设备连接到 Raspberry Pi 的各种接口方法,并进行了一个实践练习,将 ADC 添加到 Raspberry Pi 中,并使用它通过 LED 和 PiScope 逻辑分析仪直观地探索 PWM 概念。

您对我们在本章中探索和实验的基本概念的理解将有助于您理解 Raspberry Pi 如何与电子元件和设备接口,并为您提供了我们如何与模拟元件(例如,电位器)和复杂设备交互的第一手经验(也就是说,我们的 ADS1115)。在阅读本书剩余部分的过程中,我们将使用这些基础知识并在其基础上继续发展。

本章主要关注软件库和代码。然而,在下一章软件工程师电子 101 中我们将把注意力转向电子概念和用于将电子设备连接到树莓 Pi 的公共电路。

问题

最后,以下是一系列问题,供您测试有关本章内容的知识。您可以在本书的评估部分找到答案:

  1. 什么串行通信接口允许设备以菊花链连接?
  2. 您有一个 I2C 设备,但不知道其地址。你怎么能找到它?
  3. 您第一次开始使用新的 GPIO Python 库,但似乎无法使任何 GPIO 引脚正常工作。你需要检查什么?
  4. 您正在 Windows 上使用带远程 GPIO 的 PiGPIO 来驱动远程 Raspberry Pi。现在,您尝试安装第三方设备驱动程序库,但在 Windows 下安装失败。但是,您发现它已成功安装在 Raspberry Pi 上。可能的问题是什么?
  5. 正确或错误:Raspberry Pi 具有 3.3 伏和 5 伏的引脚,因此在使用 GPIO 引脚时,您可以使用任意一种电压?
  6. 您已经创建了一个使用伺服的机器人。在简单的测试中,一切似乎都很好。然而,现在您已经完成了,您会注意到伺服随机抽动。为什么?
  7. 当机器人的伺服装置移动时,您会注意到监视器上的闪电图标或显示器变为空白。为什么会发生这种情况?

进一步阅读

GPIOZero 网站提供了一系列示例,展示了使用 GPIOZero 和 RPi.GPIO 的功能等效示例。这是一个很好的入门资源,有助于理解较低级别的 GPIO 编程概念和技术:

以下链接包含关于我们在本章中讨论的接口和概念的其他材料: