当前位置:首页 > 手机资讯 > 正文

C++ 机器人编程实用指南(三)手机机器人「C++ 机器人编程实用指南(三)」

原文:

译者:飞龙

协议:CC BY-NC-SA 4.0

在本节中,我们将使用 AppInventor2 网站创建一个安卓应用程序,通过它你可以用智能手机控制机器人。

以下章节包括在本节中:

  • 第九章,构建一个语音控制的机器人

2012 年,我想创建一个可以由 Android 智能手机控制的机器人。然而,当时我对 Android 编程并不了解。令我惊讶的是,我发现了一个名为 App Inventor 的神奇网站(),它允许用户通过将编程块连接在一起的方式来开发 Android 应用,就像拼图一样。

在这最后一章中,我们将使用 App Inventor 网站,并学习如何使用我们的声音作为输入,用 Android 智能手机来控制我们的机器人。我们将涵盖以下主题:

  • App Inventor 简介

  • 创建语音应用

  • 通过蓝牙将 Android 智能手机和树莓派(RPi)配对

  • 为 RPi 开发蓝牙程序

  • 运行 Android 版本 Lollipop(版本号 5.0-5.1.1)或更高版本的 Android 智能手机

  • 树莓派机器人

本章的代码文件可以从下载。

App Inventor 是一个由 Google 最初开发的开源基于 Web 的应用程序。目前由麻省理工学院(MIT)维护。它允许用户使用类似于 Scratch 的最先进的图形编程界面开发 Android 应用程序。开发人员必须拖放可视块来创建一个 App Inventor 的 Android 应用。App Inventor 的当前版本被称为 App Inventor 2(版本 2)或 AI2。

在下图中,您可以看到每个编程块如何连接在一起,就像拼图一样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本节中,我们将看看如何创建 App Inventor 帐户,然后使用 App Inventor 创建我们的第一个 Android 应用。

Talking Pi 是一个简单的 Android 应用程序,您可以在文本框中输入文本,智能手机会显示并朗读文本。在创建此 Android 应用程序之前,我们首先需要访问 App Inventor 2 仪表板。Talking Pi 应用程序的最终布局将如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要使用 App Inventor 2 创建 Android 应用程序,您必须拥有一个 Gmail 帐户。如果您已经有一个,请在您选择的浏览器上登录。如果没有,请创建一个。现在让我们看看将 App Inventor 2 与您的 Gmail 帐户链接的步骤:

  1. 登录后,转到以下链接:ai2.appinventor.mit.edu/。如果您在浏览器中使用多个 Gmail 帐户登录,您需要选择一个特定的 ID:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,您需要同意 AI2 的服务条款。然后,您将准备好创建 Talking Pi 应用程序。要创建一个新的 Android 应用程序项目,请单击“开始新项目”按钮,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,将项目命名为,然后单击确定:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建项目后,您将在 App Inventor 中看到以下四个主要面板,称为 Palette、Viewer、Components 和 Properties:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们了解每个面板的工作原理:

  • Palette 面板包括不同的组件,如按钮、文本框、画布、蓝牙、视频播放器等。

  • Viewer 面板由一个屏幕组成,我们可以从 Palette 中拖放 UI 组件。

  • 组件面板显示了添加到屏幕内的可见和不可见组件的列表。例如,按钮是一个可见组件,因为它在屏幕上可见。另一方面,蓝牙是一个不可见组件,因为它在屏幕上不可见,但它在后台起作用。所有不可见组件都显示在屏幕下方。

  • 属性面板允许我们修改组件的属性,这些组件在组件面板中被选中。

现在让我们继续设计应用程序。

在我们的 Talking Pi 应用程序中,我们将添加四个主要组件:TextBox、Button、Label 和 TextToSpeech。TextBox、Button 和 Label 组件位于用户界面选项中。按照以下步骤:

  1. 您可以依次将 TextBox、Button 和 Label 组件拖放到屏幕上,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 添加这三个组件后,您会注意到它们都对齐到屏幕的左上角,看起来有点奇怪。为了将它们水平定位在屏幕的中心,从组件面板中选择Screen1,并将AlignHorizontal更改为Center,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,为了在三个组件之间添加一些间距,我们可以在 TextBox、Button 和 Label 组件之间添加布局组件。例如,您可以选择 HorizontalArrangement 或 VerticalArrangement:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 如果要改变两个组件之间的距离,您需要更改 HorizontalArrangement 的高度。为此,请选择高度属性,并在 HorizontalArrangement 上设置特定的像素值,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,选择Button1组件,并将其文本更改为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 同样,选择Label1组件,将其文本更改为,并将其FontSize增加到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 最后,打开媒体选项并将 TextToSpeech 组件拖到屏幕上。由于 TextToSpeech 组件是一个不可见组件,它将显示在屏幕下方,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在基本上已经完成了 Talking Pi 应用程序的设计。现在让我们进入 Blocks 选项,并为显示文本并在点击按钮时将其转换为语音创建编程块。

