ython物联网项目(四)绝不原创的飞龙

在第十三章中,介绍树莓派机器人小车,我们建造了 T.A.R.A.S 机器人小车。在章节结束时,我们讨论了如何通过代码控制 T.A.R.A.S。在本章中,我们将开始编写代码来实现这一点。

我们将首先编写简单的 Python 代码,然后利用 GPIO Zero 库使车轮向前移动,移动携带摄像头的伺服电机,并点亮机器人小车后面的 LED 灯。

然后,我们将使用类组织我们的代码,然后进一步增强它,让 T.A.R.A.S 执行秘密安全任务。

本章将涵盖以下主题:

查看 Python 代码

修改机器人小车的 Python 代码

增强代码

如果您跳到本章而没有经历前几章的项目,让我概述一下您完成以下项目所需的技能。当然,我们必须知道如何在 Raspbian OS 中四处走动,以便找到我们的集成开发环境(IDE)。

此外,需要对 Python 有一定的了解,因为本章的所有编码都将使用 Python 完成。由于我喜欢尽可能多地使用面向对象的方法,一些面向对象编程(OOP)的知识也将帮助您更好地从本章中受益。

在本章中,我们将编程 T.A.R.A.S 在桌子周围跳舞并拍照。本章的项目应该需要几个小时才能完成。

要完成这个项目,需要以下内容:

树莓派 3 型号(2015 年或更新型号)

USB 电源供应

计算机显示器

USB 键盘

USB 鼠标

已完成的 T.A.R.A.S 机器人小车套件(参见第十三章,介绍树莓派机器人小车)

在某种程度上,我们的机器人小车项目就像是我们在前几章中所做的代码的概述。通过使用 Python 和令人惊叹的 GPIO Zero 库,我们能够从 GPIO 读取传感器数据,并通过向 GPIO 引脚写入数据来控制输出设备。在接下来的步骤中,我们将从非常简单的 Python 代码和 GPIO Zero 库开始。如果您已经完成了本书中的一些早期项目,那么这些代码对您来说将会非常熟悉。

让我们看看是否可以让 T.A.R.A.S 移动一点。我们将首先编写一些基本代码来让机器人小车前后移动:

从应用程序菜单 | 编程 | Thonny Python IDE 中打开 Thonny

单击新图标创建新文件

将以下代码输入文件:

运行代码

如果发现电机没有按预期移动,那是因为接线的问题。尝试尝试不同的接线和更改Robot对象的引脚号码(left=(5,6), right=(22,27))。可能需要几次尝试才能搞定。

我们现在将测试舵机。为了做到这一点,我们将从右到左摆动机器人摄像头支架(机器人的头):

从应用程序菜单 | 编程 | Thonny Python IDE 打开 Thonny

单击新图标创建一个新文件

将以下代码输入文件:

运行代码

您应该看到机器人头部向右移动,等待5秒,然后向左移动。

在代码中,我们首先导入Adafruit_PCA9685库。在导入sleep函数后,我们创建一个名为pwm的PCA9685对象。当然,这是一个使用 Adafruit 代码构建的对象,用于支持 HAT。然后我们分别设置舵机可以移动的最小和最大值,分别为servo_min和servo_max。

如果您没有得到预期的结果,请尝试调整servo_min和servo_max的值。我们在第五章中稍微涉及了一些关于舵机的内容,用 Python 控制舵机。

您可能还记得在以前的章节中使用树莓派摄像头;特别是第九章,构建家庭安全仪表板,我们在那里使用它为我们的安全应用程序拍照。由于 T.A.R.A.S 将是我们可靠的安全代理,它有能力拍照是有意义的。让我们编写一些代码来测试一下我们的机器人车上的摄像头是否工作:

从应用程序菜单 | 编程 | Thonny Python IDE 打开 Thonny

单击新图标创建一个新文件

输入以下代码:

运行代码

如果一切设置正确,您应该在/home/pi目录中看到一个图像文件,文件名为image,后跟今天的日期。

我们的安全代理受限于发出噪音以警示我们并吓跑潜在的入侵者。在这一部分,我们将测试安装在 T.A.R.A.S 上的有源蜂鸣器。

旧的英国警察口哨是过去警察官员必须自卫的最早和可信赖的装备之一。英国警察口哨以其独特的声音,允许警官之间进行交流。尽管警察口哨已不再使用,但它的遗产对社会产生了影响,以至于“吹哨人”这个术语至今仍用来指代揭露隐藏的不公正或腐败的人。

从应用程序菜单 | 编程 | Thonny Python IDE 打开 Thonny

单击新图标创建一个新文件

将以下代码输入文件:

运行代码

您应该听到蜂鸣器声音持续5秒,然后关闭。

在 T.A.R.A.S 的背面,我们安装了两个 LED(最好是一个红色和一个绿色)。我们以前使用简单的 GPIO Zero 库命令来闪烁 LED,所以这对我们来说不应该是一个挑战。让我们更进一步,创建可以用来封装 LED 闪烁模式的代码:

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

点击新图标创建一个新文件

输入以下代码:

运行代码

你应该看到 LED 显示器闪烁 20 秒。但值得注意的是我们的代码中使用了 GPIO Zero 库的LEDBoard类,如下所示:

在这段代码中,我们从LEDBoard类中实例化一个名为led_lights的对象,并使用red和green的值来配置它,分别指向21和20的 GPIO 引脚。通过使用LEDBoard,我们能够分别或作为一个单元来控制 LED。blink_together方法控制 LED 作为一个单元,如下所示:

我们的代码相当容易理解;然而,还有一些其他事情我们应该指出。当我们初始化TailLights对象时,我们让 LED 短暂闪烁以表示对象已被初始化。这样可以在以后进行故障排除;尽管,如果我们觉得代码是多余的,那么我们以后可以将其删除:

保留初始化代码可能会很方便,尤其是当我们想要确保我们的 LED 没有断开连接时(毕竟,谁在尝试连接其他东西时没有断开过某些东西呢?)。要从 shell 中执行此操作,请输入以下代码:

你应该看到 LED 闪烁了半秒钟。

现在我们已经测试了电机、舵机、摄像头和 LED,是时候将代码修改为类,以使其更加统一了。在本节中,我们将让 T.A.R.A.S 跳舞。

让我们从封装移动机器人车轮的代码开始:

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

点击新图标创建一个新文件

将以下代码输入文件中:

运行代码

你应该看到 T.A.R.A.S 在你面前跳了一小段舞。确保连接到 T.A.R.A.S 的电线松动,这样 T.A.R.A.S 就可以做自己的事情。谁说机器人不能跳舞呢?

这段代码相当容易理解。但值得注意的是我们如何从dance方法中调用move_forward、move_backwards、turn_left和turn_right函数。我们实际上可以参数化移动之间的时间,但这会使事情变得更加复杂。0.5秒的延迟(加上硬编码的速度0.2)似乎非常适合一个不会从桌子上掉下来的跳舞机器人。可以把 T.A.R.A.S 想象成在一个非常拥挤的舞池上,没有太多的移动空间。

但等等,还有更多。T.A.R.A.S 还可以移动头部、点亮灯光并发出一些声音。让我们开始添加这些动作。

由于 T.A.R.A.S 上的摄像头连接到头部,因此将头部运动(摄像头支架舵机)与摄像头功能封装起来是有意义的:

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

点击新图标创建一个新文件

将以下代码输入文件中:

运行代码

你应该看到 T.A.R.A.S 把头向右转,然后向下,然后向上,然后全部向左,然后返回到中间并停止。

