构建语音控制机器人
1. 蓝牙配对与串口启用
在完成相关操作后,输入
exit
。接着,可通过输入
sudo bluetoothctl
来检查设备是否已与 RPi 配对。至此,RPi 的蓝牙与安卓智能手机的蓝牙配对完成。接下来,需要启用 RPi 蓝牙的串口。
-
创建脚本
:
- 输入命令
sudo nano bt_serial
。
- 在脚本中输入以下内容:
hciconfig hci0 piscan
sdptool add SP
- 按 `Ctrl + O` 保存,按 `Ctrl + X` 退出脚本。
-
执行脚本
:
-
输入命令
sudo chmod +x bt_serial(执行权限命令)。 -
输入命令
sudo ./bt_serial(运行命令)。运行脚本后,会看到消息Serial Port service registered。
-
输入命令
2. 树莓派蓝牙程序开发
在设计好安卓应用、完成设备配对并启用串口后,就可以对 RPi 进行编程,使其能够接收来自安卓智能手机的文本数据。这里将使用套接字编程中的套接字来实现。
2.1 套接字编程
套接字是网络中双向通信系统的端点,用于发送信息。在设备间建立蓝牙通信时,需要创建套接字,一个在服务器端(RPi),另一个在客户端(安卓智能手机)。在蓝牙编程中,有 RFCOMM 和 L2CAP 两种套接字选项,具体连接步骤如下:
|步骤|功能|描述|
| ---- | ---- | ---- |
|1|Socket creation (client/server)|在客户端和服务器端程序中创建套接字:
socket(int domain, int type, int protocol)
。在本案例中,
domain
为
AF_BLUETOOTH
,
type
为
SOCK_STREAM
,
protocol
可选择
RFCOMM
或
L2CAP
。|
|2|Connect (client)|客户端尝试与服务器端套接字建立连接:
connect(int sock, const struct sockaddr *server_address, socklen_t info)
,其中
server_address
为 RPi 地址。|
|3|Bind (server)|服务器端绑定地址和端口号:
bind(int sock, const struct sockaddr *address, socklen_t info)
,将 RPi 的 MAC 地址存储在其中。|
|4|Listen (server)|服务器端套接字等待客户端连接:
listen(int sock, int backlog)
,
backlog
通常设为 1。|
|5|Accept (server)|服务器端等待客户端连接请求并创建新套接字:
int new_socket = accept(int sock, struct sock_address *clientaddress, socklen_t info)
,
clientaddress
为安卓智能手机地址。|
|6|Send (client/server)|用于在客户端和服务器端之间发送数据。|
|7|Read (client/server)|用于读取客户端和服务器端之间传输的数据。|
|8|Close (client/server)|关闭套接字并释放分配的内存。|
由于已经使用 App Inventor 创建了 VoiceControlBot 安卓应用,因此无需编写客户端程序,只需为 RPi 机器人编写服务器端程序。
3. VoiceBot 服务器程序
在 VoiceBot 服务器程序中,首先使用套接字程序建立设备间的套接字连接,然后接收来自安卓智能手机的传入数据,最后根据接收到的数据移动机器人。VoiceBot.c 程序可从 GitHub 仓库的 Chapter09 文件夹下载。具体步骤如下:
1.
声明必要的头文件
:
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h> //Socket header file
#include <bluetooth/bluetooth.h> //Bluetooth header file
#include <bluetooth/rfcomm.h> //Radio frequency communication header file
#include <wiringPi.h>
-
在
main()函数中声明输出引脚 :
pinMode(0,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
- 声明相关变量和结构体 :
struct sockaddr_rc server_address = { 0 }, client_address = { 0 };
char data[1024] = { 0 };
int s, clientsocket, bytes;
socklen_t opt = sizeof(client_address);
- 创建套接字 :
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- 绑定 RPi 的蓝牙 MAC 地址并进入监听模式 :
bind(s, (struct sockaddr *)&server_address, sizeof(server_address));
listen(s, 1);
- 接受连接并创建新的客户端套接字 :
clientsocket = accept(s, (struct sockaddr *)&client_address, &opt);
- 显示连接的蓝牙 MAC 地址 :
ba2str( &client_address.rc_bdaddr, data );
fprintf(stderr, "Connected to %s\n", data);
- 读取传入数据并根据数据控制机器人 :
for(;;){
bytes = read(clientsocket, data, sizeof(data));
if( bytes > 0 ) {
printf("Alphabet: %s\n", data);
if(*data=='F')
{
----Forward Code----
}
else if(*data=='B')
{
----Backward Code----
}
else if(*data=='L')
{
----Axial Left Turn Code----
}
else if(*data=='R')
{
----Axial Right Turn Code----
}
else if(*data=='S')
{
----Stop Code----
}
}
}
- 关闭套接字 :
close(clientsocket);
close(s);
-
编译代码
:由于代码包含套接字和蓝牙头文件,编译时需要在构建命令中添加
-lbluetooth命令。因为这是一个 C 程序,还需要添加-lwiringPi命令来编译 wiringPi 代码。
4. 代码测试
在编译和构建程序之前,要确保安卓智能手机的蓝牙和 RPi 的蓝牙已配对。若未配对,运行 VoiceControlBot 应用时,RPi 蓝牙名称(raspberrypi)将不会出现在蓝牙列表中。配对步骤可参考相关说明。
- 执行之前创建的
bt_serial
脚本:
- 输入命令
sudo chmod +x bt_serial
(执行权限命令)。
- 输入命令
sudo ./bt_serial
(运行命令)。无需每次运行程序时都执行该脚本,但在开始新的 RPi 会话并测试 VoiceBot.c 程序时需要执行。
- 编译并构建 VoiceBot.c 程序。
- 打开 VoiceControlBot 安卓应用,按下
CONNECT
列表选择器,会在蓝牙列表中看到
raspberrypi
及其 MAC 地址,选择该选项连接设备。
- 连接成功后,终端窗口会显示
Connected to:
和安卓蓝牙 MAC 地址。若出现
Error 507: Unable to Connect. Is the device turned on?
错误,点击连接按钮并再次选择
raspberrypi
蓝牙。
- 设备连接后,点击语音识别按钮并开始说话。说
forward
时,屏幕会显示该单词,字母
F
会发送到 RPi;说
back
、
left
、
right
和
stop
时,字母
B
、
L
、
R
和
S
会发送到 RPi 的蓝牙,机器人会相应移动。若说其他单词,语音识别器会识别并显示,但不会向 RPi 发送文本数据。
以下是整个流程的 mermaid 流程图:
graph TD;
A[蓝牙配对] --> B[串口启用];
B --> C[蓝牙程序开发];
C --> D[VoiceBot服务器程序编写];
D --> E[代码测试];
通过以上步骤,就可以实现一个简单的语音控制机器人。在实际应用中,还可以根据需求对代码进行扩展和优化,例如添加更多的语音指令、优化机器人的运动控制等。
构建语音控制机器人
5. 常见问题及解决方法
在构建和测试语音控制机器人的过程中,可能会遇到一些常见问题,以下是这些问题及相应的解决方法:
|问题|解决方法|
| ---- | ---- |
|蓝牙配对失败|确保安卓智能手机和 RPi 的蓝牙功能都已开启,并且 RPi 的蓝牙可见。重新按照配对步骤进行操作,确保输入的配对码正确。如果问题仍然存在,尝试重启设备后再次配对。|
|
bt_serial
脚本执行失败|检查脚本文件是否存在,以及文件权限是否正确。可以使用
ls -l
命令查看文件权限,若权限不足,使用
sudo chmod +x bt_serial
命令赋予执行权限。若文件名拼写错误,修改为正确的文件名。|
|VoiceBot.c 程序编译错误|检查代码中是否存在语法错误,特别是头文件的引用和函数的调用。确保编译命令中包含了必要的参数
-lbluetooth
和
-lwiringPi
。若仍然无法编译,检查相关库文件是否已正确安装。|
|连接设备时出现
Error 507: Unable to Connect. Is the device turned on?
错误|检查设备是否开启,蓝牙是否正常工作。点击连接按钮并再次选择
raspberrypi
蓝牙进行连接。若问题依旧,尝试重启设备和重新执行
bt_serial
脚本。|
|语音指令无法控制机器人|检查语音识别功能是否正常,确保 VoiceControlBot 安卓应用能够正确识别语音。检查 RPi 是否接收到了正确的指令字母,可在终端查看输出信息。若未接收到指令,检查蓝牙连接是否稳定。
6. 扩展与优化建议
为了让语音控制机器人更加智能和实用,可以进行以下扩展和优化:
-
添加更多语音指令
:在 VoiceBot.c 程序中添加更多的
if
条件语句,以支持更多的语音指令。例如,可以添加
T
指令用于机器人转弯特定角度,
M
指令用于机器人执行特定的动作序列等。示例代码如下:
if(*data=='T')
{
----Turn Specific Angle Code----
}
else if(*data=='M')
{
----Execute Specific Action Sequence Code----
}
- 优化机器人运动控制 :可以使用更复杂的算法来控制机器人的运动,例如使用 PID 控制算法来精确控制机器人的速度和转向。同时,可以添加传感器来实现避障、跟随等功能,提高机器人的自主性。
- 增强语音识别准确性 :可以使用更先进的语音识别技术,如 Google Cloud Speech-to-Text 或百度语音识别 API,来提高语音识别的准确性和稳定性。在安卓应用中集成这些 API,并将识别结果发送到 RPi。
- 实现远程控制 :可以通过网络连接实现对机器人的远程控制,例如使用 Wi-Fi 或蓝牙网络。在 RPi 上搭建服务器,通过网络接收远程指令并控制机器人的运动。
7. 总结
通过以上步骤,我们成功构建了一个简单的语音控制机器人。从蓝牙配对、串口启用,到蓝牙程序开发和 VoiceBot 服务器程序编写,再到代码测试和问题解决,每个环节都至关重要。在实际应用中,我们可以根据需求对机器人进行扩展和优化,使其具备更多的功能和更高的性能。
以下是扩展与优化的 mermaid 流程图:
graph TD;
A[添加更多语音指令] --> B[优化机器人运动控制];
B --> C[增强语音识别准确性];
C --> D[实现远程控制];
总之,构建语音控制机器人是一个有趣且富有挑战性的项目,它结合了硬件和软件知识,为我们提供了一个实践和创新的平台。希望本文能够帮助你顺利完成语音控制机器人的构建,并激发你更多的创意和想法。
超级会员免费看
2162

被折叠的 条评论
为什么被折叠?



