Cet article fonctionne dans l'environnement suivant.
article | valeur |
---|---|
CPU | Core i5-8250U |
Ubuntu | 16.04 |
ROS | Kinetic |
Pour l'installation, reportez-vous à ROS Course 02 Installation. Le programme de cet article a également été téléchargé sur github. Veuillez vous référer au Référentiel git du cours 11 ROS.
Un jouet appelé toio a été publié par le SIE. La plus grande caractéristique de ceci est que vous pouvez obtenir la position et l'angle du cube central de toio sur le tapis de jeu. De nos jours, de nombreux jouets ont des pneus et fonctionnent seuls, mais il est rare qu'ils puissent prendre leur propre position. De plus, Spécifications a été publié afin de pouvoir être utilisé avec scratch. Je ne peux utiliser que ROS, alors rendons possible le fonctionnement à partir de ROS.
toio communique avec Bluetooth Low Energy (BLE). J'écrirai brièvement les connaissances de base pour la communication.
Tout d'abord, Bluetooth a été ajouté à partir de Bluetooth Basic Rate / Enhanced Data Rate (BR / EDR) et ver4. Il existe deux types: Bluetooth Low Energy (LE). Ces deux types sont différents sauf que le matériel sans fil est commun. La plupart des appareils traditionnels tels que les écouteurs sans fil utilisent le protocole ER / EDR. D'autre part, LE est utilisé pour des applications telles que toio qui envoient des données relativement petites par intermittence.
BLE (Bluetooth Low Energy) a deux configurations de réseau, diffusion et connexion. La diffusion est utilisée pour la communication avec un nombre non spécifié d'expéditeurs et de destinataires, comme la balise. Une connexion communique avec plusieurs périphériques reliés à une centrale. Chaque appareil Bluetooth a une adresse matérielle unique. Le dongle bluetooth est également attaché à toio, et il est utilisé pour spécifier un périphérique bluetooth spécifique. Cela fait 6 octets et s'écrit "11: 22: 33: 44: 55: 66".
Les périphériques BLE disposent de plusieurs services, dont certains sont caractéristiques. Par exemple, toio Core Cube a un service avec l'UUID de service "10B20100-5B3B-4571-9508-CF3EFCD7BBAE". Il y a. Dans ce service, le capteur de lecture a un UUID caractéristique appelé "10B20101-5B3B-4571-9508-CF3EFCD7BBAE".
Il n'y a que trois types d'accès aux données BLE
Les données ici sont un tableau de uint8.
Résumé Donc pour que ubuntu et toio communiquent
Cela devient la procédure.
Faisons ce qui précède.
Cette fois, le dongle Bluetooth l'a utilisé. Dans certains cas, BR / EDR peut être utilisé mais BLE ne peut pas être utilisé avec le PC intégré. Il est bon d'acheter un dongle en option.
hciconfig
affichera la liste des périphériques Bluetooth. Seuls le dongle coincé dans le PC et le récepteur Bluetooth intégré sont affichés ici.
Confirmation du dongle Bluetooth
$ 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
Vous verrez une liste des appareils Bluetooth à proximité comme celui-ci. Allumez toio et exécutez la commande suivante. Notez l'adresse HW de toio. Vous pouvez l'arrêter avec Ctrl + C.
Scan des appareils BLE
$ sudo hcitool -i hci0 lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
XX:XX:XX:XX:XX:XX toio Core Cube
...
(Suite ci-dessous)
Si vous obtenez ici l'option `` Set scan parameters failed: Input / output error '', l'appareil ne prend pas en charge BLE. Les privilèges root ne sont requis que lors de l'analyse des périphériques de cette manière.
Nous utilisons gatttool, un outil qui échange des données avec BLE. Commencez par la commande suivante. Pour XX: XX: XX: XX: XX: XX, entrez l'adresse matérielle de toio obtenue par le lescan ci-dessus.
Commencez à vous connecter avec toio
$ gatttool -b XX:XX:XX:XX:XX:XX -t random -I
[XX:XX:XX:XX:XX:XX][LE]>
connect Établissez la connexion réelle. Si c'est normal, vous entendrez un son de connexion de toio.
Commencez à vous connecter avec toio
[XX:XX:XX:XX:XX:XX][LE]> connect
[XX:XX:XX:XX:XX:XX][LE]> # <-La couleur vire au bleu
Obtenez la liste des caractéristiques de toio. Voir spécifications toio pour voir ce qui correspond à quoi.
Obtenez la caractéristique
[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
...
(Suite ci-dessous)
Voyons le bouton ON / OFF comme un essai. Essayez-le en appuyant sur le bouton de la lampe.
Lecture caractéristique
[XX:XX:XX:XX:XX:XX][LE]> char-read-uuid 10B20107-5B3B-4571-9508-CF3EFCD7BBAE
handle: 0x001e value: 01 80
Lorsqu'elle est enfoncée, la deuxième valeur devient «80», et lorsqu'elle est relâchée, elle devient «00».
L'écriture caractéristique est spécifiée dans le gestionnaire comme suit. Dans la liste qui apparaît avec char-desc 0x0b000b
ci-dessus, la poignée de 10B20103-5B3B-4571-9508-CF3EFCD7BBAE
qui contrôle la couleur de la lampe est 0x0014
, alors utilisez ceci.
La lampe devient blanche avec la commande suivante.
Lecture caractéristique
[XX:XX:XX:XX:XX:XX][LE]> char-write-cmd 0x0014 03000101808080
Déconnexion avec toio
[XX:XX:XX:XX:XX:XX][LE]> disconnect
Cette fois, nous utiliserons une bibliothèque python appelée bluepy.
sudo pip install bluepy
Connexion de base et méthode de lecture / écriture des données.
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)
rosrun toio_lecture toio_basic1.py F0: 5D: 68: 8E: A8: 7C
.btle.Peripheral ()
. Le premier argument est l'adresse mac du périphérique BLE et le deuxième argument est le type d'adresse. Si c'est toio, il ne se connectera que si vous spécifiez btle.ADDR_TYPE_RANDOM. Le troisième argument est le dongle Bluetooth à connecter, et 1 mène à hci1
. Aucun ou jusqu'au deuxième argument se connectera automatiquement à l'un ou l'autre.toio_peripheral.readCharacteristic (BATTERY_HANDLE)
. Le résultat de la lecture est une chaîne d'octets. Convertissez ceci en un tableau d'entiers avec ʻord () . Par exemple, vous devriez voir
('battery', 100)` (derrière se trouve le niveau de la batterie (%)).toio_peripheral.writeCharacteristic (LAMP_HANDLE, bytearray (data), True)
. Il est recommandé de définir les données avec une chaîne numérique d'entiers et de les envoyer sous forme de chaîne d'octets avec bytearray ()
. Cette commande fait briller la LED en rouge pâle.Dans la lecture de l'exemple ci-dessus, les données sont lues au moment du programme, mais il est notifié que la valeur est renvoyée depuis le périphérique chaque fois que la valeur est mise à jour dans le périphérique.
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
rosrun toio_lecture toio_basic2.py F0: 5D: 68: 8E: A8: 7C
.résultat
set delegate
callback
('battery', 90)
callback
('battery', 90)
callback
('battery', 90)
toio_peripheral.writeCharacteristic (BATTERY_HANDLE + 1, b '\ x01', True)
pour démarrer la notification.btle.DefaultDelegate
et définissez-la avec la fonction ble. Si une notification arrive en attendant à toio_peripheral.waitForNotifications ()
, handleNotification ()
sera rappelé.Je vais mettre le code source ci-dessous. toio_bridge.py
L'adresse mac est spécifiée dans le lancement ci-dessous. Il doit être réécrit.
roslaunch toio_lecture with_kicker.launch
Vous pouvez vous connecter à plusieurs toio en lançant plusieurs toio_bridges lors du lancement ci-dessus. Cependant, le phénomène de notification arrive avec un retard d'un peu moins d'une maladie se produit toujours dans le toio connecté plus tard. Pour l'instant, la solution de contournement est d'avoir autant de dongle bluetooth qu'il y a de toio et d'attribuer un dongle bluetooth différent à chaque toio_bridge. Un exemple de code peut être trouvé sur dual.launch.
Introduction à BLE Comment utiliser les commandes liées à ble Comment utiliser bluepy spécifications toio core cube
Lien vers la table des matières du cours ROS
Recommended Posts