如何使用Raspberry Pi3和蓝牙构建遥控汽车

描述

Raspberry Pi 因其通过互联网进行无线通信的无缝能力而在物联网项目中非常受欢迎。Raspberry Pi 3内置Wi-Fi和蓝牙,蓝牙是一种非常流行的无线通信协议。今天我们将使用Raspberry Pi 3和蓝牙构建遥控汽车,在这里我们将使用智能手机作为遥控器来控制汽车。

在这里,我们使用的是具有内置蓝牙的Raspberry Pi 3,因此我们不需要使用任何外部USB蓝牙加密狗。在这里,我们使用RFCOMM蓝牙协议进行无线通信。

Python 中的蓝牙编程遵循套接字编程模型,蓝牙设备之间的通信通过 RFCOMM 套接字完成。RFCOMM(射频通信)是一种蓝牙协议,提供模拟RS-232串行端口,也称为串行端口仿真。蓝牙串行端口配置文件基于此协议。RFCOMM 因其广泛的支持和公开可用的 API 而在蓝牙应用中非常流行。它绑定到 L2CAP 协议。

安装蓝牙通信所需的软件包:

在开始之前,我们需要安装一些软件来在树莓派中设置蓝牙通信。您应该准备好Raspbian Jessie安装的存储卡和Raspberry Pi。

所以现在我们首先需要使用以下命令更新 Raspbian:

sudo apt-get update
sudo apt-get upgrade
然后我们需要安装一些与蓝牙相关的软件包:

sudo apt-get install bluetooth blueman bluez
然后重新启动树莓派:

sudo reboot
BlueZ是一个开源项目和官方Linux蓝牙协议栈。它支持所有核心蓝牙协议,现在成为官方Linux内核的一部分。

Blueman 提供桌面界面来管理和控制蓝牙设备。

最后,我们需要用于蓝牙通信的python库,以便我们可以使用Python语言通过RFCOMM发送和接收数据:

sudo apt-get install python-bluetooth
同时为 Raspberry Pi 安装 GPIO 支持库:

sudo apt-get install python-rpi.gpio
现在我们已经完成了在树莓派中安装蓝牙通信所需的软件包。

通过蓝牙将设备与树莓派配对:
将蓝牙设备(如手机)与树莓派配对非常容易。在这里,我们将Android智能手机与树莓派配对。我们之前在 Pi 中安装了 BlueZ,它提供了一个名为“蓝牙ctl”的命令行实用程序来管理我们的蓝牙设备。

现在通过以下命令打开蓝牙 ctl 实用程序:

sudo bluetoothctl
您可以通过键入“帮助”来检查蓝牙ctl实用程序的所有命令。现在我们需要按给定顺序输入以下命令:

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
在最后一个命令“扫描”之后,您将在列表中看到您的蓝牙设备(手机)。确保您的手机已开启蓝牙,并且附近的设备可以看到您的手机。然后复制设备的MAC地址并使用给定的命令进行配对:

pair


然后,系统会提示您在终端控制台中输入密码或 PIN,然后在那里输入密码并按 Enter 键。然后在出现提示时在手机中输入相同的密码,您现在已成功与树莓派配对。

遥控汽车

如前所述,您还可以使用桌面界面配对手机。安装 Blueman 后,您将在 Raspberry Pi 桌面的右侧看到一个蓝牙图标,如下所示,您可以使用它轻松进行配对。

遥控汽车

选择玩具车:

在这个树莓派控制汽车项目中,我们使用玩具车进行演示。在这里,我们选择了具有左右移动转向功能的RF玩具车。购买这辆车后,我们用我们的树莓电路更换了它的射频电路。这辆车有两个直流电机,一个旋转两个前轮,另一个旋转两个后轮。前侧电机用于为汽车提供方向,即向左或向右转(如真正的汽车转向功能)。后侧电机用于驱动汽车向前和向后方向。树莓的蓝牙用于从安卓手机无线接收命令以控制汽车。

遥控汽车

您可以使用任何具有两个直流电机的玩具车来旋转前轮和后轮。

电路图及说明:

在这辆遥控车中,我们只需要使用L293D 模块将树莓派与两个电机连接。为了给Raspberry Pi和汽车供电,我们使用了移动电源。移动电源足以为Raspberry Pi和汽车的电机供电,但是当我们把移动电源放在汽车上时,由于移动电源的重量很重,汽车将无法正常移动。因此,我们建议使用轻量电源或锂电池为系统供电。所有连接如下图所示。另请查看我们的机器人部分,了解有关使用不同技术控制电机的更多信息。

注意:不要在树莓派上放置超过 5v 的电压。

遥控汽车

该电路已在 Perf 板上为该项目制作,因此汽车的重量更小。

遥控汽车

 

遥控汽车

使用安卓应用程序BlueTerm远程控制汽车:

