Skip to content

Latest commit

 

History

History
547 lines (345 loc) · 42.3 KB

File metadata and controls

547 lines (345 loc) · 42.3 KB

十、打开和关闭事物

在上一章中,我们介绍了将数字和模拟电路与 Raspberry Pi 的 GPIO 引脚连接时使用的核心电子电路和概念。

在本章中,我们将介绍如何打开和关闭需要更多电压和电流的事物,这些电压和电流超过了您的覆盆子 Pi 所能安全使用的电压和电流。说到电子产品,数百种不同的元件可用于控制和切换。有成千上万种不同的配置方式。我们将重点介绍三种常见的互补光电耦合器、晶体管和继电器。

在与树莓 Pi 接口时,了解如何控制和开关电路是一个非常重要的主题。正如我们在第 5 章将 Raspberry Pi 连接到物理世界中所讨论的,Raspberry Pi GPIO 引脚只能安全地提供几毫安的输出电流和固定的 3.3 伏。完成本章后,您对光耦、晶体管和继电器的了解将意味着您可以开始控制具有不同电流和电压要求的设备。

以下是我们将在本章中介绍的内容:

  • 继电器驱动电路的探索
  • 确定负载的电压和电流
  • 使用光耦作为开关
  • 用晶体管作开关
  • 使用继电器作为开关

技术要求

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

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

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

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

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

$ cd chapter07              # 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安装的:

本章练习所需的电子元件如下:

继电器驱动电路的探索

对电子开关的一个常见介绍是机械继电器——一种像普通开关一样工作的装置,只有通过向其通电才能打开和关闭。不幸的是,将继电器直接连接到树莓 Pi 是危险的!继电器通常需要太多的电流和电压,并且(如果它们切换)会损坏您的树莓 Pi。所以,我们需要一个驱动电路,它位于树莓 Pi 和继电器之间。该电路的一个示例如图 7.1所示:

Figure 7.1 – Relay driver circuit

这是我们将在本章中逐步构建的电路。此电路是许多继电器控制模块的代表,您可以在 eBay、Banggood 和类似网站上找到这些模块。当你让这些电路板工作时,它们的使用当然很方便。不幸的是,通常情况下,缺乏清晰的文档会使他们的工作变得烦琐和困难,尤其是如果你是电子新手的话。

我们将构建并探索*图 7.1 所示的三个子电路。*这将帮助您了解光耦、晶体管和继电器是如何作为开关工作的,以及为什么它们经常被链接在一起以控制继电器。这些知识还将帮助您对一个预制的继电器控制模块进行反向工程,以防一个模块无法正常工作。

在我们研究光耦子电路之前,我们需要首先讨论负载电压和电流。

确定负载的电压和电流

负载是您想要控制的东西,或者在本章中,打开和关闭。LED、晶体管、光耦、继电器、灯、电动机、加热器、泵、自动车库门和电视都是负载的例子。如果您再次参考图 7.1,您将注意到图表右侧的单词 Load。这是你连接你想要打开或关闭的东西的地方。

晶体管、光耦、继电器组件出现在上述负载列表中。再次参考图 7.1,继电器显示为晶体管子电路的负载,而晶体管子电路显示为光耦子电路的负载。

了解要控制的负载的两个属性非常重要:

  • 负载需要什么电压
  • 负载需要什么电流

有时,这些属性可以在设备本身或其手册或数据表中找到。在其他情况下,需要对其进行计算或手动测量负载。

了解这些特性非常重要,因为它们会影响为电路选择哪些组件,包括合适电源的规格。在本章中,当我们构建电路时,我们将提到负载电流,所以接下来会有更多的内容。现在,让我们看看如何测量直流电机的电流负载。

测量直流电动机的电流要求

电机是人们想要控制的一个常见项目,它们在电流测量中是一个很好的例子。让我们做一个练习来测量直流电机使用的电流:

Figure 7.2 – R130 DC Motor

上图显示了一个典型尺寸为 130(R130)的直流电机,以及一组焊接到电机端子上的跨接导线,因此可以轻松地将其插入试验板。该电机背部为红色,但其他颜色较为常见,尤其是透明/白色。颜色与电机规格无关。

As you proceed with the following steps, please consult your multimeter manual if you are unsure how to place it into current measurement mode.

以下是要遵循的步骤:

  1. 图 7.3所示连接电路:

Figure 7.3 – Measuring current with a multimeter

我们假设此处的电机是本章开头的技术要求一节中提到的电机。该电机足够小,可以由试验板电源供电,该电源通常可以提供 500mA 至 800mA 的电流。对于更大的电机(以及其他您不知道其额定值并想要测量的项目),您将需要更强大的电源。

