BeagleBone-示例-全-

BeagleBone 示例(全)

原文:zh.annas-archive.org/md5/13e193172fb19493b3cf69c6610b8f6d

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

如果你正在寻找一个简单的分步指南来学习基础电子学,并开始使用低成本 Linux 开发板(如 BeagleBone Black)通过示例构建互联网连接的物理计算系统和机器人,那么这本书适合你入门,如果你有基本的 Python 编程知识,并对计算机的工作原理有初步的了解。

本书涵盖内容

第一章, 开始使用 BeagleBone,介绍了 BeagleBone 板的硬件规格,如何设置 BeagleBone 板从 microSD 卡启动 Linux 操作系统,并从远程计算机登录 Linux 命令行,以及如何在 BeagleBone 板上运行的 Python 软件上进行编程。

第二章, 电路基础和 GPIO,讨论了基本电子电路的工作原理,包括开关、LED 和电池,以及 BeagleBone 板上的 GPIO 引脚,并详细说明了如何使用这些 GPIO 引脚通过 Python 程序切换 LED 状态。

第三章, 物理计算系统简介,通过实际例子帮助你理解物理计算系统的基本结构,并教你如何使用开关作为输入,LED 作为输出设备连接到 BeagleBone 板,该设备基于你编写的 Python 程序运行。

第四章, 使用 BeagleBone 板进行实时物理计算系统,以 LM35 温度传感器为例讨论了模拟传感器,并基于与 LM35 接口的 BeagleBone 板进行了一个更高级的物理计算项目。

第五章, 将物理计算系统连接到互联网,教你如何将 BeagleBone 板连接到 Wi-Fi 网络,云存储,并将传感器数据实时上传到云,并查看带有时间戳的云软件上的趋势。通过示例构建你的第一个物联网系统。

第六章, 使用 BeagleBone 进行家庭自动化,介绍了如何在 BeagleBone 板上使用 Python 和 Flask 框架设置自己的 Web 服务器,以及如何使用它通过连接到 BeagleBone 板的 AC 继电器板,从 PC 或连接到互联网的手机上控制家用电器,类似于任何其他物联网家庭自动化系统。

第七章, 使用计算机视觉处理图像,教你如何将 USB 摄像头与 BeagleBone 板连接,以及如何使用 OpenCV 通过 Python 捕获图像并处理它们。

第八章,使用 BeagleBone Black 构建家庭安全系统,教我们如何使用 Python 中的 SMTP 发送电子邮件,了解 PIR 传感器和运动检测,通过将 PIR 传感器与 BeagleBone 板接口来构建智能入侵警报系统,以检测运动,并使用 OpenCV 捕获图像并发送电子邮件。

第九章,探索机器人技术,帮助您了解机器人系统的基本结构,以及它们在不同领域中的应用和工作原理,通过实际案例进行学习。它还帮助我们了解差动驱动机器人。

第十章,构建您的机器人,教我们关于直流电机、电机驱动器 IC L293D,以及使用此电机驱动器 IC 在 BeagleBone Black 上从 Python 控制直流电机,从连接到 BeagleBone 板的 USB 摄像头在本地服务器上直播视频,以及构建带有实时视频流的遥控机器人。

您需要为本书准备

基本的 Python 编程知识和对其内部电子方面的工作原理的初步理解。

本书面向的对象

本书适合那些寻求简单分步指南以学习基本电子学,并通过示例开始接口传感器和执行器,使用低成本 Linux 开发板如 BeagleBone Black,以构建物联网和机器人系统。

习惯用法

在本书中,您将找到许多文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。

文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名如下所示:"让我们使用命令 sudo poweroff 关闭我们的 BeagleBone 板,这将关闭操作系统。"

代码块设置如下:

<img src="img/?action=stream">

任何命令行输入或输出都如下所示:

sudo python Blink.py

新术语重要词汇将以粗体显示。屏幕上显示的单词,例如在菜单或对话框中,在文本中如下所示:"点击并继续。"

注意

警告或重要提示将以如下框中的形式出现。

小贴士

小贴士和技巧将以如下形式出现。

读者反馈

我们始终欢迎读者的反馈。请告诉我们您对本书的看法——您喜欢或不喜欢的地方。读者反馈对我们来说非常重要,因为它帮助我们开发出您真正能从中获得最大收益的标题。

要向我们发送一般反馈,请简单地发送电子邮件至 <feedback@packtpub.com>,并在邮件主题中提及本书的标题。

如果您在某个主题上具有专业知识,并且您有兴趣撰写或为本书做出贡献,请参阅我们的作者指南www.packtpub.com/authors

客户支持

现在您已经是 Packt 书籍的骄傲拥有者,我们有一些事情可以帮助您从您的购买中获得最大收益。

下载示例代码

您可以从www.packtpub.com的账户下载此书的示例代码文件。如果您在其他地方购买了此书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

您可以通过以下步骤下载代码文件:

  1. 使用您的电子邮件地址和密码登录或注册我们的网站。

  2. 将鼠标指针悬停在顶部的支持标签上。

  3. 点击代码下载 & 勘误

  4. 搜索框中输入书籍名称。

  5. 选择您想要下载代码文件的书籍。

  6. 从下拉菜单中选择您购买此书籍的来源。

  7. 点击代码下载

您还可以通过点击 Packt Publishing 网站书籍网页上的代码文件按钮来下载代码文件。您可以通过在搜索框中输入书籍名称来访问此页面。请注意,您需要登录您的 Packt 账户。

下载文件后,请确保使用最新版本的以下软件解压或提取文件夹:

  • WinRAR / 7-Zip for Windows

  • Zipeg / iZip / UnRarX for Mac

  • 7-Zip / PeaZip for Linux

该书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/BeagleBone-By-Example。我们还有其他来自我们丰富图书和视频目录的代码包可供选择,网址为github.com/PacktPublishing/。请查看它们!

勘误

尽管我们已经尽一切努力确保我们内容的准确性,但错误仍然可能发生。如果您在我们的某本书中发现了错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以节省其他读者的挫败感,并帮助我们改进此书的后续版本。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并输入您的勘误详情来报告它们。一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站或添加到该标题的勘误部分下的现有勘误列表中。

要查看之前提交的勘误表,请访问www.packtpub.com/books/content/support,并在搜索字段中输入书籍名称。所需信息将在勘误部分显示。

海盗

在互联网上,版权材料的盗版是一个跨所有媒体的持续问题。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上发现任何形式的我们作品的非法副本,请立即提供位置地址或网站名称,以便我们可以追究补救措施。

请通过 <copyright@packtpub.com> 联系我们,并提供涉嫌盗版材料的链接。

我们感谢您在保护我们作者和我们为您提供有价值内容的能力方面的帮助。

问题

如果您在这本书的任何方面遇到问题,您可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决问题。

第一章. 开始使用 BeagleBone

如果您现在正在阅读这本书,这意味着您已经迈出了第一步,开始使用您的 BeagleBone 板和 Python 编程语言构建实时物理计算系统。本章将教您如何首次设置您的 BeagleBone 板,并在其上编写您的第一个 Python 代码。

到本书结束时,您将学习如何使用 Python 将电子设备连接到 BeagleBone 板的基本知识,这将允许您通过本书中给出的示例构建几乎任何东西,从家庭自动化系统到机器人。

首先,在本章中,您将学习如何使用新操作系统首次设置您的 BeagleBone 板,然后使用一些基本的 Linux Shell 命令,这些命令将帮助您在 Shell 终端上编写和执行 Python 代码,并执行更多操作,如安装不同的库和软件到您的 BeagleBone 板上。一旦您熟悉了 Linux 终端的使用,您将在 Python 上编写您的第一个代码,该代码将在您的 BeagleBone 板上运行。一旦您对此感到舒适,我们将在下一章中修改代码,使其执行更多操作。大多数时候,我们将使用互联网上免费提供的开源代码和库来编写程序,并使用它来满足我们的需求,而不是从头开始编写代码来构建我们的嵌入式系统,使用 BeagleBone 板。本章内容分为以下部分:

  • 前提条件

  • 关于单板计算机 - BeagleBone 板

  • 了解您的 BeagleBone 板

  • 设置您的 BeagleBone 板

  • 在 Linux Shell 上工作

  • 在 BeagleBone 板上用 Python 编程

前提条件

本主题将涵盖您开始使用 BeagleBone Black 所需的部分。您可以在网上购买,或者在您所在地区的任何电子产品店购买。

以下是需要开始所需的材料列表:

  • 1x BeagleBone Black

  • 1x miniUSB 类型 B 到类型 A 的线缆

  • 1x microSD 卡(4 GB 或以上)

  • 1x microSD 卡读卡器

  • 1x 5V DC,2A 电源

  • 1x 以太网线

注意

BeagleBone 板有不同版本,如 BeagleBone、BeagleBone Black、BeagleBone Green 以及一些更老的版本。这本书中大部分图片将展示 BeagleBone Black。请注意,BeagleBone Black 可以替换其他 BeagleBone 板,如 BeagleBone 或 BeagleBone Green,在大多数项目中使用。这些板子有自己的额外特性。例如,BeagleBone Black 有更多的 RAM,它的 RAM 大小几乎是 BeagleBone 的两倍,并且内置 eMMC 来存储操作系统,而不是像 BeagleBone White 那样仅通过安装在 microSD 卡上的操作系统启动。考虑到这本书应该能够指导人们使用大多数的 BeagleBone 板变体,本书中的教程将基于从 BeagleBone 板上插入的 microSD 卡启动的操作系统。我们将在本章的“设置你的 BeagleBone 板和安装操作系统”主题中详细讨论这一点。

BeagleBone Black – 单板计算机

这个主题将为你提供关于单板计算机的简要信息,让你了解它们是什么,以及 BeagleBone 板在这个类别中的位置。

你是否曾经想过你的智能手机、智能电视和机顶盒是如何工作的?

所有这些设备都运行基于不同 Linux 和 Unix 内核为特定应用开发的定制固件。当你听到 Linux 这个词,如果你熟悉 Linux,你可能会想到它不过是一个操作系统,就像 Windows 或 Mac OS X 一样,在桌面和服务器计算机上运行。但近年来,Linux 内核被广泛应用于大多数嵌入式系统,包括消费电子产品,如你的智能手机、智能电视、机顶盒等等。大多数人知道 Android 和 iOS 是智能手机上的操作系统。但只有少数人知道,这两个操作系统都是基于 Linux 和 Unix 内核的。

你是否曾经质疑过他们是如何开发出这样的设备的?应该有一个开发板吧?它们是什么?

这就是 Linux 开发板,如我们的 BeagleBone 板,被使用的场合。

通过添加外围设备,如触摸屏、GSM 模块、麦克风和扬声器到这些单板计算机,并编写操作系统软件,带有图形用户界面,使它们能够与物理世界交互,我们现在有了许多智能设备,人们每天都在使用。

现在,在你的智能手机上,你有了接近传感器、加速度计、陀螺仪、摄像头、红外发射器等等。这些传感器和发射器通过 CPU 的输入输出端口连接到你的手机 CPU 上,当整个操作系统在智能手机上运行时,有一小块软件正在运行以与这些电子设备通信,以实时获取这些传感器的读数。就像最新智能手机上的屏幕自动旋转。有一小块软件正在读取手机上的加速度计和陀螺仪传感器的数据,并根据手机的方向旋转图形显示。

因此,所有这些 Linux 开发板都是工具和基础板,使用它们你可以构建出色的现实世界智能设备,或者我们可以称它们为物理计算系统,因为它们与物理世界互动并产生输出。

了解你的板子——BeagleBone Black

BeagleBone Black 可以被描述为一种低成本的单板计算机,可以通过 HDMI 线缆插入计算机显示器或电视进行输出,并使用标准键盘和鼠标进行输入。它能够完成你期望台式计算机所能做的所有事情,如播放视频、文字处理、浏览互联网等。你甚至可以在 BeagleBone Black 上设置一个网络服务器,就像你想要在 Linux 或 Windows PC 上设置一个网络服务器一样。

了解你的板子——BeagleBone Black

但是,与你的台式计算机不同,BeagleBone 板具有使用板上可用的 GPIO 引脚与物理世界互动的能力,并且已被用于各种物理计算应用中。从物联网、智能家居项目到机器人、或推特鲨鱼入侵系统。BeagleBone 板被世界各地的硬件制造商用来构建出色的物理计算系统,这些系统正在成为市场上的商业产品。OpenROV,一个水下机器人,是某人可以使用 BeagleBone Black 构建并可能成为成功商业产品的良好例子。

BeagleBone Black 硬件规格

“一图胜千言”。以下图片描述了 BeagleBone Black 的硬件规格。但当你阅读以下图片中的内容时,你将了解到关于板子上每个部分的更多细节。

BeagleBone Black 的硬件规格

如果你熟悉计算机的基本设置,你会知道它有一个 CPU、RAM 和硬盘。你可以将键盘、鼠标和显示器连接到 CPU 上,这些设备通过电源系统供电。

在 BeagleBone Black 上也有相同的设置。它配备了一个 1GHz 处理器、512MB 的 DDR3 RAM 和 4GB 板载 eMMC 存储,用于存储操作系统,取代了硬盘。如果你想要更多的存储空间来使用不同的操作系统启动,你可以使用一个外部 microSD 卡,该卡可以插入 microSD 卡槽以提供额外存储。

正如每台计算机一样,该板包含一个电源按钮用于开启和关闭板子,一个复位按钮用于重置板子。此外,还有一个启动按钮,当操作系统加载到 microSD 卡而不是 eMMC 时,用于启动板子。我们将在本章的安装操作系统主题中详细学习这个按钮的用法。

板上有一个 Type A USB 主机端口,你可以连接外围设备,如 USB 键盘、USB 鼠标、USB 摄像头等,前提是连接到 BeagleBone Black 的外围设备有可用的 Linux 驱动程序。

小贴士

需要注意的是,BeagleBone Black 只有一个 USB 主机端口,所以你需要一个 USB Hub 来获得多个 USB 端口,以便同时连接多个 USB 设备。我建议使用无线键盘和鼠标,当你通过 HDMI 端口连接 BeagleBone Black 到显示器时,可以消除额外的 USB Hub。

BeagleBone Black 上可用的 microHDMI 端口使该板能够像任何计算机一样输出到 HDMI 显示器和 HDMI 电视。

你可以使用板左下角的 DC 圆柱形插头,通过 5V DC、2A 适配器为 BeagleBone Black 供电。虽然不推荐,但也可以使用 USB 供电,因为 USB 端口有电流限制。我们将在接下来的章节中详细介绍这一点,当我们连接 USB Wi-Fi 模块和 USB 摄像头到 BeagleBone Black 时。

板上共有 4 个 LED 灯,用于指示板子的状态,并帮助我们识别从 microSD 卡启动 BeagleBone Black。这些 LED 灯与 BeagleBone Black 上的 GPIO 引脚相连,可以在需要时使用。

你可以使用板上的以太网端口通过以太网线将 BeagleBone Black 连接到局域网或互联网。你甚至可以使用 USB Wi-Fi 模块为 BeagleBone Black 提供互联网接入。在第五章“将物理计算系统连接到互联网”中,你将学习如何做到这一点。

通常被称为通用输入输出(GPIO)引脚的扩展引脚包括 65 个数字引脚。这些引脚可以用作数字输入或输出引脚,您可以将开关、LED 以及许多其他数字输入输出组件连接到这些引脚上,7 个模拟输入,您可以将模拟传感器如电位计或模拟温度传感器连接到这些输入上,4 个串行端口,您可以将串行蓝牙或 Xbee 模块连接到这些端口上用于无线通信或任何其他用途,2 个 SPI 和 2 个 I2C 端口,用于连接不同的模块,如传感器或其他模块,使用 SPI 或 I2C 通信。它还有 8 个 PWM 输出引脚,可用于如淡入淡出和 LED 或用于在机器人应用中改变电机速度等应用,我们将在接下来的章节中讨论这些应用。

我们还有一个串行调试端口,在系统加载和运行时,可以通过串行监视器使用外部串行到 USB 转换器查看低级固件预启动和后关机/重启消息。操作系统启动后,这也作为一个完全交互式的 Linux 控制台。

设置您的 BeagleBone 板

您开始使用 BeagleBone 板的第一步是按照 BeagleBone 社区的建议设置并测试它,使用预装在 eMMC 上的 Debian Linux 发行版在 BeagleBone Black 上运行。本节将指导您完成这个过程,然后安装不同的操作系统到您的 BeagleBone 板上并登录到它。然后开始通过 SSH 使用文件和执行 Linux Shell 命令。

  1. 使用 USB 线将您的 BeagleBone Black 连接到您的笔记本电脑或 PC。

    这是将您的 BeagleBone Black 启动并运行的最简单方法。一旦您连接了 BeagleBone Black,它将开始使用 eMMC 存储上的操作系统启动。要登录操作系统并开始工作,BeagleBone Black 必须连接到网络,而 BeagleBoard 制造商提供的驱动程序允许我们在通过 USB 线连接时在您的 BeagleBone Black 和电脑之间创建一个本地网络。为此,您需要按照步骤 2 中的说明在您的 PC 上下载并安装 BeagleBone 板制造商提供的设备驱动程序。

    设置您的 BeagleBone 板

  2. 下载并安装设备驱动程序。

    • 转到beagleboard.org/getting-started

    • 根据您的操作系统点击并下载驱动程序包。我的操作系统是 Windows(64 位),所以我将下载那个

    设置您的 BeagleBone 板

    安装完成后,点击完成。如下截图所示:

    设置您的 BeagleBone 板

    安装完成后,重新启动您的 PC。确保您的笔记本电脑上的 Wi-Fi 已关闭,并且没有以太网连接到您的笔记本电脑。因为现在 BeagleBone Black 设备驱动程序将尝试在您的笔记本电脑和 BeagleBone Black 之间创建一个 LAN 连接,以便您可以访问默认在 BeagleBone Black 上运行的 Web 服务器以测试其是否一切正常、运行良好。一旦您重新启动 PC,进入第 3 步。

  3. 连接到运行在 BeagleBone Black 上的 Web 服务器。

    打开您喜欢的网页浏览器,并在 URL 栏中输入 IP 地址 192.168.7.2,这是分配给 BeagleBone Black 的默认静态 IP 地址。

    这应该会打开以下截图所示的网页:

    设置您的 BeagleBone 板

    如果您看到一个绿色的勾号,并显示您的板已连接的消息,您可以确保您之前的步骤是正确的,并且您已成功连接到您的板。

    小贴士

    如果您没有收到此消息,请尝试移除连接到 BeagleBone Black 的 USB 线,重新连接并再次检查。如果您仍然没有收到,那么请检查您是否正确完成了前两个步骤。

  4. 通过 Web 服务器玩板载 LED。

    如果您在连接到的网页上向下滚动,您将找到以下截图所示的章节:

    设置您的 BeagleBone 板

这是一个由 BeagleBone 制造商制作的示例设置,作为第一次交互界面,让您了解使用 BeagleBone Black 可以实现什么。在这个网页页面部分,您可以运行一个小脚本。当您点击运行时,根据操作系统状态闪烁的板载状态 LED 将停止其功能,并开始根据页面上的脚本工作。代码是基于由 BeagleBone 制造商构建的 JavaScript 库运行的,称为BoneScript。我们不会详细探讨这一点,因为我们将会更专注于使用 Python 编写自己的程序来与板上的 GPIO 进行交互。但为了让您理解,这里有一个简单的说明,关于脚本上有什么,以及当您在网页上点击运行按钮时会发生什么。

pinMode 函数将板载 LED 引脚定义为输出,digitalWrite 函数设置输出的状态为高(HIGH)或低(LOW)。而 setTimeout 函数将在设置的超时后恢复 LED 的正常功能,也就是说,程序将在 setTimeout 函数中设置的时间后停止运行。

假设我将代码修改为以下截图所示:

设置您的 BeagleBone 板

注意

您可以注意到,我已经将两个 LED 的状态更改为低(LOW),另外两个是高(HIGH),超时设置为 10,000 毫秒。

因此,当您点击“运行”按钮时,LED 将切换到这些状态,并保持 10 秒钟,然后恢复到其正常状态指示程序,即闪烁。

您可以尝试不同的 HIGH 和 LOW 状态以及 setTimeout 值的组合,以便您可以查看和理解正在发生的事情。

您可以在以下屏幕截图中看到我们之前执行的程序的 BeagleBone Black LED 输出状态:

设置您的 BeagleBone 板

您可以看到中间的两个 LED 处于低电平状态。当您运行脚本时,它会保持这种状态 10 秒钟,然后恢复到其常规程序。您可以在网页上提供的脚本中尝试不同的超时值和 LED 状态,并点击“运行”按钮以查看其工作情况。

就这样,我们将编写自己的 Python 程序,并设置服务器,使用 BeagleBone Black 上可用的 GPIO 来实现我们想要的方式,以便在每个项目中构建不同的应用程序。

安装操作系统

我们可以使 BeagleBone Black 使用不同的操作系统启动和运行,就像任何计算机一样。这些板子上主要使用 Linux 系统,它是免费和开源的,但需要注意的是,这些板子上也提供了特定的 Linux、Android 和 Windows CE 发行版,您可以尝试使用。

这些操作系统的稳定版本可在 beagleboard.org/latest-images 获取。

默认情况下,BeagleBone Black 在板子的 eMMC 上预装了 Debian 版本的 Linux。然而,如果您愿意,您可以像在电脑上的硬盘上一样刷新这个 eMMC,并在上面安装不同的操作系统。

注意

如本章开头所述的注意事项中提到的,考虑到本书中的所有教程都应适用于拥有 BeagleBone 和 BeagleBone Black 的人。我们将选择 www.BeagleBoard.org 基金会推荐的 Debian 软件包,并且每次启动板子时都将使用 microSD 卡上的操作系统。