再次,我们尝试编写我们的代码,使其易于理解。当实例化RobotCamera对象时,init方法确保 T.A.R.A.S 在移动头部之前将头部抬起:

通过调用RobotCamera类,我们将代码结构化为查看机器人车头部舵机和运动的一部分。尽管我们在示例中没有使用摄像头,但我们很快就会使用它。为舵机位置设置的最小和最大值是通过试验和错误确定的,如下所示:

尝试调整这些值以适应您的 T.A.R.A.S 机器人车的构建。

dance和secret_dance方法使用机器人车头执行一系列动作来模拟跳舞。它们基本上是相同的方法(除了take_picture在最后调用),secret_dance方法使用树莓派摄像头拍照,并以基于日期的名称存储在主目录中。

现在 T.A.R.A.S 可以移动身体和头部了,是时候发出一些声音了:

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

单击新图标创建新文件

将以下代码输入文件

运行代码

您应该听到 T.A.R.A.S 上的有源蜂鸣器发出短促的蜂鸣声。这似乎是为了做这个而写了很多代码,不是吗?啊,但是等到下一节,当我们充分利用RobotBeep类时。

RobotBeep的init函数允许我们打开和关闭类实例化时听到的初始蜂鸣声。这对于测试我们的蜂鸣器是否正常工作很有用,我们通过在创建robot_beep对象时向类传递True来进行测试:

循环遍历notes列表,查看note变量。我们使用第一个元素作为保持蜂鸣器开启的时间长度,第二个元素作为在再次打开蜂鸣器之前休息的时间量。换句话说,第一个元素确定音符的长度,第二个元素确定该音符与下一个音符之间的间隔。notes列表和play_song方法使 T.A.R.A.S 能够唱歌(尽管没有旋律)。

我们将在下一节中使用play_song方法。

这是一个寒冷,黑暗和阴郁的十二月之夜。我们对我们的对手知之甚少,但我们知道他们喜欢跳舞。T.A.R.A.S 被指派到敌人领土深处的一个当地舞厅。在这个晚上,所有感兴趣的人都在那里。如果您选择接受的话,您的任务是编写一个程序,让 T.A.R.A.S 在舞厅拍摄秘密照片。但是,它不能看起来像 T.A.R.A.S 在拍照。T.A.R.A.S 必须跳舞!如果我们的对手发现 T.A.R.A.S 在拍照,那将是糟糕的。非常糟糕!想象一下帝国反击战中的 C3PO 糟糕。

因此,我们有能力让 T.A.R.A.S 移动头部和身体,发出声音,发光和拍照。让我们把所有这些放在一起,以便完成任务:

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

单击新图标创建新文件

将以下内容输入文件:

运行代码

在秘密拍照之前,您应该看到 T.A.R.A.S 执行一系列动作。如果舞蹈结束后检查树莓派home文件夹,您应该会看到六张新照片。

我们代码中值得注意的是light_show列表的使用。我们以两种方式使用此列表。首先,将列表中存储的值传递给我们在RobotDance类中实例化的TailLights对象的alarm方法。我们在lets_dance_incognito方法中使用tail_light_repetition变量,如下所示:

如您在先前的代码中所看到的,TailLights类的变量alarm方法被命名为tail_lights。这将导致 LED 根据tail_light_repetition的值多次执行它们的序列。例如,当将值2传递给alarm方法(light_show列表中的第一个值)时,LED 序列将执行两次。

我们运行lets_dance_incognito方法六次。这基于light_show列表中的值的数量。这是我们使用light_show的第二种方式。为了增加或减少 T.A.R.A.S 执行舞蹈的次数,我们可以从light_show列表中添加或减去一些数字。

当我们在名为robot_camera的RobotCamera对象上调用secret_dance方法时,对于light_show列表中的每个值(在本例中为六),在舞蹈结束后,我们的家目录中应该有六张以日期命名的照片。

T.A.R.A.S 完成舞蹈后,请检查家目录中 T.A.R.A.S 在舞蹈期间拍摄的照片。任务完成!

在本章结束时,您应该熟悉使用 Python 代码控制树莓派驱动的机器人。我们首先通过简单的代码使机器人车上的各种组件工作。在我们确信机器人车确实使用我们的 Python 命令移动后,我们将代码封装在类中,以便更容易使用。这导致了RobotDance类,其中包含对类的调用,这些类又封装了我们机器人的控制代码。这使我们能够使用RobotDance类作为黑匣子,将控制代码抽象化,并使我们能够专注于为 T.A.R.A.S 设计舞步的任务。

在第十五章中,将机器人车的感应输入连接到网络,我们将从 T.A.R.A.S(距离传感器值)中获取感官信息,并将其发布到网络上,然后将 T.A.R.A.S 从桌面上的电线中释放出来,让其自由行动。

真或假?LEDBoard对象允许我们同时控制许多 LED。

真或假?RobotCamera对象上的笔记列表用于移动摄像机支架。

真或假?我们虚构故事中的对手喜欢跳舞。

dance和secret_dance方法之间有什么区别?

机器人的gpiozero库的名称是什么?

受老警察哨子启发,给出揭露犯罪行为的行为的术语是什么?

真或假?封装控制代码是一个毫无意义和不必要的步骤。

TailLights类的目的是什么?

我们将使用哪个类和方法将机器人车转向右侧?

RobotCamera类的目的是什么?

学习 GPIO Zero 的最佳参考书之一是 GPIO Zero PDF 文档本身。搜索 GPIO Zero PDF,然后下载并阅读它。

为了使我们的机器人汽车 T.A.R.A.S 成为真正的物联网设备,我们必须将 T.A.R.A.S 连接到互联网。在本章中,我们将通过将 T.A.R.A.S 的距离传感器连接到网络,开始将桌面机器人转变为互联网机器人。

本章将涵盖以下主题:

识别机器人汽车上的传感器

使用 Python 读取机器人汽车的感应数据

将机器人汽车的感应数据发布到云端

要完成本章,您应该已经按照第十三章中详细描述的方式构建了 T.A.R.A.S 机器人汽车。与本书中的其他章节一样,需要具备 Python 的工作知识,以及对面向对象编程的基本理解。

本章的项目将涉及将 T.A.R.A.S 的感应距离数据发送到互联网。我们将使用 ThingsBoard 创建一个在线仪表板,该仪表板将在模拟表盘上显示这些距离信息。

这个项目应该需要几个小时来完成。

要完成这个项目,需要以下设备:

一个树莓派 3 型号(2015 年或更新型号)

一个 USB 电源供应

一台电脑显示器

一个 USB 键盘

一个 USB 鼠标

一个完成的 T.A.R.A.S 机器人汽车套件(参见第十三章,介绍树莓派机器人汽车)

在整本书的过程中,我们使用了一些输入传感器。我们还将这些传感器的数据发布到了互联网上。T.A.R.A.S 使用距离传感器来检测附近的物体,如下图所示:

第一次看到 T.A.R.A.S 时,您可能不知道距离传感器的位置在哪里。在 T.A.R.A.S 和许多其他机器人上,这个传感器位于眼睛位置。

以下是 HC-SR04 距离传感器的照片,即 T.A.R.A.S 上使用的传感器:

如果您在机器人上搜索 HC-SR04 的 Google 图片,您会看到很多使用这个传感器的机器人。由于其低成本和广泛可用性,以及其方便的眼睛外观,它是一个非常受欢迎的选择。

