Odroid Go (ESP32) mit Arduino IDE programmieren
Neulich stieß ich im Internet auf den Odroid Go, den der Hersteller Hardkernel aus Südkorea von etwa einem Jahr auf den Markt gebracht hat. Eigentlich beschäftigt sich die Firma ja eher mit ESP32 und anderen Entwicklungsboards für Mikrocontroller, aber zum Zehnten Jubiläum hat man den Odroid Pro aus Do It yourself-Kit herausgebracht.Da der Odroid nicht nur so etwas wie ein handlicher Gameboy ist, sondern gleichzeitig auch eine Plattform für Mikrocontroller-Bastelprojekte, war das genau das richtige Spielzeug für mich und ich legte mir einen zu. Allerdings war es gar nicht so einfach, an einen heranzukommen. Bei amazon war er gerade ausverkauft, bei Pollin stand er zwar im (Papier)-Katalog, war aber zur Zeit nicht lieferbar. Und bei eBay gingen die Preise teilweise bis 100 Euro. Das Teil schien also sehr gefragt zu sein. Ich ging das Risiko einer Wartezeit ein und bestellte bei Pollin um 40 Euro und bekam den Odroid dann doch erfreulicherweise schnell nach etwas über einer Woche. Glück gehabt.
Über die Hardware und den Zusammenbau des Do-it-yourself-Kits habe ich bereits einen Artikel geschrieben. Dort wird auch beschrieben, wie man darauf seine alten Gameboy-Spiele zum Laufen bekommt.
Heute will ich zeigen, wie man seine eigene Software dafür schreibt und zum Laufen bekommt. Wir nutzen dafür die Arduino IDE, die wir ja schon für den Arduino Nano, Uno und STM32 genutzt haben.
Im Prinzip geht das genauso wie beim Arduino, nur laden wir die fertige Firmware nicht per serieller Verbindung hoch, sondern speichern sie als *.fw-Datei auf der SD-Karte des Odroid-Go.
Der Odroid-Go verfügt nämlich über eine Art "Über"-Firmware, mit der wir Firmwares (eben diese *.fw-Files) flashen können. So kann man auch unterwegs zwischen den Firmwares umschalten, ohne den Odroid an den PC anschließen zu müssen. Wie das Flashen von Firmware geht, darüber habe ich ja bereits einen Artikel geschrieben.
Die Odroid Go Hardware
Warum man den Odroid-Go als Entwicklungsplattform hernehmen sollte statt ein "nacktes" ESP32-Entwicklungsboard, liegt auf der Hand. Der Odroid-Go bringt eine Menge an angebundener Hardware mit, die wir gut gebrauchen können:- zur Anzeige: TFT-Screen mit 320x240 Pixel (2.4"), über SPI angesprochen
- zum Loggen: µSD-Kartenleser (SPI)
- zur Tonausgabe: Lautsprecher mit 0.5W (8O)
- zur Eingabe: Steuerkreuz, 1 Ein/Ausschalter, 2 Feuerknöpfe, 4 kleine Menüknöpfe
- zum Debugging: Micro USB Port zum Laden und Programmieren (UART)
- für eigenen Sensoren: GPIO-Header-Anschluss mit 10 Pins für eigene Hardwareprojekte
- unabhängig: durch eigenne LiPo-Akku mit 3.7V / 1200 mAh (hält ca. 10 Stunden Spielen durch)
- 80...240 MHz Takt
- 16 MB Flash Speicher
- WLAN 802.11 b/g/n 2.4GHz
- Bluetooth v4.2 BR/EDR, BLE
Integration der Odroid-Go-Libraries in die Arduino IDE
Für die Ansprache der Hardwarekomponenten des Odroid gibt es natürlich auch Libraries, die uns hier das Leben sehr vereinfachen.Diese müssen wir unserer Arduino IDE beibringen. Das tun wir mit dem Kommando und dem Pfad, in dem wir unsere Arduino-Libraries speichern. Das ist im Normalfall
git clone https://github.com/hardkernel/ODROID-GO.git %USERPROFILE%\Documents\Arduino\libraries\ODROID-GO
Kann aber auch abweichen wie z. B. bei mir:
git clone https://github.com/hardkernel/ODROID-GO.git D:\Arduino\libraries\ODROID-GO
in der Eingabeaufforderung. Dadurch werden die Libraries heruntergeladen und in den Library-Ordner Odroid-Go kopiert:
Cloning into 'C:\Users\admin/Documents/Arduino/libraries/ODROID-GO'...
remote: Enumerating objects: 37, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 726 (delta 12), reused 27 (delta 10), pack-reused 689
Receiving objects: 98% (712/726), 4.48 MiB | 4.47 Mi
Receiving objects: 100% (726/726), 5.59 MiB | 4.77 MiB/s, done.
Resolving deltas: 100% (281/281), done.
Danach können wir unter Werkzeuge unter Board das Board ODROID ESP32 auswählen.
Nun weiß die Arduino IDE, für welche Umgebung wir unseren Source kompilieren wollen.
Sketch kompilieren
Testen wir es, indem wir dieses kleine Progrämmchen eingeben#include
void setup() {
// put your setup code here, to run once:
GO.begin();
GO.lcd.print("Hello, ODROID-GO from Doc Cool");
}
void loop() {
// put your main code here, to run repeatedly:
}
und mit dem Haken oben links im Arduino-Fenster (Überprüfen, CTRL+R) kompilieren.Erhalten wir eine Fehlermeldung "odroid_go.h: No such file or directory" wie rechts gezeigt, dann haben wir den falschen Pfad angegeben und müssen das Git-Paket noch einmal an der richtigen Stelle installieren.
Das erste Kompilieren kann ein wenig dauern und sollte dann mit einer Meldung wie
Kompilieren abgeschlossen.
Der Sketch verwendet 383241 Bytes (29%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 16788 Bytes (5%) des dynamischen Speichers, 310892 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.
erfolgreichen Vollzug vermelden.Odroid-Firmware (*.fw) erstellen
1. Binary suchen und finden
Einen seriellen Port brauchen wir unter Werkzeuge gar nicht für unseren Odroid-Go angeben, denn wir wollen ja nicht die Über-Firmware überschreiben, sondern diese nutzen, unsere Firmware zu flashen.Dazu braucht es ein *.fw-File, dass auf die SD-Karte des Odroid unter s:\odroid\firmware\ kopiert werden kann und dann mit der "B halten und Einschalten"-Tastenkombination installiert werden kann.
Um ein .fw-File zu generieren, brauchen wir erst einmal das Kompililat, das bin-File, sozusagen die binäre .exe für unseren Microcontroller. In diesem speziellen Fall die odroid-go-hello.ino.bin
Diese können wir entweder mit einem Programm wie Everything von Voidtools tun:
oder wir geben in den Voreinstellungen der Arduino IDE an, dass die Kompilierungsausgaben ausführlicher sein sollen und kompilieren erneut, was eine elend lange Ausgabe im unteren Fensterabschnitt erzeugt:
...
"C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_build_426218\\libraries\\WiFiClientSecure\\ssl_client.cpp.o" "C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_cache_597133\\core\\core_8f6099509d1b2cd6223729101f529923.a" -lgcc -lesp32 -lphy -lesp_http_client -lmbedtls -lrtc -lesp_http_server -lbtdm_app -lspiffs -lbootloader_support -lmdns -lnvs_flash -lfatfs -lpp -lnet80211 -ljsmn -lface_detection -llibsodium -lvfs -ldl_lib -llog -lfreertos -lcxx -lsmartconfig_ack -lxtensa-debug-module -lheap -ltcpip_adapter -lmqtt -lulp -lfd -lfb_gfx -lnghttp -lprotocomm -lsmartconfig -lm -lethernet -limage_util -lc_nano -lsoc -ltcp_transport -lc -lmicro-ecc -lface_recognition -ljson -lwpa_supplicant -lmesh -lesp_https_ota -lwpa2 -lexpat -llwip -lwear_levelling -lapp_update -ldriver -lbt -lespnow -lcoap -lasio -lnewlib -lconsole -lapp_trace -lesp32-camera -lhal -lprotobuf-c -lsdmmc -lcore -lpthread -lcoexist -lfreemodbus -lspi_flash -lesp-tls -lwpa -lwifi_provisioning -lwps -lesp_adc_cal -lesp_event -lopenssl -lesp_ringbuf -lfr -lstdc++ -Wl,--end-group -Wl,-EL -o "C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_build_426218/odroid-go-hello.ino.elf"
"C:\\Users\\admin\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.4/tools/gen_esp32part.exe" -q "C:\\Users\\admin\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.4/tools/partitions/default.csv" "C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_build_426218/odroid-go-hello.ino.partitions.bin""C:\\Users\\admin\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\esptool_py\\2.6.1/esptool.exe" --chip esp32 elf2image --flash_mode dio --flash_freq 80m --flash_size 16MB -o "C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_build_426218/odroid-go-hello.ino.binspan>" "C:\\Users\\admin\\AppData\\Local\\Temp\\arduino_build_426218/odroid-go-hello.ino.elf"
esptool.py v2.6
Mehrere Bibliotheken wurden für "odroid_go.h" gefunden
Benutzt: d:\Arduino\libraries\ODROID-GO
Mehrere Bibliotheken wurden für "SPI.h" gefunden
Benutzt: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SPI
Mehrere Bibliotheken wurden für "FS.h" gefunden
Benutzt: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\FS
Mehrere Bibliotheken wurden für "SD.h" gefunden
Benutzt: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SD
Nicht benutzt: D:\Program
Nicht benutzt: d:\Arduino\libraries\SD
Mehrere Bibliotheken wurden für "WiFiServer.h" gefunden
Benutzt: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
Nicht benutzt: D:\Program
Mehrere Bibliotheken wurden für "WiFiClientSecure.h" gefunden
Benutzt: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFiClientSecure
Bibliothek ODROID-GO in Version 1.0.0 im Ordner: d:\Arduino\libraries\ODROID-GO wird verwendet
Bibliothek SPI in Version 1.0 im Ordner: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SPI wird verwendet
Bibliothek FS in Version 1.0 im Ordner: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\FS wird verwendet
Bibliothek SD in Version 1.0.5 im Ordner: C:\Users\admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SD wird verwendet
Bibliothek WiFi in Version 1.0 im Ordner: C:\Users\