执行以下步骤以准备 microSD 卡并使用它启动 BeagleBone:

  1. 转到:beagleboard.org/latest-images

  2. 下载最新的 Debian 镜像。

    以下截图突出了可用于在 microSD 卡上刷新的最新 Debian 镜像:

    安装操作系统

  3. 提取下载的 RAR 文件中的镜像文件:安装操作系统

    小贴士

    如果您的电脑中没有 WinRAR 或其他 .rar 文件提取软件,您可能需要安装。

  4. 安装 Win32 Disk Imager 软件。

    要将映像文件写入 microSD 卡,我们需要此软件。您可以通过 Google 或任何其他搜索引擎输入win32 disk imager作为关键词进行搜索,以获取以下截图所示的下载此软件的网页链接:

    安装操作系统

    您可以在以下网页链接中找到此软件:sourceforge.net/projects/win32diskimager/。但由于它经常变化,因此我建议您可以通过任何搜索引擎使用关键词进行搜索。

  5. 下载并安装软件后,当您打开 Win32 Disk Imager 时,应该能够看到以下截图所示的窗口:安装操作系统

    现在您已经准备好软件,可以使用它来刷写我们下载的操作系统映像。让我们进入下一步,在那里您可以使用 Win32 Disk Imager 软件来刷写 microSD 卡。

  6. 格式化 microSD 卡。

    将 microSD 卡插入 microSD 卡读卡器,并将其连接到您的计算机。卡读卡器显示您的 microSD 卡可能需要一些时间。一旦显示,您应该能够在 Win32 Disk Imager 软件的以下截图中选择 USB 驱动器。

    安装操作系统

  7. 现在,点击以下截图中突出显示的图标以打开文件资源管理器并选择我们在第 3 步中提取的图像文件:安装操作系统

  8. 前往您提取最新 Debian 映像文件的文件夹,并选择它。安装操作系统

  9. 现在,您可以通过点击 Win32 Disk Imager 上的写入按钮将映像文件写入 microSD 卡。如果您看到以下截图所示的提示,请点击并继续:安装操作系统

  10. 一旦您点击,刷写过程将开始,映像文件将被写入到 microSD 卡。以下截图显示了刷写过程的进度:安装操作系统

    一旦格式化完成,您将看到以下截图所示的提示信息:

    安装操作系统

  11. 现在,您可以点击确定,退出 Win32 Disk Imager 软件,并安全地从计算机中移除 microSD 卡。

现在,您已经成功地将最新的 Debian 操作系统准备就绪,适用于 BeagleBone Black。此过程适用于所有其他适用于 BeagleBone 板的操作系统。您可以在熟悉 BeagleBone 板的过程中尝试不同的操作系统,如 Angstrom Linux、Android 或 Windows CE 等。

对于 Mac 用户,您可以参考learn.adafruit.com/ssh-to-beaglebone-black-over-usb/installing-drivers-maclearn.adafruit.com/beaglebone-black-installing-operating-systems/mac-os-x

从 SD 卡启动您的 BeagleBone 板

由于您现在已经在 microSD 卡上有了操作系统,让我们继续从该 microSD 卡启动您的 BeagleBone 板,并看看如何通过 Linux Shell 登录和访问文件系统。

您需要将您的计算机通过以太网或 Wi-Fi 连接到您的路由器,并且您应该将一根以太网线连接到您的路由器和 BeagleBone 板之间。最后但同样重要的是,需要一个外部电源,您将使用它来为 BeagleBone 板供电,因为当从 microSD 卡启动时,通过 USB 供电将不足以运行 BeagleBone 板。

  1. 将 microSD 卡插入到 BeagleBone 板。

    现在,您应该将您准备好的 microSD 卡插入到 BeagleBone 板上的 microSD 卡槽中。

    从 SD 卡启动您的 BeagleBone 板

  2. 将您的 BeagleBone 连接到您的局域网。

    现在,使用以太网线将您的 BeagleBone 板连接到您的互联网路由器。

    从 SD 卡启动您的 BeagleBone 板

    您需要确保您的 BeagleBone 板和您的计算机连接到同一路由器,以便执行下一步。

  3. 将外部电源连接到您的 BeagleBone 板。从 SD 卡启动您的 BeagleBone 板

  4. 从 microSD 卡启动您的 BeagleBone 板。

    在 BeagleBone Black 和 BeagleBone Green 上,您有一个启动按钮,您需要在打开 BeagleBone 板时按住它,以便它从 microSD 卡启动,而不是默认模式,默认模式是从板载 eMMC 存储启动,该存储包含操作系统。在 BeagleBone White 的情况下,您没有这个按钮,它将从 microSD 卡本身启动,因为它没有板载 eMMC 存储。

    从 SD 卡启动您的 BeagleBone 板

根据您拥有的板子,您可以决定是否从 microSD 卡或 eMMC 启动板子。假设您有一个 BeagleBone Black,就像我在前面的图片中展示的那样。您按下图像上突出显示的用户启动按钮,并打开电源。一旦您在按住按钮的情况下打开板子,四个板载 LED 灯将亮起并保持 HIGH 状态,如以下图片所示,持续 1 到 2 秒,然后它们将开始随机闪烁。

从 SD 卡启动您的 BeagleBone 板

一旦它们开始闪烁,您就可以松开按钮。

现在你的 BeagleBone 板必须已经开始从 microSD 卡启动,所以我们的下一步将是登录到系统并开始工作。下一个主题将指导你如何进行这一步骤。

通过以太网 SSH 登录到板

如果你熟悉 Linux 操作,那么你可能已经猜到了本节的内容。但对于那些不是日常 Linux 用户或者从未听说过 SSH 术语的人来说,安全外壳SSH)是一种网络协议,它允许网络服务和远程登录能够在不安全的网络上以安全的方式操作。用基本的话来说,它是一种协议,通过它可以登录到计算机并检查其文件系统,还可以使用特定的命令在该系统上创建和操作文件。

在接下来的步骤中,你将使用一些 Linux 命令来理解这种登录系统并在其上工作的方法。

  1. 设置 SSH 软件。

    要开始,现在从 Windows PC 登录到你的 BeagleBone 板,你需要为 Windows 安装任何 SSH 终端软件。

    通过以太网 SSH 登录到板

    我最喜欢的工具是 PuTTY,所以接下来的步骤中我会使用它。如果你是 SSH 的新手,我建议你也获取 PuTTY。

    PuTTY 的软件界面将如下截图所示:

    通过以太网 SSH 登录到板

    你需要知道你的 BeagleBone Black 的 IP 地址或主机名,才能通过 SSH 登录到它。默认的主机名是beaglebone,但在某些路由器上,根据其安全设置,这种方法使用主机名登录可能不起作用。因此,我建议你首先尝试使用主机名登录。如果你无法登录,请遵循步骤 2。如果你成功连接并使用主机名获得登录提示,你可以跳过步骤 2,直接进入步骤 3。

    通过以太网 SSH 登录到板

    但如果你遇到了以下截图所示的错误,请执行步骤 2。

    通过以太网 SSH 登录到板

  2. 查找分配给 BeagleBone 板的 IP 地址。

    每次你将设备连接到你的路由器,比如你的电脑、打印机或手机。路由器会给这些设备分配一个唯一的 IP 地址。同样,路由器也必须给你的 BeagleBone 板分配了一个 IP 地址。我们可以在连接到该路由器的任何电脑的浏览器中查看路由器的配置页面来获取这个详细信息。

    在大多数情况下,可以通过输入 IP 192.168.1.1来访问路由器,但有些路由器制造商在极少数情况下有不同的 IP 地址。如果你无法使用这个 IP 192.168.1.1访问你的路由器,请参考你的路由器手册以获取访问此页面的方法。

    注意

    本节中显示的图像是为了让您了解如何登录到您的路由器并从路由器获取分配给您的 BeagleBone 板的 IP 地址详情。配置页面和设备在路由器上的显示方式将根据您拥有的路由器而有所不同。

    在您的浏览器中输入192.168.1.1地址。

    通过以太网 SSH 登录到板

    当它要求用户名密码时,输入用户名admin密码password

    这些是在大多数路由器中默认最常用的凭证。如果在这个步骤中失败,请检查您的路由器用户手册。

    假设您已成功登录到路由器配置页面,您将看到如图所示的屏幕详情:

    通过以太网 SSH 登录到板

    如果您点击突出显示的部分附加设备,您将能够看到如图所示的设备列表及其 IP 地址,在那里您可以找到分配给您的 BeagleBone 板的 IP 地址详情。

    通过以太网 SSH 登录到板

    因此,现在您可以记下分配给您的 BeagleBone 板的 IP 地址。在我之前的屏幕截图中,它显示为192.168.1.14。我们将在下一步使用此 IP 地址通过 SSH 连接到 BeagleBone 板。

  3. 使用 IP 地址通过 SSH 连接。通过以太网 SSH 登录到板

    一旦您点击打开,您可能会收到如图所示的提示。点击并继续。

    通过以太网 SSH 登录到板

    现在,您将在终端屏幕上看到登录提示,如图所示:

    通过以太网 SSH 登录到板

    如果您成功完成了这一步,那么现在是时候登录到您的 BeagleBone 板并开始通过 Linux Shell 工作了。

  4. 登录到 BeagleBone 板。

    当您得到如图所示的登录提示时,您需要输入默认用户名debian和默认密码temppwd。现在您应该已经以用户名debian登录到您的 BeagleBone 板的 Linux Shell。

    通过以太网 SSH 登录到板

现在您已经成功登录到您的 BeagleBone 板的 Linux Shell,您可以使用 Linux Shell 命令开始工作,就像在运行 Linux 的任何计算机上一样。

下一节将向您介绍一些基本的 Linux Shell 命令,这些命令对于您使用任何 Linux 系统都很有用。

在 Linux Shell 中工作

简而言之,Shell 是一个程序,它从键盘接收命令并将其传递给操作系统执行。由于我们将把 BeagleBone 板作为开发板用于构建电子项目,所以每次都要将其连接到显示器、键盘和鼠标来像计算机一样工作,这在大多数情况下可能是不必要的,而且您可能还需要更多资源,这些资源在所有时候都是不必要的。因此,我们将使用 Shell 命令行界面来在 BeagleBone 板上工作。如果您想了解更多关于 Linux 命令行界面的信息,我建议您访问 linuxcommand.org/

现在让我们继续尝试一些基本的 Shell 命令,并在您的 BeagleBone 板上做一些事情。

您可以使用 uname -r 命令查看内核版本。只需输入命令并在键盘上按回车键,命令将被执行,您将看到如下所示的输出:

在 Linux Shell 上工作

接下来,让我们检查 BeagleBone 板上的 date

在 Linux Shell 上工作

就这样,Shell 将执行您的命令,您可以通过 Shell 在 BeagleBone 板上工作。

获取内核版本和日期只是为了进行示例测试。现在让我们继续前进,开始与文件系统一起工作。

  • ls: 这代表列表命令。此命令将列出并显示当前工作目录中可用的文件夹和文件名称。在 Linux Shell 上工作

  • pwd: 这代表打印工作目录命令。此命令将打印您当前所在的当前工作目录。在 Linux Shell 上工作

  • mkdir: 这代表创建目录命令。此命令将在其他词中创建一个目录,即文件夹,但您需要在命令中指定您想要创建的目录名称。

假设我想创建一个名为 WorkSpace 的文件夹,我应该输入以下命令:

在 Linux Shell 上工作

当您执行此命令时,它将在您当前所在的工作目录中创建一个名为 WorkSpace 的文件夹,以检查目录是否已创建。您可以再次尝试 ls 命令,并看到名为 WorkSpace 的目录已创建。

在 Linux Shell 上工作

要更改工作目录并进入 WorkSpace 目录,您可以使用我们接下来将要看到的下一个命令。

  • cd: 这代表更改目录命令。此命令将帮助您根据与该命令一起提供的路径在目录之间切换。

现在要切换并进入您创建的 WorkSpace 目录,您可以输入以下命令:

cd WorkSpace

你可以注意,每次你输入一个命令,它都会在你当前所在的工作目录中执行。所以现在执行cd WorkSpace将等同于cd /home/debian/WorkSpace,因为你的当前工作目录是/home/debian

在 Linux Shell 上工作

现在你可以看到你已经进入了WorkSpace文件夹,目前它是空的,所以如果你现在输入ls命令,它将在 shell 终端的下一行,不会输出任何内容,因为文件夹是空的。

在 Linux Shell 上工作

现在如果你执行pwd命令,你会看到你的当前工作目录已经改变。

在 Linux Shell 上工作

  • cat:这代表cat命令。这是最基础的命令之一,用于在 shell 中读取、写入和追加数据到文件。

要创建一个文本文件并向其中添加一些内容,你只需要输入cat命令cat > filename.txt

假设我想创建一个sample.txt文件,我会输入下面的命令:

在 Linux Shell 上工作

一旦你输入,光标将等待你在创建的文本文件中输入的文本。现在你可以输入任何你想要的文本,完成后按Ctrl + D。这将保存文件并返回到命令行界面。

假设我输入了这是一个测试然后按下了Ctrl + D。shell 将看起来如下所示。

在 Linux Shell 上工作

现在你输入ls命令,你可以在WorkSpace目录中看到文本文件。

在 Linux Shell 上工作

如果你想要读取sample.txt文件的内容,你同样可以使用cat命令,如下所示:

在 Linux Shell 上工作

或者,你甚至可以使用more命令,这是我们将会主要使用的命令:

在 Linux Shell 上工作

现在我们已经看到了如何创建一个文件,接下来让我们看看如何删除我们创建的内容。

  • rm:这代表删除命令。这将允许你通过输入文件名或文件名及路径后跟命令来删除任何文件。

假设现在我们想要删除我们创建的sample.txt文件,命令可以是rm sample.txt,这将等同于rm /home/debian/WorkSpace/sample.txt,因为你的当前工作目录是/home/debian/Workspace

在 Linux Shell 上工作

执行这个命令后,如果你尝试列出目录的内容,你会注意到文件已经被删除,现在目录是空的。

在 Linux Shell 上工作

就这样,你可以通过 SSH 通过以太网或 Wi-Fi 在你的 BeagleBone 板上使用 shell 命令。我们将在 第五章 中看到如何将你的 BeagleBone 板连接到 Wi-Fi,将物理计算系统连接到互联网,在那里你可以设置你的 BeagleBone 板通过 Wi-Fi 连接到你的路由器,而不是通过以太网,以给你的 BeagleBone 板提供无线访问。

现在,你已经对使用 Linux Shell 有了一个清晰的概念和实际操作经验,让我们继续前进,开始使用 Python,并在 Linux 文本编辑器上编写一个示例程序,然后在本章的下一节和最后一节中进行测试。

在 BeagleBone 板上编写自己的 Python 程序

在本节中,我们将在你的 BeagleBone 板上编写一些 Python 代码。这些代码将根据输入做出决策,并根据我们编写的代码打印输出。本主题中有三个示例代码,可以帮助你掌握任何编程语言的基本知识,包括定义变量、使用算术运算符、获取输入和打印输出、循环和决策算法。

在我们编写和执行 Python 程序之前,让我们通过 Linux shell 进入 Python 的交互式壳界面,并尝试一些基本操作,比如创建变量和在那些变量上执行数学运算。

要打开 Python 壳界面,你只需在 Linux shell 中输入 python,就像你在本章前面的部分中为任何 Linux shell 命令所做的那样。

一旦你输入 python 并按 Enter,你应该能看到如下截图所示的终端:

在 BeagleBone 板上编写自己的 Python 程序

现在,你已经进入了 Python 的交互式壳界面,在这里,你输入的每一行都是你在每一步同时编写的代码和执行的代码。要了解更多信息,请访问 www.python.org/shell/,或者要开始学习 Python 编程语言,你可以购买我们出版的 Python By Example 书籍。

让我们在 Python 的交互式壳界面中执行一系列语法,看看它是否正常工作。

让我们创建一个名为 A 的变量,并将其值 20 赋予它:

在 BeagleBone 板上编写自己的 Python 程序

现在,让我们 print A 来检查它被赋予了什么值:

在 BeagleBone 板上编写自己的 Python 程序

你可以看到它打印出了我们存储在其上的值。

现在,让我们创建另一个名为 B 的变量,并将其值 30 存储到它里面:

在 BeagleBone 板上编写自己的 Python 程序

让我们尝试将这两个变量相加,并将结果存储在另一个名为 C 的变量中。然后 print C,你可以看到 A+B 的结果,即 50

在 BeagleBone 板上编写自己的 Python 程序

这就是我们在一个编程界面上执行的基本计算。我们创建了两个具有不同值的变量,然后在那些变量上执行了两个值的加法算术运算,并打印出了结果。

现在,让我们更进一步,将字符串字符存储在变量中并打印它们。

在 BeagleBone 板上编写自己的 Python 程序

这不是很简单吗。就像这样,你可以通过玩转 Python 的交互式 shell 界面来学习编码。但任何程序员都希望编写代码并执行程序,以单条命令的方式获得输出。

让我们看看现在如何做到这一点。

要从 Python 的交互式 shell 中退出并返回 Linux Shell 的当前工作目录,只需按住 Ctrl 键并按 D,即在键盘上按 Ctrl + D。你将回到下一个显示的 Linux Shell 界面:

在 BeagleBone 板上编写自己的 Python 程序

现在我们来编写一个程序,执行我们在 Python 的交互式 shell 中尝试执行的动作。也就是说,将两个值存储在不同的变量中,当它们相加时打印出结果。让我们通过在创建的变量上执行多个算术运算,并打印出加法和减法的结果来给它增添一些趣味。

你需要一个文本编辑器来编写程序并保存它们。你也可以使用 cat 命令来做这件事。但当你未来需要在程序中使用缩进和更多编辑时,基本的 cat 命令用法将会变得困难。所以,让我们开始使用 Linux 上可用的文本编辑器 nano,它是我的 Linux 中最喜欢的文本编辑器之一。如果你有其他选择,并且熟悉 Linux 上的其他文本编辑器,如 vi 或其他,你可以继续使用它们来编写程序进行下一步操作。

要创建一个 Python 文件并使用 nano 在它上面开始编写代码,你需要使用 nano 命令,后跟文件名和扩展名 .py

让我们创建一个名为 ArithmeticOperations.py 的文件。

在 BeagleBone 板上编写自己的 Python 程序

一旦你输入这个命令,文本编辑器就会打开。

在 BeagleBone 板上编写自己的 Python 程序

在这里,你可以输入你的代码,并使用键盘命令 Ctrl + X 保存它。

让我们继续编写以下截图所示的代码,并使用 Ctrl + X 保存文件:

在 BeagleBone 板上编写自己的 Python 程序

然后当提示保存修改后的文件时,输入 Y

在 BeagleBone 板上编写自己的 Python 程序

然后,如果你想用不同的名字更改文件,你可以在保存之前在下一步中进行更改。由于我们现在只创建了文件,所以我们不需要这样做。如果你想在将来以不同的名字保存文件的修改副本,你可以在这一步更改文件名:

在 BeagleBone 板上编写自己的 Python 程序

目前,我们只需按下Enter键,这将带我们回到 Linux Shell,并在当前工作目录内创建名为AritmeticOperations.py的文件,你可以通过输入ls命令来查看。你还可以通过输入我们在此章节前一部分学到的more命令来查看文件内容。

在 BeagleBone 板上编写自己的 Python 程序

现在让我们执行 Python 脚本并查看输出。为此,你只需输入命令 python,后跟我们所创建的 Python 程序文件,即ArithmeticOperations.py

在 BeagleBone 板上编写自己的 Python 程序

一旦运行了你所编写的 Python 代码,你将看到之前显示的输出结果。

现在你已经编写并执行了你的第一个 Python 代码,并在你的 BeagleBone 板上测试了它的工作情况,让我们编写另一个 Python 代码,如下面的截图所示,该代码将要求你输入输入,无论你输入什么文本作为输入,它都会打印在下一行,并且程序将连续运行。

让我们将这个 Python 代码保存为InputPrinter.py

在 BeagleBone 板上编写自己的 Python 程序

在这个代码中,我们将使用 while 循环,以便程序在您使用Ctrl + D命令将其中断并返回到 Linux Shell 之前持续运行。

在 BeagleBone 板上编写自己的 Python 程序

现在让我们尝试本节和本章的第三个也是最后一个程序,其中当我们运行代码时,程序会提示用户输入用户名作为输入,如果他们输入我们比较的特定名称,它将打印并显示Hello消息;如果输入了不同的名称,它将打印Go Away;让我们称这个代码为Say_Hello_To_Boss.py

在 BeagleBone 板上编写自己的 Python 程序

在比较时,你可以将我的名字Jayakarthigeyan替换成你的名字或任何字符串,输出决策将随之变化。

当你执行代码时,输出将看起来如下所示截图:

在 BeagleBone 板上编写自己的 Python 程序

就像我们在上一个程序中所做的那样,你可以按Ctrl + D来停止程序并返回到 Linux Shell。

以这种方式,你可以使用 Python 编程语言创建可以在 BeagleBone 板上按你希望的方式运行的代码。

既然我们已经到达了这一章节的结尾,让我们给我们的 BeagleBone 板一个休息。

使用命令 sudo poweroff 关闭我们的 BeagleBone 板,这将关闭操作系统。

在 BeagleBone 板上编写自己的 Python 程序

执行此命令后,如果你看到以下截图所示的错误消息,这意味着 BeagleBoard 已关闭电源。

在 BeagleBone 板上编写自己的 Python 程序

现在,你可以关闭连接到你的 BeagleBone 板的电源。

摘要

因此,我们来到了这一章节的结尾。在本章中,你学习了如何从 microSD 卡上的不同操作系统启动 BeagleBone 板,然后登录并开始用 Python 编写代码以运行例程和做出决策。利用这些知识,我们将在接下来的几章中看到如何使连接到 BeagleBone 板 GPIO 引脚上的 LED 闪烁,以及如何使用 Python 代码读取开关按钮的状态。但在那之前,我们将在下一章中探讨基本电子学的基础知识。

另外,你可以通过将 BeagleBone 板连接到 HDMI 显示器(使用 microHDMI 线缆),并将 USB 键盘和鼠标连接到 BeagleBone 板的 USB 主机,然后使用外部电源为显示器和 BeagleBone 板供电,并从 microSD 卡启动它,将这一章节提升到更高层次。你应该能够看到一些图形用户界面,并且能够像使用普通 Linux 计算机一样使用 BeagleBone 板。你将能够访问文件、管理它们,并在 GUI 上使用 Shell 终端。如果你拥有 BeagleBone Black 或 BeagleBone Green,你可以尝试使用最新的 Debian 操作系统刷写板载的 eMMC,并尝试使用从 microSD 卡启动的操作系统的相同方法。