现在,在设置了所有内容并成功尝试通过蓝牙配对智能手机之后,我们需要安装一个Android应用程序,以使用蓝牙串行适配器与Raspberry Pi进行通信,以便我们可以控制Raspberry Pi的GPIO引脚。如前所述,RFCOMM / SPP协议模拟蓝牙上的串行通信,因此我们在此处安装了支持此协议的BlueTerm App。

遥控汽车

您还可以使用任何其他支持通过RFCOMM插座进行通信的蓝牙终端应用程序。

现在,下载并安装BlueTerm应用程序后,从终端运行下面给定的Python程序,并同时从BlueTerm应用程序连接配对的覆盆子皮设备。

遥控汽车

连接成功后,您将在应用程序的右上角看到connected:raspberrypi,如下所示:

遥控汽车

遥控汽车

现在,您只需从BlueTerm应用程序中输入以下命令即可使汽车向所需方向移动。按“q”退出程序。您可以使用谷歌语音输入键盘通过语音控制这辆车。

命令:

F – 向前移动

B – 向后移动

S – 停止

L – 向左移动

R – 向前右移动

A – 向后向左移动

P – 向后右移动

Q – 退出

遥控汽车

蟒蛇编程:

用于控制Raspberry Pi GPIO与Android App的Python程序非常简单且不言自明。只需要我们了解一点与蓝牙射频通信相关的代码。否则,就像通过使电机的销高或低来控制任何机器人或汽车一样。

首先,我们需要导入蓝牙套接字库,它使我们能够使用 Python 语言控制蓝牙;我们已经在上一节中安装了相同的库。

import Bluetooth
然后我们加入了更多的头文件,并定义了电机的引脚,将它们默认为低电平。

import bluetooth
import time
import RPi.GPIO as 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 "Accepted connection from ",address
在这里我们可以逐行理解它们:

server_socket=蓝牙。蓝牙插座(蓝牙。RFCOMM):为蓝牙RFCOMM通信创建套接字。
server_socket.bind((“”, port):- 服务器将主机 '' 上的脚本绑定到端口。

server_socket.听(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()。当我们从移动blueTerm应用程序中按L,R,F,A,P,B,S时,将分别调用这些函数,并且汽车将相应地移动。

data=""
while 1:
data= client_socket.recv(1024)
print "Received: %s" % data
if (data == "F"): 
forward()
elif (data == "L"): 
left_side_forward()
elif (data == "R"): 
right_side_forward()
elif (data == "B"): 
reverse()
elif (data == "A"): 
left_side_reverse()
elif (data == "P"): 
right_side_reverse()
elif data == "S":
stop()
elif (data == "Q"):
print ("Quit")
break
client_socket.close()
server_socket.close()
数据 = client_socket.recv(1024):通过客户端套接字client_socket接收数据并将其分配给变量数据。一次最多可以接收 1024 个字符。

最后,在所有编程之后,使用以下代码关闭客户端和服务器连接:

client_socket.close()
server_socket.close()

import bluetooth

import time

import RPi.GPIO as 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 "Accepted connection from ",address


def left_side_forward():

print "FORWARD LEFT"

GPIO.output(m21 , 1)

GPIO.output(m22 , 0)

time.sleep(.5)

GPIO.output(m11 , 1)

GPIO.output(m12 , 0)


def right_side_forward():

print "FORWARD RIGHT"

GPIO.output(m21 , 1)

GPIO.output(m22 , 0)

time.sleep(.5)

GPIO.output(m11 , 0)

GPIO.output(m12 , 1)


def forward():

print "FORWARD"

GPIO.output(m11 , 0)

GPIO.output(m12 , 0)

GPIO.output(m21 , 1)

GPIO.output(m22 , 0)


def left_side_reverse():

print "BACKWARD LEFT"

GPIO.output(m21 , 0)

GPIO.output(m22 , 1)

time.sleep(.5)

GPIO.output(m11 , 1)

GPIO.output(m12 , 0)


def right_side_reverse():

print "BACKWARD RIGHT"


GPIO.output(m21 , 0)

GPIO.output(m22 , 1)

time.sleep(.5)

GPIO.output(m11 , 0)

GPIO.output(m12 , 1)


def reverse():

print "BACKWARD"

GPIO.output(m11 , 0)

GPIO.output(m12 , 0)

GPIO.output(m21 , 0)

GPIO.output(m22 , 1)


def stop():

print "STOP"

GPIO.output(m11 , 0)

GPIO.output(m12 , 0)

GPIO.output(m21 , 0)

GPIO.output(m22 , 0)



data=""

while 1:

data= client_socket.recv(1024)

print "Received: %s" % data

if (data == "F"): 

forward()

elif (data == "L"): 

left_side_forward()

elif (data == "R"): 

right_side_forward()

elif (data == "B"): 

reverse()

elif (data == "A"): 

left_side_reverse()

elif (data == "P"): 

right_side_reverse()

elif data == "S":

stop()

elif (data == "Q"):

print ("Quit")

break

client_socket.close()

server_socket.close()



 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分