设计应用程序的 UI 后,点击 Blocks 按钮,该按钮位于 Design 按钮旁边,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在块部分,左侧将看到Screen1,其中包含我们拖放到屏幕上的所有组件(可见和不可见)。如果点击任何组件,您将注意到每个组件的以下类型的块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将主要关注构成每个组件的三种类型的块。我们将这些称为主块中间块最终块。这些块中的每一个必须按正确的顺序连接以获得一个正常工作的程序,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们看看每个块。

App Inventor 2 中的主块类似于when循环,表示发生某事时要执行的操作。主块始终连接到中间块。我们不能直接将最终块连接到主块。主块包括一个下拉菜单,我们可以从中选择多个相同类型的组件。例如,看下面的截图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以看到,在有多个按钮的情况下,可以从下拉列表中选择特定的按钮。

中间块包括一个输入插座和一个输出插座输入插座连接到主块输出插座连接到最终块,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中间块包括两个下拉菜单。第一个下拉菜单代表相同类型的组件。例如,如果有多个标签,可以从第一个下拉菜单中选择特定的标签。第二个下拉菜单代表组件的属性。例如,对于Label1,我们有TextBackgroundColorWidth等,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如,Label1 . Text表示我们要设置或更改Label1的文本。

最终块连接到中间块。它还包括两个下拉菜单,我们可以从中选择特定的组件及其特定属性,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将使用这三种类型的块来创建我们的 Talking Pi 程序。让我们从块编程开始。

Talking Pi 编程逻辑非常简单。当按下Button1时,Label1必须显示在Textbox1内键入的文本,并且TextToSpeech1必须朗读该文本。执行此块程序的步骤如下:

  1. 首先,点击Button1组件并选择when Button1.Click主块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,由于我们希望在单击Button1时更改Label1的文本,因此选择Label1组件中的Label1.Text块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,将Label1.Text块拖到Button1.Click块内以连接这两个块。一旦连接了两个块,就会听到点击声音:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 现在,我们希望在标签组件中显示文本框内的文本。从TextBox1组件中,选择如下TextBox1.Text块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,将TextBox1.Text块连接到Label1.Text块。现在,当您按下按钮时,标签将显示文本框内的文本。Label1现在设置为显示TextBox1内的文本,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,要朗读文本框内的文本,点击TextToSpeech1组件并选择call TextToSpeech1.Speak块,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将此块连接到Label1.Text块下方。在消息插座内,连接TextBox1.Text最终块。这意味着文本框内键入的任何文本都将被TextToSpeech1块朗读,例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在已经完成了设计我们的块程序。要在 Android 智能手机内构建和运行此应用程序,请单击“构建”下拉菜单,并在两种构建类型之间进行选择,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个选项,应用程序(为.apk 提供 QR 码),将生成一个 QR 码,您可以使用 Android 智能手机(使用 QR 扫描器应用程序)扫描。扫描 QR 码后,应用程序的文件将下载到您的 Android 智能手机内。安装文件以测试应用程序的输出。

第二个选项,应用程序(将.apk 保存到我的计算机),将在您的计算机内生成并下载一个文件。您需要将文件从计算机传输到智能手机并安装文件。我个人更喜欢第一个选项,因为文件直接下载到智能手机内。

您还可以从 Android 应用商店下载 MIT AI2 Companion 应用程序,并将其安装在您的 Android 智能手机上,以实时测试应用程序。因此,在应用商店中搜索MIT AI2 Companion,然后点击安装按钮安装该应用程序。应用程序页面如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在您的 Android 智能手机内安装 MIT AI2 Companion 应用程序后,点击扫描 QR 码按钮或输入 MIT AI2 Companion 应用程序内的六位字母代码(在 QR 码旁边),然后点击用代码连接按钮。要生成 QR 码或六位数,请点击连接,然后选择AI Companion,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以通过生成其文件导出您的 Android 应用程序。要创建文件,请执行以下任一步骤:

  • 点击项目,然后选择将选定的项目导出(.aia)到我的计算机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 同样,您可以点击项目,然后选择从我的计算机导入项目(.aia)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以从 GitHub 存储库的文件夹中下载 Talking Pi 和语音控制机器人应用程序文件的文件。

