Stell dir vor, du könntest deinen Mikrocontroller ganz einfach über WLAN programmieren, ohne jedes Mal ein Kabel anschließen zu müssen. Mit Over-the-Air (OTA) Updates ist genau das möglich.
In diesem Beitrag zeige ich dir, wie du Arduino-Sketches bequem per WLAN auf deinen Mikrocontroller hochladen kannst. So sparst du nicht nur Zeit, sondern auch den Aufwand, dein Gerät physisch zu verbinden. Besonders praktisch für schwer erreichbare Geräte oder solche in abgeschlossenen Gehäusen. Die Schritte sind einfach und erfordern nur wenige Anpassungen an deinem Sketch.
Die Installation über die OTA-Schnittstelle in der Arduino-IDE setzt WiFi-fähige Boards, ausreichend Flash-Speicher und die Integration der benötigten OTA-Bibliothek voraus.
Alles was benötigt wird, steckt in der „Arduino-OTA“ Bibliothek (over the air) das einen bequemen WLAN-Upload über Funk ermöglichen.
Vorbereitung:
Bibliothek installieren:
Gehen dazu in der Arduino-IDE zu Menüpunkt
„Sketch“ / „Bibliotheken einbinden“ / „Bibliotheken verwalten…“
In dem sich öffnenden Fenster kann nun nach den benötigten Bibliothek „ArduinoOTA“ gesucht werden.
Diese nun installieren.
Richte danach unter Entwicklungsboard das zu verwendende Board deiner Wahl ein. In diesem Beispiel wurde ein ESP32 verwendet.
Schließe es per USB Kabel an deinem PC mit der Arduino-IDE an und wähle den korrekten Com-Port.
Flash Speichergröße:
Für Arduino-Boards mit OTA-Funktionalität ist ausreichend Flash-Speicher entscheidend, um Platz für das OTA-Update und den bestehenden Sketch zu bieten.
- Mindestens 1 MB Flash: Für einfache Projekte und kleinere Sketche reicht oft 1 MB Flash aus. Das ist ausreichend für grundlegende OTA-Updates, bei denen der neue Sketch vollständig in den Speicher passt.
- 2 MB Flash oder mehr: Empfohlen für komplexere Projekte oder wenn der Sketch umfangreicher wird (beispielsweise bei Projekten mit mehreren Bibliotheken oder komplexen Funktionen). 2 MB oder mehr bieten genügend Platz, um OTA-Updates reibungslos zu ermöglichen und auch größere Sketche problemlos unterzubringen.
Die ESP32-Boards beispielsweise bieten oft 4 MB Flash, was eine gute Flexibilität für OTA-Updates bietet.
Partition Scheme (Partitionierungsschema):
Das Standard-Partitionierungsschema ist in der Regel „Default“, das einen kleinen Bereich für den Bootloader, den Hauptanwendungsspeicher und einen separaten Bereich für OTA-Updates reserviert.
Es ist oft ausreichend für einfache Anwendungen und OTA-Updates.
Sketch:
Wähle nun unter Beispiele/ArduinoOTA, das dort zu findende BasicOTA Beispiel-Sketch aus.
Funktion von OTA:
Nach der Installation findet man wie immer Beispiele für die installierte Bibliothek.
Bei näherer Betrachtung kann man jeden bereits erstellten Sketch wie folgt mit OTA erweitern.
Es erfordert lediglich, wenn nicht schon geschehen, das includen dieser 4 Bibliotheken, ArduinoOTA.begin in der Setup und ArduinoOTA.handle in der Loop.
Ob ihr jetzt den Hostnamen betitelt oder ein Passwort verwendet ist optional:
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "Ihr_WLAN_SSID";
const char* password = "Ihr_WLAN_Passwort";
void setup() {
// Verbindung zum WLAN herstellen
WiFi.begin(ssid, password);
// Initialisiere OTA
// Setzen Sie den Hostnamen für OTA
ArduinoOTA.setHostname(OTAHostname);
// Setzen Sie das Passwort für OTA-Updates (optional)
ArduinoOTA.setPassword("geheimesPasswort");
ArduinoOTA.begin();
// Dein bestehender Setup-Code...
}
void loop() {
// Dein bestehender Setup-Code...
// Fügen Sie diese Zeile hinzu, um OTA-Updates zu ermöglichen
ArduinoOTA.handle();
}
Sketch der Upgedatet werden soll:
Um es übersichtlich zu machen verwende ich hier als Beispiel nur den Blink – Sketch (ESP32 mit LED an Pin 19):
#define LED_PIN 19
void setup() {
pinMode(LED_PIN, OUTPUT); // Setzt den LED-Pin als Ausgang
}
void loop() {
digitalWrite(LED_PIN, HIGH); // Schaltet die LED ein
delay(1000); // Wartet für eine Sekunde
digitalWrite(LED_PIN, LOW); // Schaltet die LED aus
delay(1000); // Wartet für eine Sekunde
}
Kombiniert man nun diese beiden Sketche sieht das Ergebnis so aus:
Somit sind die Vorbereitungen abgeschlossen. Gerät kann nun getestet werden.
Test: Ein späteres Update nun per WLAN:
Voraussetzung: Das Gerät mit der Arduino-IDE muss sich im gleichen WLAN befinden, wie das ESP32 Board.
Wird nun etwas am Sketch verändert, kann es wie folgt kabellos per Funk übertragen werden:
Der Port des Entwicklungsboard ist nun keine Com-Schnittstelle mehr, sondern ein im Netzwerk zu findender Anschluss.
Das Board nun unter dem Namen, wie im Sketch unter setHostname gesetzt suchen und ausgewählen.
Sollte ein Passwort gesetzt worden sein, dann wird vorab geprüft:
Finaler Test:
Im abschließenden Test habe ich die Blinkfrequenz im Delay verändert um zu sehen ob das update funktioniert.
Bei mir hat es ohne Probleme die neue Sketch Version übertragen und automatisch mit dieser gestartet. Inzwischen gibt es immer mehr Entwicklungsboards mit Wifi. Ich könnte mir vorstellen das es auch bei den ein oder anderen funktionieren könnte. Probiert das doch mal aus.
Fazit:
In IoT-Anwendungen bieten OTA-Updates klare Vorteile. Sie ermöglichen die Fernaktualisierung von Firmware, bieten Fehlerbehebung und Funktionserweiterungen, sparen Zeit, minimieren Ausfallzeiten und verbessern die Skalierbarkeit und die Langlebigkeit von IoT-Geräten.
Der Vollständigkeit halber hier auch die erweiterte Sketch Version mit weiteren Optionen und für Analyseausgabe im Seriellen Monitor:
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "Accesspoint Name";
const char* password = "geheim123";
#define LED_PIN 19
void setup() {
pinMode(LED_PIN, OUTPUT); // Setzt den LED-Pin als Ausgang
Serial.begin(115200);
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
// Port defaults to 3232
// ArduinoOTA.setPort(3232);
// Hostname defaults to esp3232-[MAC]
ArduinoOTA.setHostname("myesp32");
// No authentication by default
ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
})
.onEnd([]() {
Serial.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
digitalWrite(LED_PIN, HIGH); // Schaltet die LED ein
delay(1000); // Wartet für eine Sekunde
digitalWrite(LED_PIN, LOW); // Schaltet die LED aus
delay(1000); // Wartet für eine Sekunde
}
Hinweis: Das Beitragsbild wurde mit Microsoft Copilot erstellt.