Dieser Artikel funktioniert in der folgenden Umgebung.
Artikel | Wert |
---|---|
CPU | Core i5-8250U |
Ubuntu | 16.04 |
ROS | Kinetic |
Informationen zur Installation finden Sie unter ROS-Kurs 02-Installation. Das Programm in diesem Artikel wurde ebenfalls auf github hochgeladen. Weitere Informationen finden Sie im ROS Lecture 11 Git Repository.
Ein Spielzeug namens toio wurde von SIE veröffentlicht. Das größte Merkmal davon ist, dass Sie die Position und den Winkel von Toios Kernwürfel auf der Spielmatte erhalten können. Es gibt heutzutage viele Spielzeuge, die Reifen haben und alleine laufen, aber es kommt selten vor, dass sie ihre eigene Position einnehmen können. Darüber hinaus wurde Technische Daten veröffentlicht, damit es mit Scratch betrieben werden kann. Ich kann nur ROS verwenden, also machen wir es möglich, von ROS aus zu arbeiten.
toio kommuniziert mit Bluetooth Low Energy (BLE). Ich werde kurz das Grundwissen für die Kommunikation aufschreiben.
Zunächst wurde Bluetooth von Bluetooth Basic Rate / Enhanced Data Rate (BR / EDR) und ver4 hinzugefügt. Es gibt zwei Arten: Bluetooth Low Energy (LE). Diese beiden Typen unterscheiden sich mit der Ausnahme, dass die drahtlose Hardware üblich ist. Die meisten herkömmlichen Geräte wie drahtlose Kopfhörer verwenden das ER / EDR-Protokoll. Andererseits wird LE für Anwendungen wie toio verwendet, die zeitweise relativ kleine Daten senden.
BLE (Bluetooth Low Energy) verfügt über zwei Netzwerkkonfigurationen: Broadcast und Verbindung. Broadcast wird für die Kommunikation mit einer nicht festgelegten Anzahl von Sendern und Empfängern verwendet, z. B. Beacon. Eine Verbindung kommuniziert mit mehreren Peripheriegeräten, die mit einer Zentrale verbunden sind. Jedes Bluetooth-Gerät hat eine eindeutige HW-Adresse. Der Bluetooth-Dongle ist ebenfalls an toio angeschlossen und wird zur Angabe eines bestimmten Bluetooth-Geräts verwendet. Dies sind 6 Bytes und wird als "11: 22: 33: 44: 55: 66" geschrieben.
BLE-Peripheriegeräte verfügen über mehrere Dienste, von denen einige charakteristisch sind. Beispielsweise verfügt toio Core Cube über einen Dienst mit der Dienst-UUID "10B20100-5B3B-4571-9508-CF3EFCD7BBAE". Es gibt. In diesem Dienst verfügt der Lesesensor über eine charakteristische UUID mit der Bezeichnung "10B20101-5B3B-4571-9508-CF3EFCD7BBAE".
Es gibt nur drei Arten des BLE-Datenzugriffs
Die Daten hier sind ein Array von uint8.
Zusammenfassung Damit Ubuntu und Toio miteinander kommunizieren können
Es wird zum Verfahren.
Lassen Sie uns das oben genannte tun.
Diesmal hat der Bluetooth-Dongle dies verwendet. In einigen Fällen kann BR / EDR verwendet werden, BLE kann jedoch nicht mit dem eingebauten PC verwendet werden. Es ist gut, einen optionalen Dongle zu kaufen.
hciconfig
zeigt die Bluetooth-Geräteliste an. Hier werden nur der im PC steckende Dongle und der eingebaute Bluetooth-Empfänger angezeigt.
Bestätigung des Bluetooth-Dongles
$ hciconfig
hci0: Type: BR/EDR Bus: USB
BD Address: XX:XX:XX:XX:XX:XX ACL MTU: 8192:128 SCO MTU: 64:128
UP RUNNING
RX bytes:539 acl:0 sco:0 events:28 errors:0
TX bytes:860 acl:0 sco:0 commands:28 errors:0
Sie sehen eine Liste solcher Bluetooth-Geräte in der Nähe. Schalten Sie toio ein und führen Sie den folgenden Befehl aus. Notieren Sie sich die HW-Adresse von toio. Sie können es mit Strg + C stoppen.
Scan von BLE-Geräten
$ sudo hcitool -i hci0 lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
XX:XX:XX:XX:XX:XX toio Core Cube
...
(Fortsetzung unten)
Wenn hier "Scan-Parameter einstellen fehlgeschlagen: Eingabe- / Ausgabefehler" angezeigt wird, unterstützt das Gerät BLE nicht. Root-Berechtigungen sind nur erforderlich, wenn Geräte auf diese Weise gescannt werden.
Wir verwenden gatttool, ein Tool, das Daten mit BLE austauscht. Beginnen Sie zunächst mit dem folgenden Befehl. Geben Sie für XX: XX: XX: XX: XX: XX die von lescan oben angegebene HW-Adresse von toio ein.
Verbinde dich mit toio
$ gatttool -b XX:XX:XX:XX:XX:XX -t random -I
[XX:XX:XX:XX:XX:XX][LE]>
connect Stellen Sie die eigentliche Verbindung her. Wenn es normal ist, hören Sie einen Verbindungston von toio.
Verbinde dich mit toio
[XX:XX:XX:XX:XX:XX][LE]> connect
[XX:XX:XX:XX:XX:XX][LE]> # <-Die Farbe wird blau
Holen Sie sich die Liste der Eigenschaften, die toio hat. Siehe toio-Spezifikationen, um zu sehen, welche was entspricht.
Holen Sie sich charakteristisch
[XX:XX:XX:XX:XX:XX][LE]> char-desc 0x0b000b
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
...
(Fortsetzung unten)
Lassen Sie uns den Knopf EIN / AUS als Versuch sehen. Probieren Sie es aus, während Sie die Taste an der Lampe drücken.
Charakteristische Lektüre
[XX:XX:XX:XX:XX:XX][LE]> char-read-uuid 10B20107-5B3B-4571-9508-CF3EFCD7BBAE
handle: 0x001e value: 01 80
Beim Drücken wird der zweite Wert zu "80" und beim Loslassen zu "00".
Das charakteristische Schreiben wird im Handler wie folgt angegeben. In der Liste, die oben mit "char-desc 0x0b000b" angezeigt wird, lautet das Handle von "10B20103-5B3B-4571-9508-CF3EFCD7BBAE", das die Farbe der Lampe steuert, "0x0014". Verwenden Sie dies also. Die Lampe leuchtet mit dem folgenden Befehl weiß.
Charakteristische Lektüre
[XX:XX:XX:XX:XX:XX][LE]> char-write-cmd 0x0014 03000101808080
Trennung mit toio
[XX:XX:XX:XX:XX:XX][LE]> disconnect
Dieses Mal werden wir eine Python-Bibliothek namens bluepy verwenden.
sudo pip install bluepy
Grundlegende Verbindung und Datenlese- / Schreibmethode.
toio_lecture/script/toio_basic1.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from bluepy import btle
import sys
LAMP_HANDLE = 20
BATTERY_HANDLE = 34
if len(sys.argv) != 2:
print("1 argument (mac address of toio) is nessesary")
sys.exit( )
# connect
toio_peripheral = btle.Peripheral(sys.argv[1], btle.ADDR_TYPE_RANDOM, 1)
# read battery status
print("battery", ord(toio_peripheral.readCharacteristic(BATTERY_HANDLE)))
# write lamp
data = [3, 0, 1, 1, 200, 50, 50]
toio_peripheral.writeCharacteristic(LAMP_HANDLE, bytearray(data), True)
btle.Peripheral ()
. Das erste Argument ist die Mac-Adresse des BLE-Geräts und das zweite Argument ist der Adresstyp. Wenn es sich um toio handelt, wird keine Verbindung hergestellt, es sei denn, Sie geben btle.ADDR_TYPE_RANDOM an. Das dritte Argument ist der zu verbindende Bluetooth-Dongle, und 1 führt zu "hci1". Keines oder bis zum zweiten Argument stellt automatisch eine Verbindung zu beiden her.toio_peripheral.readCharacteristic (BATTERY_HANDLE)
. Das Ergebnis des Lesens ist eine Folge von Bytes. Konvertieren Sie dies mit ord ()
in ein Array von Ganzzahlen. Zum Beispiel sollte "(" Batterie ", 100)" angezeigt werden (dahinter befindet sich der Batteriestand (%)).toio_peripheral.writeCharacteristic (LAMP_HANDLE, bytearray (data), True)
. Es wird empfohlen, die Daten mit einer Zahlenfolge von Ganzzahlen festzulegen und als Bytezeichenfolge mit "bytearray ()" zu senden. Dieser Befehl bewirkt, dass die LED hellrot leuchtet.Beim Lesen des obigen Beispiels werden die Daten zum Zeitpunkt der Programmseite gelesen, es wird jedoch mitgeteilt, dass der Wert jedes Mal vom Gerät ausgegeben wird, wenn der Wert im Gerät aktualisiert wird.
toio_lecture/script/toio_basic2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from bluepy import btle
import sys
BATTERY_HANDLE = 34
class MyDelegate(btle.DefaultDelegate):
def __init__(self):
btle.DefaultDelegate.__init__(self)
print("set delegate")
def handleNotification(self, cHandle, data):
print("callback")
if(cHandle == BATTERY_HANDLE):
print("battery", ord(data))
if len(sys.argv) != 2:
print("1 argument (mac address of toio) is nessesary")
sys.exit( )
# connect
toio_peripheral = btle.Peripheral(sys.argv[1], btle.ADDR_TYPE_RANDOM, 1)
# set delegate
toio_peripheral.withDelegate(MyDelegate())
# set notify
toio_peripheral.writeCharacteristic(BATTERY_HANDLE+1, b'\x01', True)
try:
while True:
TIMEOUT = 0.1
toio_peripheral.waitForNotifications(TIMEOUT)
except KeyboardInterrupt:
None
Ergebnis
set delegate
callback
('battery', 90)
callback
('battery', 90)
callback
('battery', 90)
Ich werde den Quellcode unten setzen. toio_bridge.py
Die Mac-Adresse wird beim Start unten angegeben. Es muss neu geschrieben werden.
roslaunch toio_lecture with_kicker.launch
Sie können eine Verbindung zu mehreren toio herstellen, indem Sie beim obigen Start mehrere toio_bridges starten. Das Phänomen der Benachrichtigung tritt jedoch immer mit einer Verzögerung von etwas weniger als einer Krankheit in dem später verbundenen Toio auf. Im Moment besteht die Problemumgehung darin, so viele Bluetooth-Dongles wie toio zu haben und jedem toio_bridge einen anderen Bluetooth-Dongle zuzuweisen. Beispielcode finden Sie unter dual.launch.
Einführung in BLE Verwendung von ble-bezogenen Befehlen Verwendung von bluepy toio core cube-Spezifikationen
Link zum Inhaltsverzeichnis des ROS-Kurses
Recommended Posts