语音控制机器人应用程序是本章的主要焦点。创建语音控制机器人涉及以下三个主要部分:

  • 语音识别应用程序:语音识别应用程序将识别我们的声音,并在识别特定单词时发送数据为文本。例如,如果我们说向前,应用程序将向机器人发送F

  • 蓝牙连接:这涉及在智能手机的蓝牙和 RPi 的蓝牙之间建立工作连接。

  • RPi 机器人程序:在这一部分,我们将解码从智能手机传输的文本信息,并相应地移动机器人。例如,如果传入的文本是F,那么我们将编写一个程序来使机器人向前移动。

在这一部分,我们将创建一个语音识别应用程序。在后面的部分,我们将研究建立蓝牙连接和编程我们的机器人。您可以从 GitHub 存储库的文件夹中下载文件。

要创建应用程序,请点击项目,然后选择开始新项目:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将其命名为,然后按下确定按钮:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们继续进行设计部分。

设计语音控制机器人应用程序非常容易。最终应用程序将如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下组件将用于设计应用程序:

  • ListPicker:ListPicker 将显示连接到我们智能手机的蓝牙设备列表。

  • 语音识别器:语音识别器组件将听取我们说的话。

  • 语音识别按钮:单击语音识别按钮时,将调用语音识别器组件,该组件将听取我们说的话。

  • 断开按钮:断开按钮用于将智能手机与 RPi 断开连接。

  • 标签:标签组件将显示用户说的文本。

  • 蓝牙客户端:蓝牙客户端组件激活了我们智能手机的蓝牙连接。

  • 水平或垂直排列:我们有一个水平排列组件,将语音识别按钮正确放置在屏幕中央。

接下来让我们看看如何添加和自定义组件。

为了设计应用程序,将ListPicker(不是 ListView)组件拖到屏幕中。接下来,拖一个水平排列,在里面拖一个按钮。在水平排列下方,拖一个标签,然后再拖一个按钮。如果你已经正确拖动了所有组件,你的屏幕应该如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在接下来的步骤中,我根据自己的需求定制了应用程序中的每个组件。您可以按照以下步骤自定义组件:

  1. 首先,选择ListPicker1,将背景颜色更改为绿色,将宽度设置为,并将文本更改为,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,选择HorizontalArrangement1,将其高度宽度都更改为。将AlignHorizontalAlignVertical更改为,以便 Button1 位于 HorizontalArrangement1 的中心,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,选择Button1,单击重命名按钮,并将 Button1 重命名为。SR语音识别的缩写:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,我们将在SRButton的背景中添加一个麦克风图像。您可以从 GitHub 存储库的文件夹中下载此图像。要添加背景图像,将按钮的宽度高度更改为,使按钮成为正方形。接下来,从文本框中删除默认文本,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,点击图像选项,然后选择麦克风图像将其设置为 SRButton 的背景图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,选择Label1,将字体大小更改为,文本更改为,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,为了将 Label1 水平居中在屏幕上,选择 Screen1 并将AlignHorizontal设置为。

  2. 最后,选择Button2并将其重命名为。将其背景颜色更改为,宽度更改为,文本更改为,文本颜色更改为,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 设计应用程序的用户界面后,我们需要将蓝牙客户端和语音识别器组件拖到我们的屏幕上。蓝牙客户端在连接选项中,语音识别器组件在媒体选项中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 一旦您添加了所有必要的组件,您的屏幕应该如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们继续编程语音控制机器人块。