If you are powering a breadboard power supply from a USB phone charger, check your power supplies 5-volt output with a multimeter to make sure it is providing about 5 volts. Low wattage chargers and poor quality USB cables might not be able to deliver enough power for the power supply to operate correctly. Ideally, read the datasheet and use the suggested power adapter, which commonly are 7 to 12 volts and 1 amp.

  1. 确保您的万用表设置为测量毫安毫安),并且其红色引线连接到正确的引线输入(通常标记为 A 或 mA)。如果您的数字式万用表有一个µa 输入,不要使用它,否则您可能会烧断数字式万用表的保护保险丝(保险丝可以更换)。
  2. 给电路通电,马达就会旋转。
  3. 万用表将显示电机的电流消耗。记下这个值。这被称为连续自由电流,是您的电机在自由旋转时所使用的电流,其轴上没有任何连接。
  4. 断开电机的电源。
  5. 用钳子夹住电机轴,使其无法旋转。
  6. 重新给电机通电,并快速观察(并记录)数字式万用表的读数。该读数称为失速电流*。*当电机轴被强制停止移动时,电机将使用最大电流。
  7. 断开电机的电源。

我们现在测量了两个电流。我对 R130 电机的读数如下(您的读数会有所不同):

  • 连续或自由电流110mA 至200mA-A 当电机从使用中加热时,将使用较少的电流;电机处于冷态时进行~200mA 测量。一分钟后,它下降到约 110 毫安。
  • 失速电流:这是500mA 到600mA。

这意味着我们的电机正常运行需要 200mA 至 600mA 的毫安,我们希望与电机一起使用的任何电路必须能够实际处理 600mA,以便在电机失速时不会损坏(或者我们需要设计适当的保护,但这超出了我们的范围)。

It is interesting to note that there's also a start-up current , which is a momentary peak current that occurs when the motor starts, but we won't be able to measure that on a generic DMM.

现在我们有了 R130 电机的电流消耗,让我们为继电器和 LED 收集更多的电流数据。

测量继电器和 LED 的电流要求

当我们到达标题为的章节,将继电器用作开关时,我们还将测量 LED 和本章中使用的继电器的电流消耗。您可以使用上一节中的步骤 1 至 4测量电流消耗。对 LED 和电阻器对执行此测量的设置如下所示:

Figure 7.4 – Measuring current through a resistor/LED circuit

这是我们遵循的基本流程:

  1. 我们在图 7.3中所示的位置安装了一个 LED 和一个 1kΩ电阻器(或继电器)。
  2. 将万用表设置为毫安模式。
  3. 给电路通电。
  4. 测量万用表上的安培数。

完成(并记下)接收到的测量后,从试验板上取下 LED 和电阻器,并在继电器中连接导线,然后执行相同的测量。

下图显示了 SRD-05VDC-SL-C 继电器以及需要连接继电器上的哪些端子。请注意,您需要将接线头引脚(如图所示)或导线(一个好的选择是将杜邦电缆切成一半)焊接到继电器的端子上,因为它不能直接安装到试验板中:

Figure 7.5 – SRD-05VDC-SL-C relay

