Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Arduino Lektion 56: 4 Phasen Schrittmotor steuern

Posted on 9. Juli 201828. Februar 2025 by Stefan Draeger

In diesem Tutorial möchte ich gerne den 5V, 4 Phasen Schrittmotor mit Treiberplatine ULN2003 vorstellen.

  • Bezug
  • Technische Daten des  4 Phasen Schrittmotor
  • Aufbau
  • Schaltung
  • Ermitteln der Kraft des Schrittmotors
  • Quellcode
    • Einfaches Beispiel
      • Video
    • Webseite zum steuern des Schrittmotors 28BYJ-48 mit Treiberplatine ULN2003
      • Erstellen der Webseite
        • Quellcode der Webseite
      • Aufbau des Sketches in der Arduino IDE
        • Erzeugen des AccesssPoints
      • Sketch mit der Webseite und dem Code für den Schrittmotor

Bezug

Den 5 V, 4 Phasen Schrittmotor vom Typ „28BYJ-48 ULN2003“ kann man über eBay.de* günstig erwerben. Wobei man darauf achten sollte, dass es das „komplett Set“ ist, denn es gibt den Motor und die Platine einzeln jedoch ist das „komplett Set“ günstiger zu erwerben.

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Technische Daten des 4 Phasen Schrittmotor

  • Betriebsspannung des Schrittmotors 5V
  • Betriebsspannung der Platine 5V / 12V (einstellbar über einen Jumper)
  • Abmaße
    • Durchmesser des Motors 28 mm
    • Platinengröße 40,5 mm x 21,3 mm

Der Schrittmotor hat eine Übersetzung mit einem Zahnradgetriebe von 1: 64, d.h. für eine Umdrehung von 360° benötigt dieser Schrittmotor

360° : 64 Schritte = 5,625°  pro Schritt.

Bei einer Halbschrittübersetzung bedeutet das, dass wir 64 × 64 Schritt für eine volle Umdrehung benötigen.
64 × 64 = 4096 Schritte pro voller Umdrehung

Diese Berechnung erfolgte aus den Angaben aus dem Datenblatt des Schrittmotors 28BYJ-48.

Aufbau

Für den Aufbau der Schaltung verwende ich einen Wemos D1 mini, dieser verfügt über ein Wifi Modul welches wir später in einem Beispiel verwenden wollen.

Aufbau - Schrittmotor am Wemos D1 Mini
Aufbau – Schrittmotor am Wemos D1 Mini

Der Schrittmotor wird mit einer Treiberplatine geliefert (Bezeichnung UNL2003) an diese kann man eine 5V oder 12V Versorgungsspannung anlegen. Die 5V liefert der Mikrocontroller, jedoch sollte man hier aufpassen, dass die Last des Motors nicht zu hoch wird denn mit der Last steigt die Stromaufnahme und der Mikrocontroller ist hier leider begrenzt.

UNL2003Wemos D1 mini
IN1D5
IN2D6
IN3D8
IN4D7
–GND
+5V

Schaltung

Schaltung - Wemos D1 Mini und Schrittmotor
Schaltung – Wemos D1 Mini und Schrittmotor

Ermitteln der Kraft des Schrittmotors

Der Schrittmotor hat je nach Geschwindigkeit eine stärkere bzw. geringere Kraft um ein Objekt wie zbsp. eine Welle zu bewegen. Ich möchte nun einmal einen kleinen Versuch starten eine 0,5l Wasserflasche aus einer Höhe von ca. 75 cm anzuheben. Dabei werde ich die Flasche immer mehr füllen und auch die Geschwindigkeit erhöhen.

Aufbau Winde zum ermitteln der Kraft des Schrittmotors
Aufbau Winde zum ermitteln der Kraft des Schrittmotors

Es konnte ermittelt werden das, der Schrittmotor eine maximale Kraft von 300g (3Nm) ab der Geschwindigkeitsstufe 2 aufbringen kann. Die Stufe 1 ist die Schnellste, kann jedoch weniger Kraft aufbringen.