设计应用程序后,是时候编程语音控制机器人应用程序了:

  1. 首先,我们将使用ListPicker1.BeforePicking块从ListPicker1中,并在列表中显示连接到我们智能手机的蓝牙设备。将此块连接到ListPicker1.Elements块。接下来,从BluetoothClient1组件中,将BluetoothClient1.AddressAndNames块连接到ListPicker1.Elements块,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ListPicker1.Elements代表列表中的元素(列表项),这些元素是配对到我们智能手机蓝牙的设备的地址和名称。如果我们从列表中选择一个元素,ListPicker1.AfterPicking块就会起作用。

  1. ListPicker1.AfterPicking块用于连接到从列表中选择的AddressesAndNames蓝牙,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 一旦两台设备使用蓝牙连接,就从SRbutton中选择SRbutton.Click块。然后,从SpeechRecognizer1块中选择SpeechRecognizer1.GetText,并将其连接到SRbutton.Click块,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SpeechRecognizer1.GetText块将激活 Google 语音识别器,并尝试识别您说的话。它将把您说的话转换成文本。

  1. 接下来,使用SpeechRecognizer1.AfterGettingText块,我们将在标签内显示口头文本,例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,使用块,我们将确定口头词是前进、后退、左转、右转还是停止。如果检测到任何这些词,我们将使用 BluetoothClient 组件向我们的 RPi 机器人发送一个字母字符。块位于Control选项内,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择块,并将其放置在SpeechRecognizer1.AfterGettingText块内的Label1.Text块下方,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,为了理解口头词,我们将使用比较运算符,该运算符位于Logic选项内,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将比较块连接到块的插座中,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在比较运算符的左插座中,连接SpeechRecognizer1.Result块:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在比较运算符的右插座中,连接一个空的文本字符串框。文本字符串框位于 Text 选项内:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 将文本字符串框连接到比较运算符后,如下输入文本:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 这意味着如果SpeechRecognizer1.Result等于forward,那么在 then 插座内,我们将添加一个BluetoothClient1.SendText块。之后,我们将连接一个文本框到BluetoothClient1.SendText块,并输入字母,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着当检测到单词 forward 时,将从智能手机的蓝牙发送字符F到 RPi 的蓝牙。

右键单击块并它,创建四个额外的块,用于单词backleftrightstop。当检测到单词back时,应发送字母B;当检测到单词left时,应发送L;当检测到单词right时,应发送R;最后,当检测到单词stop时,应发送S。如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,将BluetoothClient1.Disconnect块连接到Disconnectbutton,这样当按下此按钮时,蓝牙连接将断开:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在已经完成了设计和编程我们的应用程序。您可以在 Android 智能手机上下载并安装此应用程序。在下一节中,我们将把我们的智能手机的蓝牙与 RPi 的蓝牙配对。启动您的 RPi,让我们开始配对过程。

在本节中,我们将使用终端窗口将 Android 的蓝牙与 RPi 的蓝牙配对。在开始配对过程之前,我们需要在 RPi 内安装蓝牙软件包并对某些文件进行修改。为此,请按以下步骤操作:

  1. 首先,要安装蓝牙软件包,请在终端窗口中输入以下命令:
 

可以在以下截图中看到上述命令的输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,我们将打开文件并进行一些小的修改。要打开文件,请输入以下命令:
 
  1. 接下来,在/bluetoothd 后键入。这将打开 RPi 蓝牙的兼容模式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,按下Ctrl + O,然后按Enter保存文件。接下来,按Ctrl + X退出文件。使用以下命令重新启动您的 RPi:
 
  1. RPi 重新启动后,输入以下命令检查其状态:
 

现在,您应该在旁看到。如果在输入上述命令后,您看到并且无法在终端窗口中输入任何新命令,请关闭终端窗口,然后再次打开:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,要将 RPi 的蓝牙与智能手机的蓝牙配对,我们首先需要使 RPi 的蓝牙可发现。要配对设备,请输入以下命令:
 
  1. 现在,您应该看到您的蓝牙的媒体访问控制MAC)地址以及其名称。MAC 地址是一个 12 位地址,对于每个蓝牙设备都是唯一的。您的 RPi 的蓝牙将具有默认名称,如下截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在输入下一组代码之前,打开您的 Android 设备的蓝牙并点击配对新设备选项如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,逐一输入以下五个命令,将 RPi 的蓝牙置于可发现模式:
 
  1. 打开可发现模式后,您应该在“可用设备”选项中看到名称为 raspberrypi。选择此选项:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择raspberrypi选项后,您将看到一个弹出框,询问您是否要与 Raspberry Pi 的蓝牙配对。点击 PAIR 按钮:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,在终端窗口中,您将看到一条消息,询问您是否要与智能手机的蓝牙配对。键入(小写字母)并按Enter

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,您将在终端窗口中看到一个小弹出框,询问您是否要接受配对请求。点击OK

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 然后,您可能会看到另一个弹出框,指出连接失败。忽略此错误并点击 OK:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 之后,键入。您现在可以通过输入来检查设备是否已与 RPi 配对:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,我们已经完成了将 RPi 的蓝牙与 Android 智能手机的蓝牙配对。接下来,我们将启用 RPi 蓝牙的串行端口。

