Aktionen

ESP8266 Wemos D1 Mini mit Servo Motor SG90 Beispiel

Aus znilwiki

1 Bauteile



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

Die Schaltung sieht so aus:
Wemos D1 Mini + Servo SG90 Steckplatine.png


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

ClipCapIt-190228-205734.PNG
http://arduino.esp8266.com/stable/package_esp8266com_index.json

Und danach das Board (NICHT Bibliothek!) installieren unter Werkzeuge => Board: "irgenetwas" => Boardverwalter

ClipCapIt-190303-153010.PNG

Hier nach ESP8266 suchen und den einzigen gefundenen Eintrag installieren:

ClipCapIt-190303-153145.PNG


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:

ClipCapIt-190303-213534.PNG

Die IP-Adresse ruft Ihr dann in einem Webbrowser auf:

ClipCapIt-190303-213615.PNG

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



8 Kommentare


Thomas

6 Monaten zuvor
Punktzahl 0++

Hallo, habe da mal eine Frage wie binde ich 4 servos in den sketch ein. Danke schon mal im voraus.

Gruß Thomas

BLinz

6 Monaten zuvor
Punktzahl 0++
Überall wo der Servo initialisiert oder sonstwie angesprochen wird eine entsprechende zweite, dritte und vierte Anweisung einbauen?

Thomas

6 Monaten zuvor
Punktzahl 0++

Super Danke für die schnelle Antwort aber ich steige da noch nicht so richtig duch bin grade ganz am anfang. Wenn ich das richtig verstehe muss ich doch noch 3 servos definieren und dennen auch unterschiedliche Namen geben oder Oh Gott ich blike da nicht durch. Sorry

Gruß Thomas

HD

6 Monaten zuvor
Punktzahl 0++
Danke hat sofort geklappt

Thommy

5 Monaten zuvor
Punktzahl 0++
Sehr cool auf jeden Fall! Perfekt wäre es noch, wenn ein Webcam-Stream eingebunden werden könnte...

BLinz

4 Monaten zuvor
Punktzahl 0++
Kann man prinzipiell ... aber das war nicht das Thema für dieses Beispiel.

joju

4 Monaten zuvor
Punktzahl 0++
danke -

dziembo@web.de

2 Monaten zuvor
Punktzahl 0++

super sketch

könnte man da auch noch einen Timer einbauen, so daß ein bestimmter Winkel immer zu einer bestimmten Tageszeit, Wochentag etc ausgeführt wird?

Steve

24 Tage zuvor
Punktzahl 0++

Hi, Wochentag oder Tageszyklus wäre interessant. Das ganze soll für einen Futterautomaten dienen, welcher eine Position anfährt und öffnet.

Kennt sich wer mit Zyklen beim servo aus?
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen. Bei einem Kommentar wird deine IP-Adresse zusammen mit dem Text, den angegebenen Namen bzw. der Email-Adresse in der Datenbank für die Kommentare dauerhaft gespeichert. Genaueres kannst du hier nachlesen: Datenschutzerklärung