Servosteuerung für ioBroker über ESP8266 und MQTT
In diesem Artikel zeige ich Dir, wie Du einen Servo über einen ESP8266 und MQTT mittels ioBroker steuern kannst.
Für ein neues Projekt habe ich eine kleine Steuerung gesucht, über die ich in ioBroker mehrere Servos steuern kann. Ein erster Ansatz über Tasmota hat leider nicht funktioniert, da ich hier über PWM die Servos nicht ansteuern konnte. Also entschied ich mich dazu, doch einen kleinen Sketch für den ESP8266 zu entwickeln. Dabei waren folgende Anforderungen gegeben:
- Steuerung von mehreren Servos (aktuell 3, kann aber im Sketch erweitert werden)
- Steuerung über ioBroker
Als Kommunikationsprotokoll setze ich, wie in den meisten Projekten, auch hier auf das MQTT-Protokoll.
Hier zunächst die Liste der benötigten Produkte:
Der verwendete Servo SG90 wird mit einer Betriebsspannung von 5V betrieben. Für den Anschluss habe ich einfache Male-Male Stecker verwendet, die ich mit der Buchse und dem Breadboard verbinde. Der braune Pin wird am ESP8266 an GND angeschlossen, rot an VIN und der gelbe Pin an den digitalen Pin D2.
Im folgenden Schaubild seht ihr die genaue Verkabelung der einzelnen Servos mit dem ESP8266.
Im nächsten Schritt können wir dann mit der Implementierung des Sketch beginnen. Ich habe den Sketch als Download hier bereitgestellt:
Sketch - ioBroker Servo Steuerung (1991 Downloads)Im Sketch müssen wir zunächst die Konfiguration vervollständigen. Hierfür muss die WLAN_SSID sowie das Kennwort eingetragen werden. Zudem muss die IP-Adresse des MQTT-Brokers (in meinem Fall die IP-Adresse von ioBroker) sowie der entsprechende Port definiert werden.
Im Sketch werden nun in der setup-Funktion die entsprechenden Servo-Objekte aufgebaut und an die digitalen Anschlüsse D2 bis D4 zugeordnet. Zudem wird eine Verbindung zum WLAN-Netzwerk sowie MQTT-Broker hergestellt. Alles weitere läuft nun in der MQTT-Callback Funktion. Hier werden die entsprechenden Topics verarbeitet und somit die Servos gesteuert.
Nach dem Flashen des ESP8266 können wir in ioBroker auch schon in die Objekte wechseln. In den Objekten unterhalb des MQTT-Adapters sehen wir die Datenpunkte ServoControl\Servo1 bis Servo3. Hier können wir nun über den Datenbank Angle den Winkel des jeweiligen Servos steuern. Der Winkel geht hierbei von 0 bis 180°
Für den Test des Sketch habe ich eine kleine Visualisierung erstellt, mit dem ich ein CircleKnob Widget zur Servo-Steuerung verwendet habe. Das Widget stellt dabei denWinkelbereich von 0 bis 180° dar und lässt per Klick auch Änderungen zu. Als Datenpunkt habe ich den Angle-Datenpunkt eines Servos verwendet. Bei einer Änderung des Datenpunkts wird somit auf dem ESP8266 die Callback Funktion aufgerufen und der Servo entsprechend bewegt.
Im folgenden Bild siehst Du die verschiedenen Werte des Datenpunkts sowie die Servo-Stellung.
Ich hoffe Dir gefällt dieser Artikel. Über Kommentare unterhalb des Artikels oder per E-Mail freue ich mich wie immer 🙂
Vielen Dank für die tolle Anleitung
Mein ESP verliert nach einiger Zeit die Verbindung zum WLAN. Kann man etwas am Sketch ändern um eine stabilere WLAN-Verbindung zu gewährleisten?
Hallo,
danke für die coole Anleitung! Mein ESP verliert nach einiger Zeit die Verbindung und ist nicht mehr mit iobroker ansteuerbar. Kann mir da jemand helfen? Muss ich was an dem Sketch verändern das die Verbindung stabiler bleibt?
Danke und VG,
Pascal
Hallo Pascal,
schau hier mal vorbei, dazu habe ich bereits ein Artikel veröffentlicht:
https://www.smarthome-tricks.de/esp8266/esp8266-mqtt-connection-closed-timeout/
LG Matthias
Guten Morgen, ich habe das Script auf einen Womos D1 mini aufgespielt, Netzwerk usw. angepasst, Modul kann aber keine Verbindung zum Router aufbauen, warum ?
Danke für Tips
Hallo Matthias
super anleitung ,hat auch gleich funktioniert
hätte da noch eine Frage
wie kann man da einen 360 grad Servo Ansteuern ?
Danke für deine Hilfe schon mal im Voraus
Hallo Matthias,
Vielen Dank für das tolle Projekt. Bin gerade am umsetzten 🙂
Nun hab ich doch noch eine Frage zum MQTT.
Ich habe beim MQTT Broker ein User und ein Passwort vergeben.
Wie kann ich dies im Sketch ergänzen?
Danke und Gruss Thomas
Hallo Thomas,
schau mal in diesem Artikel und dann direkt im Sketch, da zeige ich das 🙂
https://www.smarthome-tricks.de/iobroker-tutorials/wassermelder-fuer-iobroker-ueber-esp8266-und-mqtt/
LG Matthias
Hallo Matthias,
Danke für Dein Feedback. Auf die Schnelle hab ich das nicht hinbekommen. Versuche es nun mal ohne User & PW mit einer neuen Sonoff Instanz… Zumindest für den ersten Test.
Bin noch relativ neu im Thema Arduino… Tasmota geht solala.
Nun meldet die Arduino IDE immer beim überprüfen „D2 was not declared in this scope“ Denke bei D3 und D4 käme dann gleich dieselbe Medlung. Wo muss ich suchen? Danke
Gruss Thomas
Läuft 🙂
Musste folgende Zeile ganz nach oben verschieben:
#include „Arduino.h“
Gruss Thomas
Hallo Matthias,
vielen Dank, super Anleitung!!!
Das Ganze hat sehr gut geklappt, nur habe ich ein seltsamnes Phänomen:
Wenn das NodeMcu länger ohne Stromversorgung war, und dann mit Strom versorgt wird, dann geht die Servosteuerung erstmal NICHT. Nach mehrmaligem Ein/Ausstecken des Boards, dann geht die Funktion plötzlich schon.
Woran kann das liegen?
Moin,
bekomme folgende Meldung im IoBroker
mqtt.0 2021-07-15 15:13:17.774 warn (14139) Client [ServoControl] has invalid password(undefined) or username(undefined)
habe schon den Sketch, wie hier in den Kommentaren geschrieben, angepasst
const char* ssid = „xxx“;
const char* password = „xxx“;
const char* mqtt_server = „192.168.178.149“;
const int mqtt_port = 1886;
const char* mqtt_user = „xxx“;
const char* mqtt_password = „xxx“;
Den Benutzernamen und das Passwort habe ich duzendmal überprüft, was muss ich im Sketch noch nachtragen….
Moin Robert,
erfordert dein MQTT-Broker eine Authentifizierung via Username und Passwort?
Falls ja, dann muss das im Sketch anders laufen. Für die Authentifizierung muss der connect() Methode dann noch der Username und das Passwort übergeben werden.
Schau mal hier, habe dazu extra ein separaten Artikel erstellt:
https://www.smarthome-tricks.de/esp8266/pubsubclient-fuer-mqtt-mit-benutzername-passwort-und-port/
LG Matthias
Hallo,
danke für die Tolle Anleitung. Wie kann ich ein 360° Servo nur in eine Richtung drehen lassen? Kannst du mir bitte helfen? Danke.
Grüße Cengo
Das würde mich auch interessieren! Auch die man den in die andere Richtung laufen lässt wäre interessant.
Hallo,
hat einer eine Idee was mir fehlt? Bekomme die folgende Fehlermeldung. Danke und Grüße
C:\Ablage\ESP8266\iobroker_servocontrol_release\iobroker_servocontrol_release.ino: In function ‚void setup()‘:
iobroker_servocontrol_release:92:23: error: ‚D2‘ was not declared in this scope
92 | servoObject1.attach(D2);
| ^~
iobroker_servocontrol_release:93:23: error: ‚D3‘ was not declared in this scope
93 | servoObject2.attach(D3);
| ^~
iobroker_servocontrol_release:94:23: error: ‚D4‘ was not declared in this scope
94 | servoObject3.attach(D4);
| ^~
Kaum abgeschickt da habe ich den Fehler auch schon gefunden 🙂
Für alle die den gleichen Fehler bekommen. Ich hatte das falsche Board ausgewählt. In meinem Fall war das NodeMCU 1.0 (ESP-12E Module) das Richtige
Hallo, erst ein mal vielen Dank für deine tolle Anleitung.
Ich möchte damit die Zuluft von meinem Kaminofen damit steuern.
Damit man auch noch per Hand auf und zu machen kann, müsste mein Servo nur in Position fahren und dann loslassen.
Kann man dazu den Befehl detach(D2) benutzen?
Wo musste ich den in dem Sketch einfügen?
Hallo zusammen oder alleine ! ich bin so was von unerfahren und fand beim stöbern im Netz hier die Servosteuerung. Super Beschreibung und auch für einen Leihen umsetzbar. Aber es kommt ja immer anders als man denkt. Also hier meine Daten und Frage :
ESP 8266 MOD 12 -F, Sketch über IDE mit NodeMCU 0.9 (ESP-12 Module ) geflasht. Keine Fehlermeldung.
Nach dem Flashen :
Timeout und sofortiger Connected wird durchgeführt.
s. Protokoll
mqtt.0
2023-02-24 19:45:32.696
info
Client [test-device] connected with secret 1677264332695_6024
mqtt.0
2023-02-24 19:45:32.681
info
Client [test-device] connection closed: timeout
Im Verzeichnis Objekte mqtt erscheinen auch die drei Servos ! Ich habe erst versucht über Angle den Zahlenwert zu ändern, keine Bewegung am Servo. Dann habe ich die VIS nachgemacht, keine Bewegung bei Verstellung der Werte.
Könnte mir da jemand helfen ? Oder muß ich aufgeben und doch Tasmata, was mir aber zu ungenau war, aufspielen ?
Danke im Voraus
Hallo Peter,
das ist ein merkwürdiges Verhalten. Passiert das so bei jedem Start?
LG Matthias
Hallo Matthias, danke das du geantwortet hast. Ich habe mehrmals den Sketch drauf, dann per Software Rest alles löschen und wieder drauf ! bis ich dann frustriert aufhören wollte. Aber jetzt kommt es ! Habe einfach mal die Resettaste gedrückt und alles läuft so wie beschrieben. Hurah und ein ehrliches Danke. Gruß Peter
Ich hab’s hinbekommen.
1. War ‚Maske zum Bekanntgeben eigener States‘ bei mir leer. Mit „mqtt.0.*“ wurde endlich etwas übertragen
2. musste ich ‚/set‘ in dem Vergleichsstring anhängen. strcmp(topic, „ServoControl/Servo1/Angle/set“
3. Kamen im Log immer Warnungen wie: „State value to set for „mqtt.0.ServoControl.Servo2.Angle“ has to be type „string“ but received type „number““. Dies hab ich unterbunden indem ich die Variable „Angle“ im Objectbrowser editiert habe und dann die Zeile „type“: „string“ auf „type“: „number“ geändert habe.
Jetzt geht’s. Als nächstes möchte ich die Servos nach getaner Arbeit abschalten, damit sie nicht Strom verbrauchen, denn in meiner Anwendung brauche ich kein Haltemoment. Geht wohl mit Detach…