使用 5V 电源时,应获得与万用表上的值类似的值:

  • 5mm 红色 LED 与 1000Ω电阻器串联:3mA(欧姆计算值和四舍五入I=(5V-2.1V)/1000Ω=2.9mA
  • 继电器:70mA 至 90mA(数据表中的数值,并由我自己的测量结果确认)

软件工程师在第 6 章电子 101 中讨论了 LED 电流的计算过程。唯一的区别是这里我们使用的是一个 5 伏电源和一个 1kΩ电阻器,而不是我们在那一章中使用的 3.3 伏和 200Ω电阻器。

*Please note that the optocoupler and MOSFET component we will be using do have a voltage drop aspect to them that does affect current through the attached load. This impact of these voltage drops are immaterial for our purposes, so they are not taken into account for the calculations in this chapter for brevity.

现在,您已经了解了如何使用万用表测量直流电机、LED/电阻器对和继电器的电流消耗。了解您想要控制的设备的电流限制和期望值,甚至您正在连接的子电路,是设计电路和选择适当电源时选择适当额定组件所需的重要信息。

在本章中,我们将参考您在本节中进行的测量,以探索光耦合器、MOSFET 和继电器。具体来说,我们将比较这些组件的当前额定值(在它们各自的数据表中找到)到我们的直流电机、LED /电阻器和继电器测量,并考虑哪些组件可以用来直接控制哪种负载。

我们将从学习光耦以及如何将其用作开关开始。

使用光耦作为开关

光耦(或光隔离器)是一种光控元件,用于对两个电路进行电气隔离。此处显示了光耦的图示和示意符号:

Figure 7.6 – Optocoupler symbol and component with pins labeled

光耦的两侧可以描述如下:

  • 输入端:我们将连接到树莓皮 GPIO 引脚的一端
  • 输出侧:我们将连接到另一个电路的侧

输入侧的光耦内有一个内部 LED(您会注意到图 7.6中光耦符号内的 LED 符号),而在输出侧有一个 p 光电晶体管,它对 LED 的光做出响应。这意味着,从输入侧到外部侧的控制传输(即切换)是通过光进行的,因此,两侧之间没有物理电气连接。对我们来说,这意味着输出端的任何故障或事故都不会对我们的 Raspberry Pi 造成损坏。PC817 的隔离额定值为 5000 伏,远远超过我们预期用于物联网电子和设备的任何电压。

输入侧 LED 熄灭时,输出侧光电晶体管熄灭。但是,当 LED 通过向引脚 1(阳极)和引脚 2(阴极)施加电流而点亮(它位于光耦组件内部,因此您将看不到它)时,p 光电晶体管被激活(打开),并允许电流在引脚 4(集电极)和引脚 3(发射极)之间流动。

让我们创建一个简单的电路来演示具有以下规格的 PC817 光耦:

  • 输入侧(LED):具有以下功能:
    • 典型的**正向电压(VF**为 1.2 伏直流电
    • 最大**正向电流****(IF**为 50mA 直流电
  • 输出侧(光电晶体管):具有以下功能:
    • 最大集电极-发射极电压(VCEO:80 伏直流电
    • 最大集电极电流(IC:50mA DC
    • **集电极-发射极饱和电压 VCE(sat)**在 0.1 到 0.2 伏的范围内(基本上是电压降)

记住这些规范,让我们开始电路构建。

构建光耦电路

我们将要构建下图所示的电路。该电路使用 PC817 光耦对 Raspberry Pi 和 LED 子电路进行电气隔离:

Figure 7.7 – Optocoupler circuit

此处的步骤编号与图 7.7中编号的黑色圆圈相匹配:

  1. 将 LED 放入实验板中,注意 LED 的方向,如图所示,与阴极支脚有关。

  2. 将 1kΩ电阻器放入试验板。该电阻器的一端与 LED 的阴极支腿连接。

  3. 将 PC817 光耦 IC 放入试验板。IC 上的白点表示 IC 的管脚编号 1。您的 IC 可能有或没有白点,但是,IC 上应该有一个明显的标记来告诉您第一个 pin。所有 pin 编号请参考图 7.6

  4. 将一个 1kΩ电阻器放入试验板。该电阻器的一端与 PC817 的引脚 1 相连。

  5. 将 LED 的阳极支脚连接到右侧电源导轨的正极导轨上。

  6. 将 PC817 的引脚 4 连接到您在步骤 2中放置的电阻器的另一端。

  7. 将 PC817 的针脚 3 连接到右侧电源导轨的负极导轨上。

  8. 将 5 伏电源的正极输出连接到右侧正极电源导轨。

  9. 将电源的负极输出连接到右侧负极电源导轨。

  10. 步骤 4中放置的电阻器的另一端连接到覆盆子 Pi 上的 3.3 伏引脚。

  11. 最后,将 PC817 的引脚 2 连接到 Raspberry Pi 上的 GPIO 21。

In Figure 7.7 , you could connect the wires at steps 8 and 9 (which go to the External Power Supply) directly to your Raspberry Pi's +5-volt pin and a GND pin. We're only using a small amount of current for the red LED, however, for higher current loads, you must use an external power supply. The +5 volt pin on your Raspberry Pi is connected directly to the power supply you are using to power your Raspberry Pi. Using this power supply to power your circuits effectively robs current available to your Raspberry Pi. Take too much, and your Raspberry Pi will reset! Please note (this is important) that the caveat of this action is that you lose the electrical isolation offered by the optocoupler because you will have electrically connected the input and output sides of the optocoupler together (remember, the input and output sides are not electrically inside the optocoupler because control is achieved by light).

现在您已经完成了电路构建,我们将测试电路并探索使其工作的代码。

用 Python 控制光耦

首先运行 chapter07/optocoupler_test.py 文件中的代码,观察 LED 闪烁。以下是负责闪烁的代码部分:

# ... truncated ...
  pi.write(GPIO_PIN, pigpio.LOW) # On.     # (1)
  print("On")
  sleep(2)
  pi.write(GPIO_PIN, pigpio.HIGH) # Off.   # (2)
  print("Off")
  sleep(2)
# ... truncated ...

下面是正在发生的事情:

  • 在第(1)行,GPIO 21 低,输入侧的内部 LED 亮起。输出侧的光电晶体管检测到该光并激活,使电流在输出侧的集电极(引脚 4)和发射极(引脚 3)之间流动,因此我们的红色 LED 点亮。
  • PC817 电路的输入侧接线为低电平-,这就是为什么在第(1)行,GPIO 21 被设置为低电平以打开电路,而在第(2)行,GPIO 21 被设置为高电平以关闭电路。备用接线应为高电平。如果您想试验并将电路更改为高电平,您可以将图 7.7步骤 10的电线连接到 GND 引脚(而不是 3.3 伏引脚),并反转代码中的pigpio.LOWpigpio.HIGH语句。

We could have used a lower value resistor for R1 for the input-side LED, however, a 1kΩ resistor provides more than enough current ((3.3V - 1.2V)/1000 Ω = 2.1mA ) to the internal LED for the optocoupler circuit to work. You'll see 1kΩ, 10kΩ, and 100kΩ resistors used in a lot of circuits simply because these are nice round values. We've also used a 1k Ω resistor for R2 for the red LED for convenience.

您还记得上一章第 6 章软件工程师电子 101中的内容吗?当时我们讨论了树莓皮 GPIO 引脚的预期电流不应超过 8mA?好的,通过使用 PC817 光耦,我们现在可以通过在 GPIO 引脚和电路之间放置一个光耦来控制高达 50mA 的电流。此外,我们也不限于 GPIO 引脚的 3.3 伏,因为 PC817 可以处理高达 80 伏的电压。

Remember that a GPIO pin's primary role is to control something, not power it, so always think about control and power requirements independently .

在上一节中,我们计算(或测量)了电机、继电器和 LED 的电流消耗。以下是我们在输出侧使用 5 伏电源的 PC817 光耦的数据:

  • LED 和 1kΩ电阻器需要 3mA 的电流。
  • 继电器需要在 70mA 和 90mA 之间。
  • 电机需要约 500mA 至约 600mA(失速电流)。

LED 的 3mA 小于光耦的最大输出端额定值 50mA,因此可以直接在输出端驱动 LED。但是,继电器和电机需要的电流超出 PC817 的限制,因此在输出端使用它们可能会损坏光耦。

虽然我们可以也确实使用光隔离器作为数字开关,但它们通常被用作隔离屏障来驱动其他组件,从而驱动需要更高电流的负载。稍后,当我们从图 7.1构建完整的继电器驱动电路时,我们将看到这一点,但现在,让我们学习如何使用晶体管作为数字开关。

用晶体管作开关

晶体管是当今最重要的电子元件,也是数字革命的支柱。它们有两种基本的用途——作为放大器或数字开关。我们的重点将放在数字开关上,我们将使用一种称为金属氧化物半导体场效应晶体管MOSFET)的晶体管类型,具体来说,是一种 N 沟道增强型 MOSFET——是的,这是一个非常好的选择!

不要过于沉迷于冗长的技术名称或现有的多种形式的晶体管。这里简单的说明是,一个 N 沟道增强型 MOSFET 作为一个数字开关工作良好,我们可以使用我们的 Raspberry Pi 进行控制,或者正如我们稍后将看到的,从另一个源(如光耦)进行控制。

FETs are *voltage-*controlled transistors. Another type of transistor known as a Bipolar Junction Transistor ( BJT) is a current-controlled transistor. BJTs are perfectly fine to use with a Raspberry Pi but require additional considerations. You'll find a link in the Further reading section to further your learning on transistors .

以下练习将使用 2N7000,一种 N 沟道增强型 MOSFET,如图 7.8 所示。腿名为S源、Gate、D雨。两种不同的包装风格也说明,TO92 和 TO220。请注意,这两种样式上的 S 源、G ate 和 D 雨腿的排列是不同的:

Figure 7.8 – N-Channel Enhancement MOSFET symbol and common package styles

2N7000 在其数据表中具有以下规格:

  • 60 伏直流电的最大漏源极电压(VDSS
  • 200 mA 直流电的最大持续漏极电流(ID
  • 500 mA 直流电的最大脉冲漏极电流(IDM
  • 在 0.8 到 3 伏直流电压范围内的门阈值电压(VGS(th)
  • **排水管−来源于−电压(VDS(开启)**在 0.45 至 2.5 伏直流电压范围内(电压降)

以下是如何解释有关 2N7000 的这些参数:

  • 它可以安全地控制不超过 60 伏的负载(VDSS)和连续 200mA(ID),但 500mA(IDM的脉冲是可以的。
  • 理想情况下,需要大于等于 3 伏的电压才能将其打开(VGS(th)
  • 它将在负载侧电路上消耗 0.45 至 2.5 伏的电压(VDS(on))。

The 2N7000 (and the FQP30N06L that we will discuss shortly) are logic-level comparable MOSFETs . They are suitable for a Raspberry Pi because their maximum gate voltage VGS(th)is less than a GPIO pin's 3.3 volts.

让我们开始构建一个电路,将 2N7000 与覆盆子 Pi 结合使用。

构建 MOSFET 电路

我们将分两部分构建电路,首先是在试验板上放置元件:

Figure 7.9 – MOSFET transistor circuit (part 1 of 2)

以下是构建的第一部分的步骤。步骤编号与图 7.9中编号的黑色圆圈相匹配:

  1. 将 MOSFET 放入实验板中,注意按照源极、栅极和漏极支腿的正确方向定位元件。我们的示例布局假设为 2N7000 MOSFET。如果您需要帮助识别腿部,请参见图 7.8

  2. 将一个 100kΩ电阻器放入试验板。该电阻器的一端连接到 MOSFET 的栅脚。

  3. 将 1kΩ电阻器放入试验板。该电阻器的一端还连接到 MOSFET 的栅脚。

  4. 将 LED 放入试验板中,注意按照阴极支脚所示定位部件。

  5. 将 1kΩ电阻器放入试验板。该电阻器的一端与 LED 的阴极支脚连接。

  6. 将二极管放入试验板中,调整组件方向,使阴极支腿(二极管的端部和外壳上的带)朝向试验板底部。我们将很快讨论此二极管的用途。

现在,我们已经将组件放入了我们的面包板中,让我们将它们全部连接起来:

Figure 7.10 – MOSFET transistor circuit (part 2 of 2)

以下是构建的第二部分的步骤。步骤编号与图 7.10中编号的黑色圆圈相匹配:

  1. 将 Raspberry Pi 的 GND 引脚连接到右侧电源导轨的负极导轨上。

  2. 连接右侧和左侧电源导轨的负极导轨。

  3. 将 100kΩ电阻器连接到负极电源导轨上。

  4. 将 MOSFET 的源极脚连接到负极电源轨。

  5. 将 MOSFET 的引线连接至 1kΩ电阻器。

  6. 将 LED 的阳极支脚连接到二极管的阴极支脚。

  7. 将 LED 的阳极支腿(和二极管的阴极支腿)连接到右侧电源轨上的正极电源轨。

  8. 将 1kΩ电阻器连接至 Raspberry Pi 上的 GPIO 21。

  9. 将电源上的正极输出端子连接到右侧电源导轨的正极导轨上。

  10. 将电源上的负极输出端子连接到右侧电源导轨的负极导轨上。

做得好。这是我们的电路建设完成。在测试之前,让我们先简单地讨论一下这个电路。

注意图 7.10(和图 7.1中的 100kΩ电阻器 R3。这是一个外部下拉电阻器,确保 MOSFET 的栅极支腿在 GPIO 21 高电平时未被拉至+3.3 伏时与 GND(0 伏)相连。MOSFET 具有电容性电荷,因此在没有下拉的情况下,MOSFET 在放电时从 on(GPIO 21 为高电平)转换到 off(GPIO 21 为低电平)时可能会出现粘性和缓慢(请注意,此电路为高电平有源)。下拉电阻器确保快速放电至关闭状态。我们使用外部下拉电阻器,而不是代码内激活的下拉电阻器,以确保 MOSFET 栅极即使在 Raspberry Pi 断电或代码未运行时也被下拉。

您还将注意到 R1 和 R3 创建了一个分压器。1kΩ和 100kΩ的比率适用于确保 MOSFET 的栅极支腿上的电压大于 3 伏,以将其打开。如果您需要更新下拉电阻器和分压器,我们将在第 6 章电子 101 中为软件工程师讨论它们。

When adding resistors into a circuit — like adding in a pull-down — always consider with the wider impact of the change. If, for example, the addition creates a voltage divider due to the presence of an existing resistor, you then need to access the impact of the change on the surrounding circuit. For our scenario, this is to ensure enough voltage is reaching the MOSFET gate leg to turn it on.

运行下一节中的代码后,请尝试删除 R3 并再次运行代码。我不能保证你会在你这边看到任何东西,但你可以观察到,当 GPIO 21 变低时,红色 LED 缓慢熄灭,而不是迅速熄灭,并且它的行为不稳定,而不是平稳地淡入淡出。

As with the optocoupler example, you can connect the wire's external power supply to your Raspberry Pi's +5 pin and a GND pin for this LED example since its current requirements are low.

通过对 MOSFET 电路的基本了解,让我们运行并探索一个与电路交互的简单 Python 程序。

用 Python 控制 MOSFET

运行chapter07/transistor_test.py文件中的代码,红色 LED 将先亮后灭,然后淡入淡出。确认电路工作后,让我们继续查看代码:

# ...truncated ...
pi.set_PWM_range(GPIO_PIN, 100)             # (1)

try:
  pi.write(GPIO_PIN, pigpio.HIGH) # On.     # (2)
  print("On")
  sleep(2)
  pi.write(GPIO_PIN, pigpio.LOW) # Off.
  print("Off")
  sleep(2)

在本例中,我们使用 PWM。在第(1)行中,我们告诉 PiGPIO,对于 GPIO 21(GPIO_PIN = 21,我们希望将其占空比限制在 0 到 100 的值范围内(而不是默认的 0 到 255)。这是一个如何在 PiGPIO 中更改占空比值粒度的示例。我们使用 0 到 100 只是为了使报告更容易,因为它映射到终端输出的 0%到 100%。

接下来,在第(2)行中,我们只需打开和关闭 GPIO 一段时间来测试晶体管电路,我们将看到 LED 在 2 秒延迟后打开然后关闭。

在以下代码的第(3)行中,我们使用 PWM 使 LED 变暗,然后在第(4)行再次变暗,两次都使用前面代码块第(1)行中设置的占空比范围:

  # Fade In.
  for duty_cycle in range(0, 100):                  # (3)
      pi.set_PWM_dutycycle(GPIO_PIN, duty_cycle) 
      print("Duty Cycle {}%".format(duty_cycle))
      sleep(0.01)

  # Fade Out.
  for duty_cycle in range(100, 0, -1):              # (4)
      pi.set_PWM_dutycycle(GPIO_PIN, duty_cycle) 
      print("Dyty Cycle {}%".format(duty_cycle))
      sleep(0.01)
# ...truncated ...

考虑到 2N7000 的额定电流为 200 毫安,让我们检查一下继电器和电机是否可以安全使用此晶体管电路:

  • 继电器可以用来代替 LED,因为它只需要 70mA 到 90mA 之间的电流。
  • 电机需要约 200mA 的电流才能自由旋转*(持续*电流),所以它可能是安全的……或者不是?让我看看。

当我们在本章前面测试电机时,我们预计电机将需要200mA(冷态时的连续电流)到500mA 到~600mA(冷态时的失速电流)记住这些是我的测量值,所以用您的测量值替换这些值。因此,原则上,只要电机不带负载,我们的 2N7000 就可以了。实际上,一旦我们在电机轴上施加负载,它将需要超过 200mA 的连续电流。在这方面,2N7000 可能不是驱动该电机的理想晶体管。我们需要寻找一种 MOSFET,它可以舒适地处理 600mA 或更大的连续电流。我们将很快看到 FQP30N06L MOSFET,它可以处理这种电流以及更多。

当 LED 随着 PWM 相关代码淡入淡出时,如果您将电机连接到电路中以代替 LED/电阻器对,您会注意到它先升后降。您刚刚发现了如何使用 PWM 的占空比特性来控制电机的速度!我们将在第 10 章伺服运动、电机和步进电机中更详细地介绍电机。

To use the motor or relay, you must use an external power supply and not the +5-volt pin on your Raspberry Pi. If you try and use the +5-volt pin, you may find your Raspberry Pi resets as you run the code.

我们不在继电器上使用 PWM,因为它们切换速度太慢,如果它们工作(在非常低的 PWM 频率下),只会使它们磨损——但无论如何,尝试一下,看看会发生什么;一个简短的测试不会有什么坏处(尝试将代码中 8000 的频率调整为 10,即pi.set_PWM_frequency(GPIO_PIN, 10))。

在我们的电路中,还有 1N4001 二极管 D1。这被称为反激二极管或抑制二极管。它的作用是保护电路不受电磁元件(如继电器或电机)断电时可能出现的反向电压尖峰的影响。诚然,我们的 LED 没有磁性,但是,二极管存在不会造成任何伤害。

Anytime you are controlling a component that works on electromagnetism (also known as an inductive load), always correctly install a fly-back suppression diode.

图 7.8中,我们还展示了 FQP30N06L。这是一种功率 N-C 通道增强型 MOSFET,能够驱动高电流负载。其数据表中有以下规范:

  • 60 伏直流电的最大漏源极电压(VDSS
  • 32A DC 的最大连续漏极电流(ID(安培而非毫安!)
  • 128A DC 的最大脉冲****漏极电流(IDM
  • **门阈值电压(VGS(th)**在 1 到 2.5 伏 DC(<5 伏)的范围内,因此其逻辑电平兼容)
  • **排水管−来源于−电压(VSD**最大值为 1.5 伏直流电

您可以在前面的电路中替换 FQP30N06L(或另一个具有 N 沟道增强模式逻辑电平功能的 MOSFET),它将正常工作,但请记住以下几点:

  • FQP30N06L 的 G、D 和 S 支腿与 2N7000 的顺序不同,因此需要调整接线。
  • 当处理更高的电压和电流时,最好使用光耦将 MOSFET 与 Raspberry Pi 电隔离(我们将在接下来讨论继电器时看到此配置)。
  • 在高电流下,功率 MOSFET 会变得非常热-周围的组件和电线,甚至实验板都会熔化,因此使用时要小心。

Higher power MOSFETs can get hot when controlling high power loads and can be fitted with a heatsink, for example, the FQP30N06L has a metal top with a hole where the heatsink is attached. The determining factors and calculations as to when a headsink is required are beyond our scope, however, if your MOSFET is getting too hot (and you are using it within its datasheet parameters), then add a heatsink.

如果您喜欢使用 MOSFET 控制更高电流负载的想法,您可能希望在 eBay 等网站上研究现成的 MOSFET 模块。在学习了光耦和 MOSFET 之后,您现在有了了解这些模块是如何构造的背景知识-一些模块只是使用直接连接到控制设备(即 GPIO 引脚)的 MOSFET,正如我们刚才所做的,而其他模块则将光耦放在控制设备和 MOSFET 之间。

您已经学习了将 MOSFET 晶体管用作数字开关的基础知识。接下来,我们将把这一学习与我们对光耦的学习结合起来,在实验板上构建继电器驱动电路。

使用继电器作为开关

经典继电器是一种机电元件,允许电流较小的设备切换电流较大的设备或负载。原则上,它们就像我们之前使用的 MOSFET 或光耦。那么,为什么有继电器呢?以下是一些原因:

  • 对于高压和电流负载,它们往往比等效 MOSFET 便宜得多。
  • 在高电流下,它们不会像 MOSFET 那样变得非常热。
  • 与光耦类似,继电器也在输入和输出电路之间提供电气隔离。
  • 它们是简单的电气控制开关,因此非电气工程师易于理解和使用。
  • 它们经受了时间的考验,并被证明是控制高负载的简单而可靠的方法(即使它们最终会磨损——SRD-05VDC-SL-C 数据表列出了其额定预期寿命为 100000 次操作)。

There is also a type of relay known as a Solid State Relay (SSR) that has no moving parts, however, they are typically more expensive than a comparable mechanical relay.

我们的第一个任务是创建我们的电路,下一步我们将做。

继电器驱动电路的构建

让我们建立我们的继电器驱动电路。我们将分三个部分进行,首先是组件的放置:

Figure 7.11 – Relay driver circuit (part 1 of 3)

以下是构建的第一部分的步骤。步骤编号与图 7.11中编号的黑色圆圈相匹配:

  1. 将 PC817 放入您的试验板中,注意 IC 的针脚 1 连接到左侧试验板组,如图所示。
  2. 将一个 1kΩ电阻器放入试验板。电阻器的一端连接到 PC817 的引脚 1。
  3. 将 MOSFET 放入实验板中,注意按照源极、栅极和漏极支腿的正确方向定位元件。我们的示例布局假设为 2N7000 MOSFET。如果您需要帮助识别腿部,请参见图 7.8
  4. 将一个 1kΩ电阻器放入试验板。该电阻器的一端连接 MOSFET 的栅脚。
  5. 将一个 100kΩ电阻器放入试验板。该电阻器的一端还连接 MOSFET 的栅极脚。
  6. 将二极管放入实验板中,注意使阴极支脚(带条的元件端部)指向实验板底部,如图所示定位元件。

现在您已经放置了各个组件,接下来,我们将连接这些组件:

Figure 7.12 – Relay driver circuit (part 2 of 3)

以下是构建的第二部分的步骤。步骤编号与图 7.12中编号的黑色圆圈相匹配:

  1. 将之前步骤 2中放置的电阻器连接到覆盆子 Pi 上的 3.3 伏引脚。
  2. 将 PC817 的引脚 2 连接到 Raspberry Pi 上的 GPIO 21。
  3. 将 PC817 的针脚 4 连接到右侧电源导轨的正极导轨上。
  4. 将 MOSFET 的源极支脚连接到右侧电源轨的负极轨中。
  5. 将连接至 MOSFET 漏极支脚的 100kΩ电阻器连接至右侧电源轨的负极轨。
  6. 将 PC817 的针脚 4 连接到二极管的阴极支脚。
  7. 将 MOSFET 的漏极管脚连接到二极管的阳极管脚。

最后,我们将连接电源和继电器:

Figure 7.13 – Relay driver circuit (part 3 of 3)

以下是构建的第三部分和最后一部分的步骤。步骤编号与图 7.13中编号的黑色圆圈相匹配:

  1. 将右侧电源导轨的正极导轨连接至 5 伏电源的正极输出端子。
  2. 将右侧电源导轨的负极导轨连接至 5 伏电源的负极输出端子。
  3. 将二极管的阳极支脚连接到继电器的一个线圈端子上。
  4. 将二极管的阴极支脚连接到继电器的另一个线圈端子上。
  5. 不同5 伏电源的负极输出连接到继电器上的 com 端子。

At step 5, you must use two different external power sources for this circuit because the current requirements of the relay coil and potential relay load will very likely be too much to borrow (rob) from your Raspberry Pi's power supply.

  1. 不同5 伏电源的正极输出端子连接到负载的正极输入端子(例如,电机上的一个端子)。
  2. 最后,将继电器的NO常开端子连接到负载的负极输入端子。

Using the NO terminal on the relay means the load will be off by default and only powered when the relay is engaged, which happens when GPIO 21 is low (remembering this circuit is active-low). If you connect your load to the NC (Normally Closed) terminal in the relay, the load will be powered by default, including when your Raspberry Pi is switched off.

做得好!您完成的试验板电路,如图 7.13所示。这是与图 7.1中本章开头所示的示意图相匹配的试验板构建。该试验板电路显示有一个 5 伏继电器线圈电源e和一个 5 伏负载电源源。但是,该电路可与不同的电源一起使用,但需遵守以下指示:

  • 该电路中使用的电阻器和 2N7000 MOSFET 的选择能够驱动 12 伏继电器,如 SRD-12VDC-SL-C。您只需确保继电器线圈电源为 12 伏,而不是 5 伏。
  • 负载电源如图所示为 5 伏,但是,如果您的负载需要更多电压(在继电器规格范围内),则可以增加电压。

现在我们已经完成了电路,让我们运行一个 Python 程序来控制继电器。

用 Python 控制继电器驱动电路

运行chapter07/optocoupler_test.py文件中的以下代码。继电器应通过咔嗒声激活,并在 2 秒钟后停用。这与我们创建和测试光耦电路时使用的代码相同,因为它是我们的 Raspberry Pi 连接的光耦。

我们在前面了解 MOSFET 时看到,我们可以将 MOSFET 直接连接到 GPIO 引脚并控制继电器,而不需要光隔离器。那么,为什么前面的电路有一个?

答案是,我们的电路在技术上并不需要一个,而且有现成的继电器模块(尽管比较少见)没有光隔离器。然而,有一个在场并没有什么害处,因为它确实提供了一定程度的电气隔离保护,以防继电器控制电路发生故障或在连接电源时发生故障。

最后,您可以在易趣(eBay)等拥有多个中继的网站上找到中继模块?只有一个继电器电路被复制多次,您通常能够计算每个继电器的晶体管和光耦对(尽管光耦和晶体管可以采用芯片形式,也就是说,在单个封装中有多个光耦或光耦,因此在某些模件上,您可能只看到芯片)。另外,请注意,一些模块将使用 BJT 而不是 MOSFET。如果可以读取部件上的零件号,则始终可以执行 web 搜索以确定它们是什么。

为了总结我们对开关的探索,这里有一个表格,比较了我们在本章中使用的开关元件:

| | 光耦 | MOSFET | 继电器 | | 施工 | 固态 | 固态 | 机动的 | | 电流 | 交流或直流(取决于光耦) | 仅限直流电(开始研究交流用 TRIAC) | 交直流 | | 成本 | $ - $$ | $(低容量)到$$(高容量) | $ | | 变得很热(摸不着) | 不 | 是,适用于大电流功率 MOSFET | 不 | | 控制电压/电流 | 低(需要关闭和打开内部 LED) | 低(需要向栅极施加电压) | 高(需要给继电器线圈通电) | | 负载电压/电流 | 低(例如,PC817 最大 50mA) | 低(例如,200mA 时为 2N27000);高(例如,32 安时的 FQP30N06L) | 高(例如,SRD-05VDC-SL-C 10A) | | 电气隔离 | 对 | 不 | 对 | | 示例应用 | 在控制电路和待控制电路之间提供电气隔离 | 允许低电流/电压电路控制高电压/电流电路 | 允许低电流/电压电路控制高电压/电流电路 | | 寿命 | 长寿命 | 长寿命 | 寿命短(运动部件最终会磨损) | | 使用 PWM | 对 | 对 | 否-继电器的切换速度不够快,而且您只会更快地磨损继电器! |

完成这一章做得很好!现在,您了解了控制电压和电流要求超过 Raspberry Pi GPIO 引脚 3.3 伏/8 毫安限制的负载的多种方法。

总结

在本章中,我们学习了如何打开和关闭事物。在学习如何使用万用表测量直流电机、LED 和继电器的电流要求之前,我们首先简要回顾了一个典型的继电器驱动电路。接下来,我们讨论了光耦的特性,并学习了如何将其用作数字开关。然后,我们讨论了 MOSFET,并发现了如何使用它们作为开关和使用 PWM 进行电机速度控制。

信息,电路,,您在本章中学习的练习将帮助您做出明智的决策,进行必要的计算和测量,以选择合适的组件,并创建可用于开关设备和其他需要更大电流和更高电压的负载的电路,这些负载可以安全地供电从一个覆盆子皮别针。

本章的方法是逐步探索和构建继电器驱动电路,该电路为您提供了一个实际示例,说明如何以及为什么将开关元件链接在一起以控制更高功率的元件和/或负载。此外,我们还了解到,光耦合器可用于电气隔离电路,这是一种有用且实用的技术,可帮助我们隔离和保护覆盆子 Pi,使其在电路故障或接线错误时免受意外损坏。

在下一章中,我们将关注不同类型的 LED、蜂鸣器和可视组件,它们可以用来向用户发送信号或显示信息。

问题

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

  1. 说到控制晶体管,MOSFET 和 BJT 有什么不同?

  2. 您使用 MOSFET 控制电机,但是,您关闭了 MOSFET(例如,使 GPIO 引脚变低),但电机不会立即关闭,而是向下旋转。为什么?

  3. 您已经选择了一个随机 MOSFET,您想从 Raspberry Pi 3.3 伏 GPIO 控制它,但它不工作。问题的可能原因是什么?

  4. 除了开关,光电耦合器和继电器有哪些晶体管没有的共同特征?

  5. 有效低 GPIO 和有效高 GPIO 之间的区别是什么?

  6. 为什么我们更喜欢 MOSFET 栅脚的物理下拉电阻器而不是代码内激活的下拉电阻器?

  7. 对于直流电机,失速电流代表什么?

  8. 对于直流电机,连续电流和自由电流的区别是什么?

进一步阅读

以下教程全面介绍晶体管及其各种类型和应用: