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

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 gar 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 leider 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 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

NrCodeLabel
1EPERMOperation nicht erlaubt
2ENOENTDatei oder Verzeichnis existiert nicht
3ESRCHProzess existiert nicht
4EINTRSystemaufruf wurde unterbrochen
5EIOEin-/Ausgabe Fehler
6ENXIOGerät oder Adresse existiert nicht
7E2BIGListe der Argumente zu lang
8ENOEXECkein ausführbares Format
9EBADFSchlechter Datei-Deskriptor
10ECHILDKein Kind Prozess
11EAGAINResource temporär nicht verfügbar
12ENOMEMKann keinen Speicher belegen
13EACCESZugriff verweigert
14EFAULTSchlechte Adresse
15ENOTBLKBlockgerät benötigt
16EBUSYGerät oder Resource belegt
17EEXISTDatei existiert schon
18EXDEVUngültiger Querverweis auf Gerät
19ENODEVGerät existiert nicht
20ENOTDIRVerzeichnis existiert nicht
21EISDIRIst ein Verzeichnis
22EINVALUngültiges Argument
23ENFILEZu viele Dateien im System geöffnet
24EMFILEZu viele Dateien geöffnet
25ENOTTYUnpassendes ioctl für Gerät
26ETXTBSYText Datei ist belegt
27EFBIGDatei zu groß
28ENOSPCKein Platz mehr frei
29ESPIPEUngültige Suche
30EROFSSchreibgeschütztes Dateisystem
31EMLINKZu viele Verknüpfungen
32EPIPEKaputtes Rohr
33EDOMNumerisches Argument außerhalb der Domäne
34ERANGENumerisches Ergebnis außerhalb des Bereiches
35EDEADLOCKResourcen Sackgasse verhindert
36ENAMETOOLONGDateiname zu lang
37ENOLCKKeine Sperre verfügbar
38ENOSYSFunktion ist nicht implementiert
39ENOTEMPTYVerzeichnis ist nicht leer
40ELOOPZu viele verschachtelte symbolische Verknüpfungen
42ENOMSGKeine Meldung vom erwarteten Typ
43EIDRMIdentifizierer entfernt
44ECHRNGKanalnummer außerhalb des Bereiches
45EL2NSYNCLevel 2 nicht synchronisiert
46EL3HLTLevel 3 angehalten
47EL3RSTLevel 3 zurück gesetzt
48ELNRNGAnzahl der Verknüpfnungen außerhalb des Bereiches
49EUNATCHProtokoll Treiber ist nicht angebunden
50ENOCSIKeine CSI Struktur verfügbar
51EL2HLTLevel 2 angehalten
52EBADEUngültiger Austasch
53EBADRUngültige Beschreibung der Anfrage
54EXFULLAustausch voll
55ENOANOKeine Anode
56EBADRQCUngültiger Anfragecode
57EBADSLTUngültiger Slot
59EBFONTSchlechtes Dateiformat bei Zeichensatz
60ENOSTRGerät ist kein Strom
61ENODATAKeine Daten verfügbar
62ETIMEZeit abgelaufen
63ENOSRStrom-Resourcen verbraucht
64ENONETMaschine hat kein Netz
65ENOPKGPaket ist nicht installiert
66EREMOTEEntferntes Object
67ENOLINKVerbindung getrennt
68EADVWerbefehler
69ESRMNTSrmount Fehler
70ECOMMKommunikationsfehler beim Senden
71EPROTOProtokollfehler
72EMULTIHOPMultihop versucht (SSH)
73EDOTDOTRFS spezifischer Fehler
74EBADMSGSchlechte Meldung
75EOVERFLOWWert zu groß für den Datentyp
76ENOTUNIQName ist im Netz nicht eindeutig
77EBADFDDatei-Deskriptor ist fehlerhaft
78EREMCHGEntfernter Zugrff wurde geändert
79ELIBACCKann auf eine Bibliothek nicht zugreifen
80ELIBBADZugriff auf eine defekte Bibliothek
81ELIBSCN.lib Abschnitt ist defekt
82ELIBMAXVersuch zu viele Bibliotheken zu verwenden
83ELIBEXECKann Bibliotheken nicht direkt ausführen
84EILSEQUngültiges multi-Byte Zeichen
85ERESTARTUnterbrochener Systemaufruf erfordert Neustart
86ESTRPIPEFehler in Strömungsrohr
87EUSERSZu viele Benutzer
88ENOTSOCKSockel-Funktion auf etwas anderem Sockel aufgerufen
89EDESTADDRREQZieladresse benötigt
90EMSGSIZEMeldung ist zu lang
91EPROTOTYPEFalsches Protokoll fpr den Sockel
92ENOPROTOOPTProtokoll ist nicht verfügbar
93EPROTONOSUPPORTProtokoll wird nicht unterstützt
94ESOCKTNOSUPPORTSockel-Typ wird nicht unterstützt
95ENOTSUPOperation wird nicht unterstützt
96EPFNOSUPPORTProtokoll Familie wird nicht unterstützt
97EAFNOSUPPORTFamilie der Adresse wird vom Protokoll nicht unterstützt
98EADDRINUSEAdresse wird bereits benutzt
99EADDRNOTAVAILKann die angeforderte Adresse nicht zuweisen
100ENETDOWNNetzwerk ist außer Betrieb
101ENETUNREACHNetzwerk ist nicht erreichbar
102ENETRESETNetzwerk hat die Verbindung unterbrochen
103ECONNABORTEDSoftware hat die Verbindung unterbrochen
104ECONNRESETVerbindung wurde von der Gegenseite unterbrochen
105ENOBUFSKein Pufferspeicher mehr frei
106EISCONNTransport-Endpunkt ist schon verbunden
107ENOTCONNTransport-Endpunkt ist nicht verbunden
108ESHUTDOWNTransport-Endpunkt wurde herunter gefahren
109ETOOMANYREFSZu viele Referenzen
110ETIMEDOUTVerbindung dauert zu lange
111ECONNREFUSEDVerbindung verweigert
112EHOSTDOWNServer ist heruntergfahren
113EHOSTUNREACHKeine Verbindung zum Server
114EALREADYOperation läuft bereits
115EINPROGRESSOperation wird ausgeführt/td>
116ESTALEVeraltetes Dateihandle
117EUCLEANStruktur muss bereinigt werden
118ENOTNAMKeine benannte Typdatei
119ENAVAILKein Semaphor verfügbar
120EISNAMIst eine benannte Typdatei
121EREMOTEIOEntfernter Ein-/Ausgabefehler
122EDQUOTSpeicherplatzlimit erreicht
123ENOMEDIUMKein Speichermedium gefunden
124EMEDIUMTYPEFalscher Typ vom Medium
125ECANCELEDOperation abgebrochen
126ENOKEYAngeforderter Schlüssel fehlt
127EKEYEXPIREDSchlüssel ist abgelaufen
128EKEYREVOKEDSchlüssel wurde widerrufen
129EKEYREJECTEDSchlüssel wurde abgewiesen
130EOWNERDEADBesitzer gestorben
131ENOTRECOVERABLEZustand nicht wiederherstellbar
132ERFKILLOperation unmöglich wegen RF-kill