Raspberry Pi在物联网项目中非常受欢迎,因为它具有通过互联网进行无线通信的无缝能力。Raspberry Pi 3具有内置的Wi-Fi和蓝牙,并且蓝牙是一种非常流行的无线通信协议。今天,我们将使用Raspberry Pi 3和蓝牙制造遥控车,在这里我们将使用智能手机作为遥控汽车。我们之前已经使用Arduino构建了此RC汽车。
在这里,我们使用的是内置蓝牙的Raspberry Pi 3,因此我们不需要使用任何外部USB蓝牙加密狗。在这里,我们使用RFCOMM蓝牙协议进行无线通信。
使用Python对Bluetooth进行编程 遵循套接字编程模型,并且Bluetooth设备之间的通信通过RFCOMM套接字进行。 RFCOMM (射频通信)是一种蓝牙协议,提供了仿真的RS-232串行端口,也称为串行端口仿真。蓝牙串行端口配置文件基于此协议。RFCOMM的广泛支持和公开可用的API在蓝牙应用中非常受欢迎。它绑定到L2CAP协议。
如果您有Raspberry Pi 2,则需要使用外部蓝牙加密狗或蓝牙模块HC-06。查看我们以前使用这些外部蓝牙设备的项目:使用基于蓝牙的Android App和Raspberry Pi控制的家用电器控制Raspberry Pi GPIO。
安装蓝牙通信所需的软件包:
在开始之前,我们需要安装一些软件以在Raspberry Pi中设置蓝牙通信。您应该已经为Raspberry Pi准备了一个Raspbian Jessie安装的存储卡。检查本文以安装Raspbian OS并开始使用Raspberry Pi。所以现在我们首先需要使用以下命令更新Raspbian:
sudo apt-get更新sudo apt-get升级
然后,我们需要安装一些蓝牙相关的软件包:
sudo apt-get install bluetooth blueman bluez
然后重新启动Raspberry Pi:
须藤重启
BlueZ是一个开源项目和官方Linux蓝牙协议栈。它支持所有核心蓝牙协议,现已成为官方Linux内核的一部分。
Blueman提供了Desktop界面来管理和控制Bluetooth设备。
最后,我们需要用于蓝牙通信的python库,以便我们可以使用Python语言通过RFCOMM发送和接收数据:
须藤apt-get install python-bluetooth
还安装Raspberry Pi的GPIO支持库:
须藤apt-get install python-rpi.gpio
现在,我们已经完成了在Raspberry Pi中安装蓝牙通信所需的软件包的工作。
通过蓝牙将设备与Raspberry Pi配对:
将蓝牙设备(如手机)与Raspberry Pi配对非常容易。在这里,我们已将Android Smart手机与Raspberry Pi配对。我们之前在Pi中安装了BlueZ,它提供了一个名为 “ bluetoothctl” 的命令行实用程序来管理我们的蓝牙设备。
现在,通过以下命令打开 bluetoothctl 实用程序:
须藤蓝牙
您可以通过键入 'help' 来检查 bluetoothctl 实用程序的所有命令。现在,我们需要按给定顺序输入以下命令:
#打开电源#打开代理#可发现#可配对#扫描
在最后一个命令 “ scan on”之后, 您将在列表中看到您的蓝牙设备(手机)。确保您的手机已打开蓝牙并且附近的设备可以看到它。然后复制设备的MAC地址,并使用给定命令将其配对:
对
然后,将在终端控制台中提示您输入密码或Pin,然后在其中键入密码并按Enter。然后在出现提示时在手机中键入相同的密码,现在您已成功与Raspberry Pi配对。我们还在之前的GPIO控制教程中提供的视频中介绍了整个过程。这是直接的YouTube链接。
如前所述,您还可以使用桌面界面来配对移动电话。安装Blueman之后,您将在Raspberry Pi桌面的右侧看到一个蓝牙图标,如下所示,您可以使用该图标轻松进行配对。
选择玩具车:
在这个Raspberry Pi Controlled Car项目中,我们使用了玩具车进行演示。在这里,我们选择了具有左右转向功能的RF玩具车。购买这辆车后,我们用Raspberry电路代替了它的RF电路。这辆车有两个直流电动机,一个旋转两个前轮,另一个旋转两个后轮。前侧电机用于指示汽车方向,即向左或向右转(类似于真实的汽车转向功能)。后侧马达用于向前和向后驱动汽车。Raspberry的蓝牙用于从Android手机无线接收命令来控制汽车。
您可以使用任何具有两个直流电动机来旋转前后轮的玩具车。
电路图和说明:
在此遥控车中,我们只需要使用L293D模块将Raspberry Pi与两个电动机连接即可。为了给Raspberry Pi和汽车供电,我们使用了移动电源。移动电源足以为Raspberry Pi和汽车的电动机供电,但是当我们将移动电源放在汽车上时,由于移动电源的重量很大,汽车将无法正常移动。因此,我们建议使用重量较轻的电源或锂电池为系统供电。所有连接在下面的电路图中显示。另请查看我们的机器人技术部分,以了解有关使用不同技术控制电机的更多信息。
注意:覆盆子pi的电压不得超过5v。
此电路已在此项目的Perf板上完成,因此汽车的重量减轻了。
使用Android App BlueTerm远程控制汽车:
现在,在完成所有设置并成功尝试通过蓝牙解析智能手机后,我们需要安装一个 Android应用程序以使用蓝牙串行适配器与Raspberry Pi进行通信,以便我们可以控制Raspberry Pi的GPIO引脚。如前所述,RFCOMM / SPP协议模拟通过蓝牙的串行通信,因此我们在此处安装了支持该协议的BlueTerm应用程序。
您还可以使用支持通过RFCOMM套接字进行通信的任何其他蓝牙终端应用程序。
现在,下载和安装应用程序BlueTerm后,运行下面给出一个Python程序从终端和连接配对 树莓派 从BlueTerm应用程序在同一时间的设备。
成功连接后,您将在应用程序的右上角看到 connected:raspberrypi ,如下所示:
现在,您只需 在BlueTerm应用程序中输入以下命令,即可使汽车向所需方向行驶。按“ q”退出程序。您可以 使用Google语音输入键盘 通过您的语音控制这辆车。 在末尾的视频中查看完整的演示 。
命令:
F –向前移动
B –向后移动
S –停止
L –向前左移
R –向前右移
A –向后左移
P –向后右移
Q –退出
Python程式设计:
使用Android App控制Raspberry Pi GPIO的Python程序 非常简单,不言自明。只有我们需要学习有关蓝牙RFCOMM通信的代码。否则,就像通过将电动机的引脚设为高电平或低电平来控制任何机器人或汽车一样。 完整的程序在下面的“代码”部分中给出。
首先,我们需要导入蓝牙套接字库,该库使我们能够使用Python语言控制蓝牙。我们已经在上一节中安装了相同的库。
导入蓝牙
然后,我们包括更多头文件,并定义了用于电机的引脚,使它们默认为低。
导入蓝牙导入时间导入RPi.GPIO为GPIO m11 = 18 m12 = 23 m21 = 24 m22 = 25 GPIO.setwarnings(False)GPIO.setmode(GPIO.BCM)GPIO.setup(m11,GPIO.OUT)GPIO.setup( m12,GPIO.OUT)GPIO.setup(m21,GPIO.OUT)GPIO.setup(m22,GPIO.OUT)GPIO.output(m11,0)GPIO.output(m12,0)GPIO.output(m21,0) GPIO.output(m22,0)
以下是负责蓝牙通信的代码:
server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)port = 1 server_socket.bind((“”,port))server_socket.listen(1)client_socket,address = server_socket.accept()print“接受的连接来自”,地址
在这里我们可以逐行了解它们:
server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM): 创建用于蓝牙RFCOMM通信的套接字。
server_socket.bind((“”,port):- 服务器将主机''上的脚本绑定到port。
server_socket.listen(1): 服务器一次监听一次接受一个连接。
client_socket,地址= server_socket.accept(): 服务器接受客户端的连接请求,并将mac地址分配给变量地址,client_socket是客户端的套接字
此后,我们创建了一些函数,这些函数负责使汽车向所需方向移动: def left_side_forward(),def right_side_forward(),def forward(),def left_side_reverse(),def right_side_reverse(),def reverse()def stop( )。 当我们从Mobile blueTerm应用程序中按L,R,F,A,P,B,S分别调用这些功能时,汽车将相应地行驶。
data =“”而1:data = client_socket.recv(1024)打印“ Received:%s”%data if(data ==“ F”):forward()elif(data ==“ L”):left_side_forward() elif(数据==“ R”):right_side_forward()elif(数据==“ B”):reverse()elif(数据==“ A”):left_side_reverse()elif(数据==“ P”):right_side_reverse ()elif data ==“ S”:stop()elif(data ==“ Q”):print(“ Quit”)中断client_socket.close()server_socket.close()
data = client_socket.recv(1024): 通过客户端套接字client_socket接收数据,并将其分配给变量data。一次最多可以接收1024个字符。
最后,在完成所有编程之后,使用以下代码关闭客户端和服务器连接:
client_socket.close()server_socket.close()