Forum: Mikrocontroller und Digitale Elektronik Wie viele Schrittmotoren kann ich über einen ESP32 ansteuern?


von T. (tristan04)


Lesenswert?

Guten Abend, ich möchte gerne über den Winter einen kleinen Roboterarm 
entwerfen und am 3D-Drucker Drucken. Dieser soll 6 Achsen haben also 
müsste ich über den Esp 32 6 Schrittmotoren ansteuern. Theoretisch 
brauche ich dafür dann 24 GPIO Pins und diese müsste der ESP 32 S2 Mini 
ja haben oder sehe ich das falsch? 😅

Vielen Dank schonmal für die Antworten.

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Warum so viele GPIOs? Du brauchst sowieso Treiber, also reicht ein Dir 
und ein Step pro Motor. Also 12.

von Michael B. (laberkopp)


Lesenswert?

T. schrieb:
> Roboterarm entwerfen und am 3D-Drucker Drucken. Dieser soll 6 Achsen
> haben also müsste ich über den Esp 32 6 Schrittmotoren

Hmm, Roboterarme und Schrittmotoren, schlechte Kombination.

Du weisst nicht welche Kraft der Arm aufbringen muss weil Schrittmotore 
immer mit vollem Strom versorgt werden und du bist auf einen engen 
Drehzahlbereich eingeschränkt, kann nicht mal schnell unbelastet 
verfahren. Drückt jemand den Arm weg oder blockiert er, weisst du die 
Position nicht mehr

Du willst DC Gleichstrommotore mit Getriebe und Incrementalenencider, 
aber kein Schneckengetriebe. Und du willst nicht nur Richtung und 
Geschwindigkeit steuern, sondern Maximalstrom festlegen und realen Strom 
messen, pro Motor, dazu die Encoderposition und ggf. noch die 
Motortemperatur. Alternativ Gimbal BLDC.

Du brauchst also eher 2 Analogausgänge, 2 Analogeingänge (Strom und 
Temperatur), 1 Digitalausgang falls die Richtung nicht im Analogsignal 
(negativ) steckt und 2 Digitaleingänge pro Motor. Ein ESP32 ist 
vollkommen ungeeignet.

Motore mit Encoderscheiben gibt es günstig in Tintenstrahldruckern, z.B. 
Canon und die gibt es ja täglich im Schrott.

von J. S. (jojos)


Lesenswert?

Es gibt eine Firmware FluidNC die steuert 6 Achsen und es gibt auch 
schon passende HW dazu:
http://wiki.fluidnc.com/en/hardware/existing_hardware

SM werden auch in Roboterarmen verwendet, bei den Antrieben die ein 
hohes Drehmoment brauchen dann mit Planetengetriebe, Harmonic Drive oder 
Cycloid Getriebe. Kann man mit dem 3D Drucker bauen, das sind aber keine 
Anfängerprojekte.

Auch gut sind die SM Treiber die direkt an den Motor angeflanscht werden 
und ein Businterface wie RS485 oder CAN haben. Suche nach MKS Servo.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

T. schrieb:
> Dieser soll 6 Achsen haben also müsste ich über den Esp 32 6 Schrittmotoren
> ansteuern. Theoretisch brauche ich dafür dann 24 GPIO Pins
Warum brauchst du dafür 24 Pins? Da nimmt man fertige Treiber und 
steuert die über Impuls/Richtung an.

> Theoretisch brauche ich dafür dann 24 GPIO Pins und diese müsste der ESP
> 32 S2 Mini ja haben oder sehe ich das falsch?
Die Pinanzahl wird dein kleinstes Problem sein. Mach dir eher mal über 
"benötigte Rechenzeit", "Echtzeit", "Interruptreaktionszeiten" und 
"Jitter" Gedanken. Und steure zu Beginn einfach mal 1 einzigen 
Schrittmotor an.


> ich möchte gerne über den Winter einen kleinen Roboterarm entwerfen
Welche Erfahrung hast du in die Richtung der grade erwähnten Stichworte 
bereits? Könnte sein, dass da ganz schnell mehrere Winter draus 
werden...

