Auf dieser Seite informiere ich über die Leistungsmerkmale des Lern-Roboters und sammle Anleitungen zur Programmierung in Python.
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. 130€ bekommt man folgende Teile geliefert:
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:
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.
Das Fahrwerk "Rocky" besteht aus folgenden Komponenten:
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.
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.
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.
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).
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.
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.
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 |