Tabelle mit den Messergebnissen
Tabelle mit den Messergebnissen

Quellcode

Für die nachfolgenden Beispiele wird die Bibliothek „Arduino-and-ULN2003-Stepper-Motor-Driver“ von rydepier benötigt. Diese Bibliothek kann man sich aus dem GitHub Repository herunterladen.

Wie man eine Bibliothek in der Arduino IDE installiert habe ich im Tutorial Arduino IDE, Einbinden einer Bibliothek ausführlich erläutert.

Einfaches Beispiel

Der Bibliothek „StepperMotor“ liegt bereits ein Beispiel, bei welches nach einer kleinen Konfiguration sofort lauffähig ist.

#include <StepperMotor.h> //Einbinden der Bibliothek StepperMotor.h

StepperMotor motor(D5,D6,D8,D7); // IN1, IN2, IN3, IN4

//Die maximale Geschwindigkeit bei 5Volt ist 15 RPM (RoundsPerMinute)
//Je größer der Wert ist desto langsamer wird der Motor. 
//Mit einem langsamen Motor kann man größere Kräfte erzeugen!
int motorSpeed = 1; 

//Es benötigt 4096 Schritte für eine volle Umdrehung.
int motorSteps = 4096; 

//Wert für die Pause zwischen den Schritten.
int motorDelay = 1000;

void setup(){
  motor.setStepDuration(motorSpeed);
}

void loop(){
  //Erst eine volle Umdrehung entgegen des Uhrzeigersinns durchführen.
  motor.step(motorSteps); 
  delay(motorDelay); //Eine kleine Pause einlegen.

  //Danach eine volle Umdrehung im Uhrzeigersinn durchführen.
  motor.step(-motorSteps);
  delay(motorDelay); //Eine kleine Pause einlegen.
}

Video

Wemos D1 Mini mit 4 Phasen Schrittmotor 28BYJ-48 und Teiberplatine ULN2003
Dieses Video auf YouTube ansehen.

Webseite zum steuern des Schrittmotors 28BYJ-48 mit Treiberplatine ULN2003

Durch einen Kommentar auf einem meiner früheren Beiträge bin ich auf eine wohl performantere Lösung von Seitenaufrufen hingewiesen worden. Dieses möchte ich nun in diesem Beispiel anwenden.

Die Webseite soll auf einem mobilen Endgerät laufen, daher wähle ich die Einstellung für einen AccessPoint.

Damit sich mein Handy (Huawei P20 lite) mit dem Netzwerk verbinden konnte,  musste ich die Mobilen Daten sowie die Einstellung „WLAN+“ unter den WLAN-Einstellungen deaktivieren.

Erstellen der Webseite

Die Webseite muss als String im Sketch hinterlegt werden. Ich schreibe zuerst die Seite in einem Editor wie Notepad++ oder PSPad da diese mit einem entsprechenden Highlighting beim Schreiben unterstützt.

Webseite für die Steuerung des Schrittmotors
Webseite für die Steuerung des Schrittmotors
Quellcode der Webseite

Nachfolgend nun den Quellcode für die Webseite.
Dieser Code muss noch um die echte IP-Adresse des Servers ergänzt werden, dieses wird dann im Quellcode des Sketches erfolgen.