第二章:电路基础和 GPIO

在本章中,我们将学习如何设置一个外部电子电路的基本知识,您可以使用 BeagleBone 板上的通用输入/输出(GPIO)引脚与之接口。本章将侧重于让读者理解如何通过解释它们的工作原理来布线电子电路,然后使用 BeagleBone 板上的 GPIO 进行操作。

对于有电子背景的读者,前三个主题中涵盖的大部分内容都将很熟悉,但我仍然建议您浏览这些主题以复习基础知识。由于本书的编写方式使得没有电子知识背景的读者也能理解和参与项目,因此这些主题必须包含在章节中。

本章内容分为以下主题:

  • 前提条件

  • 电路的电和电子基础知识

  • 面包板的使用

  • 开关和 LED

  • GPIO

  • 将库添加到 Python

  • 使用 Python 访问 GPIO

  • 简单项目:使用 Python 脚本闪烁 LED

前提条件

本主题将涵盖您需要开始使用 BeagleBone Black 在线的哪些部分。您可以从您最喜欢的在线商店或任何当地商店购买这些部件。单个电子元件,如电阻、晶体管、LED 等,通过导电线连接到电源元件,如电池或其他电源,电流通过这些电子元件流动,从而形成一个电子电路:

前提条件

在本章的“开关和 LED”部分,我们将看到如何使用 LED 制作我们的第一个简单电路,然后连接一个开关到它。

面包板的使用

在本节中,您将了解面包板是什么,为什么被称为面包板,以及如何使用它们。完成这些后,您应该对面包板的工作原理有一个基本的理解,并能够开始使用它来在面包板上构建基本电路。

面包板由行和列的电气连接组成。每一列都与行上的每个点电连接,您可以看到有连接性的黑色列线。您可以使用电线将任何一列与另一列连接。顶部和底部有较大的行,通常用于电源的正负极,换句话说,VCC(电源)和 GND(地)信号。您可以使用这些来轻松地将任何一列连接到 VCC 或 GND,或者根据您的意愿用于其他任何目的,因为没有限制,它就像任何其他行一样:

面包板的用法

您可以通过将前一部分给出的电路连接到面包板上来学习如何使用面包板,如图所示进行测试,设置相同的电路:

面包板的用法

开关和 LED

开关是电子电路中的基本元件之一:

开关和 LED

它们所做的只是闭合或断开电路,这意味着它们在两个端点之间打开或关闭连接。开关的两种状态如下图中所示:

开关和 LED

有很多不同类型的开关。但在本节中,我们将讨论两种最常用的开关,即瞬动开关和拨动开关。在我们讨论不同类型的开关之前,正如本章介绍中提到的,让我们先看看 LED 是什么,以及如何使用它们创建一个基本电路,因为在解释开关操作时,这将有助于更好地理解。

要创建您的第一个简单电路,取一个电池、电阻和 LED,用电线将它们连接起来,如图所示。通过这样做,您可以了解 LED 是什么。LED 代表发光二极管,它不过是一个电子元件,当在适当的配置下对其引脚施加适当的电压时,它会发出光。LED 有两个引脚:阴极和阳极,如下面的图所示:

开关和 LED

阳极端应连接到电源/电池的正极,阴极端应连接到电源/电池的负极,以使 LED 发光。反向连接不会使 LED 发光。如果您想了解更多关于为什么以及 LED 是如何工作的,请在网上进行研究或阅读书籍以获取更多信息。

现在,让我们继续制作一个电子电路,电流通过电线通过电阻和 LED(它们连接到电源,换句话说,是电池)流动,如下面的图所示:

开关和 LED

因此,如图所示,电阻可以位于 LED 的任何一侧。电阻是一种降低电路中电流值的元件。它用于增加 LED 的寿命,对于大多数 LED 都是必要的。我建议您了解更多关于应该使用多少电阻值以及您使用的特定电池和 LED,因为本章及其大部分章节的目的是为您提供有关电子电路的基本入门想法。正如本章开头提到的,电气和电子是一个庞大的主题,我们无法将其中涉及的所有概念都放在一个章节中。

如果你成功地用电池和电阻之间的 LED 使 LED 发光,你就已经制作了你的第一个基本电子电路。但是,让 LED 一直发光并不是现在任何人想要的。我们总是需要一个元素来控制另一个元素。因此,开关就出现了,如果你在这个电路中连接一个开关,你就可以在需要时打开或关闭 LED 的发光。所以,让我们继续看看电子电路中最常用的两种开关类型,我们将在接下来的章节中使用它们来与 BeagleBone 板接口,从外部世界获取输入。

瞬时开关

如果你查看下面的图示,你可以看到瞬时开关有一个推杆执行器,一个位于可动触点之间的柱塞,该触点接触两个端子的固定触点。

瞬时开关

上一个图示中显示的开关在正常状态下是断开的,因为固定触点在正常状态下没有与可动触点接触,柱塞将可动触点向上拉。每次你按下顶部的按钮时,可动触点会下降并接触两个固定端点以建立接触并闭合线路。当你移除你施加在按下推杆开关上的压力时,柱塞会将可动触点拉回,电路就会断开。以下图示通过连接到电池的 LED 说明了这一解释。请查看它们以更好地理解,并尝试使用推杆瞬时开关、电池、电阻和 LED 自己动手做一下:

瞬时开关

推杆开路 - 无电流流动,所以 LED 是关闭的

瞬时开关

推杆闭路 - 有电流流动,所以 LED 是开启的

请注意,市场上还有其他类型的推杆瞬时开关,它们通常是闭合的,当按钮被按下时,开关会断开电路,而在正常状态下闭合。根据你使用的开关类型,前面图示中的电路操作会有所不同。对于通常闭合的开关,LED 将始终开启,当你按下按钮时,它会熄灭。对于通常开启的开关,操作将如前面图示所示,LED 在正常状态下是关闭的,但当你按下推杆开关时,它会点亮。

我们接下来要讨论的开关类型将是切换开关。

切换开关

切换开关类似于传统开关,这些开关用于墙式电气开关板,帮助你打开和关闭电路的连接以开关电路。以下是它的电路符号表示:

切换开关

现在你已经熟悉了开关操作的工作原理,你可以轻松理解切换开关的概念。基本上,它将状态从开启切换到关闭,就像我们切换开关的位置一样。与需要按住开关按钮来切换状态的瞬间开关不同,在这里,一旦你切换了位置,它就会保持在离开的位置。因此,我们可以将开关从关闭状态切换到开启状态,换句话说,从开启到关闭状态,以及反之亦然,并且保持这种状态,它将保持在相同的位置,换句话说,处于开启或关闭的状态,因为没有弹簧机制将开关推回到其原始位置。以下图表将帮助你更好地理解:

Toggle switch

切换开关开路 - 没有电流流动,因此 LED 是关闭的

Toggle switch

切换开关闭合电路 - 电流流动,因此 LED 是开启的

因此,如图所示,如果你已经成功设置了电路并通过切换开关使 LED 发光,那么现在你一定已经理解了电路的概念以及如何使用开关切换电气和电子电路。但是,我们将使用 BeagleBone 板而不是手动操作,我们将使用 GPIOs 来切换元件以及读取切换输入。我们将在下一章的实验中详细说明这一点。现在,在下一节中,你将学习 GPIOs 的基本概念以及 BeagleBone 板上可用的 GPIOs 类型。

GPIOs

如我们在第一章中讨论的,开始使用 BeagleBone,BeagleBone 板在板的两侧都有 GPIO 引脚头。在本节中,我们将讨论这些 GPIOs 是什么以及我们如何使用它们将外部电子元件与板连接起来。

以下图表显示了可用的 GPIOs 以及每个 GPIO 的引脚映射。这种引脚映射或一般而言,分配给这些引脚的名称,将有助于我们从操作系统上运行的软件中访问它们。你将在本章末尾详细了解这一点,当我们从 Python 中访问 GPIO 时:

GPIOs

因此,这些 GPIOs 是端口,可以从我们的定义中作为输入或输出从操作系统上运行的软件中操作。有几种方法可以将这些引脚定义为输入和输出,以及当定义为输出时更改这些引脚的状态,当定义为输入时读取状态。在本书中,由于我们将使用 Python 作为主要的编程语言,我们将从 Python 程序中访问这些引脚。要开始,你首先需要向 Python 添加几个库,这将帮助你完成这项工作。如何安装这些库以及如何验证它们将在下一主题中解释。

向 Python 添加库

为了使用 Python 编程语言在 BeagleBone 板上轻松地处理 GPIO,我们将安装 Adafruit-BeagleBone-IO-Python 库。以下步骤将指导您如何进行操作:

  1. 登录到您的 BeagleBone 板。

    正如我们在上一章中所做的那样,您需要做的第一件事是从 microSD 卡启动 BeagleBone 板并通过 SSH 登录到它:

    向 Python 添加库

  2. 更新存储库。

    您的下一步将是更新 BeagleBone 板上运行的 Debian 的软件依赖项存储库,然后我们再开始安装其他未安装的依赖项和库。

    您可以使用 apt-get update 命令来完成此操作:

    向 Python 添加库

  3. 安装依赖项。

    在此步骤中,我们将安装某些软件包,这些软件包对于库与 BeagleBone 板协同工作至关重要。您需要执行的命令如下:

    sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus –y
    
    

    您将看到的输出如下所示:

    向 Python 添加库

  4. 安装 BBIO 库。

    现在,一旦您已更新了存储库并安装了必要的依赖项,我们就可以继续安装我们将用于通过运行在 BeagleBone 板上的 Python 访问 GPIO 引脚的 Adafruit_BBIO Python 库。

    要安装 Adafruit_BBIO 库,请执行以下命令:

    sudo pip install Adafruit_BBIO
    
    

    您将看到以下输出:

    向 Python 添加库

  5. 测试您的安装。

    现在,让我们检查安装是否正确完成。为此,只需执行以下命令:

    sudo python -c "import Adafruit_BBIO.GPIO as GPIO; print GPIO"
    
    

    现在,如果您看到以下截图所示的输出,则表示安装成功,并且我们已经成功安装了 Adafruit_BBIO 库:

    向 Python 添加库

    我们可以通过将库导入 Python 并进行测试来验证这一点,如步骤 6 所示。

  6. 验证安装。

    在此步骤中,首先您需要打开 Python 的交互式 shell 以使用以下指令,如下所示:

    向 Python 添加库

如果您在打印 GPIO 时看到模块及其路径,则确认我们已经成功安装并添加了 Adafruit_BBIO 库到 Python。现在让我们继续前进,从 Python 的交互式 shell 中访问 GPIO 以更改其状态,在下一节中。

使用 Python 访问 GPIO

在本节中,我们将了解如何使用 Adafruit_BBIO 库中可用的函数,从 Python 的交互式 shell 界面更改 BeagleBone 板上 GPIO 的状态。

您需要将一个 LED 连接到 BeagleBone Black 上的一个 GPIO 引脚,以了解这些 GPIO 的工作原理。以下步骤将逐步引导您通过可以在 Python 的交互式 Shell 界面上逐步执行的程序,以了解您如何从 python 中将 GPIO 的状态从低电平更改为高电平,反之亦然:

  1. 将 LED 电路连接到 BeagleBone 板。

    要开始,我们需要面包板、LED、电阻和连接线,将 LED 电路与 BeagleBone Black 上的可用 GPIO 连接起来。一旦您准备好了这些,请按照以下图示连接电路:

    使用 Python 访问 GPIOs

    您可以看到,LED 的阴极通过一个 470 欧姆的电阻连接到 BeagleBone Black 上的 Gnd 引脚,阳极连接到 P9 接口上的 GPIO_60 引脚。您可以参考 BeagleBone Black 的扩展接口以供参考。一旦您将电路与 BeagleBone Black 连接好,我们就可以继续使用 Python 来控制这个 LED 的开关。

  2. 打开 Python 的交互式 Shell 并导入 Adafruit 的 BBIO 库:使用 Python 访问 GPIOs

    如前一个屏幕截图所示,在这一步中,您将打开 Python 的交互式 Shell,并使用前一个屏幕截图中的命令将Adafruit_BBIO模块导入其中。

  3. 设置引脚 GPIO_60 为输出模式。

    我们的下一步将是设置或定义 GPIO_60 为输出引脚,因为我们将会改变引脚的状态。请注意,这些 GPIO 引脚可以被设置为输入或输出。我们将在下一章中看到它们如何作为输入使用。现在,我们将使其作为输出引脚,以改变引脚的状态为高电平或低电平,或反之亦然,因此我们将它定义为输出引脚。为此,命令如下:

    GPIO.setup("P9_12", GPIO.OUT)
    
    

    使用 Python 访问 GPIOs

    P9_12 实际上就是引脚GPIO_60,它是 P9 接口上的第 12 个引脚。请参见以下图示以了解记号背后的含义:

    使用 Python 访问 GPIOs

  4. 将引脚 GPIO_60 设置为高电平。

    一旦我们将引脚定义为输出引脚,我们就可以继续更改引脚的状态为高电平或低电平。以下给出的函数在执行时将执行该操作:

    GPIO.output("P9_12", GPIO.HIGH)
    
    

    使用 Python 访问 GPIOs

    现在,您将能够看到 LED 已经打开,如以下图像所示:

    使用 Python 访问 GPIOs

    当您执行函数时,实际上是在处理器芯片内部的某个晶体管由软件打开,这使得 GPIO_60 处于高电平状态,并切换打开,提供 3.3V 输出,从而使 LED 发光。现在,您可以通过将 GPIO_60 引脚设置为低电平来关闭 LED,如下一步所示,通过修改GPIO.output函数为 LOW。

  5. 将引脚 GPIO_60 设置为低电平:

    GPIO.output("P9_12", GPIO.LOW)
    
    

    使用 Python 访问 GPIOs

    现在,你将能够看到 LED 已经关闭,如下面的图像所示:

    使用 Python 访问 GPIOs

    如前一步,现在软件关闭了 BeagleBone 板上的微处理器内部的晶体管,以关闭 GPIO_60,使其关闭并变为 LOW,不提供 3.3V 电源,因此 LED 被关闭。

  6. 清理 GPIO 设置。

    因此,现在你应该已经了解到,可以从板上的软件中更改 GPIO 状态。这些 GPIO 引脚保持原来的状态,直到它们被改变到另一个状态。但在你停止软件进行操作的过程中,你可能需要 GPIO 引脚回到它们的默认状态,对于大多数引脚来说,这个状态是 LOW。为此,Adafruit_BBIO库为我们提供了一个函数GPIO.cleanup(),我们将使用它来清除软件设置的 GPIO 的先前状态和定义。

    建议你在每个编写的程序结束时使用此函数,以避免不必要的、不期望的输出:

    使用 Python 访问 GPIOs

项目 – 使用 Python 脚本闪烁 LED

在上一节中,我们看到了如何从 Python 的交互式 shell 中访问 GPIO 引脚并改变其状态。现在,让我们编写一个 Python 代码,将其保存为.py文件,并像上一章结尾所做的那样运行它。本节讨论的 Python 程序将使 LED 以 1 秒的间隔闪烁。LED 将亮 1 秒,然后熄灭 1 秒;这将持续循环,直到你中断循环。

以下截图显示了程序:

项目 – 使用 Python 脚本闪烁 LED

代码导入 time 模块和Adafruit_BBIO模块,就像我们在本章上一节的交互式 shell 中所做的那样,然后我们将 GPIO_60 设置为输出引脚,并在持续运行的 while 循环中改变引脚的状态为 HIGH 和 LOW。我们使用time.sleep(1)函数在状态变化之间暂停代码 1 秒。代码还有一个GPIO.clean()函数,当代码运行时,如果给出键盘中断,则会执行。

要运行命令,在将代码保存为名为Blink.py的文件后,执行以下命令:

sudo python Blink.py

你应该看到以下截图所示的输出,连接到 BeagleBone 板的 LED 以 1 秒的间隔闪烁,控制台也打印出文本Blinking

项目 – 使用 Python 脚本闪烁 LED

当你按下 Ctrl + C 来终止程序时,它将 GPIO 清理到默认状态并退出程序:

项目 – 使用 Python 脚本闪烁 LED

现在,你可以继续尝试使用不同的 GPIO,并通过 Python 程序中的决策语句等来打开和关闭 LED。如果你还记得,在第一章《开始使用 BeagleBone》中,我们使用了 BoneScript 库来使板上的 LED 打开并保持开启状态一段时间。你也可以尝试在 Python 中编写类似的代码,并尝试让 LED 保持开启一段时间。然后根据你给出的输入将其关闭。

摘要

我们已经到达了本章的结尾,在这里我们学习了使用 LED 和开关的简单电子电路背后的基本原理。我们了解了 GPIO 是什么,以及如何从 Python 中访问它们,并编写了一个简单的代码来使 LED 以特定间隔闪烁。然后我们在 BeagleBone 板上添加了外部库。在下一章中,我们将看到如何从外部世界获取输入并构建一个对那个输入做出反应的系统。

第三章。物理计算系统简介

本章将重点介绍物理计算系统是什么,它们由什么组成,它们如何工作以及它们在哪里使用。首先,我们将从物理计算系统的简要介绍开始,通过一个示例及其应用领域,让您对物理计算系统的基本组成有一个基本的概念,最后我们将看到如何使用 BeagleBone Black、推杆和 LED 以及 Python 编程来构建自己的物理计算系统,根据推杆按下输入来改变 LED 的状态。

本章内容分为以下主题:

  • 前置条件

  • 物理计算系统简介

  • 物理计算系统的基本元素

  • 应用领域

  • 简单项目:推杆输入触发 Python 代码中的事件,切换 LED 的开关

前置条件

本主题将涵盖本章所需的部分。这些可以从您最喜欢的电子爱好商店购买,或者简单地在线订购。我们需要以下材料:

  • 1 x BeagleBone Black

  • 1 x 带有最新版本 Debian 的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1 x 5V 直流,2A 电源

  • 1 x 以太网线

  • 1 x 面板

  • 1 x 推杆开关

  • 1 x LED

  • 1 x 470 欧姆电阻

  • 1 x 4.7 千欧姆电阻

物理计算系统介绍

本节将为您提供一个物理计算系统的基本概述。物理计算系统是电子系统,它们结合软件和硬件来从物理世界获取输入,并通过在硬件上运行的软件提供输出以响应它。这些系统在不同的应用中也被称为嵌入式系统。一般来说,任何通过硬件传感器与模拟世界交互、获取输入并基于为其编写的软件相应地做出反应的系统,都被称为物理计算系统。

从您的音乐播放器、洗衣机、自动门开启器和手机,所有使用传感器和按钮从物理世界获取输入并通过改变其物理世界的输出以响应的系统,都是物理计算系统。

以你的洗衣机为例。根据你通过点击其上的按钮提供的输入,这是一个从世界到洗衣机系统的物理输入,它清洗你的衣物并使其干燥,这又是对物理世界的输出;它使用空气和水改变物理事物,即衣物。因此,它基本上通过其输出在物理、模拟世界中创造变化,其输出基于洗衣机系统上的硬件上运行的软件,以及该系统上可用的传感器和执行器。我们将在本章下一节中详细探讨这一点,该节将探讨构成物理计算系统的基本组件以及它们的工作原理。

物理计算系统的基本元素

在本节中,你将了解物理计算系统由什么组成。首先,我们将看到输入和输出元素的基本结构以及如何行动和反应,然后是它的电气、电子和软件方面的结构,包括系统的输入和输出。最后,我们将通过示例尝试以更清晰的方式了解相同的概念。

物理计算系统的基本结构包括传感器,这些传感器可以是模拟的或数字的,它们将使用连接到物理计算系统硬件的输入传感器从物理世界获取输入,如下面的图所示:

物理计算系统的基本元素

这些输入将由物理计算系统上的电子微处理器和控制器上运行的软件读取。基于该软件,将做出决策以提供输出,该输出从数字形式转换为模拟形式,或者根据执行器的类型在物理世界中产生变化。因此,基本上,一个动作是根据感觉执行的,就像人类的反射动作以及它们如何对不同感觉做出反应一样。因此,运行软件的微控制器或计算机芯片一起充当大脑,根据连接到硬件的传感器使用感觉做出决策。

让我们回顾一下之前讨论的基本实时示例,以清晰地了解系统的工作原理。跑步机是一种人们通常用于在原地行走或跑步的设备,用于健身房锻炼,或者有些人甚至在他们的家中安装跑步机。这些设备由电动机驱动,并配备一个传感器来读取电动机的运行速度,以及一个带有显示屏和按钮的微控制器单元/计算机系统,该系统运行特殊软件,从传感器读取这些输入以测量速度,并从用户那里获取输入以使跑步机以特定速度运行。以下图示了一个基本的跑步机,下面你可以看到一个基本的框图:

物理计算系统的基本元素

所以,基本上,正如你在前面的图中看到的,跑步机有一个 HiTech 电脑控制台,带有按钮和基本显示屏,用户可以通过它选择自己想要的跑步速度。电脑连接到电机控制器,通过读取速度传感器来测量速度,并使用电脑上运行的算法来调节它,电脑的输出控制到电机控制器以维持电机的速度。如果你看一下下面的图,你会理解得更好,因为方块图清楚地显示了操作过程:

物理计算系统的基本元素

通过查看跑步机示例,你应该已经对物理计算系统的基本结构和它们的操作有了清晰的认识。让我们继续深入了解系统硬件中的电子部分,然后看看软件是如何与硬件协同工作以做出决策和提供输入的。

在我们讨论物理计算系统的硬件结构之前,让我们快速看一下基本的计算机结构,如图所示,因为物理计算系统基本上是从计算系统演变而来的;物理计算系统的结构包括基本的计算系统,并增加了接口:

物理计算系统的基本元素

上图是基本计算机的方块图,它包含中央处理单元CPU),它将数据存储在内存单元中,并在算术逻辑单元中处理它,控制单元基本上执行所有其他单元之间的数据传输,使它们协同工作。输入和输出都连接到 CPU。如果你看一下下面基本计算机的图像,你可以看到系统单元是 CPU,显示器和扬声器是输出设备,同样,键盘和鼠标是输入设备:

物理计算系统的基本元素

