ESP8266 Wemos D1 Mini mit Servo Motor SG90 Beispiel
Aus znilwiki
1 Bauteile
- 1 x Wemos D1 Mini
- 1 x SG90: https://www.amazon.de/gp/product/B07BF7B69M (Bei ebay findet sich der 10er Pack für unter 17 Euro inkl. Versand)
2 Schaltung
Der SG90 wird wohl in 2 verschiedenen Varianten der Kabelfarben ausgeliefert:
Variante 1: Orange : an D4 ----------- Rot : an 3,3V Braun : an GND Variante 2: Weiß : an D4 ----------- Rot : an 3,3V Schwarz : an GND
3 Arduiono Entwicklungsumgebung
Ich nutze das Programm Arduino zur Programmierung. Zum Zeitpunkt der Erstellung dieses Artikels war das die Version 1.8.8
Es wurde die ESP8266 Bibliothek eingebunden:
Zuerst diese URL unter Datei => Voreinstellungen einbinden
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Und danach das Board (NICHT Bibliothek!) installieren unter Werkzeuge => Board: "irgenetwas" => Boardverwalter
Hier nach ESP8266
suchen und den einzigen gefundenen Eintrag installieren:
Neben dem ES8266 Board brauchen wir keine weiteren Bibliotheken nachinstallieren, die notwendigen müssten schon ab Werk aktiv sein.
4 Sketch
Hier mein Sketch für den Test. Die Idee ist aus einem Beispiel einer anderen Webseite (siehe Quellen), ich habe aber einiges Umgebaut.
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
// Zugangsdaten zu eurem WLAN:
const char* ssid = "SSID-des-WLANs";
const char* password = "PasswortDesWLANs";
// Den Servo und den Webserver definieren:
Servo Servo_SG90;
ESP8266WebServer WebServer ( 80 );
// In dieser Variablen steht die momentane Stellung des Servos
int SERVOCurrent = 0;
// Aufgaben beim Start des ESP8266 erledigen
void setup()
{
// Wir debuggen auf die serielle Schnittstelle (Seriellen Monitor im der Adruino-Programm starten!)
Serial.begin(115200);
delay(200);
Serial.println("Verbinde Servo.");
// Die möglichen Pin-Nummern. In der Zeichnung wird D4 verwendet
// D1 = 5 D2 = 4 D3 = 0 D4 = 2
// TX = 1 RX = 3 D0 = 16 D5 = 14
// D6 = 12 D7 = 13 D8 = 15
Servo_SG90.attach(2); // 2 = D4
Serial.println("Servo auf 0 Grad stellen");
Servo_SG90.write(0);
// Die Funktion für das Verbinden mit dem WLAN aufrufen
// Gute Idee das in eine Funktion zu packen - so kann man den Teil leichter in anderen Programmn wiederverwenden.
connectWifi();
// Den Webserver starten
beginServer();
}
// die Hauptschleife fragt endlos ab ob jemand auf der Webseite etwas geklickt hat:
void loop() {
WebServer.handleClient();
}
// Funktion welches die WiFi Verbindung aufbaut und uns das Ergebnis in dem Seriellen Monitor ausgibt
void connectWifi()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi verbunden");
Serial.println("IP Addresse: ");
Serial.println(WiFi.localIP());
}
// Funktion die den Webserver startet. Das es Port 80 ist wurde am Anfang definiert.
void beginServer()
{
WebServer.on ( "/", handleRoot ); // Wenn die URL aufgerufen wird (ohne etwas hinter dem /) wird die Funktion "handleRoot" gestartet
WebServer.begin();
Serial.println ( "HTTP Webserver gestartet!" );
}
// Wird von der Funktion "beginServer" aufgerufen
void handleRoot() {
if ( WebServer.hasArg("SERVO") ) { // Wir wurden mit dem Argument "SERVO" aufgerufen - es gibt also gleich etwas zu tun!
handleSubmit();
} else {
// Einfach nur die Webseite ausliefern
WebServer.send ( 200, "text/html", getPage() );
}
}
// jemand hat auf der Webseite eine der Schaltflächen / Buttons gedrückt
void handleSubmit() {
// Wir holen uns den übermittelten Wert
String SERVOValue;
SERVOValue = WebServer.arg("SERVO");
// jetzt prüfen wir ob es die +15 oder -15 war:
if ( SERVOValue == "+15" ) {
SERVOCurrent = SERVOCurrent + 15;
}
else if ( SERVOValue == "-15" ) {
SERVOCurrent = SERVOCurrent - 15;
}
else {
// Es war weder +15 noch -15, also direkt den Wert nehmen und in eine Zahl unmwandeln
SERVOCurrent = SERVOValue.toInt();
}
// Bevor wir nun den Wert nutzen einmal prüfen ob wir an den Limits angekommen sind
// es gehen nur Werte 0 bis 180
if ( SERVOCurrent > 180 ) {
// Zu groß!
SERVOCurrent = 180;
}
if ( SERVOCurrent < 0 ) {
// Zu klein!
SERVOCurrent = 0;
}
// Jetzt können wir den Wert setzen:
Serial.print("Setze Winkel ");
Serial.print(SERVOCurrent);
Serial.println(" Grad.");
Servo_SG90.write(SERVOCurrent);
// Webseite wieder aktualiseren
WebServer.send ( 200, "text/html", getPage() );
}
// Hier folgt die Webseite als HTML-Code.
String getPage() {
String ServoString = String(SERVOCurrent); // Holt die aktuelle Einstellung und wandelt diese in einen String. Ist untem im Code eingebaut.
String page = "<html lang=de-DE><head>";
//page += "<meta http-equiv='refresh' content='60'/>";
page += "<title>Wemos D1 Mini + Servo SG90 Test</title>";
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }";
page += ".button {display: inline-block; padding: 15px 15px; font-size: 25px; cursor: pointer; text-align: center; text-decoration: none;";
page += "outline: none; color: #ffffff; background-color: #4db2ec; border: none; border-radius: 5px;}";
page += ".button:hover {background-color: #4DCAEC; color:#ffffff;}";
page += ".button:active {background-color: #4DCAEC; box-shadow: 0 3px #666; transform: translateY(3px); }</style>";
page += "</head><body><center><h1>Wemos D1 Mini - Servo SG90 - WebServer</h1>";
page += "<hr><h2>aktueller Wert: " + ServoString + " Grad</h1><hr>";
page += "<h3>Feste Werte</h3>";
page += "<form action='/' method='POST'>";
page += "<INPUT class='button' type='submit' name='SERVO' value='0'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='15'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='30'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='45'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='60'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='75'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='90'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='105'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='120'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='135'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='150'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='165'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='180'>";
page += "<h3>+/-</h3>";
page += "<form action='/' method='POST'>";
page += "<INPUT class='button' type='submit' name='SERVO' value='-15'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='90'> ";
page += "<INPUT class='button' type='submit' name='SERVO' value='+15'>";
page += "</center></body>";
return page;
}
Ihr müsst den die SSID und das Passwort eures WLANs anpassen!
5 Testausgabe
Nach dem Hochladen sollte im Seriellen Monitor so etwas stehen:
Die IP-Adresse ruft Ihr dann in einem Webbrowser auf:
Fröhliches Klicken!
6 Mögliche Pins
Ich habe ausprobiert an welchen Pins ein Servo funktioniert (ohne weitere Maßnahmen):
D0 = 16 D1 = 5 D2 = 4 D3 = 0 D4 = 2 D5 = 14 D6 = 12 D7 = 13 D8 = 15 RX = 3 TX = 1
macht 11 Servos die mit einem Wemos D1 Mini gesteuert werden könnten - reicht für einen Roboterarm. Bliebe zu prüfen ob die Stromversorgung das mit macht.
Sogar der D8 funktioniert hier ohne das es Probleme gibt.
7 Quellen
- Farben der Servo-Kabel: https://www.instructables.com/id/Interfacing-Servo-Motor-With-NodeMCU/
- Vorlage für den Sketch: https://arduino-projekte.info/servo-ansteuern-arduino-esp8266-esp32/
Thomas
Permanentlink |
BLinz
Thomas
HD
Permanentlink |
Thommy
Permanentlink |
BLinz
joju
Permanentlink |
dziembo@web.de
Permanentlink |
Steve
Permanentlink |
Anonymer Benutzer #8
Markus
Permanentlink |
BLinz
Dino
Permanentlink |