Makeblock Codey Rocky
Auf dieser Seite informiere ich über die Leistungsmerkmale des Lern-Roboters und sammle Anleitungen zur Programmierung in Python.
Produktbeschreibung
Der "Codey Rocky" ist ein programmierbarer Roboter aus China, mit dem Kinder ab 14 Jahren spielerisch die Welt der Softwareentwicklung entdecken können. Zunächst beginnt man mit der grafischen Programmiersprache Scratch, wo Befehle als Puzzleteile dargestellt werden. Für fortgeschrittene mit guten Englisch Kenntnissen gibt es anschließend einen fließenden Übergang zur Programmiersprache Python, was ich für eine ziemlich gute Idee halte.
Für ca. 150 € bekommt man folgende Teile geliefert:
- Den Computerbaustein Codey (ca. 8x8x1 cm)
- Den fahrbaren Untersatz Rockey
- Ein Set bunte Kärtchen für den Farbsensor
- Ein USB Kabel (Micro USB zu Typ A Stecker)
- Ein Schlüsselband, damit man sich den Codey um den Hals hängen kann
Billig ist er nicht, aber robust und mit durchdachter Software ausgestattet. Der Computerbaustein "Codey" kann sowohl mit als auch ohne sein Fahrwerk "Rocky" benutzt werden.
Anleitungen und Software muss man sich aus dem Internet herunter laden:
Als Ergänzung habe ich folgende Webseiten gefunden:
- USB Treiber
- Doku der Micropython API (en)
- Quelltext der MicroPython API (en)
- Scratch Wiki
- Python Tutorial
Die mBlock Entwicklungsumgebung wird für Windows, Mac, Android und iPad bereitgestellt. Im Prinzip läuft sie auch auf Smartphones, aber auf dem kleinem Display kann man sie nicht sinnvoll bedienen. Die vollwertige online Version der Entwicklungsumgebung ist für den Chrome Browser vorgesehen. Um sie nutzen zu können, muss man das Programm "mLink" herunterladen und starten. Unter Linux ist dies die einzige Option.
Die Tablet App verbindet sich über Bluetooth mit dem Codey, während die PC Version das USB Kabel verwendet. Wer am PC ohne Kabel programmieren möchte, muss sich den speziellen "Bluetooth Dongle" von Makeblock dazu kaufen. Andere Bluetooth Schnittstellen werden nicht unterstützt.
Leider stellt der Hersteller überhaupt kein Lehrmaterial bereit. Das Gerät ist allerdings mit vielen spannenden Sensoren ausgestattet, die bereits ohne Anleitung zum Erforschen animieren. Man kann sich da ganz gut "durch klicken".
Offenbar hatte der Hersteller sich ursprünglich vorgenommen, weiteres Zubehör für Bild- und Spracherkennung, Neuronale Netze und KI anzubieten. Doch diese in den Werbe-Videos gezeigten Produkte kann man nicht kaufen. Der Bereich "Internet of Things" beschränkt sich auf den Abruf von Wetterberichten und dem Austausch von kurzen Textnachrichten zwischen Codey Geräten, aber der dazu nötige Cloud Server ist nur in China erreichbar. Für Python stehen immerhin IP Sockets und ein rudimentärer HTTP Client zur Verfügung, auf deren Basis man etwas eigenes aufbauen kann.
Technische Ausstattung
Der Computerbaustein "Codey" besteht aus folgenden Komponenten:- Mikrocontroller ESP32 mit 8 MB Flash, WLAN und Bluetooth
- USB-UART Chip CH341
- Lithium Akku 3,7 V 950 mAh
- Infrarot Sender/Empfänger in den "Ohren"
- Ein analoges Potentiometer
- Drei Tasten A, B und C
- Ein Lautsprecher
- Ein blaues Matrix-Display mit 16x8 Pixeln
- Eine RGB Leuchtdiode am unteren Rand des Display
- Ein Helligkeits-Sensor
- Ein Lautstärke-Sensor
- Ein Bewegungs-Sensor (6-Achsen, Beschleunigung und Rotation)
Das Fahrwerk "Rocky" besteht aus folgenden Komponenten:
- Zwei Bürstenmotoren mit Getriebe, PWM gesteuert, ohne Odometrie
- Optische Sensorleiste mit
- Weiße Leuchtdiode
- Sensor für sichtbares Licht
- RGB Leuchtdiode mit 7 Farben
- Sensor für IR
- IR Leuchtdiode
- Mechanisch kompatibel zu Lego Technik
Die optische Sensorleiste an der Front des Rocky kann man nach vorne oder nach unten ausrichten.
Zum Neuron Anschluss konnte ich nur heraus finden, dass er eine 5V Stromversorgung liefert und eine UART Schnittstelle mit 3,3V Pegeln hat. Die Verwendung mit selbst gebauter Hardware ist mangels API und Dokumentation nicht möglich.
Hinweise zur mBlock IDE
Die mBlock Entwicklungsumgebung unterstützt nicht nur den Codey Rocky, sondern auch alle anderen Produkte von Makeblock. Außerdem kann man damit einige Produkte anderer Hersteller programmieren. Mir sind dort diverse Arduino Boards positiv aufgefallen, die allerdings in Arduino C++ (nicht Python) programmiert werden.Die Projekte kann man wahlweise auf dem eigenen Computer speichern oder auf einem Cloud Server von Makeblock.
Die Entwicklungsumgebung startet mit einem Beispielprojekt für ein anderes Produkt. Deswegen muss
man als erstes unten links bei "Geräte" den Codey hinzu fügen und das falsche Gerät entfernen.
Die Entwicklungsumgebung kann nur ein Gerät gleichzeitig verwenden, auch wenn das dort anders
aussieht.
Ganz unten gibt es einen "Erweiterungen" Knopf für diverse Hardware, die man anscheinend nicht mehr
einzeln kaufen kann. Die IoT Erweiterung funktioniert nur
in China.
Die Entwicklungsumgebung unterscheidet zwischen "Hochladen" und "Live" Modus. Im Hochladen-Modus erzeugt
sie ein Python Script, das vom Codey ausgeführt wird. Am rechten Bildschirmrand blendet ein Klick auf
den
generierten Python Code ein.
Im Live-Modus wird das Scratch Programm direkt vom PC/Tablet ausgeführt. Es wird kein Python Code erzeugt. In dieser Betriebsart kann man die Figuren der Scratch Bühne mit dem Codey Roboter kombinieren. Zum Beispiel kann man den Codey als Game-Controller für eine Spielfigur auf dem PC Bildschirm nutzen. Außerdem kann man im Live-Modus fast alle Aktionen und Sensoren testen, indem man sie anklickt.
Programmieren mit Python
Es gibt einen separaten Python Editor, auf den der Button verweist, aber der ist nur für ein
anderes Produkt mit Namen "CyberPi" geeignet. Um den Codey in Python zu programmieren, musst du in den
"Hochladen" Modus umschalten und dann oben rechts bei
auf "Python" klicken.
Die folgenden Makeblock Module können importiert werden:
Darüber hinaus stehen die meisten Module von MicroPython zur Verfügung:
MicroPython implementiert nicht den vollen Funktionsumfang von Python. Zum Beispiel gibt es keine Formatierung mit f-Strings wie in f'Time={hour}:{minute}'. Weitere Unterschiede sind hier aufgelistet.
Die Netzwerk-Kommunikation ist langsam. Selbst einfachste HTTP Requests dauern rund 100 ms.
Die Entwicklungsumgebung lädt das Python Script ungeprüft als "main.py" auf den Codey hoch, welcher es dann ausführt. Fehler werden vom Codey teilweise direkt beim Start und teilweise erst zur Laufzeit erkannt. Die Entwicklungsumgebung zeigt entsprechende Meldungen im unteren Bereich an.
Konsole
Der Micropython Interpreter gibt Fehlermeldungen und print() Ausgaben auf der Konsole aus. Wenn das USB Kabel angeschlossen ist, kann man die Ausgaben mit einem Terminalprogramm schöner anzeigen als es die Entwicklungsumgebung tut.
Die Kommunikationsparameter sind 115200,8,N,1. Beispiel für Linux:
Verlasse Picocom mit der Tastenfolge Strg-A Strg-X. Die Konsole des Codey ist nicht interaktiv (kein REPL).
Beispiel: Internet Uhr
Das folgende Python Script ruft die Uhrzeit von einem Webserver ab und zeigt sie auf der LED-Matrix an:
import codey, event, time, usocket, sys, re # Pattern which finds the time in format '00:00:00' regex=re.compile(b'([0-9][0-9]):([0-9][0-9]):([0-9][0-9])') # Query the time from a web server def get_time(): socket=None try: codey.led.show(60, 60, 0) # yellow start = time.ticks_ms() # Connect to a web server addr=usocket.getaddrinfo('www.ptb.de', 80, usocket.SOCK_STREAM)[0] socket=usocket.socket(addr[0], addr[1], addr[2]) socket.connect(addr[4]) # Send HTTP request socket.write(b'HEAD /index.html HTTP/1.0\r\n\r\n') # Read and process the response line by line while True: line=socket.readline() # Find the Date header (example: 'Date: Sat, 02 Oct 2021 12:38:15 GMT\r\n') if line.startswith(b'Date:'): # Print the elapsed time and the received line print(time.ticks_ms() - start, "ms", line) codey.led.show(0, 60, 0) # green # Find the time within line res=regex.search(line) hour=int(res.group(1)) minute=int(res.group(2)) seconds=int(res.group(3)) # Convert the timezone +2 hours hour=(hour+2)%24; # Output the time now='{}:{:02d}'.format(hour,minute) codey.display.show(now) # Skip reading the rest of the response break except Exception as e: sys.print_exception(e) codey.led.show(0, 0, 60) # blue # Close connection if socket!=None: socket.close() @event.start def on_start(): print('start') # Connect to the WLAN router codey.wifi.start('your wifi ssid', 'your wifi password') while True: if codey.wifi.is_connected(): codey.led.show(0, 60, 0) # green get_time() time.sleep(10) else: # No WLAN connection codey.led.show(60, 0, 0) # red
In dieser Anwendung konnte ich das urequests Modul nicht gebrauchen, weil es die HTTP Response Header nicht zurück liefert.
Die Besonderheit der b-Strings liegt darin, dass sie im 8 Bit ASCII Zeichensatz verarbeitet werden, anstatt Unicode.
Fehlermeldungen
Exception OSError: 23Diese Fehlermeldung tritt typischerweise auf, wenn man wiederholt Dateien oder Sockets öffnet, ohne sie zu schließen.
Traceback ... in main_loopKeyboardInterrupt
Diese Meldung tritt immer auf, wenn das laufende Script wegen einem Upload unterbrochen wird. Das ist
kein Fehler.
23.01.014.006
Das ist die Versionsnummer der Firmware. Der Codey gibt diese immer aus, wenn er neu startet. Das ist
kein Fehler.
Fehlercodes
Nr | Code | Label |
---|---|---|
1 | EPERM | Operation nicht erlaubt |
2 | ENOENT | Datei oder Verzeichnis existiert nicht |
3 | ESRCH | Prozess existiert nicht |
4 | EINTR | Systemaufruf wurde unterbrochen |
5 | EIO | Ein-/Ausgabe Fehler |
6 | ENXIO | Gerät oder Adresse existiert nicht |
7 | E2BIG | Liste der Argumente zu lang |
8 | ENOEXEC | kein ausführbares Format |
9 | EBADF | Schlechter Datei-Deskriptor |
10 | ECHILD | Kein Kind Prozess |
11 | EAGAIN | Resource temporär nicht verfügbar |
12 | ENOMEM | Kann keinen Speicher belegen |
13 | EACCES | Zugriff verweigert |
14 | EFAULT | Schlechte Adresse |
15 | ENOTBLK | Blockgerät benötigt |
16 | EBUSY | Gerät oder Resource belegt |
17 | EEXIST | Datei existiert schon |
18 | EXDEV | Ungültiger Querverweis auf Gerät |
19 | ENODEV | Gerät existiert nicht |
20 | ENOTDIR | Verzeichnis existiert nicht |
21 | EISDIR | Ist ein Verzeichnis |
22 | EINVAL | Ungültiges Argument |
23 | ENFILE | Zu viele Dateien im System geöffnet |
24 | EMFILE | Zu viele Dateien geöffnet |
25 | ENOTTY | Unpassendes ioctl für Gerät |
26 | ETXTBSY | Text Datei ist belegt |
27 | EFBIG | Datei zu groß |
28 | ENOSPC | Kein Platz mehr frei |
29 | ESPIPE | Ungültige Suche |
30 | EROFS | Schreibgeschütztes Dateisystem |
31 | EMLINK | Zu viele Verknüpfungen |
32 | EPIPE | Kaputtes Rohr |
33 | EDOM | Numerisches Argument außerhalb der Domäne |
34 | ERANGE | Numerisches Ergebnis außerhalb des Bereiches |
35 | EDEADLOCK | Resourcen Sackgasse verhindert |
36 | ENAMETOOLONG | Dateiname zu lang |
37 | ENOLCK | Keine Sperre verfügbar |
38 | ENOSYS | Funktion ist nicht implementiert |
39 | ENOTEMPTY | Verzeichnis ist nicht leer |
40 | ELOOP | Zu viele verschachtelte symbolische Verknüpfungen |
42 | ENOMSG | Keine Meldung vom erwarteten Typ |
43 | EIDRM | Identifizierer entfernt |
44 | ECHRNG | Kanalnummer außerhalb des Bereiches |
45 | EL2NSYNC | Level 2 nicht synchronisiert |
46 | EL3HLT | Level 3 angehalten |
47 | EL3RST | Level 3 zurück gesetzt |
48 | ELNRNG | Anzahl der Verknüpfnungen außerhalb des Bereiches |
49 | EUNATCH | Protokoll Treiber ist nicht angebunden |
50 | ENOCSI | Keine CSI Struktur verfügbar |
51 | EL2HLT | Level 2 angehalten |
52 | EBADE | Ungültiger Austasch |
53 | EBADR | Ungültige Beschreibung der Anfrage |
54 | EXFULL | Austausch voll |
55 | ENOANO | Keine Anode |
56 | EBADRQC | Ungültiger Anfragecode |
57 | EBADSLT | Ungültiger Slot |
59 | EBFONT | Schlechtes Dateiformat bei Zeichensatz |
60 | ENOSTR | Gerät ist kein Strom |
61 | ENODATA | Keine Daten verfügbar |
62 | ETIME | Zeit abgelaufen |
63 | ENOSR | Strom-Resourcen verbraucht |
64 | ENONET | Maschine hat kein Netz |
65 | ENOPKG | Paket ist nicht installiert |
66 | EREMOTE | Entferntes Object |
67 | ENOLINK | Verbindung getrennt |
68 | EADV | Werbefehler |
69 | ESRMNT | Srmount Fehler |
70 | ECOMM | Kommunikationsfehler beim Senden |
71 | EPROTO | Protokollfehler |
72 | EMULTIHOP | Multihop versucht (SSH) |
73 | EDOTDOT | RFS spezifischer Fehler |
74 | EBADMSG | Schlechte Meldung |
75 | EOVERFLOW | Wert zu groß für den Datentyp |
76 | ENOTUNIQ | Name ist im Netz nicht eindeutig |
77 | EBADFD | Datei-Deskriptor ist fehlerhaft |
78 | EREMCHG | Entfernter Zugrff wurde geändert |
79 | ELIBACC | Kann auf eine Bibliothek nicht zugreifen |
80 | ELIBBAD | Zugriff auf eine defekte Bibliothek |
81 | ELIBSCN | .lib Abschnitt ist defekt |
82 | ELIBMAX | Versuch zu viele Bibliotheken zu verwenden |
83 | ELIBEXEC | Kann Bibliotheken nicht direkt ausführen |
84 | EILSEQ | Ungültiges multi-Byte Zeichen |
85 | ERESTART | Unterbrochener Systemaufruf erfordert Neustart |
86 | ESTRPIPE | Fehler in Strömungsrohr |
87 | EUSERS | Zu viele Benutzer |
88 | ENOTSOCK | Sockel-Funktion auf etwas anderem Sockel aufgerufen |
89 | EDESTADDRREQ | Zieladresse benötigt |
90 | EMSGSIZE | Meldung ist zu lang |
91 | EPROTOTYPE | Falsches Protokoll fpr den Sockel |
92 | ENOPROTOOPT | Protokoll ist nicht verfügbar |
93 | EPROTONOSUPPORT | Protokoll wird nicht unterstützt |
94 | ESOCKTNOSUPPORT | Sockel-Typ wird nicht unterstützt |
95 | ENOTSUP | Operation wird nicht unterstützt |
96 | EPFNOSUPPORT | Protokoll Familie wird nicht unterstützt |
97 | EAFNOSUPPORT | Familie der Adresse wird vom Protokoll nicht unterstützt |
98 | EADDRINUSE | Adresse wird bereits benutzt |
99 | EADDRNOTAVAIL | Kann die angeforderte Adresse nicht zuweisen |
100 | ENETDOWN | Netzwerk ist außer Betrieb |
101 | ENETUNREACH | Netzwerk ist nicht erreichbar |
102 | ENETRESET | Netzwerk hat die Verbindung unterbrochen |
103 | ECONNABORTED | Software hat die Verbindung unterbrochen |
104 | ECONNRESET | Verbindung wurde von der Gegenseite unterbrochen |
105 | ENOBUFS | Kein Pufferspeicher mehr frei |
106 | EISCONN | Transport-Endpunkt ist schon verbunden |
107 | ENOTCONN | Transport-Endpunkt ist nicht verbunden |
108 | ESHUTDOWN | Transport-Endpunkt wurde herunter gefahren |
109 | ETOOMANYREFS | Zu viele Referenzen |
110 | ETIMEDOUT | Verbindung dauert zu lange |
111 | ECONNREFUSED | Verbindung verweigert |
112 | EHOSTDOWN | Server ist heruntergfahren |
113 | EHOSTUNREACH | Keine Verbindung zum Server |
114 | EALREADY | Operation läuft bereits |
115 | EINPROGRESS | Operation wird ausgeführt/td> |
116 | ESTALE | Veraltetes Dateihandle |
117 | EUCLEAN | Struktur muss bereinigt werden |
118 | ENOTNAM | Keine benannte Typdatei |
119 | ENAVAIL | Kein Semaphor verfügbar |
120 | EISNAM | Ist eine benannte Typdatei |
121 | EREMOTEIO | Entfernter Ein-/Ausgabefehler |
122 | EDQUOT | Speicherplatzlimit erreicht |
123 | ENOMEDIUM | Kein Speichermedium gefunden |
124 | EMEDIUMTYPE | Falscher Typ vom Medium |
125 | ECANCELED | Operation abgebrochen |
126 | ENOKEY | Angeforderter Schlüssel fehlt |
127 | EKEYEXPIRED | Schlüssel ist abgelaufen |
128 | EKEYREVOKED | Schlüssel wurde widerrufen |
129 | EKEYREJECTED | Schlüssel wurde abgewiesen |
130 | EOWNERDEAD | Besitzer gestorben |
131 | ENOTRECOVERABLE | Zustand nicht wiederherstellbar |
132 | ERFKILL | Operation unmöglich wegen RF-kill |