基于运行在 CPU 上的软件,键盘和鼠标的输入在硬件上执行处理,我们可以在显示器上看到输出,也可以通过扬声器听到。计算机是高级物理计算系统,它们具有专用软件,运行的操作系统,以及各种通信协议。现在我们已经清楚了解计算系统的结构,让我们看看嵌入式硬件系统(如 BeagleBone Black)的结构。我们首先将查看基本结构,然后是针对 BeagleBone Black 的详细硬件方块图:

物理计算系统的基本元素

在前面的图中展示了任何物理计算嵌入式硬件系统的基本框图,换句话说,就是带有微控制器和微处理器的嵌入式系统。将前面的框图与计算机的基本框图进行比较,你可以看到输入和输出端口在前面的框图中得到了详细的阐述和解释,其中你可以看到数字和模拟输入端口与 CPU 相连,同样地,我们还有具有模拟和数字输出的输出端口。我们还有如 UART、I2C、SPI 等通信端口。

用基本术语来说,数字输入端口能够读取特定的直流电压或两个设定极限之间的直流电压范围,将其作为高电平,同样地,将其作为低电平,换句话说,就是我们计算机语言中使用的数字高电平和数字低电平。一个数字输入的例子可以是开关的按下:当它闭合时,它是高电平,换句话说,是1,而当它打开时,它是低电平,换句话说,是0。模拟输入端口是那些接收一定范围内的模拟电压并将其转换为数字输出形式的端口,以便通过将其转换为 0s 和 1s 或数字高电平和低电平来使 CPU 能够理解。一个模拟输入的例子可以是模拟温度传感器,它感知周围的温度并提供一个从最小值到最大值的电压,这个电压对应于传感器周围的温度。将模拟电压值转换为数字值的转换器被称为模数转换器ADCs)。同样地,还有只提供高电平和低电平的数字输出端口,以及将数字值转换为模拟输出的模拟输出端口。一个模拟输出的例子可以是来自手机和音乐播放器的音频输出或通过模拟信号的视频。我们还有通信端口,包括基于不同协议的通信端口,如 UART、I2C、SPI 等。输入、输出和通信端口的可用性因设备而异,这取决于它们使用的微控制器或微处理器以及系统的架构。

现在,让我们详细看看 BeagleBone Black 的硬件结构,如下面的图所示:

物理计算系统的基本元素

所以,正如你在前面的框图中所看到的,CPU 由 Sitara AM3358BZCZ 处理器组成,拥有 2 GB 的 eMMC 存储作为只读存储器ROM)和 512 MB 的随机存取存储器RAM),以及不同的外部端口用于接口,如 HDMI 用于视频、USB 客户端用于 USB 通信、RJ45 端口用于互联网接入等。其结构类似于我们熟知的基本计算机,正如我们所知,BeagleBone 板不过是一个带有 GPIO 的单板计算机。扩展头块包含 GPIO,可以根据我们基于处理器上运行的软件如何希望它为我们工作而将其设置为数字输入或数字输出。扩展头还包括模拟输入以读取模拟值。我相信这一部分可能已经给你一个关于物理计算系统基本结构的清晰概念,以及我们的 BeagleBone 板也是以类似的方式构建的。

应用领域

几个物理计算系统应用领域包括几乎所有现代科技小工具和机器,从你的手机、火灾报警器和婴儿监视器,到家庭自动化和工业自动化电子系统,以及家庭和工业中使用的机器人系统。

例如,商场中带有喷淋系统的火灾报警器基本上是通过传感器感应温度和烟雾,一旦检测到火灾事件,它们就会启动喷淋系统,通过管道和泵从水箱中喷水,使用的是持续运行专门编写软件的控制系统来完成这一操作。

同样,家庭自动化系统、连接到互联网的婴儿监视器可以帮助你将家庭电子设备连接到互联网,运行在服务器上的专用人工智能软件程序操作空调、照明和供暖等,从而让你的生活更加便利。类似的用途在工业领域也很常见,其中机器人正在制造业中产生巨大影响,如今许多机器人调酒系统正在使用中。

因此,我希望你现在应该能够清晰地想象出我们周围物理计算系统的存在以及它们是如何工作的。

在接下来的章节中,我们将探讨不同项目的构建以及使用这些扩展头上的端口,包括数字输入和输出以及模拟输入,以感应来自物理世界的输入,并通过在 Python 上编写代码来构建软件,使系统能够根据感应到的输入提供相应的输出。

项目 – 使用按钮切换 LED

现在我们已经清楚地了解了物理计算系统是什么以及它们是如何工作的,让我们继续使用 BeagleBone Black 构建自己的物理计算系统,通过将按钮开关连接到系统作为输入,并将 LED 作为输出。我们编写的软件程序将决定 LED 根据按钮开关的输入做什么。

我们已经知道如何将 LED 连接到 BeagleBone 板,也知道如何用 Python 编程来打开和关闭 LED,就像我们在上一章的项目中实验的那样。在这个项目中,我们将使用我们获得的知识以及我们现在将要学习的内容,在继续构建物理计算系统之前。现在我们知道如何接口 LED,让我们学习如何接口按钮,并使用 Python 从连接到 BeagleBone 板的按钮读取输入值。

首先,将按钮连接到 BeagleBone Black,如图所示:

项目 – 使用按钮切换 LED

一旦您将按钮开关连接到 BeagleBone Black,如图所示,通过开关和电阻将状态拉低到 LOW,当按钮未按下时,让我们继续通过 Python 交互式 shell 读取开关的输入。

拉下和拉上电阻用于保持输入状态,无论是低电平还是高电平输入都作为 GPIO 引脚的输入。您可以在网上进行自己的研究,了解更多关于下拉和上拉电阻的信息。

打开 Python 交互式 shell:

项目 – 使用按钮切换 LED

使用以下代码行导入 GPIO 库:

import Adafruit_BBIO.GPIO as GPIO

项目 – 使用按钮切换 LED

然后,让我们使用以下命令将 BeagleBone Black 的 GPIO P9_27定义为输入引脚,我们将使用该引脚连接开关:

GPIO.setup("P9_27", GPIO.IN)

项目 – 使用按钮切换 LED

接下来,使用以下命令读取 GPIO 的当前状态:

GPIO.input("P9_27")

项目 – 使用按钮切换 LED

这应该会打印出 GPIO P9_27 的当前状态;在前面截图的输出中,它是0。现在设置如图所示,按钮没有被按下;这就是为什么 P9_27 GPIO 的读取值为0的原因:

项目 – 使用按钮切换 LED

当您按下按钮并保持它,然后读取输入时,您将得到1的输入值,如图所示:

项目 – 使用按钮切换 LED

因此,如图所示,当按钮被按下时,将读取的值是1,如图所示在 Python 控制台上:

项目 – 使用按钮切换 LED

现在我们知道了使用哪些基本功能可以读取按钮的输入状态,让我们继续编写 Python 程序,该程序将实时读取按钮状态并每半秒打印一次。

首先,让我们创建一个 Python 文件:

项目 – 使用按钮切换 LED

然后,让我们按照以下截图所示输入程序并保存:

项目 – 使用按钮切换 LED

接下来我们将运行 Python 代码:

项目 – 使用按钮切换 LED

当你运行 Python 代码时,如果你没有按下按钮,输出将如前一个截图所示。

当你按下并保持时,输出将如下截图所示:

项目 – 使用按钮切换 LED

当你再次释放按钮并让它回到原来的位置时,输出将如下截图所示:

项目 – 使用按钮切换 LED

现在,让我们修改代码,使其在每次按下按钮并释放时打印按钮被按下,而不是打印开关的当前状态。将 Python 代码保存为ButtonPress.py

项目 – 使用按钮切换 LED

当你运行代码并按下按钮时,你将得到如下截图所示的输出:

项目 – 使用按钮切换 LED

每次你按下按钮并释放时,你将在 shell 上得到按钮被按下的文本输出。

现在我们已经找到了打印按钮按下事件的逻辑,我们将继续修改这段代码,以便每次按下按钮时都能切换 LED 的开和关状态。

在我们继续编程 BeagleBone Black 以切换 LED 之前,让我们将 LED 连接到 BeagleBone Black,如下所示,包括按钮开关电路图:

项目 – 使用按钮切换 LED

现在,编写程序以在每次按下按钮时交替将 LED 切换到开和关状态,如下截图所示,并将文件保存为ButtonLEDToggle.py或你选择的名称:

项目 – 使用按钮切换 LED

然后,当你运行代码并按下按钮时,你可以看到每次按下按钮时 LED 都会交替开启和关闭。输出将如下截图所示:

项目 – 使用按钮切换 LED

当 LED 关闭,如下所示:

项目 – 使用按钮切换 LED

当你按下按钮并释放时,LED 将点亮,如下所示:

项目 – 使用按钮切换 LED

再次按下按钮时,LED 将切换回关闭状态:

项目 – 使用按钮切换 LED

每次你按下按钮时,这将会交替发生,LED 将切换到高电平和低电平状态。

摘要

我们已经到达了本章的结尾,我们学习了物理计算系统如何工作的基本概念,这是通过这些系统的基本结构以及以 BeagleBone Black 为例来实现的。我们还讨论了现实世界中的几个应用领域。然后,我们看到了如何将按钮开关与 BeagleBone 板连接,并编写 Python 代码通过访问 GPIO 引脚作为 Python 的输入来读取其状态。最后,我们进行了一个非常基础的项目,以了解我们如何构建自己的物理计算系统,该系统能够感知并响应物理世界,使用按钮和 LED 在每次按下按钮时将 LED 从开启切换到关闭状态。

在下一章中,我们将看到如何使用模拟温度传感器构建一个更复杂的物理计算系统,这与从按钮输入读取的数字输入不同。但在你进入下一章之前,我建议你编写不同的程序,利用按钮按下事件让 LED 执行你喜欢的任何操作;例如,你可以计算需要按下多少次按钮,然后根据这个数量,让 LED 闪烁那么多次,然后回到等待下一次点击数量的模式。尝试你脑海中出现的任何想法,并与硬件和编码进行互动。

第四章:使用 BeagleBone 的实时物理计算系统

在本章中,我们将专注于使用 BeagleBone 板构建一个实时物理计算系统。在本章中,我们将把 LM35 温度传感器模块与 BeagleBone Black 连接起来,以便了解如何将传感器与 BeagleBone 板连接,使系统能够与物理世界交互。我们将从传感器周围的物理世界获取环境温度作为模拟输入读数,并编写 BeagleBone 板的代码,使连接到 BeagleBone 板的 LED 根据传感器测量的温度以不同的颜色发光。因此,到本章结束时,你将构建一个使用 BeagleBone 板的交互式物理计算系统,该系统能根据测量的温度输出 LED 指示。本章内容分为以下主题:

  • 前提条件

  • 温度传感器 – LM35

  • 将温度传感器连接到 BeagleBone 板

  • 简单项目:根据温度传感器测量的室内温度改变颜色的双色 LED 指示器

前提条件

本主题将涵盖您开始本章所需的部分。这些可以从您最喜欢的电子业余爱好商店购买,或者可以直接在线订购。

需要的材料

  • 1 个 BeagleBone Black

  • 1 张带有最新版 Debian 操作系统的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1 个 5V DC,2A 电源

  • 1 条以太网线

  • 1 个 LM35 温度传感器

  • 1 个双脚双色 LED

  • 1 个 220 欧姆电阻

  • 1 块面包板

  • 一些公对公跳线

  • 1 个多用电表(可选)

温度传感器

温度传感器只是一个感应周围环境温度并给出传感器输出端电压变化的电子芯片。通过使用它,我们可以计算出被感应的温度。市场上有很多不同类型的传感器,但我们将使用最易获得的,并且是最受业余爱好者欢迎的传感器。这是 LM35 温度传感器模块,它是一个模拟输出传感器,电压可以直接转换为温度值,根据传感器的制造商提供的公式,如传感器数据表所述:

温度传感器

LM35 传感器如何工作?

LM35 温度传感器背后的基本原理是它将传感器周围的周围环境温度按比例转换为模拟电压。

在以下图片中,您可以看到 LM35 温度传感器的引脚终端,其中一个终端是输入,它接收供电输入电压,其余的是输出和地。

LM35 传感器如何工作?

因此,一旦你将电源输入连接到温度传感器并与地连接,就可以测量出相对于地,模拟电压输出端子的模拟电压,如上图所示。

例如,假设测量到的输出端子和地之间的电压为 1 伏特,环境温度为 100 摄氏度,我们可以使用上图中的曲线推断出来。

而且,从 LM35 的数据表中,我们可以推断出每 10mV 与 1 摄氏度成正比。因此,如果我们知道模拟输出电压(mV),我们可以使用以下公式计算摄氏度温度。

温度(°C)= (输出电压(mV)×/ 10)

为了验证温度传感并测试在继续到下一个主题——将传感器与 BeagleBone 板接口之前,传感器是否工作正常,你可以使用万用表测量输出端口的电压,同时为 LM35 温度传感器提供外部电源和公共接地引脚。根据测量的电压,你可以使用之前的公式计算温度。你可以将热或冷的物体靠近传感器或在其上方,以观察电压变化。

使用 LM35 传感器进行温度传感

现在我们已经了解了 LM35 温度传感器的工作原理,让我们继续探讨如何通过将其连接到 BeagleBone 板来测量温度。

首先,取三根 berg 电缆,按照以下图像中显示的电路图将 LM35 温度传感器连接到 BeagleBone 板。

使用 LM35 传感器进行温度传感

然后,我们将打开 BeagleBone 板,然后登录 Linux Shell 以开始编码。我们将访问 WorkSpace 文件夹,在那里我们保存了之前章节中已经创建的所有 Python 脚本。到现在你应该熟悉如何导航到 WorkSpace 目录。

要这样做,输入命令 cd WorkSpace

使用 LM35 传感器进行温度传感

一旦你处于 WorkSpace 目录中,在编写读取温度数据的脚本之前,让我们通过 Python 控制台来测试它,你应该现在已经熟悉了它。

输入命令以启动 Python 交互式编程 shell,sudo python

使用 LM35 传感器进行温度传感

一旦我们进入 Python 交互式 shell,让我们通过输入 import Adafruit_BBIO.ADC as ADC 来导入 Adafruit GPIO 库,以读取 BeagleBone 板上的 ADC 输入。

使用 LM35 传感器进行温度传感

接下来,我们需要初始化 ADC,通过输入以下命令:ADC.setup()

使用 LM35 传感器进行温度传感

要读取连接到温度传感器输出端口的 ADC 读取值 P9_40,使用以下命令:

ADC.read("P9_40")

BeagleBone 板上的 ADC 端口为 12 位,相当于 2¹² = 4096 个单位最大,这些模拟引脚可以提供的最大电压为 1.8 V。这意味着这些引脚的电压输入,从 0 到 1.8V,与 0 到 4096 ADC 单位成比例,但在 Python 中,Adafruit 库给我们提供的读数在 0 到 1 之间,这与 0 到 1.8V 成比例。使用 ADC 读函数读取端口P9_40的 ADC 读数如下所示:

使用 LM35 传感器进行温度传感

因此,您可以看到端口P9_40上的 ADC 读数为0.19445

现在,让我们将其保存到一个变量中,以计算它是多少伏特。让我们创建一个名为reading的变量,并存储如下截图所示的测量 ADC 读数:

使用 LM35 传感器进行温度传感

然后,让我们继续将 ADC 读数转换为毫伏(mV)。我们知道 ADC 能够读取 0 到 1.8V,这在 Python 中与 0 到 1 的 ADC 读数单位成比例,换句话说,1.8 V = 1800 mV。

测量的毫伏数 = (ADC 读数) * 1800

测量电压 = (ADC 读数) * 1.8

也就是说,在我们的情况下,在 Python 控制台中,您可以创建一个名为millivolts的变量,该变量将保存传感器输出引脚相对于地引脚测量的电压,如下截图所示:

使用 LM35 传感器进行温度传感

如前一张截图所示,您将得到传感器输出电压引脚上的电压值(毫伏)。现在,我们可以继续使用我们在本主题开头从数据表中获得的信息的公式,将测量的毫伏数转换为摄氏度。如下截图所示,通过创建一个名为temp_c的变量来保存温度(摄氏度):

使用 LM35 传感器进行温度传感使用 LM35 传感器进行温度传感

如果我们打印temp_c值,我们将得到如前输出所示的结果。

现在,让我们继续编写一个 Python 程序,该程序将每秒打印温度传感器的值。

创建 Python 脚本文件,sudo nano TestLM35.py

使用 LM35 传感器进行温度传感

按如下截图所示输入代码:

使用 LM35 传感器进行温度传感

在输入代码后,您可以使用 Ctrl + X 命令保存它。

当您运行程序时,您应该会看到如下截图所示的输出:

使用 LM35 传感器进行温度传感

因此,在先前的截图中,你可以看到传感器周围的温度(以摄氏度为单位)每秒打印一次。如果你已经成功完成这一步,那么你已经成功将 LM35 温度传感器与 BeagleBone 板和 Python 连接起来。作为与 BeagleBone 板连接和测试 LM35 的进一步步骤,让我们看看 LM35 与 BeagleBone 板连接是否能够检测到温度的上升,方法是将点燃的火柴放在传感器附近。

将点燃的火柴放在传感器附近,如图所示:

使用 LM35 传感器进行温度传感

你可以看到,当你将点燃的火柴靠近温度传感器时,温度读数会上升,如下截图所示:

使用 LM35 传感器进行温度传感

当你将火柴从传感器上移开时,它将再次下降,如下截图所示:

使用 LM35 传感器进行温度传感

因此,现在我们知道了如何将 LM35 温度传感器与 BeagleBone 板连接并读取温度传感器的读数,在本书的下一个主题中,也就是我们的主要项目,让我们通过在 BeagleBone 板上添加双色 LED,使用 Python 编程构建一个实时物理计算系统。

中级项目:根据测量温度改变 LED 颜色:

  1. 按照以下图片连接电路:使用 LM35 传感器进行温度传感

  2. 编写 Python 脚本。

    如我们所知,我们已经学会了如何将温度传感器与 BeagleBone 板连接,以及如何通过 Python 开关 GPIO 的开关来点亮 LED,现在我们将结合这两个之前的实验。让我们编写一个 Python 脚本来根据温度传感器的测量值使 GPIO 处于高电平或低电平。按照以下截图所示,在TestLM35.py文件中写下代码,并将其保存为不同的名称LM35nLED.py

    使用 LM35 传感器进行温度传感

  3. 现在,当你使用命令sudo python LM35nLED.py运行代码时,你应该看到以下结果:使用 LM35 传感器进行温度传感

你的设置应该如下截图所示,在一个环境温度低于 50 摄氏度的房间里:

使用 LM35 传感器进行温度传感

当你执行 Python 程序时,输出将如下所示:

使用 LM35 传感器进行温度传感

当你点燃一根火柴并将其放在传感器前时,输出将如下所示:

使用 LM35 传感器进行温度传感

然后 LED 将变为红色,如图所示:

使用 LM35 传感器进行温度传感

当你将火柴从传感器上移开时,它将变回绿色。

使用 LM35 传感器进行温度传感

现在我们有一个系统,它从物理世界获取输入(传感器周围的周围温度),并根据该输入在环境中改变某些东西,例如 LED 颜色,温度信息打印在 Linux shell 上。这使我们到达了这一章的结尾,我们在这里使用 BeagleBone Black 构建了一个基本的物理计算系统。

摘要

在本章中,我们学习了关于温度传感器以及它们如何与 BeagleBone 板连接以通过将传感器连接到 BeagleBone 板的模拟输入读取引脚来获取温度测量值。然后我们编写了一个代码,根据从 LM35 温度传感器获得的输入做出决策,决策是打开一个连接到双色 LED 的特定 GPIO 引脚,以便根据传感器周围的周围温度改变 LED 的颜色。因此,这样我们就在 BeagleBone Black 上使用 Python 启动了一个实时物理计算系统。但这只是本地计算,决策是基于在本地系统上运行的程序做出的,所有数据都在本地系统中。

现在,在下一章中,我们将继续构建一个更高级的实时物理计算系统,该系统连接到互联网,传感器数据从连接到互联网的 BeagleBone 板发送到云服务器。

第五章. 将物理计算系统连接到互联网

在本章中,我们将专注于将 BeagleBone 板连接到互联网,以便将我们构建的物理计算系统连接到互联网。首先,我们将探讨通过以太网为 BeagleBone 板提供互联网访问,然后我们将学习如何为 BeagleBone 板添加 Wi-Fi 功能,以便我们构建的系统可以放置在任何有 Wi-Fi 访问的地方,并且不受仅在有以太网的地方设置系统的限制。完成这些后,我们将继续构建两个项目;在第一个项目中,我们将通过运行在 BeagleBone 板上的 Python 程序,在温度传感器读数超过设定水平时发送电子邮件警报。下一个项目将是一个基本的物联网入门项目,其中 BeagleBone 板将把温度传感器数据上传到互联网上的云服务器。所以基本上,我们将利用在前几章中学到的知识,在本章中,将我们之前的项目提升到下一个层次。我们将通过将它们连接到互联网,并在云和邮件等消息服务上执行操作来实现这一点。本章内容分为以下主题:

  • 前提条件

  • 为你的 BeagleBone 板提供互联网访问

  • 为你的 BeagleBone 板添加 Wi-Fi

  • 中级项目:电子邮件警报火灾报警器 – 如果温度传感器读数超过设定水平,Python 程序将发送电子邮件

  • 高级项目:传感器数据上传至云端 – 一个 Python 程序将通过 HTTP 网络服务将温度传感器数据上传到开源或免费云服务

前提条件

本主题将涵盖你开始本章所需的部件。这些可以从你喜欢的电子爱好商店购买,或者简单地在线订购。

需要的材料

在继续前进之前,我们需要以下材料:

  • 1x BeagleBone Black

  • 1x 带有最新版本 Debian 操作系统的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1x 5V DC,2A 电源供应器

  • 1x 网线

  • 1x LM35 温度传感器

  • 1x 兼容的 Wi-Fi 拓展卡

  • 1x 面包板

  • 几根跳线

为你的 BeagleBone 板提供互联网访问