GPIO Zero 库使得从 HC-SR04 读取数据变得容易。以下图表是使用这个传感器与树莓派连接的接线图:

正如你所看到的,HC-SR04 有四个引脚,其中两个用于信号输入和输出。接线图是我们在第十三章中用来连接 T.A.R.A.S 的子图,介绍树莓派机器人汽车。连接如下:

从 HC-SR04(距离传感器)的 Trig 到树莓派的 17 号引脚

从 HC-SR04 的 Echo(距离传感器)到面包板上 330 欧姆电阻的左侧

从 HC-SR04 的 VCC(距离传感器)到树莓派的 5V

从电压分压器输出到树莓派的 18 号引脚

从 HC-SR04 的 GND 到面包板上 470 欧姆电阻的右侧

触发器是 HC-SR04 的输入,可使用 5V 或 3.3V。回波引脚是输出,设计用于 5V。由于这对我们的树莓派来说有点太多了,我们使用电压分压电路将电压降低到 3.3V。

我们本可以向 T.A.R.A.S 添加更多传感器,使其更加先进,包括线路跟踪传感器、温度传感器、光传感器和 PID 传感器。线路跟踪传感器尤其有趣,因为一个简单的线路可以为 T.A.R.A.S 提供在其安全巡逻任务期间跟随的路线,这是一个非常有用的补充。由于设计已经足够复杂,如果您选择的话,我将留给您添加这个功能。

以下图表概述了线路跟踪传感器的工作原理:

在图表中,您将看到机器人车前面有两个传感器。当机器人车偏离一侧时,其中一个传感器会检测到。在上一个示例中,位置为B的汽车已经向右偏离。左侧传感器会检测到这一点,并且程序通过将机器人车向左转动来进行校正,直到它返回到位置A。

虽然我们之前已经介绍过这个,但熟悉(或重新熟悉)HC-SR04 的编程是一个好主意:

从应用程序菜单 | 编程 | Thonny Python IDE 中打开 Thonny。

点击“新建”创建一个新文件。

输入以下内容:

运行代码。

将手放在距离传感器前面。您应该在 shell 中看到以下内容(取决于您的手离距离传感器有多远):

现在我们能够从距离传感器中检索值,让我们修改代码,使其更加面向对象友好:

从应用程序菜单 | 编程 | Thonny Python IDE 中打开 Thonny

点击“新建”创建一个新文件

输入以下内容:

运行代码

代码应该以完全相同的方式运行。我们所做的唯一的事情就是将它封装在一个类中,以便进行抽象。随着我们编写更多的代码,这将使事情变得更容易。我们不必记住 HC-SR04 连接到哪些引脚,实际上我们也不需要知道我们正在从中获取数据的是一个距离传感器。这段代码在视觉上比以前的代码更有意义。

要将我们的距离传感器数据发布到 ThingsBoard,我们首先需要创建一个 ThingsBoard 设备:

点击“设备”,然后点击屏幕右下角的大橙色+号:

在“名称”中输入RobotEyes,将设备类型保留为“默认”,并在“描述”下输入有意义的描述

点击“添加”

点击RobotEyes以从右侧滑出菜单

点击“复制访问令牌”将令牌复制到剪贴板上

将令牌粘贴到一个文本文件中

对于我们的代码,我们将使用 MQTT 协议。如果 Paho MQTT 库尚未安装在您的树莓派上,请执行以下操作:

从树莓派主工具栏中打开一个终端应用程序

输入sudo pip3 install pho-mqtt

您应该看到库已安装。

现在是时候编写代码,将 T.A.R.A.S 的感知数据发布到网络上了。我们将修改我们的RobotEyes类:

从应用程序菜单|编程|Thonny Python IDE 中打开 Thonny

点击新建创建一个新文件

输入以下内容:

确保将访问令牌从文本文件粘贴到access_token变量中

运行代码

您应该在 shell 中看到distance值,就像以前一样。但是,当您转到 ThingsBoard 并单击最新遥测时,您应该看到相同的值,如下所示:

我们在这里所取得的成就,就像第十章中一样,发布到 Web 服务,成功地将我们的距离传感器信息传输到了互联网。现在,我们可以从世界上任何地方看到物体离我们的机器人车有多近。在上一张屏幕截图中,我们可以看到有某物离我们 3.801 厘米远。

再次,我们尽可能地使代码自解释。但是,我们应该指出类的publish_distance方法:

在这种方法中,我们首先创建了一个名为distance的变量,我们用我们的类get_distance方法中的实际距离信息填充它。创建了一个名为sensor_data的 Python 字典对象,并用它来存储distance值。然后,我们创建了一个名为client的 MQTT 客户端对象。我们将密码设置为我们从 ThingsBoard 复制的access_token,然后使用标准的 ThingsBoard 样板代码进行连接。

现在,让我们使用我们的距离传感数据创建一个仪表板小部件:

点击在小部件上显示

在当前包中,从下拉菜单中选择模拟表,如下所示:

点击顶部的添加到仪表板

创建名为RobotEyes的新仪表板,并选中打开仪表板框:

点击添加

恭喜!我们现在已经为 T.A.R.A.S 的感知距离信息创建了一个物联网仪表板小部件。有了这个,我们可以全屏查看信息:

在本章中,我们通过将距离数据发布到互联网,将 T.A.R.A.S 变成了一个真正的物联网物体。通过将我们的代码封装到一个名为RobotEyes的类中,我们可以忘记我们正在处理距离传感器,只需专注于 T.A.R.A.S 的眼睛表现得像声纳一样。

通过 ThingsBoard 中的演示平台,我们能够编写代码,将 T.A.R.A.S 的距离信息发送到仪表板小部件以供显示。如果我们真的想要创造性地做,我们可以通过舵机连接一个实际的模拟设备,并以这种方式显示距离信息(就像我们在第六章中所做的那样,使用舵机控制代码来控制模拟设备)。在第十六章中,使用 Web 服务调用控制机器人车,我们将更进一步,开始从互联网上控制 T.A.R.A.S。

连接 HC-SR04 到树莓派时,为什么要使用电压分压电路?

正确还是错误?T.A.R.A.S 通过声纳来看。

ThingsBoard 中的设备是什么?

正确还是错误?我们的类RobotEyes封装了 T.A.R.A.S 上使用的树莓派摄像头模块。

真的还是假的?我们需要使用 MQTT 的库在 Raspbian 上预先安装。

为什么我们将类命名为RobotEyes而不是RobotDistanceSensor?

真的还是假的?将样板代码封装在一个类中会使代码更难处理。

真的还是假的?GPIO Zero 库不支持距离传感器。

有一天,无人驾驶汽车将主导我们的街道和高速公路。尽管感应信息和控制算法将位于汽车本身,但我们将有能力(并且可能会成为立法要求)从其他地方控制汽车。控制无人驾驶汽车将需要将汽车的感应信息以速度、GPS 位置等形式发送到控制站。相反,控制站的信息将以交通和方向等形式发送到汽车。

在本章中,我们将探讨从 T.A.R.A.S 发送感应信息和接收 T.A.R.A.S 控制信息的两个方面。

本章将涵盖以下主题:

从云端读取机器人车的数据

使用 Python 程序通过云端控制机器人车

要完成本章,您应该有一个完整的 T.A.R.A.S 机器人车,详细描述在第十三章中,介绍树莓派机器人车。与本书中的其他章节一样,需要具备 Python 的工作知识,以及对面向对象编程的基本理解。

