Le toio core cube est un robot à deux roues "très mignon" qui peut être contrôlé par communication BLE. https://toio.github.io/toio-spec/
L'autre jour, j'ai écrit Une histoire sur l'utilisation d'un smartphone pour déplacer le cube core toio directement en utilisant la communication BLE, mais cette fois j'ai utilisé un ordinateur personnel. Déplaçons le cube core toio.
L'environnement officiel pour la programmation javascript et visuelle est fourni.
Cependant, cet article utilise python. Visual Programming Environment a été publié uniquement pour macOS (à compter du 10 décembre 2019) et ~~ Windows10 64 bits ou Nécessite macOS 10.13 ou version ultérieure. La bibliothèque JavaScript nécessite également l'installation de node.js et noble. Le but de cet article est de déplacer rapidement le cube core toio à l'aide d'un ordinateur personnel ou d'un Raspberry Pi que vous pouvez utiliser autour de vous.Je vais donc vous présenter comment utiliser python, qui est relativement facile à installer.
De plus, comme l'exemple de code de bleak utilise asyncio, la version Python correspondante est Python 3.5 ou version ultérieure.
Une bibliothèque pour la communication BLE Python qui s'exécute sous Windows 10 / Linux / macOS.
Il existe différentes bibliothèques python pour la communication BLE, mais j'ai choisi bleak comme une qui peut fonctionner (presque) de la même manière sur trois types d'OS: Windows10, Linux (raspbian, ubuntu) et macOS.
Si vous ne voulez pas aller directement à BLE, il est préférable d'utiliser la bibliothèque pour les cubes core toio créés par de grands ancêtres. Vérifiez les exigences de fonctionnement de chaque système d'exploitation d'exploitation.
bleak est implémenté en encapsulant l'API de communication BLE de chaque système d'exploitation.
--Sous Windows 10, le Common Language Runtime (CLR) est utilisé pour appeler la DLL et l'API UWP y est appelée. --Sous Linux, il appelle la pile bluez. --Sur macOS, pyobjc est utilisé pour appeler l'API Core Bluetooth d'Objective-C.
Puisqu'il est transformé en une bibliothèque Python sous une forme qui cache la partie communication BLE de chaque OS, il est possible d'effectuer une communication BLE avec (presque) le même script Python sur n'importe quel OS.
Linux inclut python depuis le début (généralement), mais pas Windows 10, vous devez donc l'installer. De plus, macOS inclut python2.7, mais python3 n'est pas inclus, vous devez donc l'installer également. Les articles suivants seront utiles.
Dans l'explication suivante, l'invite est "$", mais on suppose que l'invite concerne les environnements Windows10, macOS et Linux. L'opération elle-même est la même dans n'importe quel environnement.
$ pip install bleak
Après avoir attendu un moment, la sombre bibliothèque sera installée et disponible.
Ceci est exemple de code sombre discover.py ) C'est vrai.
discover.py
import asyncio
from bleak import discover
async def run():
devices = await discover()
for d in devices:
print(d)
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
Si vous déplacez ceci, la sortie sera comme suit.
$ python3 discover.py
D0:8B:7F:12:34:56: toio Core Cube
B0:52:22:33:44:5A: Unknown
6E:E4:DA:12:34:55: bluetooth deviceY
63:87:F5:55:22:33: bluetooth deviceX
L'adresse de l'appareil est un nombre hexadécimal de 6 octets où se trouve toio Core Cube. Notez cette valeur. Vous définirez cette valeur dans un script ultérieur. Dans l'exemple d'exécution ci-dessus, "D0: 8B: 7F: 12: 34: 56". Pour macOS, il s'agit d'une longue chaîne UUID telle que 243E23AE-4A99-406C-B317-18F1BD7B4CBE au lieu d'un nombre hexadécimal de 6 octets.
Pour lire le niveau de batterie restant du toio core cube, connectez-le au oio core cube, puis lisez la caractéristique de la batterie (informations sur la batterie) (10B20108-5B3B-4571-9508-CF3EFCD7BBAE). Pour allumer la LED, écrivez dans la caractéristique (10B20103-5B3B-4571-9508-CF3EFCD7BBAE) de la commande d'éclairage. Pour déplacer le moteur, écrivez la valeur dans la caractéristique du moteur (commande moteur) (10B20102-5B3B-4571-9508-CF3EFCD7BBAE).
Écrivons la valeur faisant référence à l'exemple de "lampe" et "moteur" de la spécification de communication de la spécification technique de toio core cube.
read_write_sample.py
import asyncio
import platform
from bleak import BleakClient
#Caractéristique de la batterie, de la LED et du moteur
BATTERY_CHARACTERISTIC_UUID = ("10b20108-5b3b-4571-9508-cf3efcd7bbae")
LAMP_CHARACTERISTIC_UUID = ("10b20103-5b3b-4571-9508-cf3efcd7bbae")
MOTOR_CHARACTERISTIC_UUID = ("10b20102-5b3b-4571-9508-cf3efcd7bbae")
#En sombre, il semble que l'UUID caractéristique doit être écrit en lettres minuscules.
async def run(address, loop):
async with BleakClient(address, loop=loop) as client:
x = await client.is_connected()
#logger.info("Connected: {0}".format(x))
print("Connected: {0}".format(x))
#Lecture du niveau de batterie
battery = await client.read_gatt_char(BATTERY_CHARACTERISTIC_UUID)
print("battery: {0}".format(int(battery[0])))
#La LED s'allume en rouge pendant 160 millisecondes
write_value = bytearray(b'\x03\x10\x01\x01\xff\x00\x00')
await client.write_gatt_char(LAMP_CHARACTERISTIC_UUID, write_value)
#Moteur à 100 vitesses devant la gauche, 20 vitesses à l'arrière de la droite
write_value = bytearray(b'\x01\x01\x01\x64\x02\x02\x14')
await client.write_gatt_char(MOTOR_CHARACTERISTIC_UUID, write_value)
#Se termine après 5 secondes
await asyncio.sleep(5.0, loop=loop)
if __name__ == "__main__":
address = (
# discovery.Définissez l'adresse de l'appareil du toio Core Cube trouvé par py ici
"D0:8B:7F:12:34:56" #Pour Windows ou Linux, spécifiez une adresse de périphérique hexadécimale de 6 octets.
if platform.system() != "Darwin"
else "243E23AE-4A99-406C-B317-18F1BD7B4CBE" #UUID attaché à macOS pour macOS
)
loop = asyncio.get_event_loop()
loop.run_until_complete(run(address, loop))
$ python read_write_sample.py
Connected: True
battery: 100
Lorsque vous le déplacez, le niveau de batterie restant est lu et affiché, puis la LED s'allume en rouge pendant un moment. Ensuite, tournez dans le sens des aiguilles d'une montre autour du côté légèrement droit du cube core toio. Cela se terminera dans 5 secondes.
Pour notifier l'état du bouton du cube core toio et l'ID de lecture du capteur de lecture, la caractéristique d'information du bouton (10B20107-5B3B-4571-9508-CF3EFCD7BBAE) et le capteur de lecture (informations ID) Soyez averti de la caractéristique (10B20101-5B3B-4571-9508-CF3EFCD7BBAE).
Pour cela, reportez-vous à exemple de code sombre enable_notifications.py et écrivez le script suivant.
enable_button_and_id_info_notification.py
import asyncio
import platform
from bleak import BleakClient
#Caractéristiques des boutons et des capteurs de lecture
BUTTON_CHARACTERISTIC_UUID = ("10b20107-5b3b-4571-9508-cf3efcd7bbae")
ID_READER_CHARACTERISTIC_UUID = ("10b20101-5b3b-4571-9508-cf3efcd7bbae")
#En sombre, il semble que l'UUID caractéristique doit être écrit en lettres minuscules.
#Gestionnaire de notification d'état du bouton
def button_notification_handler(sender, data):
print("BUTTON {0}: {1}".format(sender, data))
#Lire le gestionnaire de notification de capteur
def id_reader_notification_handler(sender, data):
print("toio ID {0}: {1}".format(sender, data))
async def run(address, loop):
async with BleakClient(address, loop=loop) as client:
x = await client.is_connected()
print("Connected: {0}".format(x))
#Début de la notification d'état du bouton
await client.start_notify(BUTTON_CHARACTERISTIC_UUID, button_notification_handler)
#Lire le début de la notification du capteur
await client.start_notify(ID_READER_CHARACTERISTIC_UUID, id_reader_notification_handler)
#Se termine dans 10 secondes
await asyncio.sleep(10.0, loop=loop)
#État du bouton, lecture de la fin de la notification du capteur
await client.stop_notify(BUTTON_CHARACTERISTIC_UUID)
await client.stop_notify(ID_READER_CHARACTERISTIC_UUID)
if __name__ == "__main__":
address = (
# discovery.Définissez l'adresse de l'appareil du toio Core Cube trouvé par py ici
"D0:8B:7F:12:34:56" #Pour Windows ou Linux, spécifiez une adresse de périphérique hexadécimale de 6 octets.
if platform.system() != "Darwin"
else "243E23AE-4A99-406C-B317-18F1BD7B4CBE" #UUID attaché à macOS pour macOS
)
loop = asyncio.get_event_loop()
loop.run_until_complete(run(address, loop))
Après l'avoir déplacé, soulevez le cube core toio et appuyez sur un bouton, ou placez-le sur un tapis ou un autocollant de la collection Toio.
$ python enable_button_and_id_info_notification.py
Connected: True
toio ID 10b20101-5b3b-4571-9508-cf3efcd7bbae: bytearray(b'\x01\xa4\x01g\x01|\x00\xaf\x01e\x01|\x00')
toio ID 10b20101-5b3b-4571-9508-cf3efcd7bbae: bytearray(b'\x01\xa4\x01h\x01|\x00\xaf\x01f\x01|\x00')
toio ID 10b20101-5b3b-4571-9508-cf3efcd7bbae: bytearray(b'\x01\xa4\x01g\x01|\x00\xaf\x01e\x01|\x00')
Vous pouvez voir que la valeur qui change à chaque fois est notifiée.
Seuls Windows 10 (1909) et Linux (raspbian buster, RasPi 3B et 4B ont été confirmés pour fonctionner) ont été confirmés comme fonctionnant. Je suis désolé. Je ne pouvais pas exécuter sombres sur macOS dans mon environnement. discovery.py fonctionne, mais tout le reste ne fonctionne pas du tout. (L'environnement est MacBook Pro 13 pouces (début 2015) macOS 10.14.6 (mojave)) Dans cet environnement macOS, il fonctionne avec la bibliothèque BLE d'Adafruit qui prétend supporter Linux / macOS, mais au contraire, c'est le buster raspbian Ça n'a pas marché. (Causé par la différence dans la version de bluez) Il semble que cela fonctionnera si le backend de bluez est modifié, mais je ne peux pas comprendre la cause.
Club informatique à l'école primaire ou au collège? J'ai présenté comment déplacer le cube core toio à l'aide de python sur un ordinateur personnel familier ou un Raspberry Pi qui semble s'y trouver. Je pense que même un PC qui n'a pas d'interface Bluetooth intégrée, comme un ordinateur portable, peut être utilisé en connectant une interface Bluetooth de type dongle USB. Pour ceux qui ont un peu d'obstacles pour installer node.js, noble et scratch-link, et même dans un environnement où Windows 10 peut être utilisé mais les applications qui peuvent être installées sont limitées à stocker des applications, l'application de magasin python3 peut être installée et sombre Vous pouvez l'utiliser, alors essayez-le.
Recommended Posts