BricxCC mit EV3
Die Vorteile, die eine Entwicklungsumgebung wie BricxCC für die Programmierung des EV3 von Lego Mindstorms bietet, liegen auf der Hand. Durch die Benutzung von komplexen Hochsprachen, wie zum Beispiel C, C++ oder Java, ist es möglich die gesamte Vielfalt des Mikroprozessors im EV3 auszuschöpfen. Da im inneren des EV3 ein vollwertiges Linux schlummert, hätte man damit fast unbegrenzte Möglichkeiten in der Programmierung. Die originale Programmieroberfläche von Lego ist gut als Einstieg in die Programmierung, jedoch für Fortgeschrittene Nutzer, wie zum Beispiel Mechatronik-Studenten, kaum zu gebrauchen.
Offiziell ist es es noch nicht möglich den EV3 in BricxCC zu programmieren. John Hansen, der Entwickler von BricxCC, arbeitet aber bereits daran. Wer dennoch nicht darauf verzichten will oder kann, hat über einige Umwege bereits jetzt schon die Möglichkeit BricxCC als Entwicklungsumgebung für den EV3 zu testen. In diesem Tutorial wird aufgezeigt welche Schritte erforderlich sind, um C++-Code über BricxCC auf dem EV3 zum Laufen zu bringen.
Vorbereitungen
Zur Nutzung von BricxCC als Entwicklungsumgebung und Implementierung der C++-Syntax, sind folgende Vorbereiten zu treffen.
1. Weil BricxCC unter Windows läuft und der EV3 unter Linux, wird ein Cross-Compiler benötigt, der die nötigen Linux-Bibliotheken und Linker für den ARM9-Prozessor des EV3 beinhaltet. CodeSourcery G++ Lite
2. Die Installation dieser Software sollte in einem, möglichst kurzen, Pfad erfolgen (wegen der weiteren Handhabung der Dateien). Zum Beispiel: c:\CSLITE
3. Unter Systemsteuerung\System\Erweiterte Systemeinstellungen\Umgebungsvariablen muss nun folgender Pfad in die Umgebungsvariable PATH eingefügt werden:
c:\CSLite\bin;%path%
(Hat man einen anderen Installationspfad verwendet, muss die Adresse an dieser Stelle durch den eigenen Pfad ersetzt werden.)
4. Eine aktuelle Version von BricxCC muss installiert werden, welche hier zu finden ist: http://bricxcc.sourceforge.net/test_releases/bricxcc_setup_33810_20130220.exe
5. Das neueste Test-Release von BricxCC muss nun in den Ordner der BricxCC-Installation kopiert werden. Nur die Test-Releases unterstützen einen Teil der Funktionen des EV3. Zu finden sind diese unter folgender Adresse: http://bricxcc.sourceforge.net/test_releases/ Die Dateien des Test-Releases müssen über eine bestehende BricxCC-Installation extrahiert werden. Dabei müssen die alten Dateien überschrieben werden!
6. Zusätzlich werden die Dateien linux_tools.zip und lms_api.zip benötigt.
7. Die Datei linux_tools.zip extrahiert man nun in einen weiteren kurzen Pfad, wie zum Beispiel: C:\tools
8. Danach fügt man in den Umgebungsvariablen folgende Zeile hinzu: c:\CSLite\bin;c:\tools\;%PATH%
9. Dann startet man BricxCC, wählt EV3 als Bricktype, sowie Linux als Firmware aus und updatet den eingeschalteten EV3 auf die neueste Firmware (die hier beschriebene Variante funktioniert nur mit aktuellen Firmwares ab Version 1.03H!) Lego-Firmware
10. Als Abschluss der Vorbereitungen muss in den Einstellungen (Preferences) zu dem Reiter Compiler/EV3 navigiert werden. Dort fügt man im Makefile template hinter die Variablen von "# how to link executable" eine zusätzliche Variable -static ein.
Die Vorbereitungen sind damit abgeschlossen.
ein erstes kleines Programm
Als erstes werden die Headerdateien bytecodes.h, lmstypes.h und lms2012.h von https://github.com/robotnav/robotnav benötigt. Diese 3 Dateien müssen in den gleichen Ordner, in das C-Projekt absgepeichert wird, kopiert werden. Dies ist erforderlich, um die Headerdateien in das Projekt einbinden zu können.
Als Testprogramm, um einen Überblick über den Aufbau der Motorbefehle zu bekommen, wird der Code des Open Loop Control von http://robotnav.com kopiert und in ein neues BricxCC-Projekt eingefügt, welche als program.c abgespeichert werden sollte.
Dieses Testprogramm lässt sich nun direkt aus BricxCC kompilieren, auf den EV3 downloaden und aus BricxCC heraus auch schon starten.
Um das Programm jedoch direkt von dem EV3 starten zu können, sind weitere Schritte notwendig:
Dafür muss die Datei zunächst mit dem Cross-Compiler, der zuvor installiert worden ist, kompiliert werden.
In der kostenfreien Lite-Version ist dies nur durch Anwendung der Windows-Kommandozeile cmd.exe möglich, welche unter c:\Windows\system32\cmd.exe zu finden ist.
Mit dem Befehl cd navigiert man in das Verzeichnis, indem sich die program.c, samt Headerdateien, befindet.
Für die Kompilierung des Quellcodes wird dieser Befehl benutzt: arm-none-linux-gnueabi-gcc program.c -o program
In demselben Verzeichnis ist nun das Programm zu finden, welches in das Stammverzeichnis einer MicroSD-Karte verschoben werden muss. Diese Datei ist bereits durch den ARM9-Prozessor ausführbar, kann jedoch von der originalen Lego-Firmware nicht gestartet werden. Dafür wird eine zusätzliche Startdatei benötigt, die dem Betriebssystem mitteilt, welches Programm es ausführen soll. Für diese Datei erstellt man auf der MicroSD-Karte einen "myapps"-Ordner, in den man die run_program.rbf kopiert. Nach Ausführung dieser startet das Testprogramm. Der Motor dreht sich für 2 Sekunden. Wichtig hierfür ist, dass die Testdatei "program" heisst, sonst kann Sie von der Startdatei nicht gefunden werden!
Informationen zur Startdatei: Die Startdatei wurde in Java Bytecode, einer Assemblersprache verfasst. Es ist auch möglich diese selbst zu erstellen, was es somit ermöglicht auch andere Programmnamen zu verwenden. Die Startdatei wurde vom Betreiber der Seite http://www.robotnav.com entwickelt ist auf Hompepage als offener Quellcode hinterlegt. Der Source Code der EV3-Firmware ist offen und auf https://github.com/mindboards/ev3sources hinterlegt. Darin gibt es eine Datei namens apps.c, in der die EV3-Entwickler beschreiben wie sich Programme mit dem Bytecode der Assemblersyntax erstellen lassen.
Fazit
In diesem Codebeispiel ist sehr gut zu erkennen, wie ein Motor im EV3 angesteuert wird. Wer mehr darüber wissen möchte, sollte sich die eingefügten Headerdateien etwas genauer anschauen. Dort sind alle Bytecodes und Zugriffssequenzen, sowie ihre spezifischen Hexadezimalwerte zu finden. Der Zugriff auf die Motoren und Sensoren über diese Codesequenzen gestaltet sich jedoch noch etwas schwierig, da konkrete Funktionsaufrufe der einzelnen Klassen, wie man es zum Beispiel von NXC gewohnt ist, noch nicht möglich sind. Um dies zu ermöglichen, müssen die dafür nötigen Bibliotheken inklusive der einzelnen Klassen erst noch verfasst werden.
Auf http://robotnav.com wurde mit diesen Mitteln ein Zeichenroboter komplett in C++ programmiert.
Des Weiteren wurde der gesamte Source Code der EV3-Firmware feigegeben, in dem sich noch weitere Funktionen und Befehle des EV3 verbergen.
Andere interessante Möglichkeiten der Programmierung des EV3 in C++ werden auf http://monobrick.dk beschrieben, wo die Software wahlweise über eine alternative Firmware alternative Firmware eingespielt wird. Über einen WiFi- oder Bluetooth-Tunnel lässt sich der EV3 über Direct Commands auch vom PC fernsteuern. So ist es zum Beispiel möglich das gesamte Programm auf dem PC/Notebook/Smartphone zu programmieren und auszuführen. Die Sensordaten werden dabei über eine Funk- oder Kabelverbindung eingelesen und verarbeitet. Die Motoren, der Lautsprecher oder Diplay können via Direct Commands übermittelt werden.