通过以太网为 BeagleBone 板提供互联网访问非常简单。你只需要将网线的一端连接到 BeagleBone 板,另一端连接到有互联网连接的路由器。BeagleBone 板将通过 DHCP 从路由器动态获取 IP 地址并获取互联网访问。为了检查这一点,你只需输入以下命令:

ping www.google.com

你将获得以下截图所示的响应。这意味着你有一个正常工作的互联网连接。

为你的 BeagleBone 板提供互联网访问

实际上,ping 命令的作用是测试两个网络连接之间的连接和延迟。ping 命令向另一台网络计算机发送数据包,在我们的例子中是www.google.com服务器,或者该服务器的 IP 地址。你可以在上面的输出中看到www.google.com旁边,显示的是服务器的全球 IP 地址。图片显示了 ping 命令如何测量从该服务器计算机获得响应所需的时间,时间以毫秒为单位。

因此,为 BeagleBone 板提供互联网访问非常简单,运行一个像 Linux 这样的工作操作系统。这将自动从连接的互联网路由器通过 DHCP 获取 IP 地址。但在大多数情况下,我们需要一个设置,其中实时嵌入式系统是无线连接的,这为将系统放置在任何地方进行操作提供了更多灵活性,而不是将设置限制为连接到以太网电缆。本章的下一个主题将重点介绍如何设置 Wi-Fi 访问 BeagleBone 板。

将 Wi-Fi 添加到 BeagleBone 板

要将 Wi-Fi 功能添加到 BeagleBone 板,让我们将 Wi-Fi 适配器连接到 BeagleBone 板上可用的 USB 端口,如下面图片所示:

将 Wi-Fi 添加到 BeagleBone 板

一旦你连接了 USB Wi-Fi 适配器,你可以通过输入以下命令来检查它是否已连接:

  • lsusb:如下面截图所示,USB Wi-Fi 适配器被突出显示,即Atheros Communications, Inc. AR9271 802.11n将 Wi-Fi 添加到 BeagleBone 板

然后输入以下命令:

  • iwconfigiwconfig将显示无线局域网连接状态的详细信息,如前一个截图所示,你可以看到被突出显示的 wlan1 目前没有与任何接入点关联的详细信息。

我们下一步是连接 Wi-Fi 适配器到 Wi-Fi 接入点。为此,我们将使用一个名为wicd-curses的程序,该程序在 Debian 中默认可用。

要使用该程序,我们需要输入以下命令:

  • sudo wicd-curses将 Wi-Fi 添加到 BeagleBone 板

执行命令后,你将得到一个如下截图所示的交互式程序窗口:

将 Wi-Fi 添加到 BeagleBone 板

你可以在前面的截图看到,程序指出没有找到无线网络。这是因为我们需要首先设置 USB Wi-Fi 设备,然后在该范围内搜索可用的 Wi-Fi 接入点。为此,请按照以下截图所示的步骤进行操作:

按下 Tab 键一次以打开配置菜单,– 你应该会看到以下截图所示的屏幕:

将 Wi-Fi 添加到 BeagleBone 板

一旦您看到这个屏幕,然后按一次翻页向上按钮——它应该会高亮无线接口区域,然后您需要在其中输入wlan1,如下截图所示。如果您还记得,wlan1是我们使用iwconfig命令获取由 USB Wi-Fi 网卡创建的接口详细信息时看到的接口名称。

将 Wi-Fi 添加到 BeagleBone 板

然后,按F10键保存配置。一旦保存,它将带您回到如下截图所示的前一个主屏幕:

将 Wi-Fi 添加到 BeagleBone 板

现在,您需要按一次R键来刷新程序并搜索 Wi-Fi 网卡可连接范围内的可用 Wi-Fi 接入点。按下R键后,您将看到一个如下截图所示的屏幕,表示正在搜索可用网络:

将 Wi-Fi 添加到 BeagleBone 板

然后,扫描完成后,屏幕将显示如下截图所示的界面,列出范围内的可用 Wi-Fi 接入点:

将 Wi-Fi 添加到 BeagleBone 板

一旦您有了可用 Wi-Fi 接入点的列表,您可以通过使用上下箭头键选择要连接的接入点。如以下截图所示,当您移动箭头键时,接入点会高亮显示。在这张图片中,TERO被高亮:

将 Wi-Fi 添加到 BeagleBone 板

一旦您选择了想要连接的网络,当它被高亮显示,如前图所示,请按键盘上的右箭头键,您应该会看到如下截图所示的屏幕,要求输入密码进行连接:

将 Wi-Fi 添加到 BeagleBone 板

您需要设置如下截图所示的选项,以便从路由器获取基于 DHCP 的 IP 分配,或者如果您想为您的 BeagleBone 板设置静态 IP,也可以这样做。使用Tab键在屏幕上切换字段。

将 Wi-Fi 添加到 BeagleBone 板

因此,根据前述截图设置主机名并在密钥字段中输入密码,然后按F10键保存。完成这些操作后,您将回到主屏幕,显示可用的 Wi-Fi 接入点列表,如下截图所示:

将 Wi-Fi 添加到 BeagleBone 板

现在,你可以按C键连接到网络。一旦按下,你的 shell 连接将会丢失,因为 BeagleBone 板将通过你登录的以太网连接断开网络连接。现在,BeagleBone 板将通过 Wi-Fi 连接到网络,因此 BeagleBone 板的 IP 地址必须已更改。为了检查这一点,我们需要登录到与连接 Wi-Fi 时相同的路由器的路由器配置页面。回想一下我们在第一章中是如何找到通过以太网连接到路由器的 BeagleBone 板的 IP 地址的。现在我们需要用 Wi-Fi 连接来做同样的事情。

按照以下方式打开路由器页面:

将 Wi-Fi 添加到 BeagleBone 板

检查 DHCP 客户端列表:

将 Wi-Fi 添加到 BeagleBone 板

因此,你可以看到通过 Wi-Fi 连接到网络的 BeagleBone 板的 IP 地址,如果你还记得,BeagleBone 是我们配置 Wi-Fi 时提到的主机名。现在让我们使用我们分配的新 IP 地址登录到 Linux shell:

将 Wi-Fi 添加到 BeagleBone 板

一旦使用相同的用户 ID 和密码登录,再次输入命令iwconfig,你将看到 wlan1 连接到了我们配置并连接的 SSID,你可以在下面的屏幕截图中看到:

将 Wi-Fi 添加到 BeagleBone 板

现在输入ping命令来检查网络连接性:

将 Wi-Fi 添加到 BeagleBone 板

一旦我们在 BeagleBone 板上正确地建立了网络连接,我们就可以继续下一个主题:两个与互联网连接的项目。

中级项目:电子邮件警报火灾报警器

首先,就像上一章一样,拿三根伯格线,按照以下电路图将 LM35 温度传感器连接到 BeagleBone 板:

中级项目:电子邮件警报火灾报警器

然后我们将打开 BeagleBone 板并登录到 Linux shell 以开始编写代码。

打开 Python 控制台,学习并测试如何使用 Python 发送电子邮件:

中级项目:电子邮件警报火灾报警器

我们的第一步是将smtplib导入 Python,这是一个预定义函数的邮件传输协议库,我们将在程序中使用它。

中级项目:电子邮件警报火灾报警器

接下来创建一个变量来存储你想要发送电子邮件的电子邮件 ID:

中级项目:电子邮件警报火灾报警器

然后创建变量以存储你想要发送电子邮件的账户的电子邮件 ID 和密码:

中级项目:电子邮件警报火灾报警器

使用 Gmail 主机名和端口号587创建一个 SMTP 对象:

中级项目:电子邮件警报火灾报警器

EHLO 与 HELO 类似,但服务器的响应文本提供了关于服务器能力的计算机可读信息。这个响应有助于我们确认我们创建的 SMTP 服务器是否为我们提供服务:

中级项目:电子邮件警报火灾报警器

接下来,我们需要创建一个安全连接。我们已经在最后一步检查了连接,但它是不安全的。STARTTLS 是一种将现有不安全连接升级为安全连接的方法,使用 SSL/TLS。你可以按照以下截图所示进行操作:

中级项目:电子邮件警报火灾报警器

再次使用下图所示的 EHLO 来检查和创建运行中的 SMTP 实例:

中级项目:电子邮件警报火灾报警器

我们的下一步是创建一个包含发件人电子邮件地址、收件人电子邮件地址和电子邮件主题详细信息的头变量:

中级项目:电子邮件警报火灾报警器

我们需要创建另一个变量,我们将在这个变量中添加即将发送的电子邮件的消息头。

当你使用print msg命令打印出来时,你可以看到它如下截图所示的样子:

中级项目:电子邮件警报火灾报警器

现在我们有了msg变量,其中包含了发件人电子邮件、收件人电子邮件、电子邮件主题和电子邮件消息的信息,如下面的截图所示。

我们的下一步是使用发件人电子邮件和密码登录到服务器。你可以按照以下截图所示进行操作:

中级项目:电子邮件警报火灾报警器

如果你得到如前截图所示的响应,那么你已经成功登录。

接下来,使用sendmail函数,通过接收者电子邮件 ID、发件人电子邮件 ID 和消息作为参数发送电子邮件:

中级项目:电子邮件警报火灾报警器

发送后,你可以继续关闭 SMTP 服务器并从其中注销,如下所示:

中级项目:电子邮件警报火灾报警器

到目前为止,你一定已经收到了收件人电子邮件 ID 上的电子邮件,你可以看到主题Python Email Test,正如我们在 Python 中提到的,如下截图所示:

中级项目:电子邮件警报火灾报警器

如果你打开电子邮件,你可以看到这条消息:

中级项目:电子邮件警报火灾报警器

我们实际上可以看到消息内容与我们在 Python 控制台上打印的内容格式相似。点击 Gmail 上的显示原始内容选项,查看原始文本电子邮件,如图所示:

中级项目:电子邮件警报火灾报警器

一旦点击显示原始内容,你将看到如图所示的电子邮件:

中级项目:电子邮件警报火灾报警器

你可以看到邮件中高亮的部分,与我们从 Python 控制台组成并发送的消息完全相同,如图所示:

中级项目:电子邮件警报火灾报警器

你现在可以退出 Python 控制台:

中级项目:电子邮件警报火灾报警器

现在让我们继续编写 Python 程序,以便在温度过高时发送电子邮件。你可以直接编辑上一章项目中的代码,并保存为新的名称,如图所示:

中级项目:电子邮件警报火灾报警器

保存后,你可以按照以下截图所示运行代码:

中级项目:电子邮件警报火灾报警器

你现在应该会收到一封电子邮件,如图所示:

中级项目:电子邮件警报火灾报警器

将火焰靠近传感器,如图所示:

中级项目:电子邮件警报火灾报警器

运行中的 Python 代码输出将如图所示:

中级项目:电子邮件警报火灾报警器

你将收到如图所示的电子邮件:

中级项目:电子邮件警报火灾报警器

因此,我们的项目就结束了。当你移除火焰时,它将再次发送一封电子邮件,说明温度正常。以下是代码的工作原理:当温度水平发生变化时,也就是说,如果温度超过或低于设定的限制,它将发送一封电子邮件,说明温度过高或过低。

与本项目不同,本项目是通过使用温度传感器测量的温度来做出决策,然后根据这个决策发送电子邮件,下一个项目将直接将温度传感器数据上传到云服务器。

高级项目:将传感器数据上传到网络云

连接方式与上一个项目类似,唯一的区别是编写一个新的 Python 程序,使用 HTTP 调用方法将数据上传到免费云服务器。

使用与上一个项目相同的连接,将温度传感器连接到 BeagleBone 板。

然后,我们首先需要设置需要上传数据的云服务器。我们将使用专门为物联网应用设置的免费云存储空间网站。该网站是www.thingspeak.com,我们从众多可用的云解决方案中选择使用这个云解决方案,因为 ThingSpeak 使得从硬件上传数据到云用于物联网应用变得非常简单。他们有很多用于不同应用的、不同硬件开发板的示例。查看这些广泛的示例和简单的 API 将帮助您在使用 BeagleBone 板时进行更多的实验,比我们在本章中做的还要多。

高级项目:将传感器数据上传到网络云

在这个网站上,您需要做的第一件事是注册并创建一个账户:

高级项目:将传感器数据上传到网络云

一旦创建了账户,并且您可以登录到您的账户,您将看到以下屏幕截图所示的界面,并且需要点击新建频道

高级项目:将传感器数据上传到网络云

当您点击新建频道时,它将要求您填写相同的详细信息。按照以下屏幕截图所示填写:

高级项目:将传感器数据上传到网络云

一旦输入了详细信息,您就可以点击保存频道

高级项目:将传感器数据上传到网络云

您可以在以下屏幕截图中看到具有所示字段的频道:

高级项目:将传感器数据上传到网络云

接下来,我们应该查看 ThingSpeak 网站提供的 API,用于将数据更新到云服务器。

您可以在以下屏幕截图中查看您需要发送到 ThingSpeak 服务器的 HTTP 调用的 API 详细信息:

高级项目:将传感器数据上传到网络云

如前一个屏幕截图所示,我们可以使用 HTTP POST 数据更新云服务器上的数据。接下来的步骤将向您展示如何使用这个 HTTP POST 调用从 Python 更新云服务器上的数据:

首先,打开 Python 交互式控制台:

高级项目:将传感器数据上传到网络云

然后我们需要导入requests模块,这是一个 Python 库,它具有在 webservers 上执行 HTTP 请求的内置函数:

高级项目:将传感器数据上传到网络云

接下来,我们可以直接尝试使用以下屏幕截图所示的 API 直接向服务器发送 HTTP POST 请求:

高级项目:将传感器数据上传到网络云

突出显示的部分是在您向https://api.thingspeak.com/update.json URL 进行 POST 调用时传递给服务器的参数。

你可以看到我们提到了field1=25,这将更新到 ThingSpeak 服务器上。

响应将被存储在变量r中,当你print r时,如果你收到200的响应,那么数据已成功更新:

高级项目:将传感器数据上传到网络云

一旦你收到200的响应,数据就像以下截图所示已更新到网络服务器上:

高级项目:将传感器数据上传到网络云

使用field1数据等于10执行 HTTP POST 调用:

高级项目:将传感器数据上传到网络云

然后,你可以看到 field1 在该时间点已更新为新数据:

高级项目:将传感器数据上传到网络云

现在,我们将继续编写代码以连续更新温度数据到云服务器。我们可以使用我们的TestLM35.py代码对其进行修改,并以新名称保存,以便每 61 秒将温度数据更新到thingspeak.com/服务器:

高级项目:将传感器数据上传到网络云

当你运行程序时,输出将如以下截图所示:

高级项目:将传感器数据上传到网络云

你可以使用Ctrl + C来结束程序并退出。

然后,如果你在 ThingSpeak 网站上的 field1 图表中查看数据,你可以看到数据已如以下图片所示更新。你可以看到时间戳,并看到两次数据更新实例之间的间隔为 1 分钟,温度读数值也与我们打印在控制台输出上的一致:

高级项目:将传感器数据上传到网络云

因此,我们已经成功编写了一个程序,每分钟更新数据并将其存储在云服务器上。

摘要

在本章中,我们学习了如何通过 Wi-Fi 为 BeagleBone 板提供互联网接入,以及当通过连接到 BeagleBone 板的温度传感器测量的温度高于或低于程序中设置的阈值时,发送电子邮件警报。我们还看到了如何使用 Python 从 BeagleBone 板向服务器发送 HTTP 请求来上传数据到云网络服务器。因此,在本章中我们学习了如何设置基本级别的物联网项目。你可以继续探索使用 Python 的requests模块在物联网中使用的各种免费开源云服务器上的 HTTP Put、Post 和 Get 请求的选项,这些服务器就像我们本章使用的thingspeak.com/一样。有选项可以让你在不需要使用 HTTP POST 请求上传数据的情况下从云服务器获取数据;也就是说,你可以从云服务器读取数据并在 Python 程序中打印它。你可以像本章中那样读取服务器上的数据而不是上传数据,我建议你探索所有这样的可能性。

在下一章中,我们将继续设置我们自己的网络服务器并将其连接到互联网。一旦你学会了这一点,将来如果你可以使用一块 BeagleBone 板作为网络服务器,而不是本章中使用的第三方服务器,另一块 BeagleBone 板可能正在使用另一块 BeagleBone 板上传数据到我们设置的服务器。

第六章:使用 BeagleBone 进行家庭自动化

在本章中,我们将学习如何使用 BeagleBone Black 构建家庭自动化系统。要开始,我们首先将学习关于互联网连接的家庭自动化系统以及它们是如何工作的。然后,我们将继续设置 Python Flask 库,它允许你使用 Python 在 BeagleBone Black 上运行 HTTP 服务器。

一旦我们在 Python 上使用 Flask 库运行服务器,我们将使用它来创建一个程序,你可以通过服务器创建的网页输入来打开和关闭 GPIO。这个 GPIO 引脚将用于打开和关闭一个电继电器来开关灯泡。

本章内容分为以下几部分:

  • 前提条件

  • 家庭自动化系统的结构

  • 网络服务器简介

  • Python Flask 简介

  • 在 BeagleBone 板上设置 Python Flask

  • 使用 Flask 创建网络服务器

  • 晶体管、继电器和电源开关

  • 高级项目:互联网控制电源开关 – 从互联网控制交流灯泡

前提条件

本主题将涵盖本章中你需要哪些部分。你可以从任何电器店或在线购买。

需要的材料

  • 1x BeagleBone Black

  • 1x 带有最新版本 Debian 的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1x 5V DC,2A 电源

  • 1x 以太网线

  • 1x 面包板

  • 1x 继电器板

家庭自动化系统结构

本节将为你提供一个关于连接到互联网的家庭自动化系统的基本概念。在下面的图片中,你可以看到移动电话和物联网设备通过局域网路由器连接到互联网:

家庭自动化系统结构

在本章中,我们也将使用 BeagleBone 板来做类似的事情,通过我们的家庭路由器连接到互联网,使用与 BeagleBone 板接口的继电器电路来控制交流灯泡。为此,我们将在 BeagleBone 板上设置一个 web 服务器。我们将在本章的下一个主题中看到如何做到这一点。

网络服务器简介

网络服务器是连接到互联网或内网的计算机,用于服务来自客户端计算机或移动设备的网络浏览器的请求。为了更好地理解这一点,请看下面的图片:

网络服务器简介

因此,如图所示,web 服务器基本上是托管网页并基于从客户端设备上的网络浏览器发送的请求进行处理的计算机。客户端设备可以是 PC、笔记本电脑、移动电话、平板电脑或任何其他具有网络浏览器的设备,或者是一个可以发出 HTTP 请求的 Linux shell。

仔细看看下面的图片,以更好地理解这一点:

网络服务器简介

现在您可以看到多个客户端通过互联网连接到多个服务器,这就是万维网WWW),TCP/IP 网络

什么是 TCP/IP?当你在浏览器中输入 URL 并按回车键时,究竟发生了什么?

看看下面的图片来了解更多信息:

Web 服务器简介

类似地,在我们的系统中,我们有一个 Web 服务器,它执行前面图片中显示的所有过程。有一点不同,我们的网页将能够控制 AC 灯泡。现在,既然我们知道了 Web 服务器的工作原理,让我们继续在 BeagleBone 板上使用 Flask Python 设置一个 Web 服务器。

Python-Flask 在 BeagleBone Black 上

Flask 是一个用于设置 Web 服务器的 Python 框架。在本主题中,我们将探讨如何使用 Python 在 BeagleBone Black 上设置 Web 服务器。要开始,我们需要在 BeagleBone Black 上从 Python 包索引安装 Python-Flask 包。以下步骤将指导您如何设置 Flask 并测试它,然后编写 Python 代码将其与继电器电路接口。我们将在下一主题中看到这一点,然后在本章的最后一个主题中,我们将看到从互联网控制 AC 灯泡的主要项目:

第 1 步:按照以下步骤安装 PIP:

  • sudo apt-get install python-pip

    你应该能看到它已经被安装了,因为我们已经安装了最新的 Debian 版本,并且它已经在版本中可用。其他一些版本可能没有这个功能,如果没有可用,则会安装,如果当前操作系统中安装的版本有更新,则会升级。

    Python-Flask on BeagleBone Black

    PIP 安装并管理用 Python 编写的软件包。许多软件包可以在Python 包索引PyPI)中找到。

第 2 步:按照以下步骤安装 Flask-Python 库:

  • sudo pip install flaskPython-Flask on BeagleBone Black

创建一个基本的 Web 应用程序来测试是否成功安装了包,如下所示:

第 1 步:在您的 BeagleBone Black 上创建一个目录:

  • mkdir HomeAutomationPython-Flask on BeagleBone Black

第 2 步:切换到您创建的目录:

  • cd HomeAutomationPython-Flask on BeagleBone Black

第 3 步:创建一个 Python 文件并编写以下代码来设置一个打印 Hello World 网页服务器的服务器:

  • nano WebApp.pyPython-Flask on BeagleBone Black

现在按照以下所示在您创建的文件中输入代码并保存:

Python-Flask on BeagleBone Black

第 4 步:按照以下步骤运行 Python 程序:

  • sudo python WebApp.pyPython-Flask on BeagleBone Black

如果您看到的前面图片中的输出,那么您已经正确完成了前面的步骤,我们已经在 BeagleBone 板上启动并运行了一个服务器。

现在通过打开连接到同一局域网(与 BeagleBone 连接的局域网)的 PC 或手机上的网页来打开我们在 BeagleBone 板上运行的网络服务器。为了做到这一点,输入以下内容:BeagleBone 板的 IP 地址:5000,所以,在我的情况下,它将是浏览器地址栏上的 192.168.1.20:5000,其中 5000 是 Python-Flask 路由其连接的默认端口号。你可以将其更改为不同的端口号。在网络上了解更多关于不同网络服务器端口的详细信息。

当你从浏览器调用服务器时,你应该会看到类似下面的内容:

Python-Flask 在 BeagleBone Black 上

你还将能够看到浏览器在 BeagleBone 服务器上发出的请求调用,如下面的截图所示:

Python-Flask 在 BeagleBone Black 上

Ctrl + C 来停止它:

Python-Flask 在 BeagleBone Black 上

现在我们用 Python-Flask 通过回显一行文本做了一件非常基础的事情。