本章的项目将涉及通过互联网与 T.A.R.A.S 进行通信。我们将深入研究在第十五章中创建的仪表板模拟表,然后在仪表板上创建控制 T.A.R.A.S 的开关。这些项目应该需要大约 2 小时才能完成。

要完成此项目,需要以下内容:

一个树莓派 3 型号(2015 年或更新型号)

一个 USB 电源适配器

一台电脑显示器

一个 USB 键盘

一个 USB 鼠标

一个完整的 T.A.R.A.S 机器人车套件(参见第十三章,介绍树莓派机器人车)

这是我们改变距离表外观的方法:

点击 DASHBOARDS

点击 ROBOTEYES 标题

单击屏幕右下角的橙色铅笔图标

您会注意到距离模拟表已经改变(见下面的屏幕截图)

首先,表盘右上角有三个新图标

右下角的颜色也变成了浅灰色

您可以通过将鼠标悬停在右下角来调整小部件的大小

您也可以将小部件移动到仪表板上

右上角的 X 允许您从仪表板中删除此小部件

带有下划线箭头的图标允许您将小部件下载为.json文件。此文件可用于将小部件导入 ThingsBoard 上的另一个仪表板

单击小部件上的铅笔图标会产生一个从右侧滑出的菜单:

如前面的屏幕截图所示,菜单选项为 DATA、SETTINGS、ADVANCED 和 ACTION。默认为 DATA

点击 SETTINGS 选项卡

在标题下,将名称更改为RobotEyes:

点击显示标题复选框

点击背景颜色下的白色圆圈:

将顶部更改为rgb(50,87,126)

点击右上角的橙色复选框以接受更改

您会注意到距离表有一些外观上的变化(请参见以下屏幕截图):

看着距离模拟表,很明显,对于我们的应用程序来说,有负数并没有太多意义。让我们将范围更改为0到100:

点击小部件上的铅笔图标

点击“高级”选项卡

将最小值更改为0,将最大值更改为100:

点击右上角的橙色复选框以接受对小部件的更改

关闭 ROBOTEYES 对话框

点击右下角的橙色复选框以接受对仪表板的更改

您会注意到距离模拟表现在显示范围为0到100:

对于我们的最后一个技巧,我们将在我们的帐户之外显示我们的仪表板(我们在第十章中也这样做,发布到 Web 服务)。这也允许我们将我们的仪表板发送给朋友。那么,为什么我们要在帐户之外查看我们的仪表板呢?物联网的核心概念是我们可以从一个地方获取信息并在其他地方显示,也许是在世界的另一边的某个地方。通过使我们的仪表板在我们的帐户之外可访问,我们允许在任何地方设置仪表板,而无需共享我们的帐户信息。想象一下世界上某个地方有一块大屏幕,屏幕的一小部分显示我们的仪表板。从 T.A.R.A.S 显示距离信息可能对许多人来说并不是很感兴趣,但重要的是概念。

在 ThingsBoard 应用程序中,点击“仪表板”选项

点击 RobotEyes 仪表板下的中间图标:

点击 URL 旁边的图标将 URL 复制到剪贴板

要测试 URL,请将其粘贴到计算机上的完全不同的浏览器中(或将其发送给朋友并让他们打开)

您应该能够看到我们的距离模拟表的仪表板

能够在仪表板中看到传感器数据是非常令人印象深刻的。但是,如果我们想要从我们的仪表板实际控制某些东西怎么办?在本节中,我们将做到这一点。我们将首先构建一个简单的开关来控制 T.A.R.A.S 上的 LED。然后,我们将扩展此功能,并让 T.A.R.A.S 通过互联网上的按钮按下来跳舞。

让我们首先将仪表板的名称从RobotEyes更改为RobotControl:

在 ThingsBoard 应用程序中,点击“仪表板”选项

点击 RobotEyes 仪表板下的铅笔图标:

点击橙色铅笔图标

将瓷砖从RobotEyes更改为RobotControl:

点击橙色复选框以接受更改

退出侧边对话框

现在让我们从 ThingsBoard 仪表板上控制 T.A.R.A.S 上的 LED。

为了控制 LED,我们需要创建一个开关:

点击 RobotControl 仪表板

点击橙色铅笔图标

点击+图标

点击“创建新小部件”图标

选择“控制小部件”并点击“切换控制”:

在目标设备下,选择 RobotControl

点击“设置”选项卡:

将标题更改为Green Tail Light,然后点击显示标题

点击高级选项卡

将 RPC 设置值方法更改为toggleGreenTailLight:

点击橙色的勾号图标以接受对小部件的更改

关闭侧边对话框

点击橙色的勾号图标以接受对仪表板的更改

那么,我们刚刚做了什么?我们在我们的仪表板上添加了一个开关,它将发布一个名为toggleGreenTailLight的方法,该方法将返回一个值,要么是true,要么是false(默认返回值为this is a switch)。

既然我们有了开关,让我们在树莓派上编写一些代码来响应它。

要控制 T.A.R.A.S 上的绿色 LED,我们需要编写一些代码到 T.A.R.A.S 上的树莓派。我们需要我们仪表板的访问令牌(参见第十五章,将机器人汽车的感应输入连接到网络,关于如何获取):

从应用程序菜单中打开 Thonny | 编程 | Thonny Python IDE

点击新建图标创建一个新文件

输入以下内容:

运行代码

返回我们的 ThingsBoard 仪表板(如果您一直在 T.A.R.A.S 上的树莓派之外的计算机上使用,现在是一个好时机)

点击开关以打开它

您应该看到 T.A.R.A.S 上的绿色 LED 随开关的打开和关闭而打开和关闭

那么,我们刚刚做了什么?使用从 ThingsBoard 网站获取的样板代码,我们构建了一个消息查询遥测传输(MQTT)客户端,该客户端监听仪表板,并在接收到toggleGreenTailLight方法时做出响应。我们通过在on_connect方法中订阅'v1/devices/me/rpc/request/+'来实现这一点。我们在第十章中也使用了 MQTT,发布到网络服务。然而,由于这段代码几乎只是 MQTT 代码,让我们更仔细地研究一下。

MQTT 是一种基于发布者和订阅者方法的轻量级消息传递协议,非常适合在物联网中使用。理解发布者和订阅者的一个好方法是将它们与过去的报纸联系起来。发布者是制作报纸的实体;订阅者是购买和阅读报纸的人。发布者不知道,甚至不必知道,为了印刷报纸有多少订阅者(不考虑出版成本)。想象一下每天都会出版的巨大报纸,不知道有多少人会购买他们的报纸。因此,发布者可以有很多订阅者,反之亦然,订阅者可以订阅很多发布者,就像读者可以阅读很多不同的报纸一样。

我们首先导入我们代码所需的库:

on_connect方法打印出连接信息,然后订阅将我们连接到来自我们 ThingsBoard 仪表板的rpc方法的服务:

正是on_message方法使我们能够真正修改我们的代码以满足我们的目的:

第一个if语句,if data['method'] == 'toggleGreenTailLight',检查我们的msg是否包含我们在 ThingsBoard 仪表板上设置的toggleGreenTailLight方法。一旦我们知道msg包含这个方法,我们使用if data['params']提取data中的其他键值对,以检查是否有True值。换句话说,调用on_message方法返回的json文件看起来像{'params': True, 'method': 'toggleGreenTailLight'}。这基本上是一个包含两个键值对的 Python 字典。这可能看起来令人困惑,但最简单的想法是将其想象成一个json版本的方法(toggleGreenTailLight)和一个返回值(True)。

