Essayez d'exécuter le cube core toio sur Windows 10 / macOS / Linux avec la bibliothèque Python bleak

Je souhaite exécuter le cube core toio sur un ordinateur proche de moi

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.

Qu'est-ce qui est sombre?

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.

Autres bibliothèques python de communication BLE

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.

Comment fonctionne sombre

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.

Eh bien, faisons-le quand même

Installez python sur Windows 10 et macOS

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.

Installez Bleak

$ pip install bleak

Après avoir attendu un moment, la sombre bibliothèque sera installée et disponible.

Découvrez l'adresse de l'appareil BLE du cube core toio

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.

Lisez le niveau de batterie restant du toio core cube, allumez la LED et faites tourner le moteur

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. P_20191209_221300.jpg Ensuite, tournez dans le sens des aiguilles d'une montre autour du côté légèrement droit du cube core toio. P_20191209_221458.jpg Cela se terminera dans 5 secondes.

Notifier l'état du bouton du cube core toio et l'ID lu par le capteur de lecture

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.

Réellement ...

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.

à la fin

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

Essayez d'exécuter le cube core toio sur Windows 10 / macOS / Linux avec la bibliothèque Python bleak
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez d'exécuter Python avec Try Jupyter
Exécutez SwitchBot avec Bleak sur Windows 10
Premiers pas avec Python 3.8 sous Windows
Mettre la liaison MeCab pour Python sur Windows, Mac et Linux avec pip
L'histoire de l'exécution de l'application asp.net core 3.1 sur la version arm64 Amazon Linux 2
Exécutez le servo avec Python sur ESP32 (Windows)
[C] [python] Lire avec AquesTalk sous Linux
Télécharger des fichiers sur le Web avec Python
Essayez le scraping HTML avec la bibliothèque Python
Installation de PIL avec Python 3.x sur macOS
Affichage des données d'informations de position en Python --Essayez de tracer avec la bibliothèque d'affichage de carte (folium) -
Essayez d'utiliser le processeur à 4 cœurs du Raspberry Pi 2 avec Parallel Python
Essayez d'exécuter Google Chrome avec Python et Selenium
Essayez de résoudre le diagramme homme-machine avec Python
Essayez CI le code python poussé sur GitHub.
Gérez bien AWS avec la bibliothèque Python Boto
Essayez de travailler avec Mongo en Python sur Mac
Introduction à Python avec Atom (en route)
Installez Python 3 sur MacOS Catalina (avec Homebrew uniquement)
Essayez d'utiliser l'API DropBox Core avec Python
Python sur Windows
Essayez de résoudre le livre des défis de programmation avec python3
Le problème que Windows python est appelé dans pipenv sur WSL
Essayez de traduire avec Python tout en conservant la mise en page PDF
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Installez le sélénium sur votre Mac et essayez-le avec python
Essayez de déboguer Python sur Raspberry Pi avec Visual Studio.
J'ai essayé de résoudre Soma Cube avec python
Commande Yum pour accéder à MySQL avec Python 3 sous Linux
Installez la bibliothèque python tierce sur Cinema4D
Faire un point d'arrêt sur la couche c avec python
Informations pour contrôler les moteurs avec Python sur RaspberryPi
PIL en Python sur Windows8 (pour Google App Engine)
À propos de l'option --enable-shared lors de la construction de Python sous Linux
[Débutant] Installation de Python et exécution de programmes (Windows)
Principes de base pour exécuter NoxPlayer en Python
Jusqu'à ce que vous utilisiez l'API Kaggle avec Colab
Pièges piégés lors de l'exécution d'exécutables Windows Python
Python sur Windows
environnement windows python
Installation de Python (Windows)
Essayez d'exécuter le cube core toio sur Windows 10 / macOS / Linux avec la bibliothèque Python bleak
Touchez le dernier moteur de rendu basé sur la physique Mitsuba2 (2) Passer de Python
J'ai essayé d'exécuter l'application sur la plateforme IoT "Rimotte"
Le processus d'installation d'Atom et de l'exécution de Python