Codey Rocky Codey Rocky

mBlock IDE mBlock Entwicklungsumgebung

Startseite

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. 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.

Technische Ausstattung

Der Computerbaustein "Codey" besteht aus folgenden Komponenten:

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.

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 Python Editor 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 Blöcke/Python 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:

Console

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: 23
Diese 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