让我们继续使用 HTML 布局做一些事情,使网页看起来更好。为此,在家庭自动化目录内创建一个名为 templates 的目录:

  • mkdir templatesPython-Flask 在 BeagleBone Black 上

切换到你创建的新模板目录,以便在其中创建和保存 HTML 文件:

  • cd templatesPython-Flask 在 BeagleBone Black 上

因此,这个目录将是您找到 HTML 和 CSS 文件的地方,通过这些文件可以将网络服务器路由到客户端设备浏览器的请求。

现在,让我们继续在这个目录内创建一个 HTML 页面,如下面的截图所示:

  • nano index.htmlPython-Flask 在 BeagleBone Black 上

当你在 HTML 文件中输入内容完成,如图所示,你可以通过按 Ctrl + X 来保存文件。保存后,继续切换回家庭自动化目录:

  • cd ..Python-Flask 在 BeagleBone Black 上

现在我们需要编写一个不同的程序来将网络服务器路由到我们创建的 HTML 文件。而不是从头开始编写,让我们修改之前创建的 WebApp.py 文件,并将其保存为 WebAppFromTemplate.py,因为大部分代码行都是相同的。如下面的截图所示:

Python-Flask 在 BeagleBone Black 上

一旦你编辑了文件并将其保存为 WebAppFromTemplate.py,你可以继续运行以下代码:

  • sudo python WebAppFromTemplate.py

再次,让我们打开浏览器中的 URL 并检查输出。你应该会看到类似于下面图片所示的网页:

Python-Flask 在 BeagleBone Black 上

现在您可以看到文本Webpage from a template!是使用 HTML 格式化的,并且您可以看到它作为一个基于 HTML 的网页。

和上次一样,您将看到浏览器为调试 shell 发出的 HTTP 调用:

Python-Flask on BeagleBone Black

对于本章中我们控制来自互联网的交流灯泡的项目,我们应该在网页上放置按钮,而不是之前显示的纯文本。

为了在 HTML 页面上放置按钮,我们需要编写网页模板的 HTML 代码,同样,我们也应该编写 Python 代码来读取网页上按钮点击时的输入。我们可以使用这些输入通过 Python 代码来改变 BeagleBone Black 上 GPIO 的状态。

我们将在本章的项目部分详细探讨如何从 HTML 按钮点击输入中切换 GPIO 状态。在此之前,作为这个主题的最后一部分,让我们创建一个带有按钮输入的 HTML 页面,当这些输入被触发时读取它们,并打印出特定按钮被点击的文本。网页上将有两个按钮,它们将是ONOFF。无论哪个按钮在网页上被点击,Python 代码都会打印出该按钮被点击的信息。让我们继续做吧。

首先,切换回模板文件夹,创建一个名为main.html的文件,其内容如以下截图所示:

Python-Flask on BeagleBone Black

现在您可以看到它有两个带有 ID 的按钮元素。

完成创建此文件后,保存它并返回到智能家居目录,根据以下截图编辑文件WebAppFromTemplate.py,并将其保存为ControlWebApp.py

Python-Flask on BeagleBone Black

保存后,您可以继续运行程序,如下所示:

  • sudo python ControlWebApp.pyPython-Flask on BeagleBone Black

现在您可以打开网页,看看它的样子。您应该会看到以下截图类似的内容:

Python-Flask on BeagleBone Black

当您点击ON按钮时,您应该会看到以下截图类似的内容:

Python-Flask on BeagleBone Black

输出如下:

Python-Flask on BeagleBone Black

当您点击OFF按钮时,您应该会看到以下截图类似的内容:

Python-Flask on BeagleBone Black

因此,我们现在有一个程序可以打印出哪个按钮被点击了。我们只需要编写一个程序,在网页上按下按钮时,将 BeagleBone Black 上可用的 GPIO 的状态改变为高和低。我们将在本章的项目主题中这样做。在这样做之前,在本章的主题中,我们将学习继电器电路是如何工作的,以及我们如何使用从 BeagleBone Black 的 GPIO 引脚获得的非常低的电压来切换继电器电路。这样我们就能使用继电器来开关交流灯泡。

晶体管、继电器、电源开关

因此,基本上,要切换交流电器或任何电路,你需要一个开关,就像你在家里有的那样,你有一个开关来打开灯或风扇。涉及的基本电路看起来非常像下面的图片:

晶体管、继电器、电源开关

因此,正如我们可以在前面的图片中看到的那样,如果你切换开关,它将打开和关闭电路。这反过来会使灯泡关闭和开启。但这在普通机械开关中是机械完成的。

每当我们想要执行相同的动作时,我们都会使用电控开关,这些开关位于电气继电器上。下面的图片显示了电气继电器在开启和关闭状态下的图像:

晶体管、继电器、电源开关

在前面的图中,你可以看到,当电源从3V电源供给线圈时,线圈被激活并像磁铁一样拉动端子向下。这连接了另一个端子并闭合了电路,电流从6V电池流向直流灯。你可以在前面的图像中的图 2 中看到这个动作。而当线圈失电时,如图 1 所示,端子保持开放,这切断了电路并使其打开,因此灯处于关闭状态,因为没有电流通过电路。再次,在前面的例子中,你可以看到使用机械开关来切换低压供电(3V),而电气继电器则切换高压供电。

通常容易获得的继电器是 5V 直流供电的,其中线圈激活所需的电压是 5V,以及足够的电流供应。但 BeagleBone 板上可用的 GPIO 在 HIGH 状态下为 3.3V,在 LOW 状态下为 0V。我们将在其中间使用一个新的电子元件来切换低压供电,这个元件是晶体管。我不会深入讲解晶体管类型及其工作原理的细节。你可以浏览一下,详细了解它。但在基本术语中,当晶体管的基极供电时,它就是一个电子控制的开关,即导通通过集电极和发射极;当晶体管的基极为低,即关闭时,没有导通发生。

观察以下图表,了解当使用继电器为 AC 灯泡建立连接时,我们的电路将如何通过晶体管与继电器接口:

晶体管、继电器、电源开关

因此,每当基极驱动器打开,即高电平时,它将打开继电器;而每当晶体管的基极关闭,或低电平时,它将关闭继电器,进而关闭 AC 灯泡。

您可以直接将晶体管的基极连接到 BeagleBone 板的 GPIO 上,这样当 GPIO 引脚为高电平时,晶体管将打开,当 GPIO 引脚为低电平时,晶体管将关闭。

有现成的继电器板,带有晶体管和继电器。您可以直接将这些与 BeagleBone 板或其他任何微控制器板接口,如下面图片所示:

晶体管、继电器、电源开关

获得这些之一将使您的工作变得简单,但如果您想自己制作,也可以通过在互联网上搜索来实现。为了使下一步更容易,我获得了一个现成的模块,并将其接口连接到 BeagleBone Black 的 GPIO 上。连接相当直接,如前图所示。继电器模块的 D1 连接到 GPIO_60,即 P9_12,Vcc 连接到 BeagleBone Black 的 5V,继电器模块的 Gnd 引脚连接到继电器模块的 Gnd 引脚。通过继电器的 K1 NO 和 C 端子将 AC 灯泡的相线和零线连接到继电器,因为 D1 输入对应于模块中 K1 继电器的切换。

晶体管、继电器、电源开关

您可以通过查看上面给出的电路图来获得更多关于电路连接的详细信息。

晶体管、继电器、电源开关

一旦完成电路连接,使用我们在第二章中使用的闪烁代码来测试继电器是否能够打开和关闭,或者继续到下一个主题,编写从网页控制电路的代码。

高级项目:互联网控制电源开关 – 从互联网控制 AC 灯泡

现在我们已经从上一个主题中设置了电路,我们将用 Python 编写代码来从网页切换 GPIO 到高电平和低电平。您可以继续编写如下截图所示的代码:

高级项目:互联网控制电源开关 – 从互联网控制 AC 灯泡

现在将文件保存为 GPIOControlWebApp.py

让我们运行代码来开关灯泡,然后从 Android 平板电脑打开页面。该平板电脑连接到与 BeagleBone 板相同的 LAN Wi-Fi 路由器。点击开关按钮,您将在以下截图所示的 shell 终端中看到输出:

高级项目:互联网控制电源开关 – 从互联网控制 AC 灯泡

灯泡将像以下图片所示那样开关:

高级项目:互联网控制电源开关 – 从互联网控制 AC 灯泡

灯泡处于关闭状态

高级项目:互联网控制电源开关 – 从互联网控制 AC 灯泡

灯泡处于开启状态

但现在,我们只是在我们的本地网络内,在我们的家庭路由器 LAN 网络中进行此操作,BeagleBone 板连接到这个网络。如果我们想通过手机上的 3G 连接来控制灯泡怎么办?在这种情况下,你需要将你的 BeagleBone Black 路由并从你的手机通过互联网连接到它,你的手机通过 3G 连接到互联网。如果你回到本章的 Web 服务器主题,你可以看到有很多路由器、DNS 网关在客户端和服务器之间连接到互联网的任一端。在我们的情况下,我们的 BeagleBone 板设备本身正在充当服务器。我们只是将路由器的端口转发设置好,将路由器公共 IP 地址收到的请求重定向到 BeagleBone Black 托管服务器的特定端口,即 5000,在我们的例子中,这是 Python-Flask 路由请求的默认端口。所以,让我们继续进行端口转发,通过互联网服务提供商分配给我们的路由器的公网 IP 地址来访问 BeagleBone 板上的 Web 服务器。

设置端口转发

按照以下步骤设置端口转发:

  1. 正如我们在第一章开始使用 BeagleBone中做的那样,登录到你的路由器配置页面:设置端口转发

  2. 前往高级设置:设置端口转发

  3. 前往高级设置设置端口转发

  4. 点击端口转发设置端口转发

  5. 点击添加自定义服务。你将看到如下截图所示的页面:设置端口转发

填写详细信息,然后通过点击应用来保存配置:

设置端口转发设置端口转发

完成这些操作后,去谷歌搜索“我的 IP 是什么?”这将检查你的公网 IP 地址,你应该会得到如下截图所示的输出:

设置端口转发

一旦你有了这个,拿出你的手机并连接到 3G,使用这个公网 IP 地址加上端口号5000来访问你的 BeagleBone 板。这将允许你通过手机开关 AC 灯泡。你将看到一个如下截图所示的网页:

设置端口转发

现在,你可以将网络链接183.82.111.33:5000提供给任何连接到互联网的人,以便他们可以访问你的 BeagleBone 板,并从世界任何地方控制灯泡。这样,你的家庭自动化系统就已经连接到互联网了。你也可以称之为在本章结束时你已经构建了自己的物联网项目。尝试自己控制两个电器,更改 HTML 网页的风格,并为网页添加颜色和控制图形,以学习和获得更多乐趣。

摘要

在本章中,我们学习了如何通过互联网设置我们自己的家庭自动化系统,其中空调灯泡可以从世界任何地方通过互联网进行控制。在构建它的过程中,我们学习了如何在 BeagleBone 板上使用 Python-Flask 网络框架设置一个网络服务器。然后我们还学习了如何使用继电器电路将交流电路与 BeagleBone 板连接起来,通过运行在 BeagleBone 板上的网络服务器来控制交流灯泡。通过这种方式,你已经在本章中构建了一个高级的物联网项目。在下一章中,我们将探讨如何将摄像头与 BeagleBone Black 连接起来,并在 BeagleBone Black 上使用 OpenCV 进行图像处理。

第七章. 使用计算机视觉处理图像

在本章中,我们将开始将 USB 摄像头与 BeagleBone 板接口,并使用 OpenCV 从摄像头捕获图像。我们将首先安装 OpenCV,然后继续使用 OpenCV 和 Python 捕获图像。

我们将深入探讨本章中给出的主题:

  • 前提条件

  • 将 USB 摄像头添加到 BeagleBone Black

  • OpenCV 简介

  • 使用 Python 和 OpenCV 一起

  • 使用 Python 和 OpenCV 从摄像头捕获图像

前提条件

本节将介绍在本章中你需要哪些部件。这些部件都可以在网上购买。

我们将需要以下材料开始:

  • 1x BeagleBone Black

  • 1x 带有最新版本 Debian 的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1x 5V DC,2A 电源

  • 1x 以太网线

  • 1x USB 摄像头

需要的材料

  • 1x BeagleBone Black

  • 1x 带有最新版本 Debian 的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1x 5V DC,2A 电源

  • 1x 以太网线

  • 1x USB 摄像头

将 USB 摄像头添加到 BeagleBone 板

将 USB 摄像头添加到 BeagleBone 板非常简单。你所需要做的就是获取一个与 Linux 兼容的 USB 摄像头,也就是有 Linux 驱动程序的摄像头。如今,几乎所有的 USB 网络摄像头都带有这种支持。如果你有一个非常旧的 USB 网络摄像头,你想与 BeagleBone 板接口,你可能需要添加一些额外的步骤来安装设备驱动程序,以便在 BeagleBone 板的 Linux 设备列表上看到你的视频摄像头元素。对于这个主题解释,我使用了如图所示的 Logitech C270 HD 网络摄像头:

将 USB 摄像头添加到 BeagleBone 板

你可以使用 BeagleBone 板上的 USB 端口,如图所示连接 USB 摄像头:

将 USB 摄像头添加到 BeagleBone 板

使用我们之前烧录的 Debian 在 MicroSD 卡上启动 BeagleBone 板,并通过 SSH 登录到 BeagleBone 板。现在输入命令 Lsusb,如图所示:

将 USB 摄像头添加到 BeagleBone 板

如果你能在设备列表中看到网络摄像头,这意味着摄像头已通过 USB 正确连接到 BeagleBone 板。

然后,检查 Linux 内核中是否为摄像头提供了驱动程序,以及它是否已成功接口,并在 Debian 设备列表中创建了一个视频输入元素。让我们更改目录到 dev 目录 cd /dev,然后 ls。如果你看到列表上列出了video0,那么你可以假设一切顺利,USB 网络摄像头已成功与 BeagleBone 板接口。我们现在有一个可以用于 OpenCV 或任何其他软件的视频 0 元素,我们将安装到 BeagleBone 板上以从摄像头获取视频输入。

将 USB 摄像头添加到 BeagleBone 板

现在我们 BeagleBone 板上已经有了视频组件,我们可以继续安装 OpenCV,开始从 USB 网络摄像头捕获图像并将它们存储在 BeagleBone 板上的 microSD 卡上。

OpenCV – 简介和在 BeagleBone 板上设置

在这个主题中,你将了解 OpenCV 是什么以及我们如何使用它从连接到 BeagleBone 板的网络摄像头捕获图像。

OpenCV 代表开源计算机视觉。它主要是为实时计算机视觉设计的。因此,这个库将基本上帮助我们使用常用的编程语言,如 C、C++和 Python,从连接到我们计算机的摄像头捕获图像——在我们的案例中,使用 BeagleBone 板。当我们进入本章的项目部分,使用 Python 从 USB 摄像头捕获图像时,你会理解 OpenCV 库如何使代码从摄像头获取输入、生成图像文件输出以及更多图像处理功能变得简单。

在 BeagleBone 板上的 Debian 系统上安装 OpenCV

按照步骤在 BeagleBone 板上的 Debian 系统上安装 OpenCV:

第 1 步:安装编译器:

sudo apt-get -y install build-essential cmake pkg-config

这些编译器对于从源代码构建软件包然后安装它们非常重要。安装它们对我们未来很有用,尤其是在机器人项目期间:

在 BeagleBone 板上的 Debian 系统上安装 OpenCV

第 2 步:安装编译前必需的其他软件包:

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

在 Linux 中,大多数编写的软件将使用其他开源软件包来构建它们的软件,因此这些软件包是 OpenCV 在它们的软件中使用的,以给我们一个美丽且易于编码/使用的库。

在 BeagleBone 板上的 Debian 系统上安装 OpenCV

当你安装这些软件包时,如果提示你使用额外的磁盘空间,请继续按Y然后按Enter开始安装所需的软件包。

在编译之前,你还需要安装一些其他软件包,这些软件包如下所示:

  • sudo apt-get -y install libjpeg62-dev

  • sudo apt-get -y install libtiff4-dev libjasper-dev

  • sudo apt-get -y install libgtk2.0-dev

  • sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

  • sudo apt-get -y install libdc1394-22-dev

  • sudo apt-get -y install libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

  • sudo apt-get -y install python-dev python-numpy

  • sudo apt-get -y install libqt4-dev

  • sudo apt-get install unzip

第 3 步:安装一些可能在未来使用 OpenCV 时很有用的其他可选软件。这些软件由 OpenCV 推荐:

  • sudo apt-get install python-dev python-numpy libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

这些软件对于 OpenCV 的正常运行并非必需,但当你将来将显示器连接到 BeagleBone 板并希望使用图形时,这些软件将非常有用。现在安装它们比将来在编写带有显示元素和 GUI 的代码时遇到错误而感到沮丧要好。

在 BeagleBone 板上安装 Debian 上的 OpenCV

到这一步,我们已经安装了编译和安装 OpenCV 在 BeagleBone Black 上所需的所有必要软件包。因此,现在让我们继续下载 OpenCV 的源代码文件,然后编译和安装它们。让我们创建一个新的目录,并在构建 OpenCV 库时将所有文件保存在其中:

第 4 步:使用以下命令创建一个 OpenCV 目录:

  • mkdir OCV

  • cd OCV

它将看起来像这样:

在 BeagleBone 板上安装 Debian 上的 OpenCV

第 5 步:将 OpenCV 源代码克隆到我们的工作目录中:

  • wget https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip

wget命令将从它后面的 URL 下载文件,并将其保存在当前工作目录中。您可以在 Linux shell 中看到下载状态的百分比,如下面的截图所示:

在 BeagleBone 板上安装 Debian 上的 OpenCV

您需要等待下载完成,并使用ls命令检查是否收到了 zip 文件。如果您看到文件,如下面的截图所示,您可以继续下一步:

在 BeagleBone 板上安装 Debian 上的 OpenCV

第 6 步:使用 cmake 从源文件构建 OpenCV:

  • unzip opencv-2.4.9.zip –d opencv

首先,我们需要解压我们下载的.zip文件以提取文件内容。

在 BeagleBone 板上安装 Debian 上的 OpenCV

然后我们编译文件夹内的文件,等待解压过程完成:

在 BeagleBone 板上安装 Debian 上的 OpenCV

然后使用ls命令检查是否已创建opencv文件夹,以及.zip文件的内容是否已提取到其中:

  • ls

您可以看到已经创建了opencv文件夹,其中包含了已解压的文件:cd opencv

在 BeagleBone 板上安装 Debian 上的 OpenCV

这就是lscd opencv-2.4.9在命令行中的样子:

在 BeagleBone 板上安装 Debian 上的 OpenCV

现在,我们需要在opencv-2.4.9文件夹中创建一个文件夹,我们将在这个文件夹中编译和构建安装文件。您需要执行mkdir buildcd build命令来完成此操作:

在 BeagleBone 板上安装 Debian 上的 OpenCV

  • cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=OFF -D WITH_OPENGL=ON

这就是它的样子:

在 BeagleBone 板上安装 OpenCV 到 Debian

现在,等待配置完成:

在 BeagleBone 板上安装 OpenCV 到 Debian

一旦完成,你应该会看到类似于前面的截图。

现在我们可以继续编译文件:

第 7 步:编译make,它看起来像这样:

在 BeagleBone 板上安装 OpenCV 到 Debian

等待程序编译并准备安装:

在 BeagleBone 板上安装 OpenCV 到 Debian

一旦文件编译和构建完成,我们可以使用以下步骤将 OpenCV 库安装到我们的系统中:

第 8 步:安装sudo make install

在 BeagleBone 板上安装 OpenCV 到 Debian

等待程序安装完成。

在 BeagleBone 板上安装 OpenCV 到 Debian

安装完成后,让我们使用以下命令测试是否所有内容都正确安装:

第 9 步:验证安装

由于我们将一起使用 Python 和 OpenCV,让我们使用以下命令验证 OpenCV 的 Python 库是否正确安装:

  • sudo python

在 Python 交互式 shell 中输入from cv2 import_version_命令以导入库,然后执行以下命令以打印版本:

  • _ 版本 _

你应该会看到以下截图:

在 BeagleBone 板上安装 OpenCV 到 Debian

如果它没有错误地打印版本,那么一切正常,你可以看到它是2.4.9,这与你在第 5 步中下载的 zip 文件中的版本相同。

现在我们已经成功安装了 OpenCV 库,我们可以继续到下一个主题,我们将使用 Python 和 OpenCV 一起从我们插入到 BeagleBone 板上的 USB 视频相机捕获图像。

项目:使用 Python 和 OpenCV 从相机捕获图像

在本章中,我们将编写一个代码来从相机捕获图像,并使用 Python 将其保存为.jpg格式。

让我们先创建一个名为ImageCapture的目录,在其中我们可以保存我们编写的 Python 文件,以及我们捕获的图像文件:

  • mkdir ImageCapture

  • cd ImageCapture

它看起来像以下截图:

项目:使用 Python 和 OpenCV 从相机捕获图像

  • sudo nano TakePhoto.py

    参考以下图像:

    项目:使用 Python 和 OpenCV 从相机捕获图像

现在,我们可以开始编写代码来从相机捕获图像并将其保存到 BeagleBone Black 上:

完成此任务的最简单代码如下截图所示:

项目:使用 Python 和 OpenCV 从相机捕获图像

保存它并运行它以从相机捕获图像并保存。

当您运行sudo python TakePhoto.py代码时,您将看到的输出如下截图所示:

项目:使用 Python 和 OpenCV 从相机捕获图像

如果您没有收到任何错误,并且程序结束时打印出保存图像文本,那么一切应该都进行得很顺利。为了检查这一点,让我们看看Photo.jpg文件是否已经创建在文件夹中。您可以使用ls命令来检查,您应该会看到如下截图所示的Photo.jpg文件已创建:

项目:使用 Python 和 OpenCV 从相机捕获图像

由于我们正在通过 SSH 在 BeagleBone Black 上工作,我们现在没有直接在 GUI 上查看图像的选项 - 我们将需要一个文件传输协议FTP)客户端软件来下载捕获的图像。所以,让我们现在在我们的 Windows PC 上安装一个。

小贴士

FileZilla 是我最喜欢的,所以在这个教程中我会使用它,您可以使用您熟悉的软件,或者如果您还没有安装 FileZilla,可以安装它。