Merke: auch wenn es etwas für kleines Geld an jeder Ecke zu kaufen gibt, 
bedeutet das nicht, dass man das alleine ohne Erfahrung so nebenher in 
den Winterferien auch hinbekommt.

von Brax (brax09)


Lesenswert?

Wenn Du ein wenig rumbasteln willst ist aus dem Character der Frage 
evtl. ein PCA9685 Modul von den üblichen Shops mit einer Hand voll 
Servos ausreichend - da kannst Du 16 Kanäle (Servos) über 2 Pins (I2C) 
ansteuern. Simpel aber zum Spielen reicht es. Wenn es solide sein soll 
sind andere Lösungen gefragt, die Dir hier genügend Leute erklären 
werden - melde Dich schon mal zum Maschinenbau-, Elektrotechnik- und 
Informatikstudium um komm dann wieder: aber bloß nicht unter Master! ;-)

von F. (radarange)


Lesenswert?

Ihr seid schon echt unmöglich. Es ist völlig klar, dass es hier um ein 
spaßiges Bastelprojekt geht, nicht um industriellen Einsatz.
Also lasst die Leute lernen, stattdessen kommen hier neunmalkluge 
Empfehlungen und Entmutigung. Kein Wunder, dass kaum jemand Lust hat, 
sich mit solchen Dingen zu beschäftigen, wenn man dermaßen schlechte 
Hilfe bekommt.
Es ist natürlich auch offensichtlich, daß hier seitens des 
Threaderstellers noch größere Wissenslücken vorherrschen, aber diese 
lassen sich ja schließen.

Der Schrittmotor kann, wie bereits erwähnt, nicht direkt an den ESP32 
angeschlossen werden, es wird ein Motortreiber benötigt, der auch die 
notwendige Leistung schalten kann. Wenn es nicht gerade darum geht, eine 
Motoransteuerung zu entwickeln, kann man sich den Aufwand sparen und 
direkt einen integierten Motortreiber verwenden, dem man nur noch die 
Bewegungsrichtung vorgeben muss und dann für jeden Schritt einen Puls 
senden. Die gibt es mittlerweile gut und günstig auf kleinen 
Breakout-Platinen, hier mal ein paar konkrete Modellvorschläge: A4988, 
DRV8825, TMC2209. In Details unterscheiden die sich natürlich, aber in 
den Grundfunktionen sind sie ähnlich.

von T. (tristan04)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die vielen Antworten. Ja es soll eher ein Bastlerprojekt 
gehen, welches ich über Esp Home oder einen Joystick steuern will. Ich 
habe bereits einen Schrittmotor 28bjy-48 mit ULN 2003 Treiber Platine 
angesteuert. Diese Treiberplatine hat 4 Pins zum ansteuern, daher kommen 
auch die 24 GPIO Pins zustande. Den Arm mache ich hauptsächlich zum Spaß 
und er sollte auch möglichst günstig sein. Ein paar von diesen 
Schrittmotoren hatte ich noch rumliegen, daher meine Wahl des 28bjy-48. 
Mir ist bewusst, dass dieser keinen nenneswerten Drehmoment hat, aber um 
sich mal in dieser Richtung zu Versuchung reicht es denke ich.

Damit ihr mal ein ungefähres Bild dabei liegen habt füge ich eine Idee, 
welche ich gefunden habe ein. Aber wie bereits erwähnt würde ich gerne 
selbst etwas entwerfen.

Daher bleibt meine Frage, habe ich mit dem ESP 32 bzw S2 mini die 
Möglichkeit die 6 ULN 2003 anzusteuern?

Der Link zu dem Foto:

https://www.myminifactory.com/de/object/3d-print-arduino-robotic-arm-117926

von Rüdiger B. (rbruns)


Lesenswert?

https://de.aliexpress.com/item/1005008202785732.html
Da ist alles drauf.
Aber für Bipolare Schrittmotoren, dafür brauchst du also Schrittmotoren 
mit 4 oder 6 Anschlüssen.
Deiner hat aber 5 Anschlüsse.

: Bearbeitet durch User
von T. (tristan04)


