Raspberry Pi 3 / Zero W和Arduino / HM-10之间的蓝牙串行

时间:2017-03-17 00:21:36

标签: serialization bluetooth bluetooth-lowenergy raspberry-pi3 bluez

我正在尝试在运行 Raspbian Jessie [03-07-2017]和Arduino(UNO)的Raspberry Pi Zero W之间建立蓝牙串行通信链接。 我目前能够使用bluetoothctl将数据写入Arduino。

应用程序要求我们能够将数据写入特定的BLE从站。有多个[HM-10] Slave可以切换,需要在程序执行期间选择Slave。

没有BAUD费率偏好。目前,我们普遍使用9600。

创建了自动连接然后将数据写入"属性"的功能,这显示为Arduino串行监视器上的数据。

Python代码 - 使用 BlueZ 5.44 (手动安装):

import subprocess
from subprocess import Popen, PIPE

# Replaces the ':' with '_' to allow the MacAddress to be in the form
# of a "Path" when "selecting an attribute"
def changeMacAddr(word):
    return ''.join(c if c != ':' else '_' for c in word)

# Connects to a given MacAddress and then selects the attribute to write to
def connBT(BTsubProcess, stringMacAddr):
    BTsubProcess.stdin.write(bytes("".join("connect "+stringMacAddr +"\n"), "utf-8"))
    BTsubProcess.stdin.flush()
    time.sleep(2)
    stringFormat = changeMacAddr(stringMacAddr)
    BTsubProcess.stdin.write(bytes("".join("select-attribute /org/bluez/hci0/dev_"
                              + stringFormat +
                              "/service0010/char0011" + "\n"), "utf-8"))
    BTsubProcess.stdin.flush()

# Can only be run once connBT has run - writes the data in a list [must have numbers 0 - 255 ]
def writeBT(BTsubProcess, listOfData):
    stringList = [str('{0} ').format(elem) for elem in listOfData]
    BTsubProcess.stdin.write(bytes("".join("write " + "".join(stringList) + "\n"), "utf-8"))
    BTsubProcess.stdin.flush()

# Disconnects
def clostBT(BTsubProcess):
    BTsubProcess.communicate(bytes("disconnect\n", "utf-8"))

# To use the functions a subprocess "instance" of bluetoothctl must be made
blt = subprocess.Popen(["bluetoothctl"], stdin=subprocess.PIPE, shell=True)
# blt with then be passed into the function for BTsubProcess

# Note: the MacAddresses of the Bluetooth modules were pre-connected and trusted manually via bluetoothctl

此方法适用于小型数据集,但我的要求要求我非常快速地将数据流式传输到Arduino。

目前的设置是:

  1. Pi
  2. 接收通过USB串行传感器数据(加速度计,EEG)
  3. Pi处理数据
  4. 然后通过Pi Zero W的内置蓝牙将命令发送到Arduino
  5. 然而,在使用此方法时,蓝牙数据传输会在传感器数据发生变化时延迟(暂时冻结)。

    使用两个预先配对的HM-10模块时数据传输完美无缺,Pi的GPIO串口使用 PySerial 进行配置。

    还尝试了以下方法:

    • 使用 WiringPi 在/ dev / ttyAMA0上设置蓝牙串口
    • 使用Python套接字和rfcomm

    尝试同时使用这两种方法时。然而,Python代码编译后,一旦打开串行端口,数据似乎就不会被写入,也不会显示在Arduino的串行监视器上。

    这会破坏以前的功能。即使手动使用bluetoothctl,模块也无法取消配对/断开连接。写入适当的属性也不起作用。

    需要重新启动才能恢复正常功能。

    这种做法是否正确? 有没有更好的方法通过BLE发送数据?

    更新时间:05/07/2017
    我不再从事这个项目了。但故障排除让我相信一场竞争条件"在代码中可能导致程序无法正常运行。
    这在测试阶段得到了验证,在这个阶段创建了一个功能非常好的准系统代码。

0 个答案:

没有答案