一旦您打开了 FTP 软件,它将要求您输入设备的 IP 地址、用户名、密码和端口号:

项目:使用 Python 和 OpenCV 从相机捕获图像

这就是软件的外观。您可以在左上角看到一个输入主机 IP 地址、用户名、密码和端口号的空间。下面您可以看到您想要下载和上传文件的目录选择,底部您可以看到数据传输的日志。

现在我们继续将我们的 PC 通过 FTP 连接到 BeagleBone Black,以传输我们捕获的图像文件,并看看它的样子。您需要输入的详细信息是分配给 BeagleBone 板的 IP 地址,您将通过 SSH 连接到它,与debian相同的 IP 地址和用户名,默认密码为temppwd,如果您已经更改了用户名和密码,则在这里使用它们,端口号为22。然后点击快速连接按钮,您应该会看到 BeagleBone Black 上的文件,如下面的截图所示:

项目:使用 Python 和 OpenCV 从相机捕获图像

您可以点击图片中显示的Debian文件夹旁边的+符号,然后导航到其中的ImageCapture文件夹,我们捕获并保存的Photo.jpg文件就在这个文件夹里。您会看到如下截图所示的内容:

项目:使用 Python 和 OpenCV 从相机捕获图像

现在,您可以继续下载文件。一旦您点击下载,文件将被下载到 FTP 文件夹或您在 PC 上选择的用于下载文件的文件夹中。您可以在下面的屏幕截图中看到,Photo.jpg文件现在位于您的 PC 上之前为空的 FTP 文件夹中:

项目:使用 Python 和 OpenCV 从相机捕获图像

因此,现在您已经将捕获的照片下载到您的 PC 上,您可以继续打开它,使用您在 PC 上设置的图像查看软件查看它。

项目:使用 Python 和 OpenCV 从相机捕获图像

捕获的图像如前一个屏幕截图所示,拍摄此照片时相机的布置如以下屏幕截图所示:

项目:使用 Python 和 OpenCV 从相机捕获图像

在前面的图片中,您可以看到相机已经被放置,指向 BeagleBone Black,并且距离较远,因此我们捕获的图像显示了 BeagleBone Black 的侧面视图,显示了连接到它的 USB,以及背景。

因此,这样,您可以使用 Python 和 OpenCV 一起拍照并保存它们,用于许多应用程序。

摘要

本章只是为您了解 OpenCV 是什么,将其设置在 BeagleBone Black 上,以及通过编写几行代码了解您可以使用它做什么的开始。在本章中,图像捕获项目只是我们做的简单事情——您可以尝试更多,比如捕获视频并保存,将彩色图像转换为黑白,以及使用 OpenCV 和 Python 进行其他图像处理。现在我们知道了如何拍照并保存。

在下一章中,我们将构建一个家庭安全应用程序项目,使用传感器检测运动并在检测到运动时拍照。这样,我们将构建一个实时应用程序,使用 OpenCV、BeagleBone Black 和 Python,系统将与物理世界进行交互。

第八章. 使用 BeagleBone Black 的家庭安全系统

在本章中,我们将专注于使用 BeagleBone 板构建一个实时互联网连接的家庭安全监控系统。与前面的章节类似,我们将在 BeagleBone 板上使用 OpenCV 和 Python,并连接一个摄像头。但为了将项目提升到高级水平,我们将在 BeagleBone 板上添加一个 PIR 传感器,并在其上编写代码以与物理世界交互。我们将从使用 PIR 传感器进行运动检测开始,然后使用 Python 从 BeagleBone 板上发送电子邮件。我们将以一个项目结束本章,在这个项目中,我们将构建一个运动检测安全摄像头,当 PIR 传感器检测到运动时,它会发送带有捕获图像的电子邮件警报。

本章内容分为以下主题:

  • 前提条件

  • PIR 传感器

  • 使用 PIR 传感器进行运动检测

  • 发送带附件的电子邮件

  • 高级项目 – 运动检测、图像捕获和警报系统

前提条件

这里是要求:

  • 一块 BeagleBone Black

  • 一张带有最新版本 Debian 的 microSD 卡,用于启动 BeagleBone 板

  • 一个 5V DC,2A 的电源

  • 一根以太网线

  • 一台 USB 摄像头

  • 一个 PIR 传感器

PIR 传感器

PIR(即被动红外)传感器是一种电子传感器,它测量其视野中存在的物体辐射的红外线(IR)。这些传感器主要用于基于 PIR 的运动检测器。

PIR 传感器

PIR 传感器的工作原理

如果你查看以下图示,PIR 传感器内部有两个插槽,每个插槽都通过特殊材料帮助准备,这些材料对红外线敏感。菲涅耳透镜帮助传感器上的两个插槽扩大检测区域及其距离,即传感器的灵敏度。当传感器前方或检测区域内没有运动时,两个插槽检测到相同数量的红外线;我们称这为传感器的空闲状态,在此期间,插槽检测从房间或户外辐射出的环境红外线量。传感器会自动校准并等待温暖物体的运动。

PIR 传感器的工作原理

当 PIR 传感器的一半拦截到任何温暖物体,如人或动物时,它会在 PIR 传感器的两个部分之间引起正差分变化。同样,当温暖物体离开感应区域时,会产生负差分变化,这实际上是正差分变化产生的逆过程。因此,我们获得的输出是以传感器输出引脚的上升和下降脉冲的形式,我们通过这些脉冲推断 PIR 前方是否有运动。

你可能想知道为什么前面的图示和实际图像之间有差异,如第一张图像所示。实际上,第一张图像是为了让你理解 PIR 传感器的工作原理。它展示了市场上可用的传感器,我们将使用这个传感器。为了使传感器能够在广泛的检测区域内工作,其镜头呈半球形,如果你看一下下面的图像,你会看到镜头上已经制作了各种角度的槽口,以便在广泛区域内检测,并可以在天花板和墙壁等不同地方安装,以检测移动物体的运动。

PIR 传感器的工作原理

市面上大多数这些业余级 PIR 传感器的检测区域为 90 度宽,但有些可达 110 度,长度为 5 到 6 米。你可以选择并购买你喜欢的任何一种。

PIR 传感器的工作原理

使用 PIR 传感器进行运动检测

现在我们已经了解了 PIR 传感器的工作原理,让我们继续将其连接到我们的 BeagleBone 板以检测运动。

首先,取三根伯格线,按照以下电路图将 PIR 传感器连接到 BeagleBone 板上:

使用 PIR 传感器进行运动检测

如前述电路图所示,将 PIR 传感器的 Vcc 连接到 BeagleBone 板上的 5V 引脚,将 PIR 传感器的输出引脚连接到 BeagleBone 板上的 GPIO60,并将两个板上的地引脚相互连接。

然后,我们将打开 BeagleBone 板并登录到 Linux shell 以开始编写代码。

使用 sudo nano TestPIR.py 创建一个新的 Python 程序:

使用 PIR 传感器进行运动检测

输入以下屏幕截图所示的代码:

使用 PIR 传感器进行运动检测

输入代码后,你可以使用 Ctrl + X 保存它。

通过查看代码中的注释来了解其工作原理。我们正在将 GPIO_60 设置为 INPUT PIN,从 PIR 传感器的输出读取上升沿,每次从 GPIO 引脚 60 读取上升沿时,都会打印出 Movement Detected 文本。

当你运行命令时,你应该看到以下输出:

使用 PIR 传感器进行运动检测

你可以在传感器前放置你的手或进行任何动作,如下面的图片所示:

使用 PIR 传感器进行运动检测

有一个选项可以设置灵敏度,即检测区域的范围,通过调整传感器上的电位器来实现。看看下面的图示,以获得更好的理解。你还有一个电位器可以调整触发时间,这实际上是传感器自动重置模式下的脉冲持续时间,直到脉冲变高并返回低。当设置为无重置模式时,脉冲将始终保持 HIGH 状态,直到检测到另一个运动。通常,首选的方法是自动重置。

使用 PIR 传感器进行运动检测

现在我们已经测试了 PIR 传感器,让我们继续使用 Python 从 BeagleBone Black 发送带附件的电子邮件。

从 BeagleBone Black 发送带附件的电子邮件

就像使用 Python 在 BeagleBone Black 上与图像和摄像头一起工作的 OpenCV 库一样,我们还有许多其他由 Python 开发和构建的精彩库。其中一个这样的库是 SMTP 电子邮件库,我们将在这个部分中使用它。

为了测试这个,我们将使用上一章项目中捕获的图像,它位于ImageCapture文件夹内。

我们首先将工作目录更改为ImageCapture目录,如下截图所示,使用cd ImageCapture

从 BeagleBone Black 发送带附件的电子邮件

然后,我们将继续创建一个 Python 文件,其中包含发送带附件的电子邮件的代码。为此,首先创建一个名为sendemail.py的新文件,使用sudo nano sendemail.py

从 BeagleBone Black 发送带附件的电子邮件

现在,输入以下截图所示的代码,并将文件保存在ImageCapture文件夹本身中。代码的大部分行都带有注释,以便你清楚地了解它是如何工作的。

从 BeagleBone Black 发送带附件的电子邮件

你会看到我们之前项目中捕获的Photo.jpg文件仍然在ImageCapture文件夹内,这是我们将在执行此程序时附加到电子邮件中的同一张图片:

从 BeagleBone Black 发送带附件的电子邮件

当你执行程序时,你应该会在sendemail.py代码文件中提到的接收者的电子邮件地址上收到一封电子邮件,终端的输出将如下所示:

从 BeagleBone Black 发送带附件的电子邮件

当它在 Linux shell 上打印出电子邮件已发送时,你将在你的电子邮件账户中收到电子邮件;查看我收到的这些电子邮件截图:

从 BeagleBone Black 发送带附件的电子邮件

因此,就像这样,你可以将任何附件附加到电子邮件中,并从 BeagleBone 发送。既然我们现在知道如何使用连接到 BeagleBone 板的 PIR 传感器检测运动,以及如何发送带有照片附件的电子邮件,让我们继续将上一章的相机图像捕获项目与我们在本章中学到的知识合并,以构建一个高级项目。

高级项目 – 基于运动的家居安全警报系统

在本节中,我们将构建一个家居监控安全警报系统,其中我们将有一个连接了 PIR 传感器的 BeagleBone 板。一个 USB 摄像头连接到它上,BeagleBone 板连接到互联网。所以基本上,该系统将在 PIR 传感器前检测到移动时从摄像头捕获图像。

按照以下步骤操作:

  1. 使用 BeagleBone 板设置 PIR 传感器,就像我们在本章的运动检测主题中所做的那样,将 USB 网络摄像头连接到 BeagleBone 板,并登录到系统。设置看起来如下所示:高级项目 – 基于运动的家居安全警报系统

  2. 使用 sudo mkdir HomeSecurity 为此项目创建一个新的目录:高级项目 – 基于运动的家居安全警报系统

    使用 cd HomeSecurity

    高级项目 – 基于运动的家居安全警报系统

  3. 使用 sudo nano EmailAlert.py 创建项目的 Python 脚本:高级项目 – 基于运动的家居安全警报系统

将以下代码输入到文件中。代码中的大多数行都有注释,以清楚地解释其工作原理。

高级项目 – 基于运动的家居安全警报系统

输入代码后,继续保存。当你运行它时,你应该在 Linux 命令行界面中看到输出,如下面的截图所示,只要在 PIR 传感器前有移动:

高级项目 – 基于运动的家居安全警报系统

下面的图像显示了我在 PIR 传感器前挥动手臂的情况,手指始终保持在传感器前,然后移开:

高级项目 – 基于运动的家居安全警报系统

我收到的电子邮件截图如下所示:

高级项目 – 基于运动的家居安全警报系统

就这样,你可以使用 Python、OpenCV 和 Python 的电子邮件库一起,每当 PIR 传感器检测到移动时,点击图片并发送电子邮件警报。

摘要

在本章中,我们使用了上一章关于 OpenCV 的知识,以及本章关于使用 BeagleBone 板进行 PIR 传感器接口和通过 BeagleBone 板使用 Python 发送电子邮件所学的知识,来构建一个运动检测摄像头监控电子邮件警报系统。而不是在这里停止这个项目,我建议你尝试其他运动检测方法,并构建一个没有 PIR 传感器的相同系统。网上有很多关于使用 Python 在实时中利用 OpenCV 进行运动检测的资源。尝试设置一个系统,在没有 PIR 传感器的情况下,仅使用摄像头进行运动检测,并发送电子邮件警报。

第九章。探索机器人学

正如标题所说,在本章中,我们将探索和学习机器人学的基本概念。我们将从机器人学的基本介绍开始,包括一些关于机器人系统和一些关于机器人历史的定义和解释。然后,我们将研究机器人系统结构,就像我们在第三章中做的那样,即《物理计算系统介绍》,关于物理计算系统。我们将查看机器人系统中涉及的硬件和软件的基本模块,这与我们的物理计算系统相似。然后,我们将研究它们的操作,最后讨论差动驱动机器人,因为下一章我们将要构建一个差动驱动机器人。

本章内容分为以下几部分:

  • 机器人学介绍

  • 机器人系统的元素、结构和操作

  • 应用领域

  • 差动驱动机器人

机器人学介绍

许多人只记得著名演员阿诺德·施瓦辛格,并关联到《终结者》电影中的人形终结者机器人,当他们听到“机器人”这个词时。尽管这是真的,机器人这个词与类似类型的机器人相关,但人们忘记了机器人的确切意义不仅仅是这样。实际上,那只是机器人的一种类型:人形机器人,或者如人们今天所说的——机器人,是类似人类的机器人。我们仍然处于机器人开发的开端——如果我们想要达到类似科幻电影机器人的结果,那么在这个研究领域还有很长的路要走。

机器人学介绍

科幻类人形机器人与目前最先进的实际机器人

被称为机器人的东西有许多不同的定义。这些定义取决于机器人系统中使用的技术以及机器人系统执行的应用。与已知的物理计算系统定义相关联,我们可以将机器人系统定义为任何由电磁执行器组成的物理计算系统,这些执行器可以在计算机程序的控制下自主或半自主地执行动作,该程序在其电子硬件电路中运行。

机器人学介绍

一个拾取和放置食物的机器人和一个医院远程存在机器人

以非常基础的方式,我们可以这样说,机器人是设计成能够以速度和精度执行一项特定任务或多项任务的机器。你可以很容易地购买市场上各种不同类型的机器人系统,用于不同的应用,从清洁地板的吸尘机器人到在咖啡馆为你提供咖啡和茶的机器人,它们看起来就像人类一样。我们将在本章后面讨论一些机器人广泛和当前的应用领域。

尽管机器人存在已久,但它们过去总是存在于研究实验室中,并且由于工业革命之前成本高昂,普通人难以获得。在工业革命期间,制造商和工业界希望有许多工业机器来加速生产,在更短的时间内生产出更多的产品而不会出现缺陷。工业机器开始出现,它们由机器人系统的结构组成,例如使用执行器构建的机器人臂,能够在工业中举起重物。在早期阶段,几乎所有的机器人系统都是由人通过遥控操作,以确保安全和灵活性。但随着软件开始变得便宜且更可靠,具有半自主功能的机器人系统开始演变,例如带有机器人执行器的传送带,可以从传送带上拾取物品并自动包装,同样,许多其他应用也开始在工业中出现。如今,有些公司完全由机器人制造和包装食品和饮料,几乎不需要人工干预。

由于研发智能和智能工业机器人系统,许多传感器和执行器机制被开发出来,以在工业生产中替代人工干预,这导致了各种传感器的发展,这些传感器不再用于构建类人机器人。尽管十多年前电影中已经展示了这样的机器人,但我们还需要很多年才能建造出能够替代人类的机器人。

在我们探讨机器人系统的广泛应用领域之前,让我们先了解一下机器人系统的基本元素和结构,以便理解它们的运作方式。

机器人系统的元素、结构和操作

在本节中,您将了解机器人系统由哪些部分组成,随后是它们的操作方式。正如我们在前一节中定义的那样,机器人系统与物理计算系统非常相似,只是某些物理计算系统中可能没有执行减少人力劳动的任务的执行器,而机器人系统则不同。因此,系统的元素以及它们的操作几乎相似。在某些情况下,“物理计算系统”这个术语也可以与机器人系统同义。

就像任何物理计算系统一样,任何机器人系统也将具有连接到具有输入/输出端口的 CPU 的输入传感器和输出执行器。执行器根据在 CPU 上运行的计算机程序进行驱动,这取决于机器人系统中存在的传感器输入。

为了让您更容易理解,并给您一个关于我们将在下一章中构建的机器人的简要概念,让我们看一下一辆两轮机器人的方块图,它将随机移动而不会碰到任何表面:

机器人系统的元素、结构和操作

如果你查看方块图,它由一个传感器组成,即一个超声波传感器,它可以检测其位置前方任何障碍物的距离,并且该传感器连接到 CPU 的输入端口。同样,我们有一个电机控制器 IC,或者电机驱动 IC,它将帮助我们通过从微控制器获取的低电压数字输入来驱动高电压的重型电机。因此,这个电机驱动 IC 连接到 CPU 的输出端口。电机连接到电机驱动 IC。根据提供给电机驱动 IC 的输入,电机以特定的方向驱动。我们将在下一章详细探讨这个 IC。最后,最重要的是,所有设备都应使用外部电源供电,这通常是一个直流电源,但有时也可能是交流电源,这取决于应用。在我们的案例中,对于下一章的项目,它将是直流电源。如果你查看第三章中物理计算系统的以下方块图《物理计算系统简介》,你可以理解它有一些相似之处:

机器人系统的元素、结构和操作

因此,当你比较结构与我们所使用的用于演示目的的机器人系统的结构时,它包括一个向 CPU 提供输入的传感器,以及一个根据 CPU 的输出驱动电机的驱动 IC。在 CPU 中,我们运行软件,它将随机使机器人移动,而不会碰到任何障碍物。

根据软件的不同,机器人可以以任何方式操作。例如,对于一个随机避障和自主移动的机器人,它根据微控制器的输出引脚输出移动机器人向前方向,同时,软件持续读取超声波传感器测量的距离。每当传感器在设定距离处检测到障碍物时,程序就会将其视为障碍物。因此,程序通过改变控制器输出引脚上的输出信号来停止电机运行,然后使机器人向左或向右转动。这可以是随机的,或者我们可以在代码中指令它每次检测到障碍物时只向左或向右移动。因此,机器人开始向特定方向转动,直到有足够的空间移动,然后再次停止并直线移动。这样,程序循环就会运行,机器人就会随机移动而不会撞到任何东西。这听起来可能很愚蠢,因为它不做任何具体工作,也不执行任何复杂任务。但是,当你向系统中添加更多传感器,例如指南针来读取开始转动时的角度,以及一些轮编码器来测量机器人的移动距离,然后编写程序以避免重复在同一区域移动,如果你将其安装到吸尘器系统上,它就可以成为一个很棒的机器人。这样一款机器人就是市面上可购买的吸尘器机器人。

因此,任何机器根据其智能工作方式、解决实时问题和执行动作的能力,都可以变成机器人。让我们看看这样的例子,在下一节中,我们将探讨具有简单硬件但优秀软件的机器人在不同应用中的使用。然后,在最后,我们将更深入地探讨差速驱动机器人,以了解这些电机如何仅使用两个带电机的轮子根据电机方向在不同方向上转动。

应用领域

当我们讨论机器人的应用领域时,我们可以看到机器人的存在非常普遍。最常见的基于应用领域的机器人系统分类如下:

  • 工业机器人

  • 家庭或家用机器人

  • 医疗机器人

  • 移动机器人

  • 社交和类人机器人

工业机器人

如前所述,尽管我们已经建造机器人很长时间了,但它们的广泛应用是通过工业机器人在制造业中用于提高生产力才出现的。这些机器在工业中以高速执行特定任务。

工业机器人

在前面的图片中,你可以看到在汽车制造业中,机器人臂正在制造汽车。这些臂的编程方式使得所有移动汽车的机器人臂和传送带以同步方式工作,并且每个机器人臂都执行特定的任务,例如拧紧螺母或焊接两块金属板。

家用机器人

帮助人类完成家务的机器人被称为家用机器人。以下第一个是一个虚构的家用机器人:

家用机器人

备注

glennhsmith.files.wordpress.com/2013/04/rosie-the-robot-h.jpg

static01.nyt.com/images/2014/12/25/garden/20141225-TECH-slide-3TZF/20141225-TECH-slide-3TZF-jumbo.jpg

s.yimg.com/ny/api/res/1.2/HUZ5Rw7cnzK2z_k8zuI5ZA--/YXBwaWQ9aGlnaGxhbmRlcjtzbT0xO3c9NTc0O2g9NDM2O2lsPXBsYW5l/http://boygeniusreport.files.wordpress.com/2014/02/roomba-robot-vacuum-cleaner.jpg

前面的组合图像的左下角显示了一个每天在固定时间间隔给草坪浇水的机器人,右下角显示了一个清洁地板的吸尘机器人。我想你现在可以将其与我们之前章节中讨论的随机工作的避障机器人联系起来。

医疗机器人

近年来,手术和康复机器人被广泛应用于医疗行业。正如其名称所暗示的,手术机器人帮助医生进行复杂的手术,康复机器人帮助人们恢复使用他们的手、臂或身体其他被替换或失去功能的部分。

医疗机器人

备注

www.tipoist.com/indexfoto/robotic-surgery.jpg

www.salford.ac.uk/__data/assets/image/0003/370434/dexterous-robot-hand-robotics-cse.jpg

如果你查看左边的图示,你可以看到手术是如何通过机器人臂来进行的:外科医生通过观看安装在臂上的摄像头控制机器人臂,并在控制台进行手术。正如我之前提到的,大多数机器人都是远程操作的。在许多情况下,外科医生在远离患者的地方进行手术。

如果你看看右边的图片,它展示的是一个戴有外骨骼手的人,他没有大拇指。但是有了外骨骼,他有一个完整的手可以帮助他。这些都是帮助人体部位康复的机器人。

移动机器人

能够导航和执行任务的机器人被称为移动机器人。有许多自主和半自主的机器人可以导航和执行任务,这与在工业中使用的固定机器人臂和在家庭中使用的固定草坪浇水机器人不同。