Lesenswert?

Also ist es  nicht möglich die 6 ULN 2003 über den ESP 32 anzusteuern?

von F. (radarange)


Lesenswert?

T. schrieb:
> Also ist es  nicht möglich die 6 ULN 2003 über den ESP 32 anzusteuern?

Natürlich ist das möglich, die Frage ist nur, ob es sinnvoll ist.
Ich befürchte, dass du dich bereits auf irgendwas festgelegt hast und 
davon partout nicht abweichen willst, aber wenn wir dir das mal nicht 
unterstellen, dann gibt es einige Möglichkeiten.
Es gibt jetzt verschiedene Herangehensweisen, dieses Problem zu lösen. 
Wir nehmen an, dass ein ESP32 auf deinem bevorzugten Entwicklungsboard 
nicht genügend Ausgänge hat.
- Man könnte nun Porterweiterungen einsetzen, die beispielsweise per I2C 
(langsam) oder SPI (schneller) angebunden sind. Vorteil: Deine 
bestehenden Motoren und Treiber können genutzt werden. Nachteil: Viel 
weitere Hardware notwendig, wahrscheinlich weitreichende 
Softwareanpassungen notwendig, wahrscheinlich kann die maximale 
Verfahrgeschwindigkeit der Motoren nicht mehr erreicht werden.
- Man könnte jedem Motor seinen eigenen Billig-Microcontroller 
spendieren (einen der neueren Attinys, CH32V003, ...), der sich um 
nichts anderes kümmert als die Ansteuerung des Motors. Diese können dann 
z.B. per I2C oder serieller Schnittstelle an den ESP32 angebunden 
werden. Vorteil: Extreme Flexibilisierung der Hardwarekonfiguration, da 
die Motorsteuerung und die Bewegungssteuerung nun getrennt voneinander 
sind. Nachteil: Ein gewisser Entwicklungsaufwand ist notwendig.
- Man könnte mehrere ESP32 verwenden und im Programm einen Modus 
einbauen, mit dem der zweite ESP32 nur Motorsteuerungsbefehle empfängt 
und die Motoren dann entsprechend ansteuert. Die Logik dafür brauchst du 
beim ersten ESP32 ja sowieso, der Programm-Modus könnte durch einen 
Jumper ausgewählt werden. Vorteil: Keine separate Softwareentwicklung 
notwendig, kostengünstige Lösung. Nachteil: Softwareentwicklung wird 
durch die Notwendigkeit, mit dem anderen ESP32 komplex zu kommunizieren, 
verkompliziert.
- Anstatt alle Motoren gleichzeitig anzusteuern, könntest du Motoren 
oder Motorgruppen multiplexen. Wenn alle im Multiplexbetrieb gefahren 
werden, brauchst du nur noch 4 + 6 Ausgänge, anstatt 4*6. Vorteil: 
Weniger Ausgänge benötigt. Nachteil: Sehr aufwendige 
Hardware-Beschaltung fürs Multiplexing, es können nicht mehr alle 
Motoren gleichzeitig betrieben werden, komplizierte Software.
- Oder du könntest deine Schrittmotoren austauschen und vollintegrierte 
Treiber für bipolare Schrittmotoren verwenden. Die haben alles 
integriert, was man will, können (im Gegensatz zu deinem 
Darlington-Array) die Motoren optimal treiben und haben extern eine 
einfache step/direction-Schnittstelle. Vorteil: Deutlich bessere 
Performance, Softwareentwicklung vereinfacht sich. Sehr günstige Treiber 
verfügbar. Nachteil: Neue Motoren notwendig.

So, und jetzt darfst du entscheiden. Was soll's denn sein?

von T. (tristan04)


Lesenswert?

Vielen Dank für deine wirklich sehr detaillierte Auflistung. Ich möchte 
es eigentlich möglichst unkompliziert halten, da ich mich erst wieder in 
das Thema einarbeiten muss. Ich habe derzeit ESP32 DEV Kit C V4 von 
Az-Delivery oder ein S2 mini zur Verfügung. Mir geht es grundsätzlich 
erstmal um die Frage, ob die Anzahl der Ausgänge auf den 
Entwicklungsboards ausreichen würde.

Es gibt bestimmt sinnvollere Möglichkeiten, aber diese sind denke ich 
mit meinem Wissensstand nicht so einfach möglich.

Da ich die oben genannte Kombi schon am laufen hatte (zumindest 1 
Schrittmotor) ist meine Idee drauf gefallen. Sie scheinen auch ein wenig 
robuster zu sein als die Servos(9g Micro Servos), die ich daheim hab.

Mein Ziel ist es eigentlich mit den Mitteln, welche ich bereits habe, 
das Projekt zu realisieren.

anbei die links zu den Entwicklungsboards:
https://www.az-delivery.de/products/esp-32-dev-kit-c-v4
https://www.az-delivery.de/products/esp32-s2-mini?_pos=1&_sid=caf31e2e1&_ss=r

von F. (radarange)


Lesenswert?

Es ist verständlich, dass du dein Projekt mit dem realisieren willst, 
was du bereits hast. Allerdings: Besonders geschickt ist das nicht, das 
muss dir bewusst sein.
Es wird eine nette Übung sein, aber deutlich komplexer als notwendig und 
es wird hinter den Möglichkeiten zurückbleiben, weil dich deine 
vorhandene Hardware einschränkt. Gerade wenn du auch noch deinen Arm 
designen und drucken willst, ist es vielleicht geschickt, jetzt mit 
einem einfacheren Modell anzufangen und die vorhandene Hardware zu 
nutzen (vielleicht 4 Achsen: Ein Motor zum Rotieren des Aufbaus, zwei 
Motoren für den Arm, 1 Motor für den Greifer?) und dann später dein 
sechsachsiges Modell mit besser geeigneten Komponeten umzusetzen. Du 
wirst auch so relativ viel lernen und kannst schon einmal die Software 
modular und erweiterbar gestalten, das ist Arbeit genug.

Nun zur Verwendung deiner bisherigen Hardware, wenn du unbedingt jetzt 
deinen sechsachsigen Arm realisieren willst: Das Devkit hat vielleicht 
genügend I/O-Pins, ich zähle 26, dann passen deine 6 Motoren und ein 
Joystick mit 2 Achsen gerade so dran. Oder eben deine 6 Motoren und ein 
I2C zur Kommunikation. Zum Flashen wirst du die UART-Pins irgendwie mit 
Jumpern ausrüsten müssen, die werden wahrscheinlich benutzt werden 
müssen. Debugging geht dann auch relativ schlecht. Ansonsten musst du 
auf bedrahtete Kommunikation verzichten und kannst z.B. deine 6 Motoren 
plus den UART zum Debugging/Flashen betreiben. Die Steuerung des Arms 
muss dann per WLAN erfolgen.
Du wirst also wahrscheinlich sowieso beide Boards nutzen müssen. Wie du 
die Funktionalität dann aufteilst, ist dir überlassen.

von Frank K. (fchk)


Lesenswert?

T. schrieb:

> Daher bleibt meine Frage, habe ich mit dem ESP 32 bzw S2 mini die
> Möglichkeit die 6 ULN 2003 anzusteuern?

Wer richtig Plan von der Sache hat, der bekommt das sicher hin. Der 
hätte aber von vornherein einen anderen Weg und andere Komponenten 
gewählt.

Ja, die theoretische Möglichkeit besteht. So wie Du fragst, wird das 
aber wohl nicht. Solange wie Du noch nicht genug Ahnung von der Sache 
hast, solltest Du tunlichst erst fragen und dann kaufen. Dann kommt mehr 
bei rum.

fchk

von Knut _. (_knut_)


Lesenswert?

Ich gehe davon aus, dass du aktuell 28bjy-48 mit ULN 2003 Treiber hast.
Dann würde ich vorschlagen mal nur einen Motor über den ULN 2003 
anzusteuern. Das geht sehr einfach.
Dann wirst du sehen, dass es sehr schwierig ist damit etwas anzufangen.

Für die 28bjy gibts es aber einen einfachen Patch um diese 4Polig mit 
ordentlichen Treibern zu steuern:
https://everythingsmarthome.co.uk/converting-the-28byj-48-stepper-motor-for-more-torque/

Dann investierst du ein paar € in einen der folgen Treiber je Motor
A4988, DRV8825, TMC2209

Ich würde für 6 Achsen 2 so grbl arduino boards nehmen:
https://howtomechatronics.com/tutorials/how-to-setup-grbl-control-cnc-machine-with-arduino/
Mit dem ESP32 lassen sich die 2 Boards bequem per G Code fernsteuern.
Kostet nicht die Welt und auch keine Raketenwissenschaft.

von T. (tristan04)


Lesenswert?

Vielen Dank für die Antworten. Das hat mir auf jeden Fall sehr geholfen. 
Ich denke ich werde es erstmal bei 4 Stück belassen und schauen, wie gut 
das klappt.  Ich denke das sollte mit den Sachen, welche ich vorhanden 
habe gut klappen und ich lerne dabei bestimmt einiges um dann irgendwann 
mit anderen Komponenten einen großen Bruder zu bauen ;)

von Rüdiger B. (rbruns)


Lesenswert?

Dieser NEMA17 Motor ist Preiswert:
https://www.pollin.de/p/minebea-schrittmotor-17pm-k077bp01cn-10-2v-0-3a-1-80-310689
und wenn du sowieso Drucken musst:
https://www.thingiverse.com/thing:2780513
oder andere aus dem Thingiverse.

von Stephan (stephan_h623)


Lesenswert?

T. schrieb:
> Theoretisch
> brauche ich dafür dann 24 GPIO Pins und diese müsste der ESP 32 S2 Mini
> ja haben oder sehe ich das falsch? 😅

Sollte grade so hinhauen.
Aber ist damit dann auch quasi nichts mehr sonst an IO möglich. Mir wärs 
zu knapp, und weiß grade nicht, ob der OTA-Updates kann und ob der 
Speicher dafür reichen wird.
Grobe Steuerung und Debugging geht zur Not per WLAN, aber alles auf 
Kante.

Lothar M. schrieb:
> Die Pinanzahl wird dein kleinstes Problem sein. Mach dir eher mal über
> "benötigte Rechenzeit", "Echtzeit", "Interruptreaktionszeiten" und
> "Jitter" Gedanken. Und steure zu Beginn einfach mal 1 einzigen
> Schrittmotor an.

Dürfte mit manueller Steuerung und in dem Rahmen unproblematisch sein.
Die Punkte greifen aber natürlich massiv wenn "exakte" Bahnen mit den 6 
Achsen abgefahren werden sollen. Und dann auch noch möglichst schnell 
...

von Max (max_u)


Lesenswert?

Es ist ein Bastelprojekt für die Tage zwischen den Jahren. Der wird 
nicht 6-Achsen mit 100k Schritten/s präzise fahren wollen.

32>24, als sind genug GPIO pins da. 8 bleiben noch übrig, da kann man 
auch noch ein paar Knöpfe oder nen Joystick spendieren.

Go for it. Es ist dein Projekt.

Die anderen haben natürlich recht, dass es im ganzen keine besonders 
sinnvolle Umsetzung ist, weil vernünftige Treiber einfacher und mit 
weniger Pins gesteuert werden können, du keine Positionsrückmeldung hast 
und die Motoren auch nicht die besten sind.

Aber du hast ja schon alles da oder? Und willst das nur noch 
zusammenlöten, Mechanik bauen und Software schreiben.

Software wird sicherlich das komplizierteste, wenn du mehr als eine 
Achse zur Zeit steuern willst. Vielleicht gibts ja aber auch ein 
fertiges Projekt irgendwo, dass sich für deine Zwecke anpassen lässt...

von T. (tristan04)


Lesenswert?

Ja da hab ich mich eventuell auch etwas umständlich ausgedrückt. Die 
Teile hab ich eigentlich schon daheim(aus anderen Projekten) und es soll 
wirklich nicht extrem aufwendig werden. Mir reicht es vollkommene, wenn 
die Bewegungen nacheinander ausgeführt werden.

Wie gesagt ich probiere erstmal die 4 Achsen aus und schau, wie ich 
dabei zurecht komme bzw was ich dabei lerne.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Spendiere einfach jedem Schrittmotor einen eigenen adressierbaren 
Treiber bzw. Subsystem, dann brauchst du am Zentral-Prozessor nur eine 
Schnittstelle/Bus (Serial, I2C, LAN ...). Kann man auch mit je einem 
8266 und Simpel-Treiber selber machen, dann ist man völlig frei 
bezüglich Schnittstelle und Protokoll.

Sowas kann man dann auch besser in Betrieb nehmen, weil einzeln zu 
erstellen und zu testen.

Beispiel:

https://www.reichelt.com/ch/de/shop/produkt/arduino_-_grove_i2c-motortreiber_l298-191248

Nachtrag: Wenn du einen einfachen Einstieg willst, probiers erstmal mit 
Servos. Digitale Servos halten übrigens ihre Position auch dann, wenn 
die Impulse mal ausbleiben. Das vereinfacht die Programmierung deutlich 
...

: Bearbeitet durch User
von Bernhard S. (b_spitzer)


Lesenswert?

Hallo,
der Schrittmotor 28bjy-48 hat ein Getriebe mit einer recht krummen 
Untersetzung (die im Datenblatt angegebenen Schritte pro Umdrehung sind 
falsch).
Mit dem mehrstufigen Getriebe hat der Motor 
64*((22*26*31*32)/(9*9*10*11)) Halb-Schritte. Das ergibt dann 
1650688/405 = 4075.77 Schritte oder gerundet:
const int stepsPerRevolution = 4076;      // NOT 4096 half-steps...

Eine parallele Ansteuerung mit 6x4 Leitungen wäre mit dem ESP32-S3 
möglich, der hat mehr Pins. Oder über I2C-Portexpander (3x PCF8574) oder 
über 3 Schieberegister 74HCT595 (Arduino-Funktion ShiftOut).
Alternativ könnte man auch einen L297 pro Motor-Treiber verwenden, der 
hat dann am Eingang wieder die Steuerung über Step/Dir - aber das ist 
bei dem Motor mit Kanonen auf Spatzen geschossen...

Wenn du für den Anfang bei 4 Motoren bleibst, wären 2x PCF8574 oder ein 
PCA9555 (oder der schon erwähnte PCA9685 - dann mit 0/100% PWM als 
digitaler I/O) am einfachsten anzusteuern.
Schieberegister brauchen ein paar Portpins mehr als I2C, die hätten aber 
den Vorteil, dass man über gleichzeitige Ansteuerung der Output-Latches 
(Pin RCLK) die Ausgabe bei allen Motoren zeitgleich umschaltet.

von Rainer W. (rawi)


Lesenswert?

Rüdiger B. schrieb:
> Aber für Bipolare Schrittmotoren, dafür brauchst du also Schrittmotoren
> mit 4 oder 6 Anschlüssen.
> Deiner hat aber 5 Anschlüsse.

Kannst du bitte auch erklären, wie du dazu kommst?
Halbschritt und Vollschrittbetrieb ist ohne Probleme auch mit einem 
Motor möglich, bei dem die Mittenanzapfungen verbunden sind. Man muss 
lediglich eine doppelte so hohe Spannung anlegen.

Der ULN2003 ist sowieso etwas antiquiert. Heutige Schrittmotortreiber 
verwenden Stromregelung, damit das Drehmoment bei höherer Drehzahl nicht 
so früh einbricht.

Bernhard S. schrieb:
> Das ergibt dann
> 1650688/405 = 4075.77 Schritte oder gerundet:
> const int stepsPerRevolution = 4076;

Bei der Ansteuerung von Schrittmotoren die Schrittzahl/Untersetzung zu 
runden, führt bei sensorlosem Betrieb unweigerlich zu sich 
akkumulierenden Positionierungfehlern, sofern der Motor nicht nur hin- 
und zurück gedreht wird. Das ist meist keine gute Idee.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.