配对设备后,我们需要创建一个启用蓝牙串行端口的脚本。我们将命名此脚本为(bt代表蓝牙)。按照以下说明创建此脚本:

  1. 输入以下命令:
 
  1. 在这个脚本中,输入以下行:
 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 接下来,保存(Ctrl + O)并退出(Ctrl + X)此脚本。

  2. 然后需要执行并运行此脚本。输入以下命令:(这是执行命令)和(这是运行命令):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行脚本后,您将看到消息。

设计完 Android 应用程序,配对设备并启用串行端口后,现在是时候对 RPi 进行编程,以便它可以从 Android 智能手机接收文本数据。为了从智能手机接收传入的文本数据,我们将使用套接字编程中的套接字。

套接字是网络中双向通信系统的端点。我们创建套接字以便通过它们发送信息位。为了在设备之间建立蓝牙通信,我们需要创建一个套接字。一个套接字将位于服务器端,另一个将位于客户端。在我们的情况下,Android 智能手机是客户端,RPi 是服务器。

客户端套接字尝试与服务器套接字建立连接,而服务器套接字尝试监听来自客户端套接字的传入连接请求。在蓝牙编程中,我们可以在 RFCOMM 和 L2CAP 之间进行选择,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在套接字程序中,以下连接步骤必须依次从客户端和服务器端进行。每个步骤代表一个函数,该函数在客户端、服务器或两个脚本中声明。按照以下步骤进行:

  1. 套接字创建(客户端/服务器):在客户端和服务器程序中创建套接字如下:
 

在这个函数中,第一个参数是指通信域。在我们的情况下,通信域是蓝牙()。第二个参数是指通信类型()。第三个参数是指通信协议。在蓝牙编程中,我们可以选择无线电频率通信RFCOMM)协议或逻辑链路控制和适配协议L2CAP)。

  1. 连接(客户端):此函数尝试与服务器套接字建立连接:
 

在这个函数中,第一个参数是指套接字,第二个参数是指服务器的地址,第三个参数用于查找设备地址的大小。在我们的情况下,设备地址是树莓派的地址。

  1. 绑定(服务器):函数绑定服务器设备的地址和端口号。RPi 的 MAC 地址将存储在绑定函数内,如下所示:
 

在这个函数中,第一个参数是指套接字,第二个参数是指服务器设备(树莓派)的地址,第三个参数用于查找设备地址的大小。

  1. 监听(服务器):使用函数,服务器套接字等待客户端接近以建立连接:
 

第一个参数是指套接字。等待队列通常设置为。

  1. 接受(服务器):函数等待传入的连接请求并创建一个新的套接字:
 

在这个函数中,第二个参数是指客户端的地址,即 Android 智能手机。

  1. 发送(客户端/服务器):函数用于从客户端向服务器发送数据,反之亦然。

  2. 读取(客户端/服务器):函数用于从客户端向服务器读取数据,反之亦然。

  3. 关闭(客户端/服务器):函数关闭套接字并释放分配给套接字的内存。

现在,由于我们已经使用 App Inventor 创建了安卓应用程序,因此无需编写客户端程序。剩下的就是为我们的 RPi 机器人编写服务器程序。

在这个服务器程序中,我们将首先使用套接字程序在设备之间建立套接字连接。接下来,我们将接收来自安卓智能手机发送的传入数据。最后,我们将根据发送的数据移动机器人。程序可以从 GitHub 存储库的文件夹中下载。请按照以下步骤进行:

  1. 首先,声明所有必要的头文件如下:
 
  1. 接下来,在函数内,声明 wiringPi 引脚编号 0、2、3 和 4 为输出引脚如下:
 

为了与其他设备建立 RFCOMM,声明以及和。变量将存储和显示传入的数据。和分别用于存储服务器和客户端套接字的值。变量将读取传入的字节信息。包含的大小。这在以下代码行中显示:

 
  1. 接下来,创建,通信域设置为,通信类型设置为,通信协议设置为:
 
  1. 然后,使用函数将 RPi 的蓝牙 MAC 地址绑定到服务器套接字,并使(服务器套接字)进入监听模式如下:
 
  1. 一旦连接被接受,将使用函数创建一个新的客户端套接字如下:
 
  1. 然后,使用函数将传入的字节数据转换为字符串。之后,显示连接的蓝牙的 MAC 地址如下:
 
  1. 之后,在循环内,使用函数读取传入的数据。如果字节变量中的值大于,我们将按以下方式打印数据:
 