当从params返回的值为True时,我们简单地使用标准的 GPIO Zero 代码打开 LED。当从params返回的值不是True(或False,因为只有两个可能的值)时,我们关闭 LED。

通过使用互联网看到 LED 开关是相当令人印象深刻的。然而,这还不够。让我们利用我们在之前章节中使用的一些代码,让 T.A.R.A.S 跳舞。这一次,我们将通过互联网让它跳舞。

要让 T.A.R.A.S 再次跳舞,我们需要确保第十四章中的代码使用 Python 控制机器人车与我们将要编写的代码在同一个目录中。

我们将从在我们的仪表板上创建一个跳舞开关开始:

按照之前的步骤 1 到 9,在仪表板下添加一个开关来创建一个开关

将标题更改为 Dance Switch 并点击显示标题

点击高级选项卡

将RPC set value method更改为dance

点击橙色的勾号图标以接受对小部件的更改

关闭侧边对话框

点击橙色的勾号图标以接受对仪表板的更改

现在我们有了开关,让我们修改我们的代码:

从应用程序菜单 | 编程 | Thonny Python IDE 打开 Thonny

点击新图标创建一个新文件

输入步骤 4 中的以下内容:

运行代码

现在去仪表板上打开跳舞开关(不幸的是,它是一个开关而不是一个按钮)。T.A.R.A.S 应该开始跳舞,就像在第十四章中一样,使用 Python 控制机器人车。

那么,我们刚刚做了什么?嗯,我们拿了简单的代码,稍微修改了一下,通过面向对象编程的力量,我们能够让 T.A.R.A.S 跳舞,而无需更改甚至浏览我们旧的RobotDance代码(难道 OOP 不是自从你认为最好的东西以来最好的东西吗?)。

对于 MQTT 代码,我们所要做的就是在RobotDance类中添加import,去掉多余的 GPIO Zero 导入,去掉对 LED 的任何引用(因为这会引起冲突),然后修改我们的on_message方法以查找dance作为方法。

RobotDance类类型的robot_dance对象完成了所有工作。当我们在这个对象上调用lets_dance_incognito方法时,它会启动RobotWheels、RobotBeep、TailLights和RobotCamera类中用于移动的方法。最终结果是通过互联网上的开关让 T.A.R.A.S 跳舞的方法。

在本章中,我们进一步研究了我们用于距离传感信息的仪表盘模拟表。在更改范围并将其公开之前,我们对其进行了美学修改。然后,我们将注意力转向通过互联网控制 T.A.R.A.S。通过使用一个简单的程序,我们能够通过仪表盘开关打开 T.A.R.A.S 上的绿色 LED。我们利用这些知识修改了我们的代码,通过另一个仪表盘开关使 T.A.R.A.S 跳舞。

在第十七章 构建 JavaScript 客户端中,我们将继续编写一个 JavaScript 客户端,通过互联网控制 T.A.R.A.S。

无人驾驶汽车需要从中央站获取什么类型的信息?

真/假?在 ThingsBoard 仪表盘中无法更改小部件的背景颜色。

如何更改仪表盘模拟表的范围?

真/假?从行print(data)返回的信息无法被人类阅读。

我们从RobotDance类中调用哪个方法来使 T.A.R.A.S 跳舞?

真/假?我们需要使用的处理json数据的库叫做jason。

我们如何在仪表盘上创建一个开关?

真/假?T.A.R.A.S 上的绿色 LED 连接到 GPIO 引脚 14。

真/假?一个发布者只能有一个订阅者。

使用on_message方法从msg返回多少个键值对?

让我们面对现实吧。如果没有互联网,我们真的不会有物联网。JavaScript,连同 HTML 和 CSS,是互联网的核心技术之一。物联网的核心是设备之间通信的协议 MQTT。

在这一章中,我们将把注意力从 Python 转移到使用 JavaScript 构建 JavaScript 客户端以订阅 MQTT 服务器上的主题。

本章将涵盖以下主题:

介绍 JavaScript 云库

使用 JavaScript 连接到云服务

我们将从创建一个简单的 JavaScript 客户端开始这一章,该客户端连接到 MQTT Broker(服务器)。我们将向 MQTT Broker 发送一条测试消息,然后让该消息返回到我们创建 JavaScript 客户端的同一页。然后我们将从 Raspberry Pi 发布一条消息到我们的 MQTT Broker。

完成本章应该需要几个小时。

要完成这个项目,需要以下内容:

Raspberry Pi 3 型号(2015 年或更新型号)

USB 电源适配器

计算机显示器

USB 键盘

USB 鼠标

用于编写和执行 JavaScript 客户端程序的单独计算机

让我们首先介绍一下 JavaScript 云库的背景。JavaScript 自互联网诞生以来就存在(1995 年,举例而言)。它已经成为一种可以将 HTML 网页转变为完全功能的桌面等效应用程序的语言。就我个人而言,我发现 JavaScript 是最有用的编程语言之一(当然,除了 Python)。

JavaScript 于 1995 年发布,旨在与当时最流行的网络浏览器 Netscape Navigator 一起使用。它最初被称为 livescript,但由于在 Netscape Navigator 浏览器中使用和支持 Java,名称被更改为 JavaScript。尽管语法相似,但 Java 和 JavaScript 实际上与彼此无关——这是一个令人困惑的事实,直到今天仍然存在。

Eclipse Paho JavaScript 客户端库是一个面向 JavaScript 客户端的 MQTT 基于浏览器的库。Paho 本身是用 JavaScript 编写的,可以轻松地插入到 Web 应用程序项目中。Eclipse Paho JavaScript 客户端库使用 Web 套接字连接到 MQTT Broker。我们将在本章的项目中使用这个库。

对于我们的项目,我们将构建一个 JavaScript 客户端并将其连接到 MQTT Broker。我们将发布和订阅名为test的topic。然后,我们将在树莓派上编写一个小的简单程序来发布到名为 test 的主题。这段代码将演示使用 MQTT 发送和接收消息是多么容易。

请查看以下图表,了解我们将通过此项目实现的内容:

要设置帐户:

在创建帐户框中,输入您的电子邮件地址:

您将收到一封发送到该电子邮件地址的电子邮件,要求您确认。您可以通过单击电子邮件中的确认电子邮件按钮来完成确认过程。

然后您将进入一个页面,需要输入密码。选择密码,确认密码,然后按提交:

现在我们已经设置了 CloudMQTT 帐户,是时候创建一个用于我们应用程序的实例了:

从实例页面,单击标有创建新实例的大绿色按钮。

您将看到以下页面:

在名称框中,输入T.A.R.A.S(我们将将 MQTT Broker 实例命名为此,因为我们将考虑此 Broker 是 T.A.R.A.S 机器人汽车的一部分)。

在计划下拉菜单中,选择 Cute Cat(这是用于开发目的的免费选项)。

点击绿色的选择区域按钮。

根据您所在的世界位置,选择一个靠近您地理位置的区域。由于我位于加拿大,我将选择 US-East-1(北弗吉尼亚):

点击绿色的确认按钮。

您将看到确认新实例页面。在点击绿色的确认实例按钮之前,请查看此信息:

这是我在我的帐户上设置的 T.A.R.A.S 实例的屏幕截图。请注意列表中的值。这些值来自我的实例,您的值将不同。我们将在编写 JavaScript 客户端时使用这些值:

要编写我们的 JavaScript 客户端代码,我们应该使用 T.A.R.A.S 上的树莓派以外的计算机。您可以使用任何您喜欢的操作系统和 HTML 编辑器。我使用 macOS 和 Visual Studio Code 编写了我的 JavaScript 客户端代码。您还需要 Paho JavaScript 库:

点击 JavaScript 客户端链接。它将以JavaScript 客户端的名称标记,后跟版本号。在撰写本文时,版本号为 1.03。

我们需要在计算机上创建一个用作项目文件夹的文件夹。在计算机上创建一个新文件夹,并将其命名为MQTT HTML Client。

在MQTT HTML Client文件夹内创建一个名为scripts的子文件夹。

MQTT HTML Client文件夹内的目录结构应如下所示:

现在,是时候编写代码了。我们将尽可能简化我们的代码,以便更好地理解 MQTT 如何与 JavaScript 配合使用。我们的客户端代码将包括两个文件,一个 HTML 页面和一个.js(JavaScript)文件。让我们从创建 HTML 页面开始:

您的project文件夹应该如下所示:

在运行客户端代码之前,我们需要创建一个 JavaScript 文件,该文件将提供我们需要的功能:

点击Subscribe to test按钮。您应该会收到一个弹出对话框,显示Subscribed to test消息。

关闭弹出对话框。

点击发送测试消息按钮。

您应该在文本框中看到消息Hello from JavaScript client。

这是我们刚刚执行的某种魔术吗?在某种程度上是。我们刚刚成功订阅了 MQTT Broker 上的一个主题,然后发布到相同的主题,然后在同一个 JavaScript 客户端中接收到了一条消息。要从 MQTT Broker 中观察到这一点,请执行以下操作:

点击 T.A.R.A.S 实例

点击 WEBSOCKET UI 菜单选项

您应该会看到以下对话框,显示您已连接:

再次点击发送测试消息按钮

返回 CloudMQTT 页面

在接收到的消息列表下,您应该看到一条消息:

我们首先来看订阅代码。我们用来从我们的 MQTT Broker 订阅主题的两种方法是subscribeTestData和onsubsribeTestDataSuccess。subscribeTestData创建了一个名为client的 Paho MQTT 客户端对象。它使用client对象通过实例化对象与我们的 MQTT Broker 连接,并使用Server和Websockets Port值(为简单起见,我在代码中留下了我的帐户中的值):

当成功连接到 MQTT 代理时,将调用onsubsribeTestDataSuccess方法。它设置client对象以订阅test主题。然后,它创建一个带有消息Subscribed to test的警报:

如果与客户端的连接不成功,则调用doFail方法。它只是创建一个带有消息“错误!”的弹出警报:

现在我们了解了订阅test主题的代码,让我们看一下发布到test主题的代码。

sendTestData函数与subscribeTestData函数非常相似:

创建了一个名为client的 Paho MQTT 客户端对象,其参数与subscribeTestData函数中使用的参数相同。设置的唯一回调处理程序是onConnectionLost。我们没有设置onMessageArrived,因为我们正在发送消息而不是接收消息。将options变量设置为与subscribeTestData函数中使用的相同值,唯一的例外是将onSuccess分配给sendTestDataMessage函数。

onConnectionLost函数用于订阅和发布,并简单地创建一个带有来自 JavaScript 响应对象的错误消息的警报弹出窗口:

既然我们的 JavaScript 客户端已经订阅并发布到我们的 MQTT 代理,让我们让树莓派也参与其中。

让我们返回到我们的树莓派(如果您一直在使用另一台计算机),并编写一些代码与我们的 MQTT 代理进行通信:

从应用程序菜单 | 编程 | Thonny Python IDE 打开 Thonny。

单击“新建”图标创建一个新文件。

在文件中输入以下内容:

返回到 CloudMQTT 页面。您应该看到来自树莓派的消息:

树莓派 Python 代码故意保持简单,以便可以理解这些概念。我们通过导入所需的库来启动代码。然后,我们创建一个名为mqttc的 MQTT 客户端对象。使用username_pw_set方法设置用户名和密码。然后,我们使用connect方法连接到 MQTT 代理,通过传递Server和Port值(我们为 Python 客户端使用Port而不是Websockets Port)。在一个连续的循环内,我们通过传递主题test和消息Hello from Raspberry Pi来通过publish方法发布到 MQTT 代理。

在本章中,我们在使用 JavaScript 创建 MQTT 客户端之前探索了 JavaScript 库。我们设置了一个基于云的 MQTT 代理,并能够使用我们的 JavaScript 客户端和树莓派上的 Python 程序发布和订阅消息。

在第十八章中,将所有内容放在一起,我们将扩展本章学到的知识,并构建一个可以通过互联网控制 T.A.R.A.S 的 JavaScript 客户端。

我们可以使用哪个程序(平台)在本地安装 MQTT Broker?

JavaScript 和 Java 是相同的技术,是真是假?

我们可以使用 JavaScript 来创建一个 MQTT 客户端吗?

我们可以使用google-api-javascript-client库来访问哪些谷歌服务?

MQTT 是物联网中使用的协议,是真是假?

Python 可以用于开发 MQTT 客户端,是真是假?

我们可以通过使用脚本标签将外部 JavaScript 库的功能添加到我们的网页中,是真是假?

我们如何在 JavaScript 代码中为我们的 MQTT 客户端设置用户名和密码?

我们可以在 Cloud MQTT 应用程序中查看我们发布的消息吗?

对于我们的最后一步,我们将让 T.A.R.A.S 响应使用 JavaScript 客户端发送的 MQTT 控制信号。我们将通过修改到目前为止编写的代码来实现这一点。如果您从头开始阅读本书,感谢您的毅力。这是一个漫长的旅程。我们终于做到了。在本章结束时,我们将完成构建物联网设备的终极目标,即一个可以通过互联网控制的机器人车。

系好安全带(双关语)-是时候将 T.A.R.A.S 提升到下一个级别了。

在本章中,我们将涵盖以下主题:

构建一个 JavaScript 客户端以连接到我们的树莓派

JavaScript 客户端以访问我们的机器人车的感知数据

增强我们的 JavaScript 客户端以控制我们的机器人车

在本章中,我们将 T.A.R.A.S 连接到 MQTT 代理。通过 MQTT 消息,我们将控制 T.A.R.A.S 的移动,并从 T.A.R.A.S 的距离传感器中读取信息。以下是我们将要构建的图表:

我们将首先编写 HTML JavaScript 客户端(在图表中显示为HTML 客户端),并使用它发送和接收 MQTT 消息。然后,我们将把注意力转向编写 T.A.R.A.S 上的代码,以从相同的 MQTT 代理接收和发送消息。我们将使用这些消息来使用浏览器控制 T.A.R.A.S。最后,我们还将使用浏览器从 T.A.R.A.S 实时传输视频。

要完成此项目,需要以下内容:

一个树莓派 3 型(2015 年或更新型号)

一个 USB 电源适配器

一个计算机显示器

一个 USB 键盘

一个 USB 鼠标

一个 T.A.R.A.S 机器人车

以下是我们将构建的 HTML JavaScript 客户端的屏幕截图,用于通过网络控制 T.A.R.A.S。HTML JavaScript 客户端可能不会赢得任何设计奖,但它将作为一个优秀的学习平台,用于通过互联网发送机器人控制信息。