<html><head><meta charset="utf-8">  
		<title>Online Schrittmotorsteuerung</title>
		<style>
			label{ display:inline-block; width:230px;}
			.lbl {width:100px;}
			.textfield {width:60px;}
		</style>
	</head>
	<body>
		<h2>Schrittmotorsteuerung</h2>
		<fieldset>
		  <legend>Konfiguration</legend>
		  <label>Drehrichtung</label>
		  <input type="radio" value="1" name="direction" id="vRbtn"/>
		  <label for="vRbtn" class="lbl">Vorwärts</label> 
		  <input type="radio" value="2" name="direction" id="rRbtn"/>
		  <label for="rRbtn" class="lbl">Rückwärts</label> 
		  <br/><br/>
		  <label for="spTField">Geschwindigkeit</label>
		  <input class="textfield" type="number" value="1" id="spTField" min="1" max="15"/>
		  <br/><br/>
		  <label for="sVUTField">Schritte für eine volle Umdrehung</label>
		  <input class="textfield" type="number" value="4096" id="sVUTField" min="1"/>
		  <br/><br/>
		  <label for="sTField">Schritte</label>
		  <input class="textfield" type="number" value="10" id="sTField" min="1"/>
		  <br/><br/>
		  <input type="button" value="Speichern" id="cSBtn"/>
		</fieldset>
		<div style="margin:0px auto; width:100px">
		<br/><br/>
		<input type="button" value="Start" id="startBtn"/>
		</div>
		<script>
			var ipadresse = "-undefined-";
			
			var drehrichtung = 1;
			var schritteVolleUmdrehung = 4096;
			var schritte = 10;
			var geschwindigkeit = 1;
			
			if(drehrichtung === 1){
			  document.getElementById("vRbtn").checked = true;
			} else {
			  document.getElementById("rRbtn").checked = true;
			}
			
			document.getElementById("spTField").value(geschwindigkeit);
			document.getElementById("sVUTField").value(schritteVolleUmdrehung);
			document.getElementById("sTField").value(schritte);
			
			document.getElementById("startBtn").onclick = startMotor;
			document.getElementById("cSBtn").onclick = saveConfiguration;
			
			function startMotor(){
				window.open("http://"+ipadresse+"/index.html?start=1","_self");
			}
			
			function saveConfiguration(){
				var direction = document.getElementById("vRbtn").checked?1:2;
				var svu = document.getElementById("sVUTField").value;
				var st = document.getElementById("sTField").value;
				var sp = document.getElementById("spTField").value;
				window.open("http://"+ipadresse+"/index.html?direction="+direction+"&svu="+svu+"&st="+st+"&sp="+sp,"_self");
			}
		</script>
	</body>
</html>

Dieser HTML Code muss nun in den Arduino Sketch eingefügt werden. Dazu werde ich diesen Code auf das Minimum reduzieren, d.h. alle unnötigen Leerzeichen sowie Zeilenumbrüche werden entfernt.

Das kann man per Hand oder aber auch bequem über eine Seite wie https://www.willpeavy.com/minifier/ lösen.

Das Ergebnis zu meinem Code wäre:

<html><head><meta charset="utf-8"> <title>Online Schrittmotorsteuerung</title><style>label{display:inline-block; width:230px;}.lbl{width:100px;}.textfield{width:60px;}</style></head><body><h2>Schrittmotorsteuerung</h2><fieldset> <legend>Konfiguration</legend> <label>Drehrichtung</label> <input type="radio" value="1" name="direction" id="vRbtn"/> <label for="vRbtn" class="lbl">Vorwärts</label> <input type="radio" value="2" name="direction" id="rRbtn"/> <label for="rRbtn" class="lbl">Rückwärts</label> <br/><br/> <label for="spTField">Geschwindigkeit</label> <input class="textfield" type="number" value="1" id="spTField" min="1" max="15"/> <br/><br/> <label for="sVUTField">Schritte für eine volle Umdrehung</label> <input class="textfield" type="number" value="4096" id="sVUTField" min="1"/> <br/><br/> <label for="sTField">Schritte</label> <input class="textfield" type="number" value="10" id="sTField" min="1"/> <br/><br/> <input type="button" value="Speichern" id="cSBtn"/></fieldset><div style="margin:0px auto; width:100px"><br/><br/><input type="button" value="Start" id="startBtn"/></div><script>var ipadresse="-undefined-";var drehrichtung=1;var schritteVolleUmdrehung=4096;var schritte=10;var geschwindigkeit=1;if(drehrichtung===1){document.getElementById("vRbtn").checked=true;}else{document.getElementById("rRbtn").checked=true;}document.getElementById("spTField").value(geschwindigkeit);document.getElementById("sVUTField").value(schritteVolleUmdrehung);document.getElementById("sTField").value(schritte);document.getElementById("startBtn").onclick=startMotor;document.getElementById("cSBtn").onclick=saveConfiguration;function startMotor(){window.open("http://"+ipadresse+"/index.html?start=1","_self");}function saveConfiguration(){var direction=document.getElementById("vRbtn").checked?1:2;var svu=document.getElementById("sVUTField").value;var st=document.getElementById("sTField").value;var sp=document.getElementById("spTField").value;window.open("http://"+ipadresse+"/index.html?direction="+direction+"&svu="+svu+"&st="+st+"&sp="+sp,"_self");}</script></body></html>

