最近在做一個農業機器人的項目,上位機採用的是樹莓派3B,下位機採用的是Arduino Mega,一開始用的UDP協議進行數據交換,後來發現UDP傳輸數據不是很穩定,就決定使用串口通訊,由於樹莓派3B集成了藍牙模塊,所以一切變得簡單起來。
首先,在樹莓派中進行環境搭建,依次執行下列命令:
sudo apt-get update
sudo apt-get install Arduino python-serial
sudo apt-get install bluetooth bluez python-bluez
然後進行藍牙的配置,有兩種方案:
1.如果使用的是LXDE,直接在屏幕右下角選擇藍牙,進行掃描和連接,一般HC-05和HC-06模塊的初始藍牙密碼都是1234,完成連接,此時藍牙模塊上的指示燈由快速閃爍變爲慢速閃爍。如果希望下一次樹莓派對該設備進行自動連接,需要在/dev/中建立相應的文件。首先查看該藍牙的識別碼,鼠標指針放置在剛纔連接藍牙處,即可以出現已經連接的藍牙的識別碼,然後打開命令行,輸入:
$ sudo rfcomm bind 0 00:14:01:10:10:32
其中的00:14:01:10:10:32即爲剛纔的藍牙識別碼,執行以後會在樹莓派的/dev目錄中創建一個/dev/rfcomm0 文件,而此時Arduino的藍牙指示燈爲閃爍狀態,表示“未連接”,當樹莓派向藍牙設備發送消息時纔去做連接操作。
sudo rfcomm release 0 00:14:01:10:10:32
表示對該設備已經綁定的藍牙設備進行解綁。
注意:這裏如果不小心填錯了藍牙的識別碼而且無法刪除/dev/rfcomm0文件,可以重新新建一個rfcomm1文件進行綁定,$ sudo rfcomm bind 1 00:14:01:10:10:32即可,在程序裏面連接/dev/rfcomm1即可。
2.如果使用的是命令行,在命令行裏面輸入下面的bluetoothctl命令即可進入藍牙的配置環境。
bluetoothctl
在藍牙的配置環境中,常用的命令有:
scan on
用於掃描可以配對的藍牙
pair 00:14:01:10:10:32
配對識別碼爲00:14:01:10:10:32的藍牙設備
paired-devices
查看該設備已經配對的設備
remove 00:14:01:10:10:32
刪除已經配對的設備
如果需要綁定可以按下Ctrl+Z退出藍牙的配置環境,然後按照上面的步驟在命令行中進行bind或release藍牙設備。
注意:這裏連接藍牙設備後,藍牙設備應該變爲慢速閃爍,這時候表示已經與設備進行連接。但是此時是沒有數據的,只有在運行下列python和Arduino程序的時候,才能實現打開串口,進行串口數據的收發。
完成配對後進行程序的編寫,首先是Arduino的程序:
void setup()
{
pinMode(11, OUTPUT);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
Serial.begin(9600);
}
void loop() {
while (Serial.available())
{
char c = Serial.read();
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW); //收到消息指示燈(LED)閃一下
if (c == 'A')
{
Serial.println("B"); //收到A就返回B
} else {
Serial.println("Please input [A]"); //都是其他字符返回
}
}
}
然後是樹莓派的程序(這裏使用的是py2.7進行測試):
import serial
import sys
port = "/dev/rfcomm0"
serial = serial.Serial(port,9600)
if len(sys.argv) > 1:
sendStr = sys.argv[1]
else:
sendStr = "A"
serial.write(sendStr)
serial.flushInput()
if serial.isOpen() == False:
serial.open()
line = serial.readline()
print line
注意:如果上面綁定的時候用的“bind 1”,則這裏的port="/dev/rfcomm1"。