大紫色按钮用于向 T.A.R.A.S 发送“前进”和“后退”命令。较小的绿色按钮向 T.A.R.A.S 发送“左转”和“右转”控制信息。底部的小银色按钮允许我们使用 T.A.R.A.S 的摄像头拍照,触发 T.A.R.A.S 的警报,并让 T.A.R.A.S 跳舞。跟踪距离按钮将 HTML JavaScript 客户端连接到 T.A.R.A.S 传来的距离信息。

在我们为树莓派构建 Python MQTT 客户端之前,我们将使用 CloudMQTT 仪表板跟踪控制信息。

我们将首先为我们的 HTML JavaScript 客户端编写 HTML 代码。您可以使用树莓派以外的计算机:

在您的计算机上创建一个名为HTML JavaScript Client的project文件夹

从第十七章中复制 Paho JavaScript 库,构建 JavaScript 客户端,到project文件夹中

在您的project文件夹中,创建一个新文件夹,并将其命名为styles

在project文件夹中创建另一个文件夹,并将其命名为scripts

您的project目录应该与以下内容相同:

您应该看到 T.A.R.A.S 机器人车控制仪表板

由于我们的按钮几乎相似,我们只讨论第一个按钮。第一个按钮通过onclick属性绑定到我们 JavaScript 文件中的moveForward函数。按钮的样式通过将class分配给big_button来设置。我们使用第一个按钮来向前移动 T.A.R.A.S。

现在我们有了 HTML 和 CSS 文件,让我们创建一个 JavaScript 文件,让 MQTT 的魔力发生:

我已经在代码中留下了我的 CloudMQTT 实例的值。就像我们在第十七章中所做的那样,构建 JavaScript 客户端,用您实例的值(服务器、Websockets 端口、用户名、密码)替换这些值。

我们已经更改了上一个示例中的代码。moveForward函数创建了一个名为client的 Paho MQTT 客户端,其中包含从我们的 CloudMQTT 实例获取的服务器和Websockets 端口连接信息。设置了一个回调处理程序来处理连接丢失时的情况,该处理程序设置为onConnectionLost函数。使用从我们的 CloudMQTT 实例获取的userName和password信息创建了options变量。我们将成功连接到 MQTT 代理设置为sendMoveForwardMessage函数。然后通过传入options变量连接到我们的客户端。

sendMoveForwardMessage函数创建了一个名为Forward的新 Paho MQTT 消息。然后将此消息分配给RobotControl主题,并使用我们的 Paho MQTT 客户端对象client发送。

发送后退、右转、左转、拍照、触发警报和跳舞的消息的函数以类似的方式编写为moveForward函数。

现在我们已经为控制 T.A.R.A.S 在网络上构建了 HTML JavaScript 客户端,让我们使用 CloudMQTT 实例上的WEBSOCKETS UI页面进行测试:

导航回到您的 CloudMQTT 帐户。

选择您获取服务器、用户、密码和 Web 套接字端口连接信息的实例(在第十七章中,构建 JavaScript 客户端,我们创建了名为T.A.R.A.S的实例)。

点击左侧的 WEBSOCKETS UI 菜单选项。您应该在右侧收到一个成功连接的通知。

现在,导航回到您的 CloudMQTT 实例。您应该在“接收到的消息”列表中看到一条新消息:

恭喜!您刚刚连接了一个 HTML JavaScript 客户端到一个 MQTT 代理并发送了一条消息。现在我们将在另一台设备上使用完全不同的编程语言开发另一个客户端,然后使用该客户端订阅来自我们的 HTML JavaScript 客户端的消息。

类似于我们在第十七章中编写的代码,构建 JavaScript 客户端,subscribeDistanceData函数创建了一个 Paho MQTT 客户端,其中包含来自 CloudMQTT 实例的连接信息。成功连接后,将调用onsubscribeDistanceDataSuccess函数,该函数将client订阅到distance主题。

还创建了一个警报,告诉我们 HTML JavaScript 客户端现在已订阅了distance主题。

现在我们将把注意力转回到我们的树莓派机器人车上,并编写 Python 代码来与我们的 MQTT 代理通信,最终与我们的 HTML JavaScript 客户端通信。以下代码应直接从 T.A.R.A.S 运行。如果您想要无线运行 T.A.R.A.S,请使用 USB 电源适配器为树莓派供电,并在运行以下程序后断开 HDMI 电缆:

从应用程序菜单 | 编程 | Thonny Python IDE 中打开 Thonny。

单击新图标创建一个新文件。

将以下代码输入文件中:

从 Thonny 运行代码。

转到 HTML JavaScript 客户端,然后单击前进按钮:

T.A.R.A.S 应该向前移动一秒,然后停止。

底部的小灰色按钮允许您执行与 T.A.R.A.S 的各种任务:

通过单击这些按钮来探索每个按钮的功能。Take Picture按钮将拍照并将其存储在文件系统中,T.A.R.A.S Alarm将在 T.A.R.A.S 上触发警报,T.A.R.A.S Dance将使 T.A.R.A.S 跳舞。

要订阅来自 T.A.R.A.S 距离传感器的distance数据,请单击 Track Distance 按钮:

单击关闭以关闭弹出窗口。现在您应该看到 T.A.R.A.S 的距离数据信息显示在 Track Distance 按钮旁边。

与迄今为止我们编写的所有代码一样,我们的目标是使其尽可能简单和易于理解。我们代码的核心是watch_mode方法:

watch_mode方法是我们代码的默认方法。它在代码运行后立即调用,并在另一个方法完成时调用。在watch_mode中,我们需要创建一个名为mqttc的 MQTT 客户端对象,然后使用它连接到我们的 CloudMQTT 实例。从那里,我们将on_message回调设置为on_message方法。然后我们订阅RobotControl主题。随后的 while 循环调用我们的 MQTT 客户端mqttc的loop方法。由于我们已经设置了on_message回调,因此每当从RobotControl主题接收到消息时,程序都会退出 while 循环,并执行我们代码的on_message方法。

在watch_mode中,每 2 秒将距离传感器信息发布到distance主题。由于我们的 HTML JavaScript 客户端已设置为订阅distance主题上的消息,因此我们的 HTML JavaScript 客户端将每两秒在页面上更新distance信息。

从网络上控制 T.A.R.A.S 是一件了不起的事情,但如果我们看不到我们在做什么,那就没什么用了。如果你在树莓派上安装 RPi-Cam-Web-Interface,就可以很简单地从树莓派上直播视频。现在让我们来做这个:

如果您的树莓派上没有安装git,请在终端中使用sudo apt-get install git进行安装。

使用cd RPi_Cam_Web_Interface命令更改目录。

您应该看到配置选项屏幕:

通过在键盘上按Tab,接受所有默认设置,直到 OK 选项被突出显示。然后按Enter。

在看到“现在启动摄像头系统”对话框时选择“是”:

现在,您应该看到视频流播放器加载到您的浏览器中,并从您的树莓派实时播放视频。以下是我办公室 T.A.R.A.S 的直播截图,显示我的无人机:

正如我们已经提到的,我们的 HTML JavaScript 客户端是最具吸引力的界面。我设计它尽可能简单直接,以便解释各种概念。但是,如果我们想把它提升到另一个水平呢?以下是一些可能用于增强我们的 HTML JavaScript 客户端的 JavaScript 库的列表。

我们做到了!我们已经完成了树莓派物联网之旅。在本章中,我们将所学知识整合在一起,并创建了自己的 HTML JavaScript 客户端,用于通过网页控制 T.A.R.A.S。我们使用类来控制 T.A.R.A.S,使得创建控制代码相对容易,因为我们只需要在类上调用方法,而不是从头开始创建控制代码。