Die Lesbarkeit ist nun auf fast 0 % gesunken, jedoch sind durch diese Art der Komprimierung die Bytes, welche für den String benötigt werden, gesunken.

Ergebnis der Komprimierung durch Minify einer Html Seite
Ergebnis der Komprimierung durch Minify einer Html Seite

Damit diese Seite später in dem Sketch verwendet werden kann, müssen alle Anführungszeichen escaped werden, d.h. es muss ein Backslash „\“ davor gestellt werden. Dieses mache ich in der Anwendung NotePad++ durch die Funktion „Suchen & Ersetzen“.

Durch das bearbeiten der Seite kann diese nun nicht mehr mit einem Browser vernünftig dargestellt werden.

Aufbau des Sketches in der Arduino IDE

Erzeugen des AccesssPoints

Wie man einen AccessPoint einrichtet habe ich im Tutorial Wemos D1 Mini (ESP8266) als AccessPoint einrichten bereits beschrieben, daher möchte ich hier auf die Besonderheit eingehen damit dieser eine Webseite anzeigen kann.

Wir benötigen für die Anzeige einer Webseite zusätzlich einen Serverdienst diesen binden wir über die Bibliothek „ESP8266WebServer.h“ in den Sketch ein. Der Webserver läuft über den Port 80 (dies ist der übliche Port für einen HTTP Webserver).

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

int countConnectedDevices = 0;

// Wird ausgeuehrt wenn "http://<ip address>/" aufgerufen wurde
void callHome(){
  String text = "";
  text+="Hallo Welt!";
  server.send(200, "text/html", text);
}

void setup(){
  Serial.begin(115200);
  Serial.println();

  boolean result = WiFi.softAP("WemosAP", "geheim123");  
  Serial.print("Verbindung wurde ");
  if(result == false){
    Serial.println("NICHT ");
  }
  Serial.print("erfolgreich aufgebaut!");

  Serial.println("Server IP-Adresse:");
  Serial.print(WiFi.softAPIP());

  //Wenn der Client eine Anfrage startet.
  server.on("/", callHome);

  // Starte den Server
  server.begin();
}

void loop(){
  if(countConnectedDevices != WiFi.softAPgetStationNum()){
     countConnectedDevices = WiFi.softAPgetStationNum();
     Serial.printf("Anzahl der Verbundenen Geräte= %d\n", countConnectedDevices);
  }
  
  server.handleClient();
}

Wenn dieser Sketch ausgeführt wird, dann wird als Erstes auf dem seriellen Monitor der Arduino IDE folgende Ausgabe sichtbar:

Ausgabe auf dem seriellen Monitor der Arduino IDE
Ausgabe auf dem seriellen Monitor der Arduino IDE

Wir sollten also nun das gesicherte Netzwerk „WemosAP“ sehen.
Hat man sich erfolgreich zum Netzwerk verbunden, so navigiert man mit
einen beliebigen Browser zur IP-Adresse „192.168.4.1“ es sollte
dann die Ausgabe „Hallo Welt!“ erscheinen.

