ESP8266ESP8266 - EinführungioBroker Tutorials

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 (2007 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 🙂

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

22 Gedanken zu „Servosteuerung für ioBroker über ESP8266 und MQTT

  • Vielen Dank für die tolle Anleitung

    Antwort
  • Florian

    Mein ESP verliert nach einiger Zeit die Verbindung zum WLAN. Kann man etwas am Sketch ändern um eine stabilere WLAN-Verbindung zu gewährleisten?

    Antwort
    • Pascal

      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

      Antwort
  • 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

    Antwort
  • Mario

    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

    Antwort
  • Thomas

    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

    Antwort
  • Thomas

    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

    Antwort
  • Thomas

    Läuft 🙂
    Musste folgende Zeile ganz nach oben verschieben:
    #include „Arduino.h“

    Gruss Thomas

    Antwort
  • Holger

    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?

    Antwort
  • Robert Zimmemann

    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….

    Antwort
  • 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

    Antwort
    • Hotze

      Das würde mich auch interessieren! Auch die man den in die andere Richtung laufen lässt wäre interessant.

      Antwort
  • Sideshowbob100

    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);
    | ^~

    Antwort
    • Sideshowbob100

      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

      Antwort
  • Marvin

    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?

    Antwort
  • Peter Kralitschek

    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

    Antwort
    • Matthias Korte

      Hallo Peter,

      das ist ein merkwürdiges Verhalten. Passiert das so bei jedem Start?

      LG Matthias

      Antwort
  • 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

    Antwort
  • Captayne

    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…

    Antwort

Schreibe einen Kommentar zu Hotze Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht.