Hardware - Steppermotor 28BYJ-48 mit ULN2003
Hier handelt es sich um einen kleinen Steppermotor mit einem 1/64 untersetzenden Getriebe und einem eigenen mitgeliefertem Treibermodul ULN2003. Die Ansteuerung erfolgt direkt über 4 Pin's und verdeutlicht auch sehr gut die Arbeitsweise von Steppermotoren.....
Dieser kleine Motor mit Treibermodul ist oft in den "Einstiegspaketen" aus Fernost mit enthalten.

Man sollte ihn nicht unterschätzen, er dreht zwar sehr langsam, hat aber durch die Untersetzung durchaus Kraft (für seine Grösse).

Die Platine hat folgende Anschlüsse:
IN1-IN4 | diese PINS verbindet ihr mit 4 PINS an Eurem Computer, diese werden später in definierter Reihenfolge an-/ausgeschaltet |
PWR 5-12V VIN und GND | dieser Anschluss versorgt das Modul und den Motor mit externem Strom (5-12V), der GND muss mit dem GND am Computer verbunden werden ! |
ABCD | dieser Anschluss mit vorgefertigter Steckerleiste wird mit dem Motor verbunden |
Auch hier gibt es verschiedene MODI von Grob bis Fein hinsichtlich der Ansteuerung des Motors, nur machen wir es hier im Gegensatz zu siehe A4988... direkt in unserer Programmierung.
GROB:
Wir schalten die PINS für A=>B=>C=>D einfach nacheinander durch, jeweils mit einer kleinen Verzögerung, damit der Motor reagieren kann. Der Motor läuft jetzt recht "ruppig" und mit weniger Kraft - dafür mit grösster möglicher Geschwindigkeit.
FEIN:
Wir schalten die PINS für A=>AB=>B=>BC=>C=>CD=>D nacheinander durch, ebenfalls mit jeweils einer kleinen Verzögerung. Jetzt läuft der Motor "weicher" und hat auch etwas mehr Kraft - allerdings langsamer ( er hat ja mehr Verzögerungsschritte je Periodendurchlauf).
Durch die Angabe der Verzögerung können wir die Motor-Drehzahl variieren, es gibt aber eine Mindestverzögerung.
Hier ein kleines Programm für den ESP32..
(Achtung - der Text [code].....[/code] gehört NICHT zum Programm..)
[code]
// Motorsteuerungsmodul für den Stepper 28BYJ-48 ausführlich
// zum Nachlesen und Verstehen...
// Schaltung zur Motorsteuerungs-Platine, die Int-Kennzahlen
// stellen die Motorpositionen ( 4 Stellungen-Motor ) auf 90 Grad dar
// A = 0 ( bzw. 180) Grad
// B = 45 ( bzw. 225 Grad)
// C = 90 ( bzw. 270 Grad)
// D = 135 ( bzw. 315 Grad)
// Die Ansteuerung läuft durch Anwahl A=>B=>C=>D (0=>45=>90=>135 Grad),
// dann wieder A=>B=>C=>D ( 180>=225=>270=>315 Grad ), d.h 1 Motorumdrehung
// dann wieder .....
// Verdrahtung ( bei mir... )
// pin GPIO 12 als => A...
// pin GPIO 14 als => B...
// pin GPIO 27 als => C...
// pin GPIO 26 als => D...
// Verbindung GND des ESP mit GND der Stromversorgung der Steuerpatine des
// Stepper-Motors nicht vergessen...
// Steuerplatine mit Stromquelle >= +5V - 12 V verbinden, der Jumper bleibt
// auf den beiden Nebenpolen gesetzt...( dessen Aufgabe ist mir bisher unklar...)
// ACHTUNG: zwischen den Befehlschritten muss immer mind. 3 ms Pause sein,
// sonst überdreht der Motor und stoppt
// In den nachfolgenden Anweisungsschleifen sind 4 Vollschritte A=>B=>C=>D enthalten,
// der Rest sind die o.g. Zwischenschritte (die zählen nicht ). Für eine Motorumdrehung
// brauchen wir 2x4 Schleifendurchläufe und die Untersetzung im Getriebe ist 1/64, daher
// (2*4)* 64 = 512 Schleifendurchläufe..
// Es sind 512 Schleifendurchläufe für 1 Umdrehung der Achse notwendig, das dauert
// also ca. 512 * ( 9 Anweisungen * 3ms ) = 13.824 sek....für eine Umdrehung am Getriebe,
// dazu kommt noch der eigentliche Zeitbedarf für die Motorbewegung selbst...
// Bibliotheken
// keine...wir machen alles selbst...
// Definitionen
static const int A = 12; // mit Treiber PIN 1
static const int B = 14; // mit Treiber PIN 2
static const int C = 27; // mit Treiber PIN 3
static const int D = 26; // mit Treiber PIN 4
int i = 0; // allgemeine Zählvariable
// erste Einstellungen
void setup() {
Serial.begin(115200); //Verbindung zum seriellen Monitor in Arduino-Software
// MUSS der Einstellung dort entsprechen !!
pinMode(A, OUTPUT); // mit Treiber PIN 1
pinMode(B, OUTPUT); // mit Treiber PIN 2
pinMode(C, OUTPUT); // mit Treiber PIN 3
pinMode(D, OUTPUT); // mit Treiber PIN 4
digitalWrite(A, 0); // erst mal ausschalten
digitalWrite(B, 0); // erst mal ausschalten
digitalWrite(C, 0); // erst mal ausschalten
digitalWrite(D, 0); // erst mal ausschalten
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
delay(1000); // wartezeit 1 sek
} // Ende Setup
// eigentliche Arbeitsanweisungen - diese Schleife läuft ständig durch
void loop() {
// Drehrichtung RECHTS
// für 512 Ausführung = 1 Umdrehung des Getriebes 1/64
for (i = 0; i <= 512 ; i++) { // sollte eine Rechtsdrehung erzeugen
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
} // Ende Steuerschleife...rechts herum
// Drehrichtung LINKS
// für 512 Ausführung = 1 Umdrehung des Getriebes 1/64
for (i = 0; i <= 512 ; i++) { // sollte eine Rechtsdrehung erzeugen
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,1); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,1); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,1); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
digitalWrite(A,1); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
} // Ende Steuerschleife...links herum
// und IMMER wieder ausschalten
digitalWrite(A,0); // pin anschalten;
digitalWrite(B,0); // pin anschalten;
digitalWrite(C,0); // pin anschalten;
digitalWrite(D,0); // pin anschalten;
delay(3); // wartezeit mind. 3 millisekunden = 3/1000 sek
Serial.println("Runde beendet...");
delay(1000); // wartezeit 1 sek
} // Ende Loop
[/code]
Probiert es doch einfach aus...