Ausgabe im Browser (Google Chrome)
Ausgabe im Browser (Google Chrome)

Ersetzen wir also nun den Text „Hallo Welt!“ gegen unsere Webseite und ersetzen im JavaScript Block den Platzhalter für die IP-Adresse durch die echte.

Screenshot Schrittmotorsteuerung (mobile Ansicht)
Screenshot Schrittmotorsteuerung (mobile Ansicht)

Sketch mit der Webseite und dem Code für den Schrittmotor

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <StepperMotor.h> 

ESP8266WebServer server(80);
StepperMotor motor(D5,D6,D8,D7);

int countConnectedDevices = 0;

int drehrichtung = 1;
int schritteVolleUmdrehung = 4096;
int schritte = 10;
int geschwindigkeit = 1;

IPAddress ipAdresse;

void callHome(){
  Serial.println("callHome");
  server.send(200, "text/html", getWebpage());
}

void callStart(){
  Serial.println("callStart");
  printArgs();

  motor.setStepDuration(geschwindigkeit);
  switch(drehrichtung){
    case 1 : motor.step(schritte); break;
    case 2 : motor.step(-schritte); break;
  }
  
  server.send(200, "text/html", getWebpage());
}

void callConfig(){
  Serial.println("callConfig");
  printArgs();
  server.send(200, "text/html", getWebpage());
}

void printArgs(){
  for (int i = 0; i < server.args(); i++) {
      String parameterName = server.argName(i);
      String parameterValue = server.arg(i);

      if(parameterName == "svu"){
        schritteVolleUmdrehung = parameterValue.toInt();
      } else if(parameterName == "st"){
        schritte = parameterValue.toInt();
      } else if(parameterName == "sp"){
        geschwindigkeit = parameterValue.toInt();
      } else if(parameterName == "direction"){
         drehrichtung = parameterValue.toInt();
      } 
      
      Serial.print(parameterName);
      Serial.print(" : ");
      Serial.println(parameterValue);
  } 
}

String getWebpage(){
   String webpage ="<html><head><meta charset=\"utf-8\"> <title>Online Schrittmotorsteuerung</title><style>label{display:inline-block; width:230px;}.lbl{width:100px;}.textfield{width:60px;}</style></head><body><h2>Schrittmotorsteuerung</h2><fieldset> <legend>Konfiguration</legend> <label>Drehrichtung</label> <input type=\"radio\" value=\"1\" name=\"direction\" id=\"vRbtn\"/> <label for=\"vRbtn\" class=\"lbl\">Vorwärts</label> <input type=\"radio\" value=\"2\" name=\"direction\" id=\"rRbtn\"/> <label for=\"rRbtn\" class=\"lbl\">Rückwärts</label> <br/><br/> <label for=\"spTField\">Geschwindigkeit</label> <input class=\"textfield\" type=\"number\" value=\"1\" id=\"spTField\" min=\"1\" max=\"15\"/> <br/><br/> <label for=\"sVUTField\">Schritte für eine volle Umdrehung</label> <input class=\"textfield\" type=\"number\" value=\"4096\" id=\"sVUTField\" min=\"1\"/> <br/><br/> <label for=\"sTField\">Schritte</label> <input class=\"textfield\" type=\"number\" value=\"10\" id=\"sTField\" min=\"1\"/> <br/><br/> <input type=\"button\" value=\"Speichern\" id=\"cSBtn\"/></fieldset><div style=\"margin:0px auto; width:100px\"><br/><br/><input type=\"button\" value=\"Start\" id=\"startBtn\"/></div><script>var ipadresse=\""+ipAdresse.toString()+"\";var drehrichtung="+drehrichtung+";var schritteVolleUmdrehung="+schritteVolleUmdrehung+";var schritte="+schritte+";var geschwindigkeit="+geschwindigkeit+";if(drehrichtung===1){document.getElementById(\"vRbtn\").checked=true;}else{document.getElementById(\"rRbtn\").checked=true;}document.getElementById(\"spTField\").value=geschwindigkeit;document.getElementById(\"sVUTField\").value=schritteVolleUmdrehung;document.getElementById(\"sTField\").value=schritte;document.getElementById(\"startBtn\").onclick=startMotor;document.getElementById(\"cSBtn\").onclick=saveConfiguration;function startMotor(){window.open(\"http://\"+ipadresse+\"/start.html?start=1\",\"_self\");}function saveConfiguration(){var direction=document.getElementById(\"vRbtn\").checked?1:2;var svu=document.getElementById(\"sVUTField\").value;var st=document.getElementById(\"sTField\").value;var sp=document.getElementById(\"spTField\").value;window.open(\"http://\"+ipadresse+\"/config.html?direction=\"+direction+\"&svu=\"+svu+\"&st=\"+st+\"&sp=\"+sp,\"_self\");}</script></body></html>";
   return webpage;
}

