原文:
译者:飞龙
协议: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 帐户链接的步骤:
创建项目后,您将在 App Inventor 中看到以下四个主要面板,称为 Palette、Viewer、Components 和 Properties:
现在让我们了解每个面板的工作原理:
Palette 面板包括不同的组件,如按钮、文本框、画布、蓝牙、视频播放器等。
Viewer 面板由一个屏幕组成,我们可以从 Palette 中拖放 UI 组件。
组件面板显示了添加到屏幕内的可见和不可见组件的列表。例如,按钮是一个可见组件,因为它在屏幕上可见。另一方面,蓝牙是一个不可见组件,因为它在屏幕上不可见,但它在后台起作用。所有不可见组件都显示在屏幕下方。
属性面板允许我们修改组件的属性,这些组件在组件面板中被选中。
现在让我们继续设计应用程序。
在我们的 Talking Pi 应用程序中,我们将添加四个主要组件:TextBox、Button、Label 和 TextToSpeech。TextBox、Button 和 Label 组件位于用户界面选项中。按照以下步骤:
我们现在基本上已经完成了 Talking Pi 应用程序的设计。现在让我们进入 Blocks 选项,并为显示文本并在点击按钮时将其转换为语音创建编程块。
设计应用程序的 UI 后,点击 Blocks 按钮,该按钮位于 Design 按钮旁边,如下截图所示:
在块部分,左侧将看到Screen1,其中包含我们拖放到屏幕上的所有组件(可见和不可见)。如果点击任何组件,您将注意到每个组件的以下类型的块:
我们将主要关注构成每个组件的三种类型的块。我们将这些称为主块、中间块和最终块。这些块中的每一个必须按正确的顺序连接以获得一个正常工作的程序,如下图所示:
让我们看看每个块。
App Inventor 2 中的主块类似于when循环,表示发生某事时要执行的操作。主块始终连接到中间块。我们不能直接将最终块连接到主块。主块包括一个下拉菜单,我们可以从中选择多个相同类型的组件。例如,看下面的截图:
您可以看到,在有多个按钮的情况下,可以从下拉列表中选择特定的按钮。
中间块包括一个输入插座和一个输出插座。输入插座连接到主块,输出插座连接到最终块,如下图所示:
中间块包括两个下拉菜单。第一个下拉菜单代表相同类型的组件。例如,如果有多个标签,可以从第一个下拉菜单中选择特定的标签。第二个下拉菜单代表组件的属性。例如,对于Label1,我们有Text、BackgroundColor、Width等,如下图所示:
例如,Label1 . Text表示我们要设置或更改Label1的文本。
最终块连接到中间块。它还包括两个下拉菜单,我们可以从中选择特定的组件及其特定属性,如下图所示:
我们将使用这三种类型的块来创建我们的 Talking Pi 程序。让我们从块编程开始。
Talking Pi 编程逻辑非常简单。当按下Button1时,Label1必须显示在Textbox1内键入的文本,并且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 应用程序。要创建文件,请执行以下任一步骤:
您可以从 GitHub 存储库的文件夹中下载 Talking Pi 和语音控制机器人应用程序文件的文件。
语音控制机器人应用程序是本章的主要焦点。创建语音控制机器人涉及以下三个主要部分:
语音识别应用程序:语音识别应用程序将识别我们的声音,并在识别特定单词时发送数据为文本。例如,如果我们说向前,应用程序将向机器人发送F。
蓝牙连接:这涉及在智能手机的蓝牙和 RPi 的蓝牙之间建立工作连接。
RPi 机器人程序:在这一部分,我们将解码从智能手机传输的文本信息,并相应地移动机器人。例如,如果传入的文本是F,那么我们将编写一个程序来使机器人向前移动。
在这一部分,我们将创建一个语音识别应用程序。在后面的部分,我们将研究建立蓝牙连接和编程我们的机器人。您可以从 GitHub 存储库的文件夹中下载文件。
要创建应用程序,请点击项目,然后选择开始新项目:
将其命名为,然后按下确定按钮:
现在让我们继续进行设计部分。
设计语音控制机器人应用程序非常容易。最终应用程序将如下所示:
以下组件将用于设计应用程序:
ListPicker:ListPicker 将显示连接到我们智能手机的蓝牙设备列表。
语音识别器:语音识别器组件将听取我们说的话。
语音识别按钮:单击语音识别按钮时,将调用语音识别器组件,该组件将听取我们说的话。
断开按钮:断开按钮用于将智能手机与 RPi 断开连接。
标签:标签组件将显示用户说的文本。
蓝牙客户端:蓝牙客户端组件激活了我们智能手机的蓝牙连接。
水平或垂直排列:我们有一个水平排列组件,将语音识别按钮正确放置在屏幕中央。
接下来让我们看看如何添加和自定义组件。
为了设计应用程序,将ListPicker(不是 ListView)组件拖到屏幕中。接下来,拖一个水平排列,在里面拖一个按钮。在水平排列下方,拖一个标签,然后再拖一个按钮。如果你已经正确拖动了所有组件,你的屏幕应该如下所示:
在接下来的步骤中,我根据自己的需求定制了应用程序中的每个组件。您可以按照以下步骤自定义组件:
之后,为了将 Label1 水平居中在屏幕上,选择 Screen1 并将AlignHorizontal设置为。
最后,选择Button2并将其重命名为。将其背景颜色更改为,宽度更改为,文本更改为,文本颜色更改为,如下所示:
现在让我们继续编程语音控制机器人块。
设计应用程序后,是时候编程语音控制机器人应用程序了:
ListPicker1.Elements代表列表中的元素(列表项),这些元素是配对到我们智能手机蓝牙的设备的地址和名称。如果我们从列表中选择一个元素,ListPicker1.AfterPicking块就会起作用。
SpeechRecognizer1.GetText块将激活 Google 语音识别器,并尝试识别您说的话。它将把您说的话转换成文本。
这意味着当检测到单词 forward 时,将从智能手机的蓝牙发送字符F到 RPi 的蓝牙。
右键单击块并它,创建四个额外的块,用于单词back、left、right和stop。当检测到单词back时,应发送字母B;当检测到单词left时,应发送L;当检测到单词right时,应发送R;最后,当检测到单词stop时,应发送S。如下截图所示:
我们现在已经完成了设计和编程我们的应用程序。您可以在 Android 智能手机上下载并安装此应用程序。在下一节中,我们将把我们的智能手机的蓝牙与 RPi 的蓝牙配对。启动您的 RPi,让我们开始配对过程。
在本节中,我们将使用终端窗口将 Android 的蓝牙与 RPi 的蓝牙配对。在开始配对过程之前,我们需要在 RPi 内安装蓝牙软件包并对某些文件进行修改。为此,请按以下步骤操作:
可以在以下截图中看到上述命令的输出:
现在,您应该在旁看到。如果在输入上述命令后,您看到并且无法在终端窗口中输入任何新命令,请关闭终端窗口,然后再次打开:
因此,我们已经完成了将 RPi 的蓝牙与 Android 智能手机的蓝牙配对。接下来,我们将启用 RPi 蓝牙的串行端口。
配对设备后,我们需要创建一个启用蓝牙串行端口的脚本。我们将命名此脚本为(bt代表蓝牙)。按照以下说明创建此脚本:
接下来,保存(Ctrl + O)并退出(Ctrl + X)此脚本。
然后需要执行并运行此脚本。输入以下命令:(这是执行命令)和(这是运行命令):
运行脚本后,您将看到消息。
设计完 Android 应用程序,配对设备并启用串行端口后,现在是时候对 RPi 进行编程,以便它可以从 Android 智能手机接收文本数据。为了从智能手机接收传入的文本数据,我们将使用套接字编程中的套接字。
套接字是网络中双向通信系统的端点。我们创建套接字以便通过它们发送信息位。为了在设备之间建立蓝牙通信,我们需要创建一个套接字。一个套接字将位于服务器端,另一个将位于客户端。在我们的情况下,Android 智能手机是客户端,RPi 是服务器。
客户端套接字尝试与服务器套接字建立连接,而服务器套接字尝试监听来自客户端套接字的传入连接请求。在蓝牙编程中,我们可以在 RFCOMM 和 L2CAP 之间进行选择,如下图所示:
在套接字程序中,以下连接步骤必须依次从客户端和服务器端进行。每个步骤代表一个函数,该函数在客户端、服务器或两个脚本中声明。按照以下步骤进行:
在这个函数中,第一个参数是指通信域。在我们的情况下,通信域是蓝牙()。第二个参数是指通信类型()。第三个参数是指通信协议。在蓝牙编程中,我们可以选择无线电频率通信(RFCOMM)协议或逻辑链路控制和适配协议(L2CAP)。
在这个函数中,第一个参数是指套接字,第二个参数是指服务器的地址,第三个参数用于查找设备地址的大小。在我们的情况下,设备地址是树莓派的地址。
在这个函数中,第一个参数是指套接字,第二个参数是指服务器设备(树莓派)的地址,第三个参数用于查找设备地址的大小。
第一个参数是指套接字。等待队列通常设置为。
在这个函数中,第二个参数是指客户端的地址,即 Android 智能手机。
发送(客户端/服务器):函数用于从客户端向服务器发送数据,反之亦然。
读取(客户端/服务器):函数用于从客户端向服务器读取数据,反之亦然。
关闭(客户端/服务器):函数关闭套接字并释放分配给套接字的内存。
现在,由于我们已经使用 App Inventor 创建了安卓应用程序,因此无需编写客户端程序。剩下的就是为我们的 RPi 机器人编写服务器程序。
在这个服务器程序中,我们将首先使用套接字程序在设备之间建立套接字连接。接下来,我们将接收来自安卓智能手机发送的传入数据。最后,我们将根据发送的数据移动机器人。程序可以从 GitHub 存储库的文件夹中下载。请按照以下步骤进行:
为了与其他设备建立 RFCOMM,声明以及和。变量将存储和显示传入的数据。和分别用于存储服务器和客户端套接字的值。变量将读取传入的字节信息。包含的大小。这在以下代码行中显示:
现在,我们将使用五个条件来检查传入的数据是否包含字母、、、或,如下所示:
上述代码可以解释如下:
:机器人将向前移动
:机器人将向后移动
:机器人将进行轴向左转
:机器人将进行轴向右转
:机器人将停止
接下来让我们测试代码并检查最终输出。
现在,在编译和构建程序之前,请确保您已经配对了安卓智能手机的蓝牙和 RPi 的蓝牙。如果它们没有配对,那么当您运行应用程序时,RPi 蓝牙名称()将不会出现在蓝牙列表中。配对设备的步骤在通过蓝牙配对安卓智能手机和 RPi部分中列出。
完成此操作后,您需要在终端窗口内执行和运行我们之前创建的脚本。执行和运行此脚本的命令如下:
你不需要每次运行程序都执行这个脚本,但是当你启动一个新的 RPi 会话并想要测试程序时,你需要执行和运行这个脚本。接下来,编译和构建程序。之后,打开 Android 应用程序并按下CONNECT列表选择器。你将在蓝牙列表中看到树莓派的名称以及其 MAC 地址。选择树莓派选项以连接设备,如下所示:
一旦它们连接,你将在终端窗口内收到一个通知,显示和 Android 蓝牙 MAC 地址,如下面的屏幕截图所示:
如果你收到以下**错误 507:无法连接。设备是否打开?**错误,请不要担心。点击连接按钮并再次选择树莓派蓝牙:
一旦设备连接,你可以点击语音识别器按钮并开始说话。如果你说单词forward,这应该显示在屏幕上,如下面的屏幕截图所示,并且字母F将被发送到 RPi:
同样,当你说单词back、left、right和stop时,字母B、L、R和S,如下面的屏幕截图所示,将被发送到 RPi 的蓝牙,机器人将朝适当的方向移动:
如果你说任何其他单词,语音识别器应该识别这个单词并在屏幕上显示出来,但不会发送任何文本数据到 RPi。
我们通过创建我们的第一个 Android 应用程序 Talking Pi 开始了这一章,其中文本框内的文本被显示在标签上,并由智能手机朗读出来。然后,我们开发了一个声控机器人 Android 应用程序,它可以识别我们的声音并通过蓝牙将文本发送到 RPi。之后,使用终端窗口,我们将 Android 智能手机的蓝牙与 RPi 的蓝牙配对。最后,我们研究了套接字编程,并编写了程序,以与 Android 智能手机的蓝牙建立连接来控制机器人。
我们使用哪种通信协议通过蓝牙连接发送数据?
蓝牙设备有什么样的地址?
在应用程序中 ListPicker 的用途是什么?
在客户端,用什么函数将客户端套接字连接到服务器套接字?
你的 RPi 的默认蓝牙名称是什么?
Broadcom BCM2837 四核 1.4 GHz 处理器
40
VNC 查看器
用户名:,密码:
八个(引脚号 6, 9, 14, 20, 25, 30, 34, 和 39)
高
1V
L298N 电机驱动 IC
H 桥
逆时针方向
超声波脉冲以 340 m/s 的速度传播
液晶显示
180 厘米
第 4 列和第 1 行
它们用于调节 LCD 的背光
和
函数初始化屏幕。它设置内存并清除命令窗口屏幕
GCC
按下按钮时移动机器人, 松开按钮时停止移动
开源计算机视觉
3,280 x 2,464 像素
8GB - 50% and 32 GB - 15%
阈值处理
右下角的区块
在屏幕的左上部分
。
水平线特征。
。
感兴趣的区域。
函数改善图像的亮度和对比度。这很重要,因为在光线不足的情况下,相机可能无法从图像中区分出脸部。
无线电频率通信 (RFCOMM)
媒体访问控制 (MAC) 地址
ListPicker 显示了所有已经与您的智能手机蓝牙配对的蓝牙设备列表
连接
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://cpq.tttmy.cn/news/8589.html