In diesem Beitrag wollen wir mit einem D1-Mini einen Servo ansteuern, der ein Ventil mit Knebel öffnet oder schließt.
Benötigte Hardware
Anzahl | Bauteil | Anmerkung |
---|---|---|
1 | D1 Mini | |
1 | Servo MG955 | |
1 | Schlauchventil mit Knebel | |
1 | Kleine Lochrasterplatine 6x10 Löchen | |
1 | Federleiste 8-polig | liegt D1 Mini bei |
1 | Abgewinkelte Stiftleiste 3-polig | |
4 | Blechschrauben 2.2 x 10 mm für Gehäuse | |
2 | Blechschrauben 2.2 x 5 mm für Servoadapter | |
4 | Schrauben mit Mutter M3 x 10 mm für Servo | |
3 | Gehäuseteile aus dem 3D-Drucker |
Der Servo
Ehe wir mit der Ansteuerung beginnen, wollen wir uns einmal ansehen, wie ein solcher Servo funktioniert. Ein Servo ist ein Elektromotor mit Untersetzungsgetriebe. Die Ausgangswelle ist mit einem Potentiometer verbunden. Der Widerstand dieses Potentiometers ist direkt ein Maß für den Drehwinkel.
Das Potentiometer bedingt aber auch den maximalen Drehbereich von, je nach Bauform, 180 bis 270 Grad. Der maximale Drehbereich wird meist auch mechanisch begrenzt, um eine Beschädigung des Potentiometers zu verhindern. Eine Regelelektronik sorgt dafür, dass der mit dem Potentiometer gemessene Winkel mit dem am Eingang der Regelelektronik eingestellten Wert übereinstimmt.
Zum Einstellen des Winkels wird die Breite eines Impulses herangezogen. Der Impuls wird mit einer Frequenz von 50 Hz wiederholt. Die Impulsdauer kann zwischen 0.5 ms und 2.5 ms variieren. Typische Empfänger für Funkfernsteuerungen können die Impulsdauer nur zwischen 1 ms und 2 ms ändern, wodurch der mögliche Drehwinkel halbiert wird.
Die Spannung der Impulse am Anschluss Vin hat keinen Einfluss auf den Drehwinkel, da nur die Impulsdauer von Bedeutung ist. Der im Servo verwendete Mikrocontroller PIC12F629 benötigt ein Eingangssignal von typisch 2 V, um HIGH zu erkennen. Wir können daher den Servo mit 5 V betreiben und trotzdem die Ansteuerung direkt von einem GPIO Pin des D1 Minis mit 3,3 V vornehmen.
Die Schaltung
Die Ansteuerung des Servos erfolgt über den GPIO13 (D7) Pin. Die Anforderung an die Genauigkeit der Impulsdauer ist sehr hoch. Es wäre sehr aufwendig, das selbst zu programmieren. Wir greifen daher auf eine vorhandene Bibliothek zurück. Die Bibliothek Servo.h ist im Basispaket enthalten und braucht nicht extra installiert zu werden.
Die Software
Im ersten Teil wollen wir den Servo über eine Webseite steuern. Die Webseite sollte so ausgelegt sein, dass sie auf einem Smartphone gut angezeigt wird. Die Zugangsdaten fürs lokale WLAN werden im Programm definiert. Im zweiten Teil werden wir dann die Konfiguration über Netzwerk ermöglichen. Zusätzlich können dann bis zu zehn Ereignisse konfiguriert werden, die zu einem bestimmten Zeitpunkt für eine einstellbare Zeit automatisch das Ventil öffnen und wieder schließen. Die Durchflussmenge kann dann ebenfalls konfiguriert werden. In der Arduino IDE wählen wir als Board den LOLIN(WEMOS) D1 R2 & mini.
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <Servo.h> Servo servo1; #define SERVO 13 #define SSID "*******" #define Pass "*******" uint16_t durchfluss = 0; float winkel = 0; const char HTML[] = "<!DOCTYPE HTML>\n" "<html lang='de'>\n" "<head>\n" "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n" "<meta name='viewport' content='width=380' />\n" "<title>Ventilsteuerung</title>\n" "<style>\n" "body {\n" " background-color: #d2f3eb;\n" " font-family: Arial, Helvetica, Sans-Serif;\n" " Color: #000000;\n" " font-size:12pt;\n" "}\n" ".titel {\n" "font-size:18pt;\n" "font-weight:bold;\n" "text-align:center;\n" "width:100%;\n" "padding:20px;\n" "}\n" ".zeile {\n" " width:100%;\n" " padding:5px;\n" " text-align: center;\n" "}\n" "button {\n" "font-size:14pt;\n" "width:150px;\n" "border-radius:10px;\n" "}\n" "</style>\n" "</head>\n" "<body>\n" "<div id='main_div' style='margin-left:15px;margin-right:15px;'>\n" "<div class='titel'>Durchflussmenge %i %%</div>\n" "<form method='get'>\n" " <div class='zeile'>0%<input type='range', min='0', max='100' value='%i' name='durchfluss' onchange='form.submit()'\>100%</div>\n" "</form>\n" "</div>\n" "</body>\n" "</html>\n"; ESP8266WebServer server(80); void handleRoot() { char buf[1024]; if (server.hasArg("durchfluss")) { durchfluss = server.arg("durchfluss").toInt(); sendServo(durchfluss); } Serial.print("Durchfluss = "); Serial.print(durchfluss); Serial.println("%"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); sprintf(buf,HTML,durchfluss,durchfluss); server.send(200, "text/html", buf); } void sendServo(uint16_t durchfluss) { //um das Ventil zu öffnen ist ein Winkel //von 90 Grad erforderlich float winkel = durchfluss * 90 / 100; //diese Korrektur berücksichtigt, dass der Servo //einen gesmt Drehwinkel von 210 Grad und //nicht 180 Grad hat winkel = winkel * 180 / 210; servo1.attach(SERVO,520,2400); servo1.write(winkel); delay(1000); servo1.detach(); } void setup() { // put your setup code here, to run once: Serial.begin(74880); Serial.println(); WiFi.mode(WIFI_STA); WiFi.begin(SSID,Pass); Serial.println("Start Verbindungsaufbau"); uint8_t cnt = 0; while ((WiFi.status() != WL_CONNECTED) && (cnt < 20)) { Serial.print("."); cnt++; delay(500); } Serial.println(); if (WiFi.status() != WL_CONNECTED) { Serial.println("Keine Verbindung"); } else { Serial.println("Verbindung erfolgreich"); Serial.println("IP Adresse:"); Serial.println(WiFi.localIP()); } //Webserver vorbereiten und starten server.on("/", handleRoot); server.begin(); Serial.println("WebServer gestartet"); if (MDNS.begin("ventil.local")) { Serial.println("MDNS responder gestartet"); } //Servo nach dem Einschalten auf 0% sendServo(durchfluss); } void loop() { server.handleClient(); MDNS.update(); }
Mechanischer Aufbau
Für den D1-Mini basteln wir uns mit der Lochrasterplatine einen einfachen Adapter, an dem wir das Kabel vom Servo anschließen können.
Aus einer 2 x 8 cm Lochrasterplatine schneiden wir einen Teil heraus, der genau 10 Rasterlöcher in der Länge hat. Eine der beiden, dem D1-Mini beiliegenden 8-poligen Federleisten, teilen wir in eine 3-polige und eine 4-polige.
Nun legen wir den D1-Mini auf den Rücken, sodass die Stiftleisten nach oben zeigen und der USB-Anschluss nach rechts. Die geteilte Federleisten stecken wir rechtsbündig auf beide Stiftreihen. Auf die Federleisten kommt die zurecht geschnittene Lochrasterplatine, und zwar so, dass der rechte Rand mit dem rechten Rand des D1-Minis bündig ist.
Nachdem die Federleiste mit der Lochrasterplatine verlötet wurde, trennen wir D1-Mini und Adapter und bringen am Adapter die 3-polige, abgewinkelte Stiftleiste an.
Die beiden Abbildungen zeigen, wie die Stiftleiste mit den Federleisten zu verbinden ist. Nachdem alle Verbindungen hergestellt sind, stecken wir den Adapter wieder auf den D1 Mini und verbinden den Servo mit der Stiftleiste am Adapter. Auf die richtige Polung achten!
Nun können wir den D1 Mini mit dem USB-Bus verbinden und, falls noch nicht geschehen, den Sketch hochladen. Wenn wir im Browser die Webseite ventil.local aufrufen, sollte die HTML-Seite mit dem Schieberegler scheinen.
Mit dem Schieberegler sollte es möglich sein, den Servo im Bereich von 0 bis 90 Grad zu verstellen. Nach erfolgreichem Test sollte der Servo für den Einbau in das Gehäuse auf 0 gestellt werden.
Wir beginnen mit dem Einbau des Servos in den oberen Gehäuseteil. Dazu legen wir zuerst die Anschlussleitung in den T-förmigen Schlitz am Gehäuse. Danach können wir den Servo hochklappen und mit vier Schrauben M3x10 am Gehäuse befestigen.
Zum Betätigen des Ventil-Knebels benötigen wir einen Adapter. Diesen Adapter schrauben wir mit zwei Blechschrauben 2,2 X 5 mm auf die runde Scheibe des Servos. Die Scheibe mit Adapter können wir jetzt auf die Antriebswelle des Servos stecken. Der Adapter muss quer stehen, da das Ventil bei 0 geschlossen sein soll. Beim Ventil stellen wir den Knebel ebenfalls so, dass es geschlossen ist. Nun können wir das Ventil mit dem Knebel voraus in das Gehäuseoberteil einsetzen.
In das untere Gehäuseteil stecken wir den D1 Mini mit der Adapterplatine, und zwar so, dass die USB-Buchse über die zugehörige Öffnung zu liegen kommt. Nun können wir beide Gehäuseteile vorsichtig zusammenstecken und mit vier Blechschrauben 2,2x10 mm verschließen.
Wichtiger Hinweis!
Die Software ist so ausgelegt, dass nach einem Neustart das Ventil geschlossen wird. Sollte jedoch die Stromversorgung des D1-Minis unterbrochen werden, während das Ventil offen ist, so wird das Ventil erst nach der Wiederherstellung der Stromversorgung automatisch geschlossen.
5 commentaires
Christian
@Bernd: danke für den Tipp. Hat funktioniert !
Bernd Albrecht
@ Christian:
Bitte ändern Sie folgende Zeile in der Funktion sendServo()
von
float winkel = durchfluss * 90 / 100;
auf
float winkel = (100-durchfluss) * 90 / 100;
Christian
Hallo und frohes neues Jahr,
vielen Dank für die Vorlage.
Ich möchte damit den Poti meiner Pelletheizung steuern.
Jedoch muss sich mein Servo “anders herum” drehen.
Sprich die 100% von der Bewässerung sind meine 0%.
Die 0% der Bewässerung sind meine 100%.
Mein Servo muss bei Erhöhung der % Zahl im Uhrzeigersinn drehen.
Was muss am Code geändert werden?
Danke und Grüße,
Christian
Gerald
Hallo Stefan, du hast nichts falsch gemacht. Der Fehler lag bei mir, ich habe die falsche Datei auf Thingivers gespeichert. Ich habe das soeben korrigiert. Die richtige Datei servo_adapter_v.stl kann jetzt heruntergeladen werden. Tut mir Leid.
https://www.thingiverse.com/download:8573123
Stefan
Hallo bei mir ist der Servoadapter nur eine runde scheibe ,was habe ich falsch gemacht ?