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 Anwender 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. Man muss sich die Aufgaben selbst ausdenken.

Falls sie irgendwo lesen, dass das Gerät Bilder und Sprache erkennen kann oder etwas mit Neuronalen Netzen, KI und Internet of Things zu tun habe: Glauben sie es nicht. Es kann bestenfalls mit solchen Geräten über WLAN kommunizieren, aber die Möglichkeiten sind in der Praxis sehr beschränkt.

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 persönlich sind dort diverse Arduino Boards positiv aufgefallen, die allerdings in 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 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 Fehlermeldungen und Ausgaben vom print() Befehl im unteren Bereich an. Wenn das Ausgabeformat schlecht ist (z.B. alles in einer Zeile erscheint) kannst du alternativ die serielle Konsole versuchen.

Konsole

Der Micropython Interpreter gibt Fehlermeldungen und print() Ausgaben auf der Konsole aus. Wenn das USB Kabel angeschlossen ist kann man ein Terminalprogramm benutzen, um sich mit der Konsole des Codey zu verbinden. Die Kommunikationsparameter sind 115200,8,N,1. Beispiel für Linux:

Console

Leider kann man das nicht gleichzeitig mit der Entwicklungsumgebung nutzen. Die Konsole des Codey ist nicht interaktiv (kein REPL).

Verlasse Picocom mit der Tastenfolge Strg-A Strg-X.

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

# To find the current time in format 00:00
regex=re.compile(b'([0-9][0-9]):([0-9][0-9])')

@event.start
def on_start():

    # Connect to the WLAN router
    codey.wifi.start('MySSID', 'MyPassword')

    while True:
        if codey.wifi.is_connected():
            # Show status
            codey.led.show(0, 60, 0)
            
            socket=None
            try:
                # Show status and measure performance
                start = time.ticks_ms()
                codey.led.show(60, 60, 0)

                # 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()

                    # Stop reading at the first empty line
                    if not line or line==b'\r\n':
                        break

                    # Find the Date: header
                    if line.startswith(b'Date:'):

                        # Show status and measure performance
                        codey.led.show(0, 60, 0)
                        end = time.ticks_ms()
                        print(end - start, "ms", line)

                        # Find the time within the Date: header
                        res=regex.search(line)
                        hour=int(res.group(1))
                        minute=int(res.group(2))

                        # 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) 

            # Close connection and sleep a little
            if socket!=None:
                socket.close()
            time.sleep(10)

        else:
            # No WLAN connection
            codey.led.show(60, 0, 0)

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