void setup(){
  Serial.begin(115200);
  Serial.println();

  boolean result = WiFi.softAP("WemosAP", "geheim123");  
  Serial.print("Verbindung wurde ");
  if(result == false){
    Serial.println("NICHT ");
  }
  Serial.println("erfolgreich aufgebaut!");
  
  Serial.println("");
  
  Serial.println("Server IP-Adresse:");
  ipAdresse = WiFi.softAPIP();
  Serial.print(ipAdresse);

  //Wenn der Client eine Anfrage startet.
  server.on("/", callHome);
  server.on("/start.html", callStart);
  server.on("/config.html", callConfig);

  // Starte den Server
  server.begin();
}

void loop(){
  if(countConnectedDevices != WiFi.softAPgetStationNum()){
     countConnectedDevices = WiFi.softAPgetStationNum();
     Serial.printf("Anzahl der Verbundenen Geräte= %d\n", countConnectedDevices);
  }
  
  server.handleClient();
}

15 thoughts on “Arduino Lektion 56: 4 Phasen Schrittmotor steuern”

  1. Andreas sagt:
    1. Oktober 2019 um 16:18 Uhr

    ich bekommen den StepperMotor.h nicht installiert.
    Downloade mir die Datei „Arduino-and-ULN2003-Stepper-Motor-Driver-master.zip“
    Gehe auf Menü „Sketch->Library importieren…->Add Library… klicke die Datei an.
    Gehe auf Bibliotheksverwaltung und gebe im Suchfeld „StepperMotor.h“
    keine Treffer…

    Immer wenn ich das Programm überprüfe gibt er mir die Fehlermeldung:
    xit status 1
    no matching function for call to ‚Stepper::Stepper(const uint8_t&, const uint8_t&, const uint8_t&, const uint8_t&)‘

    Was mache ich falsch ?

    Antworten
  2. Wolfgang sagt:
    1. November 2019 um 20:55 Uhr

    Hallo Herr Draeger,
    erst mal herzlichen Dank für diese Anleitung! Mir ist allerdings aufgefallen, dass bei dem void callStart die schrittmotor-Pins nicht wieder auf Null/LOW gezogen werden nach der Bewegung, was zur Folge hat, das es passiert, dass ein oder zwei Schrittmotor-Pins auf High stehen bleiben und der Schrittmotor dadurch warm wird.
    hier die Änderung in dem void callStart:
    void callStart(){
    Serial.println(„callStart“);
    printArgs();

    motor.setStepDuration(geschwindigkeit);
    switch(drehrichtung){
    case 1 : motor.step(schritte); break;
    case 2 : motor.step(-schritte); break;
    }
    digitalWrite(D5, LOW);
    digitalWrite(D6, LOW);
    digitalWrite(D7, LOW);
    digitalWrite(D8, LOW);

    Serial.println(„Motor stop“);

    server.send(200, „text/html“, getWebpage());
    }
    Dann habe ich noch eine Frage, wie ist es möglich, in der Zeile, wo sich der Start-Button befindet, weitere Buttons einzurichten, die aber feste Werte haben/übermitteln. Beispiel ein Button soll vorwärts 10 heißen und dann eben vorwärts 10 Schritte laufen. Also quasi vordefinierte Buttons mit festen Werten. Für Hilfe in diesem Bereich und dem Quellcode wäre ich Ihnen dankbar!

    Gruß
    Wolfgang

    Antworten
    1. Stefan Draeger sagt:
      2. November 2019 um 19:34 Uhr

      Hi,

      danke für deine Anmerkung zu meinem Code.

      Wenn du eine weitere Schaltfläche bzw. Button dem HTML Formular hinzufügen möchtest dann wäre dieses ein weiteres Html INPUT Type Button Element.
      Im nachfolgenden ein kleines Beispiel wie du zwei Schaltflächen implementieren kannst welche dann die Funktion „callStart“ aufruft.


      Bitte probiere das doch mal, und melde dich einfach mal zurück.

      Gruß,

      Stefan Draeger

      Antworten
  3. Helge sagt:
    25. November 2019 um 17:17 Uhr

    Hi,

    cooles Projekt,
    habe das mal nach gebaut, hatte am Anfang auch Probleme mit der library StepperMotor.h
    Hab mir diese Bibliothek wie oben beschrieben, aus dem GitHub Repository heruntergeladen und manuell installiert.
    Außerdem ist der Code noch von folgenden Printouts auf dem seriellen Monitor erweitert worden.

    void callStart() {
    long startTime = 0;
    Serial.println(„callStart“);
    printArgs();
    motor.setStepDuration(geschwindigkeit);
    startTime = millis();
    switch (drehrichtung) {
    case 1 : motor.step(schritte); break;
    case 2 : motor.step(-schritte); break;
    }
    // Erweiterung
    // Zusaetzliche Printout fuer den Serial Monitor
    Serial.print(„time: „);
    Serial.println(millis() – startTime);
    Serial.print(„geschwindigkeit: „);
    Serial.println(geschwindigkeit);

    // Pins auf Null/LOW setzen (Wolfgang)
    digitalWrite(D5, LOW);
    digitalWrite(D6, LOW);
    digitalWrite(D7, LOW);
    digitalWrite(D8, LOW);

    Serial.println(„Motor stop“);
    //Ende
    server.send(200, „text/html“, getWebpage());
    }

    Suche noch ein Beispiel wo ich genau für eine komplette Umdrehung 60 Sekunden brauche,
    aber leider kann man bei “ geschwindigkeit “ keine Komma-Werte angeben.
    int geschwindigkeit = 1;

    Wie schon gesagt sehr schönes Projekt.

    Gruß
    ///Helge

    Antworten
  4. Gisy sagt:
    23. Februar 2020 um 22:01 Uhr

    Hi Stefan!

    Deine Webseite hat mich gerettet.
    Ich wollte ebenfalls den gleichen Stepper Motor mit dem Wemos D1 Mini betreiben.
    Allerdings verwiesen die meisten anderen Beispiele im Netz auf die „allgemeine“ Stepper lib.
    Bei mir hatte das zur Folge, dass den Wemos ständig einen Reset auslöste:
    „wdt reset
    load 0x4010f000, len 1392, room 16“ (falls das irgendwer googlet :))
    Ich habe vor deinen Code noch etwas zu erweitern, damit man Befehle über MQTT senden kann.

    Antworten
    1. Stefan Draeger sagt:
      24. Februar 2020 um 05:54 Uhr

      Hi,

      danke für dein Feedback. Ich freue mich das ich dir helfen konnte.

      Gruß,

      Stefan Draeger

      Antworten
  5. Tom sagt:
    7. März 2020 um 11:52 Uhr

    Hallo,
    ich habe die Schaltung nachgebaut und habe das Problem, dass der Wemos nicht startet, wenn der Motor an den Pins D5-D8 hängt.
    Erst wenn einer der Anschlüsse getrennt wird und danach der Wemos Strom bekommt, startet der Wemos und der Motor fährt los.

    Ich konnte leider noch keine Lösung finden, vielleicht hat hier ja jemand eine Lösung?
    Danke!

    Antworten
  6. Friedrich Schrader sagt:
    2. September 2020 um 11:57 Uhr

    Hallo Herr Draeger,
    ich glaube nicht, dass sich im Halbschrittbetrieb die Schrittzahl von 64 Schritten pro Umdrehung auf 4096 Schritten pro Umdrehungen erhöht. Meiner Meinung nach erhöht sich die Schrittzahl auf 2 x 64 Schritte = 128 Schritte pro Umdrehung, da der Unterschied zwischen Halb- und Vollschritt nur im Faktor 2 begründet ist.
    Ihr Rechenbeispiel träfe meiner Ansicht nach für einen Mikroschrittbetrieb mit 64 Mikroschritten zu.

    Antworten
  7. Michael Pfleiderer sagt:
    24. September 2020 um 13:56 Uhr

    Hallo Herr Draeger

    Ich habe an derselben Stelle gestockt, wie mein Vorredner (Friedrich Schrader). Die 4096 Schritte pro Umdrehung erachte ich als korrekt, ihren Rechnungsweg jedoch nicht. Mit Halbschritten hat ihre Rechnung so nichts zu tun.

    Laut Datenblatt hat der Motor selbst (ohne Getriebe) einen Schrittwinkel von 5,625°. Dies entspricht 64 einzelnen Schritten pro Umdrehung, vor dem Getriebe!

    Durch die 1:64 Übersetzung des Getriebes wiederum verfeinert sich der effektive Schrittwinkel an der Achse nach dem Getriebe auf 0,087890625° (5,526° / 64). Somit kommen wir exakt auf die genannten 4096 Schritte pro Umdrehung (360° / 0,087890625° = 4096), dies ist jedoch im Vollschrittbetrieb.
    Im Halbschrittbetrieb wären es dann somit 8192 Schritte pro Umdrehung (4096 * 2 bzw. 4096 / 1/2).

    Halbschrittbetrieb hat so nichts mit dem 1:64 Getriebe zu tun, sondern eher mit der Ansteuerung des Schrittmotors.

    Antworten
  8. Tobi sagt:
    28. Januar 2021 um 19:52 Uhr

    Hallo,

    Ich versuche mich schon eine weile an dem einbinden der Bibliothek. allerdings wird mir immer gesagt, „Angegebener Ordner/ZIP-Datei enthält keine gültige Bibliothek“.

    Antworten
    1. Stefan Draeger sagt:
      28. Januar 2021 um 20:23 Uhr

      Hi,

      manchmal sind die Inhalte in der *.zip Datei nochmal im unterordner. Hier musst du einmal den Ordner entpacken und dann den eigentlichen Ordner nochmal zippen.

      Gruß,

      Stefan Draeger

      Antworten
  9. arti sagt:
    29. Mai 2021 um 11:00 Uhr

    Wäre es möglich den Quellcode zu veröffentlichen, möchte den Stepper auch per MQTT steuern?

    Antworten
    1. Stefan Draeger sagt:
      30. Mai 2021 um 21:11 Uhr

      Hi,

      der Quellcode ist auf der Seite, oder fehlt etwas?

      Gruß,

      Stefan Draeger

      Antworten
  10. Pingback: Vorstellung RFID Starter Kit für den Arduino UNO R3 - Technik Blog
  11. Tom Jackson sagt:
    4. Dezember 2024 um 04:14 Uhr

    Vielen Dank für deine ausführliche Erklärung, sie hat mir sehr geholfen.

    Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}