移动机器人

注意

static-ssl.businessinsider.com/image/55d233c42acae700448be4de-960-720/to-make-things-a-bit-easier-for-its-workers-amazon-added-about-15000-kiva-robots-to-10-us-fulfillment-centers-during-the-2014-holiday-season-amazon-bought-kiva-systems-the-company-that-manufactures-the-robots-for-775-million-in-2012.jpg

cnet4.cbsistatic.com/img/g2VlwBmVinTwCSSQd2BgrErY2Ws=/570x0/2016/03/18/6cdc953e-563b-4424-bf33-6014b300e428/dominos-dru-pizza-robot-lifestyle.jpg

看看前面的图片。左边的图片显示的是在仓库中根据控制单元的请求携带带有物品的货架的仓库管理移动机器人。这些机器人是移动的,并且比人类寻找特定物品并将其带到包装站或仓库中的任何地方要快得多。这些移动机器人最近极大地改变了仓库管理。接下来,如果你看右边的图片,它展示的是最新的一款移动机器人,它将披萨送到顾客的家中地址并递送。这些机器人能够避开障碍物,不会撞到人类;它们规划路径并继续前进。吸尘器机器人也属于移动机器人,但再次强调,根据它们的应用,它们也可以被归类为家用机器人。因此,这些应用领域大多是相互关联的。

移动机器人甚至包括用于军事应用、太空探索、水下机器人等等的机器人。

移动机器人

注意

s-media-cache-ak0.pinimg.com/236x/2d/ff/8d/2dff8d05cf7f5ca90e6d4ab61148349d.jpg

i4.mirror.co.uk/incoming/article4822277.ece/ALTERNATES/s615b/Curiosity-Rover.jpg

seahack.org/wp-content/uploads/2013/05/openrov_large.jpg

如果你观察前面的图片,你可以看到三种不同的机器人。最左边的是一种配备有远程触发武器的军用机器人。中间的是火星探测器,一种被送往火星以探索星球表面的机器人。它通过卫星与地球上的一个站点保持通信联系。最后,在最右边,我们有一个用于水下探索的机器人,称为 OpenROV。现在,关于这个机器人有一个有趣的事实,那就是它是以 BeagleBone Black 作为主控制器来构建的。这是一个如何将使用 BeagleBone Black 的业余项目转变为商业产品的典型例子。我们将在下一章中也构建类似的东西。但与水下探索不同,它将使用摄像头探索地面周围的环境,并将实时视频流显示给我们。

从这些例子中,你可以理解尽管它们执行了如此多的应用,但这些机器人的基本结构仍然相同,而正是我们通过不同的传感器、执行器、通信链路和编写的软件程序添加的功能,使得它们在应用中具有如此多的不同名称,并且产生了如此多的差异。

社会型和人形机器人

在外观和交互方式上与人类相似的机器人被称为人形机器人。社会机器人是这类机器人中的一个特定群体,它们没有像人形机器人那样的肢体,但它们上面运行着软件,以实现像人类一样的社会互动。

以下图片展示了两种可能帮助你区分人形机器人和社会机器人的机器人:

社会型和人形机器人

注意

letsmakerobots.com/files/imagecache/robot_fullpage_header/field_primary_image/asimo.jpg

www.laptopreleasedate.com/wp-content/uploads/2016/06/Robot-ASUS-Zenbo.jpg

如果你观察左侧的图片,你可以看到一个看起来像人类,有手、腿、耳朵和显示在屏幕上的脸的机器人。这个机器人是机器人技术研究和开发的一个伟大成果,它试图模仿人类身体的构造,手上有手指可以抓取和握住东西,脚可以用来从一个地方走到另一个地方。它还理解语音并回应人类。

如果你看看右边的图片,它展示了一款基于语音处理与人互动的最新社交机器人。但这看起来并不像人类。社交机器人主要是为了作为人类的个人助理而设计的。它们也旨在娱乐;例如,机器人可以给你讲故事,为你播放歌曲,等等。我想你现在可以理解为什么这样的机器人会被冠以“社交”这个称号。

机器人的类别和应用领域是无限的。一本书不足以解释所有内容。你可以自己进行研究来了解更多。有了这个,我们将结束这个主题,继续讨论差动驱动机器人,这是移动机器人的一种形式,因为这种控制机制将在下一章帮助我们构建自己的移动机器人。

差动驱动机器人

差动驱动是一种在大多数需要控制导航机器人的情况下使用的控制机制,特别是对于室内应用。对于初学者来说,这也被认为是开始学习机器人的最佳控制机制。大多数在工业和家庭中使用的室内导航机器人都使用这种机制。

这种机制的概念是使用两个分别驱动的电机与机器人的轮子耦合,相隔一定距离,并放置在固定的共同水平轴上。底盘还包括一个或多个万向轮或滚球轮,以保持平衡。

它看起来是这样的:

差动驱动机器人

在图中,你可以看到差动驱动机器人的两种不同配置。左边的一个有两个万向轮,而另一个只有一个。这两个是最常用的差动驱动系统配置之一。它们在导航过程中都有不同的运动学。如果你想深入了解,你可以在互联网上找到更多信息。现在,为了开始,你可以选择这些底盘之一——无论你在市场上得到哪个。操作取决于使用电机驱动器 IC 和 MCU 的输出控制两个电机。

当我们观察这些机器人的导航操作时,看起来像这些图示:

  • 向前移动:差动驱动机器人

    当右侧电机顺时针旋转而左侧电机逆时针运行时,机器人将向前移动。

  • 向后移动:差动驱动机器人

    当右侧电机逆时针旋转而左侧电机顺时针运行时,方向正好与前进运动时的方向相反,机器人将向后移动。

  • 左转:差动驱动机器人

    当左侧电机停止而右侧电机顺时针运行时,机器人向左转。

  • 向右转:差动驱动机器人

    当左侧电机逆时针运行而右侧电机停止时,机器人向右转。

  • 旋转:差动驱动机器人

    当两个电机都朝逆时针方向运行时,从上方看,机器人会绕其自身轴心顺时针旋转。同样地,当电机方向反转时,它会逆时针旋转。

  • 停止:

    我认为我们不需要图片来解释这个动作——如果两个电机都没有运行,机器人就会停止。

概述

因此,我们来到了这一章节的结尾,其中我们介绍了机器人学的基础知识,包括一些将科幻与现实联系起来的例子,随后简要解释了机器人系统的结构和它们的工作原理。我们还探讨了某些例子和它们的应用领域。最后,我们了解了差速驱动机器人的工作方式和操作方法。在下一章中,我们将构建我们自己的实时视频流差速驱动机器人。

第十章. 构建你自己的机器人

在本章中,我们将了解如何使用 BeagleBone Black 和与之接口的电机和电机驱动 IC 来构建自己的机器人。首先,我们将了解直流电机,然后是 L293D 电机驱动 IC,它将帮助我们驱动直流电机。然后我们将了解如何从连接到 BeagleBone 板的摄像头在网页上实时流式传输视频。最后,我们将构建一个可以远程控制的机器人,你可以通过网页上的实时视频流从连接到 BeagleBone Black 的摄像头来控制它。

本章内容分为:

  • 前提条件

  • 直流电机和 L293D 电机驱动 IC

  • BeagleBone 板上的实时视频流

  • 高级项目:带有实时视频流的遥控机器人

前提条件

本主题将涵盖你开始构建机器人所需的部件。这些材料可以从你当地的电子爱好商店购买,或者从 Adafruit、Sparkfun、Seed Studio 等网站在线订购。

需要的材料

  • 1x BeagleBone Black

  • 1x 带有最新版本 Debian 的 microSD 卡,用于从 microSD 卡启动 BeagleBone 板

  • 1x 5V DC,2A 电源/移动电源,具有 5V 2A 或更高输出

  • 1x USB WiFi 外置设备

  • 1x 面板

  • 2x 50 至 100 RPM 范围内的 12V 直流电机

  • 1x L293D 电机驱动 IC

  • 1x USB 摄像头

  • 1x USB 集线器

  • 1x 12V 或 9V 电池

  • 1x USB 线

  • 1x 直流柱状插头

  • 连接线

直流电机

直流电机是一种使用直流电源运行的电机。

直流电机

如前图所示,它有两个端子线。我们可以称其中一条端子线为正极,另一条为负极。通常,这些线被标记为红色和黑色,红色代表正极,黑色代表负极。尽管这些线被标记为正负极,但与电池不同,电池的极性不能混合,在这里的直流电机中,它们可以混合。

例如,在一个电机上,如果正极线连接到电池的正极,负极线连接到电池的负极或电源,电机将按顺时针方向旋转。当你反转连接,例如从电机的正极到电池的负极,电机的负极到电池的正极,那么电机将按逆时针方向旋转,如下图所示:

直流电机

当电压源连接到电机的端子时,其极性控制直流电机的旋转方向,而直流电压源的幅度则决定了其速度。

但是,每次手动改变极性和开关电路都是一项繁琐的工作,我们需要一个电子电路来帮助我们完成这项工作,而无需物理切换连接。这就是电机驱动 IC 将派上用场的地方,以数字输入完成这项任务。其中一种电机驱动 IC 是 L293D,我们将在下一节讨论。

L293D 电机驱动 IC

如我们之前提到的,L293D 可以被定义为 H 桥电机驱动电路,它被制作成 IC,使我们能够使用数字输入驱动直流电动机。

L293D的引脚配置如图所示:

L293D 电机驱动 IC

如前图所示,在 L293D 中,有四个输入引脚和四个输出引脚。两个输入引脚,即第二个和第七个引脚,调节连接到输出引脚三和六的电动机的旋转。同样,右侧的输入引脚,即第十五个和第十个引脚,调节连接到输出引脚十一和十四的电动机的旋转。左、右两侧的使能引脚一和二,位于 IC 的第一个和第九个引脚上,根据 IC 该侧的输入来启用输出操作。电动机根据输入引脚提供的逻辑0和逻辑1来旋转。为 IC 的Vcc引脚供电5V以供其工作,并将地引脚连接到地线和电源的负极。最后,您需要将直流电源/电池的正极连接到Vss引脚,为电动机提供电源,并将电源的负极连接到GND引脚。

请参考以下图片中的电路连接:

L293D 电机驱动 IC

对于前面所示的电路,当输入 1 为低电平且输入 2 为高电平时,电动机 1 将顺时针旋转,同样,当输入 1 和 2 都为低电平或高电平时,电动机将不会旋转。这可以用逻辑表来解释:

输入 1 输入 2 电动机 1 运行方向
逆时针
顺时针
空转 – 无旋转
空转 – 无旋转

对于输入 3 和输入 4,输出将如以下表格所示:

输入 3 输入 4 电动机 2 运行方向
逆时针
顺时针
空转 – 无旋转
空转 – 无旋转

您可以通过将其连接到 BeagleBone Black 并编写与我们的闪烁代码或我们在前几章中尝试的智能家居代码类似的 Python 代码来测试它。有了这些知识,您将清楚地了解 L293D 的工作原理。您可以通过查看 L293D IC 的数据表来获取有关 IC 规格和额定值的更多详细信息。您可以在互联网上找到由 IC 制造商提供的数据表。

我们将在本章末使用与 BeagleBone 板连接的相同电路来构建我们最终项目中的机器人。现在让我们继续看看如何使用连接到它的 USB 摄像头在 BeagleBone 板上进行实时视频流。

BeagleBone 板上的实时视频流

要从 Logitech HD C270 USB 摄像头通过本地服务器连接到 BeagleBone 板进行实时视频流,你需要一个能够完成这项工作的软件包。但在下载和编译实时视频流软件之前,你还需要安装一些基本软件。让我们通过执行以下命令开始安装软件包:

  • sudo apt-get install imagemagickBeagleBone 板上的实时视频流

    当你被提示继续操作时,输入Y,如前一个截图的末尾所示,然后按Enter继续并完成安装:

  • sudo apt-get install libjpeg8-devBeagleBone 板上的实时视频流

  • sudo apt-get install subversionBeagleBone 板上的实时视频流

现在我们已经安装了所有预置软件,让我们下载和编译视频流软件。

首先在主目录中创建一个单独的目录,并将流软件的内容放入其中:

  • mkdir mjpgBeagleBone 板上的实时视频流

现在让我们将我们的工作目录更改为我们创建的目录:

  • cd mjpgBeagleBone 板上的实时视频流

一旦你进入了mjpg目录,你可以使用命令中提到的 URL 下载 mjpg-streamer 软件包:

  • svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamerBeagleBone 板上的实时视频流

下载完成后,将创建一个mjpg-streamer文件夹,其中包含软件的源代码。让我们继续更改目录到那个文件夹:

  • cd mjpg-streamerBeagleBone 板上的实时视频流

现在接下来的步骤将是使用make命令编译软件:

  • makeBeagleBone 板上的实时视频流

一旦你成功编译了软件且没有错误,你可以继续使用以下命令运行软件:

  • /mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y" -o "./output_http.so -w ./www"

如果你已经在 Debian 包中安装了 Apache 服务器,那么当你执行运行视频流软件的先前命令时,可能会显示一个错误,说bind: Address already in use,如下面的截图所示:

BeagleBone 板上的实时视频流

这是因为 Apache 服务器默认使用端口8080。在这种情况下,为了解决这个问题,我们可以通过更改ports.conf文件中的详细信息,将 Apache 使用的端口更改为8079或任何其他允许的数字,如下面的截图所示:

  • sudo nano /etc/apache2/ports.confBeagleBone 板上的实时视频流

打开文件后,你可以将NameVirtualHost更改为8079,并将Listen更改为8079端口,如下面的截图所示,并保存它:

BeagleBone 板上的实时视频流

保存后,你需要重新启动 Apache 服务器以执行更改。为此,执行service restart命令:

  • sudo service apache2 restartBeagleBone 板上的实时视频流

重新启动并得到前面截图所示的输出,这意味着更改已经完成。现在你可以继续运行流媒体软件,通过执行以下命令:

  • sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y" -o "./output_http.so -w ./www"BeagleBone 板上的实时视频流

如果你看到前面截图所示的输出,那么流媒体软件正在正常运行。我们可以通过访问如下面的截图所示的本地服务器在端口8080来测试它。IP 地址是你路由器上 BeagleBone Black 的 IP 地址,它与用于登录 BeagleBone 板的 IP 地址相同。

打开网页链接后,你将看到流媒体软件的主页,如下一页所示:

BeagleBone 板上的实时视频流

前一截图显示了有关我们在 BeagleBone 板上运行的流媒体软件的详细信息页。在主页本身,你可以看到从摄像头捕获的图像,但它是一个静态图像,不是实时流。要查看实时流,请点击左侧的Stream按钮,它将显示包含从摄像头实时视频流的网页,如下面的截图所示:

BeagleBone 板上的实时视频流

点击此处的按钮,该按钮以红色突出显示,并标注为要查看简单示例,请点击此处。你将看到仅作为 HTML 页面上的一个图像元素单独显示的视频流,如下面的截图所示:

BeagleBone 板上的实时视频流

以下截图显示了在实时流传输时,带有 USB 摄像头的 BeagleBone 板的设置:

BeagleBone 板上的实时视频流

因此,你可以看到摄像头前方的 BeagleBone 和移动电源在实时流中是可见的。如果你在摄像头前挥手,你可以在网页上实时看到。

现在我们已经看到了这个直播视频流,如果你想在创建的任何 HTML 页面上包含它,你可以通过添加由流媒体软件创建的图像源元素来实现。你可以通过在浏览器上右键单击并点击“检查元素”来获取该图像源的信息,这将显示如下截图中的详细信息。现在我们使用的几乎所有浏览器,如 Chrome、IE 或 Mozilla,都显示这些详细信息,你可以通过浏览互联网了解更多信息。

BeagleBone 板上的实时视频流

可以在浏览器窗口右侧的检查块中识别图像元素,其中详细说明了如下截图:

<img src="img/?action=stream">

我们将在本章的末尾使用这个元素,通过 Flask 框架和 Python 在网页上获取实时视频流。现在我们知道了如何从 USB 摄像头获取实时视频流并将其集成到网页上,让我们继续本章的下一个主题,我们将构建一个带有实时视频流的机器人。

高级项目 – 带直播视频流的遥控机器人

首先连接电机驱动 IC 和电机,电源如下电路所示:

高级项目 – 带直播视频流的遥控机器人

整个设置看起来如下:

高级项目 – 带直播视频流的遥控机器人

从前面的图片中你可以看到,BeagleBone Black 连接到一个 USB 集线器,Wi-Fi 适配器和 USB 摄像头都连接到这个集线器。L293D 连接到机器人的电机,并使用外部 12V 电池来驱动电机。L293D 的输入引脚连接到 BeagleBone Black,以控制 L293D。BeagleBone Black 使用 USB 到 DC 柱状连接器电缆通过移动电源供电,你可以按照以下图片所示自己制作:

高级项目 – 带直播视频流的遥控机器人

那为什么 BeagleBone 板不能使用内置的 USB 连接供电呢?这是因为 USB 总共只从输入电源中抽取了 500mAh,这不足以给 USB 摄像头和 Wi-Fi 适配器供电。

现在,你可以登录到 BeagleBone Black 并编写代码,从网页上控制机器人。

在这个项目中,我们不会从头编写代码——相反,我们将通过编辑来自第六章“使用 BeagleBone 进行家庭自动化”中我们的家庭自动化项目的代码来编写代码。所以,在登录后,让我们先进入 Linux shell 中的家庭自动化目录:

  • cd WorkSpace/HomeAutomation高级项目 – 带直播视频流的遥控机器人

如果你使用ls命令列出目录内容,你会看到以下:

高级项目 – 带有实时视频流的遥控机器人

一旦您处于智能家居目录中,让我们首先编辑 HTML 模板:

  • cd templates高级项目 – 带有实时视频流的遥控机器人

现在,我们可以继续编辑我们在智能家居项目中创建的 main.html 文件,并将其保存为 Robot.html 文件,如下所示屏幕截图:

高级项目 – 带有实时视频流的遥控机器人

一旦您打开了 main.html 文件,使用 nano 文本编辑器,编辑内容使其看起来像以下屏幕截图:

高级项目 – 带有实时视频流的遥控机器人

您可以看到,我们已经将之前主题中的图像源元素添加到这个 HTML 文件中,并添加了四个按钮。一旦保存文件,您就可以继续在需要运行的 Python 文件中进行更改,以创建服务器。

首先,让我们回到智能家居目录:

高级项目 – 带有实时视频流的遥控机器人

现在,让我们打开我们在智能家居项目中创建的 GPIOControlWebApp.py 文件:

高级项目 – 带有实时视频流的遥控机器人

按照以下屏幕截图所示编辑文件,并将其保存为 Robot.py

高级项目 – 带有实时视频流的遥控机器人

现在您可以通过以下命令运行 Python 代码:

  • sudo python Robot.py高级项目 – 带有实时视频流的遥控机器人

仅运行此代码是不够的。我们还需要运行流媒体软件,为我们的项目提供实时视频流。因此,使用另一个 PuTTY 会话登录到 BeagleBone Black,并按照以下屏幕截图所示运行流媒体软件:

高级项目 – 带有实时视频流的遥控机器人

当流媒体软件和 Python 代码同时运行时,您可以通过将 BeagleBone Black 的 IP 地址指向同一本地网络中的端口 5000(通过 PC 或手机连接到同一网络,与 BeagleBone 板连接的网络相同),在任何浏览器中检查服务器文件。您将看到下一页上的输出图片,从那里您可以查看实时视频并控制机器人:

高级项目 – 带有实时视频流的遥控机器人

因此,在先前的截图中,你可以看到机器人的轮子。设置与本章开头图片中显示的相同,当时摄像头指向机器人的轮子。这将向你展示当你点击网页上的每个按钮时,轮子的运动是如何工作的。我们将在下一部分讨论,你可以在图像本身上看到轮子的运动,因为正在运行的轮子看起来会模糊。

当你点击前进按钮时,两个电机按照我们在上一章讨论的差速驱动系统运行。也就是说,电机将驱动机器人向前行驶,你可以在下面的截图中看到与上一页本章中显示的图像中的轮子闲置且未运行时的区别。

高级项目 – 带实时视频流的遥控机器人

当你按下按钮时,你还可以在 Python 输出中看到移动日志,如下面的截图所示:

高级项目 – 带实时视频流的遥控机器人

同样,对于左转,右电机需要运行,而左电机停止,如下面的截图所示:

高级项目 – 带实时视频流的遥控机器人

当你按下右键按钮时,左键电机运行,而右键电机停止,如下面的截图所示:

高级项目 – 带实时视频流的遥控机器人

类似地,当你点击停止时,两个电机都会停止。如果你按照需求将这些电子元件安装在机器人顶部,你可以让它作为一个带有实时视频流的遥控机器人四处行驶。在本章中,我为你提供了理解这个想法所需的所有资源。现在,你可以继续在机器人基座上安装电子元件。要了解人们是如何在硬件开发板上焊接电子元件以制作简单的原型保护罩,只需在谷歌上输入BeagleBone 的原型保护罩树莓派的帽子以及 Arduino 的保护罩。尽管这些是为不同的硬件开发板(如 BeagleBone 和树莓派)制作的,但经过轻微修改,相同的电子元件可以安装在 BeagleBone 板上,这将帮助你摆脱杂乱的布线。此外,尝试使用子进程 Python 模块来执行 shell 命令,并在 Python 代码的开头启动流媒体软件以运行服务器。通过使用这个子进程,你不需要运行两个 PuTTY 实例,只需一个就可以完成你的工作。

摘要

有了这些,我们就结束了这一章的内容,其中我们学习了一些关于直流电机及其操作的基础知识,还了解了 L293D 电机驱动 IC 是什么,以及我们如何使用它来控制连接的直流电机。接下来,我们看到了如何使用 mjpg-streamer 软件包在 BeagleBone Black 本地服务器上直播视频。最后,我们进行了一个项目,其中我们将 L293D 电机驱动 IC 与 BeagleBone Black 以及实时图像源接口,并通过我们使用 Python 和 Flask 网络服务器框架创建的网页上的输入按钮控制机器人。

posted @ 2025-09-18 12:47  绝不原创的飞龙  阅读(36)  评论(0)    收藏  举报