Der Toio Core Cube ist ein "sehr süßer" Zweiradroboter, der durch BLE-Kommunikation gesteuert werden kann. https://toio.github.io/toio-spec/
Neulich schrieb ich Eine Geschichte über die Verwendung eines Smartphones zum direkten Verschieben des Toio-Core-Cubes mithilfe der BLE-Kommunikation, aber diesmal verwendete ich einen PC. Bewegen wir den Toio-Kernwürfel.
Die offizielle Umgebung für Javascript und visuelle Programmierung wird bereitgestellt.
Dieser Artikel verwendet jedoch Python. Visual Programming Environment wurde nur für macOS (Stand: 10. Dezember 2019) und ~~ Windows10 64bit oder veröffentlicht Benötigt macOS 10.13 oder höher. JavaScript-Bibliothek erfordert auch die Installation von node.js und noble. Der Zweck dieses Artikels besteht darin, den Toio-Core-Cube mithilfe eines PCs oder Raspberry Pi, den Sie verwenden können, schnell zu verschieben. Daher werde ich die Verwendung von Python vorstellen, das relativ einfach zu installieren ist.
Da der Beispielcode von düster Asyncio verwendet, ist die entsprechende Python-Version außerdem Python 3.5 oder höher.
Eine Bibliothek für die BLE-Kommunikation Python, die unter Windows 10 / Linux / macOS ausgeführt wird.
Es gibt verschiedene Python-Bibliotheken für die BLE-Kommunikation, aber ich habe Bleak als eine ausgewählt, die (fast) auf drei Arten von Betriebssystemen ausgeführt werden kann: Windows 10, Linux (Raspbian, Ubuntu) und MacOS.
Wenn es ein wenig direkt BLE ist, ist es besser, die Bibliothek für den Toio-Core-Cube zu verwenden, der von großen Vorfahren erstellt wurde. Überprüfen Sie die Betriebsanforderungen für jedes Betriebssystem.
Bleak wird implementiert, indem die BLE-Kommunikations-API jedes Betriebssystems eingeschlossen wird.
Da es in einer Form zu einer Python-Bibliothek gemacht wird, die den BLE-Kommunikationsteil jedes Betriebssystems verbirgt, ist es möglich, die BLE-Kommunikation mit (fast) demselben Python-Skript auf jedem Betriebssystem durchzuführen.
Linux enthält Python (normalerweise) von Anfang an, Windows 10 jedoch nicht. Sie müssen es daher installieren. Außerdem enthält macOS python2.7, python3 ist jedoch nicht enthalten, sodass Sie es ebenfalls installieren müssen. Die folgenden Artikel sind hilfreich.
In der folgenden Erläuterung lautet die Eingabeaufforderung "$", es wird jedoch davon ausgegangen, dass die Eingabeaufforderung für Windows 10-, MacOS- und Linux-Umgebungen gilt. Der Vorgang selbst ist in jeder Umgebung gleich.
$ pip install bleak
Nach einer Weile wird die düstere Bibliothek installiert und verfügbar sein.
Dies ist düsterer Beispielcode remove.py ) Korrekt.
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())
Wenn Sie dies verschieben, lautet die Ausgabe wie folgt.
$ 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
Die Geräteadresse ist eine 6-Byte-Hexadezimalzahl, in der sich toio Core Cube befindet. Notieren Sie sich diesen Wert. Sie werden diesen Wert in einem späteren Skript festlegen. Im obigen Ausführungsbeispiel "D0: 8B: 7F: 12: 34: 56". Für macOS ist es eine lange UUID-Zeichenfolge wie 243E23AE-4A99-406C-B317-18F1BD7B4CBE anstelle einer 6-Byte-Hexadezimalzahl.
Um den verbleibenden Batteriestand des Toio-Kernwürfels abzulesen, schließen Sie ihn an den Oio-Kernwürfel an und lesen Sie dann die Batteriecharakteristik (Batterieinformationen) (10B20108-5B3B-4571-9508-CF3EFCD7BBAE). Um die LED einzuschalten, schreiben Sie in die Kennlinie (10B20103-5B3B-4571-9508-CF3EFCD7BBAE) der Lichtsteuerung. Um den Motor zu bewegen, schreiben Sie den Wert in die Kennlinie des Motors (Motorsteuerung) (10B20102-5B3B-4571-9508-CF3EFCD7BBAE).
Schreiben wir den Wert, der sich auf das Beispiel "Lampe" und "Motor" der Kommunikationsspezifikation der technischen Spezifikation des Toio Core Cube bezieht.
read_write_sample.py
import asyncio
import platform
from bleak import BleakClient
#Charakteristik von Batterie, LED und Motor
BATTERY_CHARACTERISTIC_UUID = ("10b20108-5b3b-4571-9508-cf3efcd7bbae")
LAMP_CHARACTERISTIC_UUID = ("10b20103-5b3b-4571-9508-cf3efcd7bbae")
MOTOR_CHARACTERISTIC_UUID = ("10b20102-5b3b-4571-9508-cf3efcd7bbae")
#In trostlosem Zustand scheint die charakteristische UUID in Kleinbuchstaben geschrieben zu sein.
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))
#Batteriestandsanzeige
battery = await client.read_gatt_char(BATTERY_CHARACTERISTIC_UUID)
print("battery: {0}".format(int(battery[0])))
#LED leuchtet 160 Millisekunden lang rot
write_value = bytearray(b'\x03\x10\x01\x01\xff\x00\x00')
await client.write_gatt_char(LAMP_CHARACTERISTIC_UUID, write_value)
#Motor 100 Geschwindigkeiten vorne links, 20 Geschwindigkeiten hinten rechts
write_value = bytearray(b'\x01\x01\x01\x64\x02\x02\x14')
await client.write_gatt_char(MOTOR_CHARACTERISTIC_UUID, write_value)
#Endet nach 5 Sekunden
await asyncio.sleep(5.0, loop=loop)
if __name__ == "__main__":
address = (
# discovery.Stellen Sie hier die Geräteadresse des von py gefundenen toio Core Cube ein
"D0:8B:7F:12:34:56" #Geben Sie für Windows oder Linux eine hexadezimale 6-Byte-Geräteadresse an.
if platform.system() != "Darwin"
else "243E23AE-4A99-406C-B317-18F1BD7B4CBE" #UUID an macOS für macOS angehängt
)
loop = asyncio.get_event_loop()
loop.run_until_complete(run(address, loop))
$ python read_write_sample.py
Connected: True
battery: 100
Wenn Sie es bewegen, wird der verbleibende Batteriestand gelesen und angezeigt, und dann leuchtet die LED für einen Moment rot. Drehen Sie dann im Uhrzeigersinn um die leicht rechte Seite des Toio-Kernwürfels. Es endet in 5 Sekunden.
Um den Tastenstatus des Toio-Core-Cubes und die Lese-ID des Lesesensors, die Tasteninformationscharakteristik (10B20107-5B3B-4571-9508-CF3EFCD7BBAE) und den Lesesensor (ID-Informationen) zu benachrichtigen. Über das Merkmal informiert werden (10B20101-5B3B-4571-9508-CF3EFCD7BBAE).
Informationen hierzu finden Sie unter düsterer Beispielcode enable_notifications.py und schreiben Sie das folgende Skript.
enable_button_and_id_info_notification.py
import asyncio
import platform
from bleak import BleakClient
#Tasten- und Lesesensoreigenschaften
BUTTON_CHARACTERISTIC_UUID = ("10b20107-5b3b-4571-9508-cf3efcd7bbae")
ID_READER_CHARACTERISTIC_UUID = ("10b20101-5b3b-4571-9508-cf3efcd7bbae")
#In trostlosem Zustand scheint die charakteristische UUID in Kleinbuchstaben geschrieben zu sein.
#Benachrichtigungshandler für den Schaltflächenstatus
def button_notification_handler(sender, data):
print("BUTTON {0}: {1}".format(sender, data))
#Lesen Sie den Sensor-Benachrichtigungs-Handler
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))
#Schaltfläche Status Benachrichtigung starten
await client.start_notify(BUTTON_CHARACTERISTIC_UUID, button_notification_handler)
#Start der Sensorbenachrichtigung lesen
await client.start_notify(ID_READER_CHARACTERISTIC_UUID, id_reader_notification_handler)
#Endet in 10 Sekunden
await asyncio.sleep(10.0, loop=loop)
#Tastenstatus, Lesen der Sensorbenachrichtigung beendet
await client.stop_notify(BUTTON_CHARACTERISTIC_UUID)
await client.stop_notify(ID_READER_CHARACTERISTIC_UUID)
if __name__ == "__main__":
address = (
# discovery.Stellen Sie hier die Geräteadresse des von py gefundenen toio Core Cube ein
"D0:8B:7F:12:34:56" #Geben Sie für Windows oder Linux eine hexadezimale 6-Byte-Geräteadresse an.
if platform.system() != "Darwin"
else "243E23AE-4A99-406C-B317-18F1BD7B4CBE" #UUID an macOS für macOS angehängt
)
loop = asyncio.get_event_loop()
loop.run_until_complete(run(address, loop))
Heben Sie nach dem Verschieben den Toio-Kernwürfel an und drücken Sie einen Knopf oder legen Sie ihn auf eine Matte oder einen Aufkleber in der Toio-Sammlung.
$ 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')
Sie können sehen, dass der Wert, der sich jedes Mal ändert, benachrichtigt wird.
Nur Windows 10 (1909) und Linux (Raspbian Buster, RasPi 3B und 4B wurden bestätigt) funktionieren tatsächlich. Es tut mir Leid. Ich konnte unter macOS in meiner Umgebung nicht trostlos laufen. Discovery.py funktioniert, aber alles andere funktioniert überhaupt nicht. (Die Umgebung ist MacBook Pro 13 Zoll (Anfang 2015) macOS 10.14.6 (Mojave)) In dieser macOS-Umgebung funktioniert es mit Adafruits BLE-Bibliothek, die behauptet, Linux / macOS zu unterstützen, im Gegenteil, dies ist der Raspbian Buster. Es hat nicht funktioniert. (Verursacht durch den Unterschied in der Version von bluez) Es scheint, dass es funktionieren wird, wenn das Backend von bluez geändert wird, aber ich kann die Ursache nicht herausfinden.
Computerclub in der Grundschule oder Realschule? Ich habe vorgestellt, wie man den Toio-Core-Cube mit Python auf einem vertrauten PC oder Raspberry Pi bewegt, in dem er sich zu befinden scheint. Ich denke, dass sogar ein PC ohne integrierte Bluetooth-Schnittstelle, wie z. B. ein Notebook-PC, durch Anschließen einer Bluetooth-Schnittstelle vom Typ USB-Dongle bedient werden kann. Für diejenigen, die ein wenig große Hürden bei der Installation von node.js, noble und Scratch-Link haben, und sogar in einer Umgebung, in der Windows 10 verwendet werden kann, die installierbaren Apps jedoch auf das Speichern von Apps beschränkt sind, kann die Store-App python3 installiert und düster sein Sie können es verwenden, probieren Sie es also aus.