树莓派与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"。

 

你可能感兴趣的:(python,树莓派)