现在,我们将使用五个条件来检查传入的数据是否包含字母、、、或,如下所示:

 

上述代码可以解释如下:

  • :机器人将向前移动

  • :机器人将向后移动

  • :机器人将进行轴向左转

  • :机器人将进行轴向右转

  • :机器人将停止

  1. 最后,为了断开设备的连接,使用函数关闭和如下:
 
  1. 接下来,由于此代码包含套接字和蓝牙头文件,因此在编译此代码时,您需要在构建命令中添加命令。由于这是一个 C 程序而不是 C++程序,因此您还需要添加命令来编译 wiringPi 代码,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来让我们测试代码并检查最终输出。

现在,在编译和构建程序之前,请确保您已经配对了安卓智能手机的蓝牙和 RPi 的蓝牙。如果它们没有配对,那么当您运行应用程序时,RPi 蓝牙名称()将不会出现在蓝牙列表中。配对设备的步骤在通过蓝牙配对安卓智能手机和 RPi部分中列出。

完成此操作后,您需要在终端窗口内执行和运行我们之前创建的脚本。执行和运行此脚本的命令如下:

 

你不需要每次运行程序都执行这个脚本,但是当你启动一个新的 RPi 会话并想要测试程序时,你需要执行和运行这个脚本。接下来,编译和构建程序。之后,打开 Android 应用程序并按下CONNECT列表选择器。你将在蓝牙列表中看到树莓派的名称以及其 MAC 地址。选择树莓派选项以连接设备,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一旦它们连接,你将在终端窗口内收到一个通知,显示和 Android 蓝牙 MAC 地址,如下面的屏幕截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你收到以下**错误 507:无法连接。设备是否打开?**错误,请不要担心。点击连接按钮并再次选择树莓派蓝牙:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一旦设备连接,你可以点击语音识别器按钮并开始说话。如果你说单词forward,这应该显示在屏幕上,如下面的屏幕截图所示,并且字母F将被发送到 RPi:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,当你说单词backleftrightstop时,字母BLRS,如下面的屏幕截图所示,将被发送到 RPi 的蓝牙,机器人将朝适当的方向移动:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你说任何其他单词,语音识别器应该识别这个单词并在屏幕上显示出来,但不会发送任何文本数据到 RPi。

我们通过创建我们的第一个 Android 应用程序 Talking Pi 开始了这一章,其中文本框内的文本被显示在标签上,并由智能手机朗读出来。然后,我们开发了一个声控机器人 Android 应用程序,它可以识别我们的声音并通过蓝牙将文本发送到 RPi。之后,使用终端窗口,我们将 Android 智能手机的蓝牙与 RPi 的蓝牙配对。最后,我们研究了套接字编程,并编写了程序,以与 Android 智能手机的蓝牙建立连接来控制机器人。

  1. 我们使用哪种通信协议通过蓝牙连接发送数据?

  2. 蓝牙设备有什么样的地址?

  3. 在应用程序中 ListPicker 的用途是什么?

  4. 在客户端,用什么函数将客户端套接字连接到服务器套接字?

  5. 你的 RPi 的默认蓝牙名称是什么?

  1. Broadcom BCM2837 四核 1.4 GHz 处理器

  2. 40

  3. VNC 查看器

  4. 用户名:,密码:

  1. 八个(引脚号 691420253034, 和 39

  2. 1V

  1. L298N 电机驱动 IC

  2. H 桥

  1. 逆时针方向

  1. 超声波脉冲以 340 m/s 的速度传播

  2. 液晶显示

  3. 180 厘米

  4. 第 4 列和第 1 行

  5. 它们用于调节 LCD 的背光

  1.  和 

  2.  函数初始化屏幕。它设置内存并清除命令窗口屏幕

  3. GCC

  4. 按下按钮时移动机器人, 松开按钮时停止移动

  1. 开源计算机视觉

  2. 3,280 x 2,464 像素

  3. 8GB - 50% and  32 GB - 15%

  1. 阈值处理

  2. 右下角的区块

  3. 在屏幕的左上部分

  1. 水平线特征。

  2. 感兴趣的区域。

  3.  函数改善图像的亮度和对比度。这很重要,因为在光线不足的情况下,相机可能无法从图像中区分出脸部。

  1. 无线电频率通信 (RFCOMM)

  2. 媒体访问控制 (MAC) 地址

  3. ListPicker 显示了所有已经与您的智能手机蓝牙配对的蓝牙设备列表

  4. 连接

最新文章