Raspberry Pi 因其通過互聯(lián)網(wǎng)進行無線通信的無縫能力而在物聯(lián)網(wǎng)項目中非常受歡迎。Raspberry Pi 3內(nèi)置Wi-Fi和藍牙,藍牙是一種非常流行的無線通信協(xié)議。今天我們將使用Raspberry Pi 3和藍牙構(gòu)建遙控汽車,在這里我們將使用智能手機作為遙控器來控制汽車。
在這里,我們使用的是具有內(nèi)置藍牙的Raspberry Pi 3,因此我們不需要使用任何外部USB藍牙加密狗。在這里,我們使用RFCOMM藍牙協(xié)議進行無線通信。
Python 中的藍牙編程遵循套接字編程模型,藍牙設(shè)備之間的通信通過 RFCOMM 套接字完成。RFCOMM(射頻通信)是一種藍牙協(xié)議,提供模擬RS-232串行端口,也稱為串行端口仿真。藍牙串行端口配置文件基于此協(xié)議。RFCOMM 因其廣泛的支持和公開可用的 API 而在藍牙應(yīng)用中非常流行。它綁定到 L2CAP 協(xié)議。
安裝藍牙通信所需的軟件包:
在開始之前,我們需要安裝一些軟件來在樹莓派中設(shè)置藍牙通信。您應(yīng)該準(zhǔn)備好Raspbian Jessie安裝的存儲卡和Raspberry Pi。
所以現(xiàn)在我們首先需要使用以下命令更新 Raspbian:
sudo apt-get update
sudo apt-get upgrade
然后我們需要安裝一些與藍牙相關(guān)的軟件包:
sudo apt-get install bluetooth blueman bluez
然后重新啟動樹莓派:
sudo reboot
BlueZ是一個開源項目和官方Linux藍牙協(xié)議棧。它支持所有核心藍牙協(xié)議,現(xiàn)在成為官方Linux內(nèi)核的一部分。
Blueman 提供桌面界面來管理和控制藍牙設(shè)備。
最后,我們需要用于藍牙通信的python庫,以便我們可以使用Python語言通過RFCOMM發(fā)送和接收數(shù)據(jù):
sudo apt-get install python-bluetooth
同時為 Raspberry Pi 安裝 GPIO 支持庫:
sudo apt-get install python-rpi.gpio
現(xiàn)在我們已經(jīng)完成了在樹莓派中安裝藍牙通信所需的軟件包。
通過藍牙將設(shè)備與樹莓派配對:
將藍牙設(shè)備(如手機)與樹莓派配對非常容易。在這里,我們將Android智能手機與樹莓派配對。我們之前在 Pi 中安裝了 BlueZ,它提供了一個名為“藍牙ctl”的命令行實用程序來管理我們的藍牙設(shè)備。
現(xiàn)在通過以下命令打開藍牙 ctl 實用程序:
sudo bluetoothctl
您可以通過鍵入“幫助”來檢查藍牙ctl實用程序的所有命令。現(xiàn)在我們需要按給定順序輸入以下命令:
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
在最后一個命令“掃描”之后,您將在列表中看到您的藍牙設(shè)備(手機)。確保您的手機已開啟藍牙,并且附近的設(shè)備可以看到您的手機。然后復(fù)制設(shè)備的MAC地址并使用給定的命令進行配對:
pair
然后,系統(tǒng)會提示您在終端控制臺中輸入密碼或 PIN,然后在那里輸入密碼并按 Enter 鍵。然后在出現(xiàn)提示時在手機中輸入相同的密碼,您現(xiàn)在已成功與樹莓派配對。
如前所述,您還可以使用桌面界面配對手機。安裝 Blueman 后,您將在 Raspberry Pi 桌面的右側(cè)看到一個藍牙圖標(biāo),如下所示,您可以使用它輕松進行配對。
選擇玩具車:
在這個樹莓派控制汽車項目中,我們使用玩具車進行演示。在這里,我們選擇了具有左右移動轉(zhuǎn)向功能的RF玩具車。購買這輛車后,我們用我們的樹莓電路更換了它的射頻電路。這輛車有兩個直流電機,一個旋轉(zhuǎn)兩個前輪,另一個旋轉(zhuǎn)兩個后輪。前側(cè)電機用于為汽車提供方向,即向左或向右轉(zhuǎn)(如真正的汽車轉(zhuǎn)向功能)。后側(cè)電機用于驅(qū)動汽車向前和向后方向。樹莓的藍牙用于從安卓手機無線接收命令以控制汽車。
您可以使用任何具有兩個直流電機的玩具車來旋轉(zhuǎn)前輪和后輪。
電路圖及說明:
在這輛遙控車中,我們只需要使用L293D 模塊將樹莓派與兩個電機連接。為了給Raspberry Pi和汽車供電,我們使用了移動電源。移動電源足以為Raspberry Pi和汽車的電機供電,但是當(dāng)我們把移動電源放在汽車上時,由于移動電源的重量很重,汽車將無法正常移動。因此,我們建議使用輕量電源或鋰電池為系統(tǒng)供電。所有連接如下圖所示。另請查看我們的機器人部分,了解有關(guān)使用不同技術(shù)控制電機的更多信息。
注意:不要在樹莓派上放置超過 5v 的電壓。
該電路已在 Perf 板上為該項目制作,因此汽車的重量更小。
使用安卓應(yīng)用程序BlueTerm遠程控制汽車:
現(xiàn)在,在設(shè)置了所有內(nèi)容并成功嘗試通過藍牙配對智能手機之后,我們需要安裝一個Android應(yīng)用程序,以使用藍牙串行適配器與Raspberry Pi進行通信,以便我們可以控制Raspberry Pi的GPIO引腳。如前所述,RFCOMM / SPP協(xié)議模擬藍牙上的串行通信,因此我們在此處安裝了支持此協(xié)議的BlueTerm App。
您還可以使用任何其他支持通過RFCOMM插座進行通信的藍牙終端應(yīng)用程序。
現(xiàn)在,下載并安裝BlueTerm應(yīng)用程序后,從終端運行下面給定的Python程序,并同時從BlueTerm應(yīng)用程序連接配對的覆盆子皮設(shè)備。
連接成功后,您將在應(yīng)用程序的右上角看到connected:raspberrypi,如下所示:
現(xiàn)在,您只需從BlueTerm應(yīng)用程序中輸入以下命令即可使汽車向所需方向移動。按“q”退出程序。您可以使用谷歌語音輸入鍵盤通過語音控制這輛車。
命令:
F – 向前移動
B – 向后移動
S – 停止
L – 向左移動
R – 向前右移動
A – 向后向左移動
P – 向后右移動
Q – 退出
蟒蛇編程:
用于控制Raspberry Pi GPIO與Android App的Python程序非常簡單且不言自明。只需要我們了解一點與藍牙射頻通信相關(guān)的代碼。否則,就像通過使電機的銷高或低來控制任何機器人或汽車一樣。
首先,我們需要導(dǎo)入藍牙套接字庫,它使我們能夠使用 Python 語言控制藍牙;我們已經(jīng)在上一節(jié)中安裝了相同的庫。
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)
以下是負責(zé)藍牙通信的代碼:
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通信創(chuàng)建套接字。
server_socket.bind((“”, port):- 服務(wù)器將主機 '' 上的腳本綁定到端口。
server_socket.聽(1):服務(wù)器偵聽一次接受一個連接。
client_socket, 地址 = server_socket.accept():服務(wù)器接受客戶端的連接請求并將 mac 地址分配給可變地址,client_socket是客戶端的套接字
在此之后,我們創(chuàng)建了一些負責(zé)向所需方向移動汽車的函數(shù):def left_side_forward(),def right_side_forward(),def forward(),def left_side_reverse(),def right_side_reverse(),def reverse()def stop()。當(dāng)我們從移動blueTerm應(yīng)用程序中按L,R,F(xiàn),A,P,B,S時,將分別調(diào)用這些函數(shù),并且汽車將相應(yīng)地移動。
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()
數(shù)據(jù) = client_socket.recv(1024):通過客戶端套接字client_socket接收數(shù)據(jù)并將其分配給變量數(shù)據(jù)。一次最多可以接收 1024 個字符。
最后,在所有編程之后,使用以下代碼關(guān)閉客戶端和服務(wù)器連接:
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()
-
遙控汽車
+關(guān)注
關(guān)注
0文章
7瀏覽量
6983 -
微藍牙
+關(guān)注
關(guān)注
0文章
2瀏覽量
6684
發(fā)布評論請先 登錄
相關(guān)推薦
評論