我们简要介绍了如何轻松地从树莓派实时传输视频。尽管我们做所有这些是为了通过网络控制机器人小车,但不难想象我们可以利用所学知识来构建任意数量的不同物联网项目。

我们生活在一个非常激动人心的时代。我们中的任何一个人都可以仅凭我们的智慧和一些相对便宜的电子元件来构建下一个杀手级应用程序。如果可能的话,我希望我能激励您使用令人惊叹的树莓派计算机来构建您的下一个伟大项目。

对于那些质疑我们如何将这视为物联网项目的人,当我们只使用我们的本地网络时,请研究一下如何在路由器上打开端口以连接外部世界。然而,这不是一项应该轻率对待的任务,因为在这样做时必须解决安全问题。请注意,您的互联网服务提供商可能没有为您提供静态 IP 地址,因此您构建的任何用于从外部访问您的网络的东西都会在 IP 地址更改时中断(我曾经构建过一个定期检查我的 IP 地址的 PHP 页面,存储最新地址,并有外部客户端会访问该 PHP 获取地址,而不是将其硬编码)。

在我们的项目中,我们向哪个主题发布控制类型的消息?

真或假?MQTT Broker 和 MQTT Server 是用来描述同一件事情的词语。

真或假?T.A.R.A.S 在相同的 MQTT 主题上发布和订阅。

我们的 HTML JavaScript 客户端中的大前进和后退按钮是什么颜色?

真或假?使用 HTML JavaScript 客户端,我们能够远程使用 T.A.R.A.S 上的摄像头拍照。

我们使用什么 MQTT 主题名称来订阅来自 T.A.R.A.S 的距离数据?

真或假?我们的 HTML JavaScript 客户端采用了屡获殊荣的 UI 设计。

真或假?使用我们的 CloudMQTT 账户,我们能够查看我们实例中发布的消息。

我们使用什么技术来从 T.A.R.A.S 进行视频直播?

真或假?Johnny-Five 是可口可乐公司推出的一种新果汁饮料。

THE END
0.你还在手动操作机器人?用Python构建语音控制系统的7个关键环节第一章:Python机器人语音控制概述 在现代自动化系统中,语音控制技术正逐步成为人机交互的重要方式。利用Python开发机器人语音控制系统,不仅具备良好的可扩展性,还能结合丰富的开源库实现高精度的语音识别与指令解析。 语音控制的基本原理 语音控制的核心流程包括音频采集、语音识别、命令解析和动作执行。首先通过麦克风获取用jvzquC41dnuh0lxfp0tfv8KwpeOom8ftvkimg8igvcomu86752:7;@7
1.PS2无线控制器,适用于Arduino和Python编程科学教育,高级套件AI 机器人臂套件,MaxArm ESP32 开源无线控制智能机器人臂带 AI 视觉传感器套件 PS2 无线控制器,适用于 Arduino 和 Python 编程科学教育,高级套件 玩具和游戏 › 遥控电动玩具 › 机器人 ¥2,315.10¥2,315.10 会员0门槛免运费,查看详情。非会员满300元免运费。jvzquC41yy}/cvf|qp4dp8ir1D6DIMG4YJS
2.错过这8个Python控制库,你就等于错过了整个智能制造未来第一章:Python工业机器人编程概述 工业机器人在现代制造业中扮演着核心角色,而Python凭借其简洁的语法和强大的库支持,正逐渐成为控制和编程工业机器人的首选语言之一。通过Python,开发者可以高效地实现路径规划、运动控制、传感器集成以及与机器人操作系统的通信,大幅缩短开发周期并提升系统可维护性。 jvzquC41dnuh0lxfp0tfv8Hqfg]ikv4ctvodnn4fgvgjn|4375657>52
3.【行空板Python编程学习主控板】使用陀螺仪和语音识别的星球大战【行空板 Python编程学习主控板】使用陀螺仪和语音识别的星球大战BB-8机器人控制器[复制链接]本帖最后jvzquC41ddy/gn|qtnj/exr0ep5uj{jcf/7359686/7.37mvon
4.【永泰•科技】砥砺前行再创辉煌——永泰小学科技颁奖仪式3.海淀区中小学生创客编程秀Python趣味编程竞赛 在海淀区中小学生创客编程秀Python趣味编程竞赛中,我校有5位同学获得二等奖,获奖名单如下: 南思同 昝子嘉 王晨 王嘉睿 刘晓然 4.海淀区中小学生机器人智能大赛 在海淀区中小学生机器人智能大赛中,我校有4位同学获得三等奖,获奖名单如下: jvzquC41{v~y0kojfgjv0ls1z{ld1sfv1814=531v814=5344e78@640unuou
5.“科技之光点亮梦想”第四届怀柔区青少年机器人竞赛暨首届怀柔区竞赛设置了包含机器人竞赛、创意编程与智能设计大赛两大类别的6个分赛项的竞赛活动。比赛严格遵循北京青少年机器人竞赛、北京创意编程与智能设计大赛的赛项及规则,一是运用了线下技能测试的比赛方式对智能设计2个赛项进行选拔,二是在区级赛事中开展Python人工智能对抗赛,均系全市首次! 区政协副主席高永革、北京青少年科技活动中心主任张小虎、 jvzq<84dl0}fpvnpi0io1qw1jtzqz€44247168y424716;:a8288:A90ujznn
6.人工智能+机器人入门与实战全本书评在线阅读树莓派是一款基于ARM架构、Linux系统的极简计算机,既可以用于计算机编程教育,也可以作为机器人的控制核心。*种运行于树莓派上的编程语言是Python,这是当前人工智能领域*为流行的编程语言。机器视觉是人工智能中重要的细分研究领域,OpenCV则是当前机器视觉领域主流的源处理库,可以方便地用于计算机图像处理,并应用于面部识别jvzq<84g0fgoimfpi0ipo8utqf{dv|43;2733:=3:0nuou
7.RoboCom世界机器人开发者大赛——Python编程设计大赛决赛11月13日,2020 RoboCom世界机器人开发者大赛组委会传来喜讯,由信息工程学院机器人社团参赛团队许俊毅同学(明子成老师指导)晋级Python编程设计大赛决赛。2020 Python编程设计大赛是工业和信息化部人才交流中心、中国计算机教育联合会、IEEE人机协同及柔性制造技术委员会jvzquC41kg4ole0gjv0ls1635:h8h7786b:;8571vbinr0jvs
8.【小学·社团建设】保持好奇心,拥有探索力——小学科技社团介绍通过动手搭建,培养儿童的动手能力和想象力,并提升孩子认知周围事物的水平和创造力;通过机器人组装、编程、调试、控制等活动,了解传感器原理、机器人运动控制,学会图形化编程。在机器人社团里,学生能够主动参与科技学习和锻炼、体验动手实践的乐趣,形成创新的意识和习惯。同时机器人社团也为我校学生提供了一个了解最新技术jvzquC41yy}/d€kz0eun0ls1kplp1:8;2183:?<0jvs
9.机器人工程专业核心课程:电路原理、模拟电子技术基础、数字电子技术基础、微型计算机系统、机器人基础原理、机械设计基础、自动控制原理、机器人伺服控制、Linux系统、电气控制与PLC应用、计算机控制系统、机器人设计与仿真、现代控制理论、Python编程、机器人检测技术、机器人操作系统基础、数字图像处理与机器视觉。 jvzquC41|jgpuqjpi0wvv7jfw0io1ƒ~ll1~y{tiez0lzwie0nuo