樹莓派與Arduino藍牙通訊實踐

        最近在做一個農業機器人的項目,上位機採用的是樹莓派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"。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章