Ansteuern von Schrittmotoren mit Arduino

Ein Arduino Controller kann verwendet werden, um eigenständige interaktive Objekte zu steuern oder um mit Softwareanwendungen auf Computern zu interagieren (z. B. Adobe Flash, Processing, diverse Skriptsprachen, Terminal etc.). Arduino wird beispielsweise auch an Kunsthochschulen genutzt, um interaktive Installationen aufzubauen. Die Hardware besteht aus einem einfachen I/O-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen. Die Entwicklungsumgebung verwendet die Programmiersprache Processing, die auch technisch weniger Versierten den Zugang zur Programmierung und zu Mikrocontrollern erleichtern soll. [Quelle: Wikipedia]

Um es Einsteigern in die Welt von Elektronik und Mikrocontrollern möglichst einfach zu machen, gibt es für die Arduino-Plattform eine große Vielfalt an steckbaren Erweiterungsmodulen, so genannte „Shields“. Auch für die Ansteuerung von Motoren sind diverse Shields erhältlich. Sie bestehen oft nur aus einem Treiberchip mit der minimalen Basisbeschaltung. Über die kleine Platine kann kaum Verlustleistung abgeführt werden, zudem fehlt es für größere Motoren an ausreichend dimensionierten Pufferelkos. Auch Schutzbeschaltungen (Kurzschlussschutz, Optokoppler in Richtung Controller) sind die absolute Ausnahme. Das Experimentieren mit Motoren kann so schnell zu einem frustrierenden Erlebnis werden, wenn mit den Motoren „reale“ Lasten angetrieben werden sollen. Im folgenden Beitrag wird gezeigt, wie man mit einem Arduino mit Hilfe der AccelStepper-Bibliothek über wenige I/Os nahezu alle Schrittmotorsteuerungen mit Takt-/Richtungsinterface ansteuern kann.

Zur Arduino Entwicklungsumgebung gehört auch eine einfache Bibliothek zur Ansteuerung von Schrittmotoren. Sie geht jedoch davon aus, dass die Motorwicklungen direkt oder mittels zwischengeschalteter Transistoren über die I/Os des Prozessors angesteuert werden (Verwendung von zwei Ausgängen je Motorwicklung, insgesamt 4 Ausgänge). Beschleunigungs- und Bremsrampen sind nicht vorgesehen. Durch diese einfache Ansteuerung lässt sich nur ein geringes Drehmoment bei niedrigen Drehzahlen erreichen. Die AccelStepper-Library unterstützt dagegen auch so genannte 2- und 3-Draht Interfaces sowie den Typ „Driver“. Gemeint ist damit die Ansteuerung von integrierten Treibern über Takt- und Richtungssignale. Es ist auch möglich, eigene Interface-Definitionen einzuführen, wie im Beispiel zu diesem Beitrag gezeigt wird. Wie der Name andeutet, implementiert die Lib außerdem Beschleunigungs- und Bremsrampen. Über die Bibliothek können zudem mehrere Motoren gleichzeitig angesteuert werden, was die Anwendungsmöglichkeiten von Arduino für Projekte mit Motoren deutlich erweitert.

Anschluss der Tiny-Step Endstufe an den Arduino Controller

Anschluss der Tiny-Step Endstufe an den Arduino Controller

Das Bild zeigt den Anschluss der Takt-Richtungsendstufe Tiny-Step II, welche auf dem A3979 von Allgero Micro basiert. Der Treiber realisiert Motorströme bis 2,25A bei bis zu 35V bei Mikroschritt-Auflösungen bis 1/16. Durch das durchdachte Kühlkonzept werden die genannten Leistungsdaten auch im Dauerbetrieb sicher erreicht. Der integrierte, selbstrückstellende Kurzschlussschutz sichert die Schaltung vor Schäden durch falsche Beschaltung. Neben den Anschlüssen für Takt und Richtung (grün und gelb) werden auch Ausgänge für Enable (Einschalten der Endstufe) und Stromabsenkung ausgegeben sowie ein Fehlersignal von der Endstufe über einen Eingang eingelesen. Diese Signale sind optional. Der fertige Aufbau ist im folgenden Bild zu sehen, angeschlossen ist ein Nema17 Motor mit 0,5Nm Haltemoment. Auch kleinere Nema23 Motoren können mit diesem Aufbau angesteuert werden.

Testaufbau mit Arduino, Tiny-Step und Schrittmotor von Nidec Servo

Testaufbau mit Arduino, Tiny-Step und Schrittmotor von Nidec Servo

Nach dem gleichen Prinzip und hier sogar mit der identischen I/O-Beschaltung lassen sich aber auch deutlich leistungsfähigere Endstufen an den Arduino anbinden. Das folgende Bild zeigt einen Aufbau mit einer Endstufe vom Typ LAM DS1078 (bis 14A bei bis zu 90V), die einen Nema34 Motor mit 3,1Nm antreibt. Die DS10-Serie ist eine industrietaugliche Serie von Schrittmotorendstufen mit SPS-kompatiblen I/Os. Durch den Einsatz dieser Kraftpakete ergeben sich mit dem Arduino ganz neue Möglichkeiten.

Testaufbau mit LAM DS1078

Testaufbau mit LAM DS1078

Das Programmierbeispiel (Arduino-Projekte werden auch Sketch genannt) ist auf Git-Hub frei zum Download verfügbar. Ich würde mich über Rückmeldungen zum Einsatz der Accellib freuen.

Tags: , , , , , , ,

29 Responses to “Ansteuern von Schrittmotoren mit Arduino”

  1. Günther sagt:

    Hallo ,
    bin sehr interessiert an ihren Produkten.
    Möchte gerne einen Drehteller mit Arduino Steuerung bauen ( drehende Schaufensterpuppe ).
    Was muss ich dafür kaufen ?.
    Und welche Software brauche ich um die Fotos automatisch zu schiessen haben sie damit Erfahrung ?
    Würde mich über eine Rückantwort freuen
    Mit freundlichen Grüßen Daniel

    • Hallo Daniel,

      mit einem Arduino-Board kann man jede Schrittmotor-Endstufe ansteuern, die Takt-Richtungssignale versteht, also z.B. die DS10-Serie von LAM oder meine Tiny-Step II, wie oben im Beitrag beschrieben.

      Halbautomatisiert lässt sich dass dann realisieren, wenn man statt des Arduinos meinen NC-Pilot USB verwendet. Das haben schon mehrere Kunden so im Einsatz. Darauf aufbauend habe ich für einen kunden eine vollautomatische Lösung entwickelt, die aber (bisher) nicht einzeln verkauft wird. Eingesetzt wird das bei diesem Fototisch.

  2. Rudi Rickli sagt:

    Guten Tag Herr Ostermann,
    ich hätte die Absicht 56 Schrittmotoren (Nema 8, mutmasslich zirka 0,2A) getaktet (bedingt synchronisiert) eine Aktion ausführen zu lassen:
    Auf das Taktsignal drehen alle Motoren eine individuelle Schrittzahl vorw-
    wärts und von da alle eine konstante Schrittzahl zurück.
    Dann folgt der nächste Takt mit einer anderen individuellen Schrittzahl vor-
    wärts und der gleichen vormaligen konstanten Schrittzahl zurück.
    Die Zahl der Takte beträgt zirka 140, die Taktzeit zirka 0,5 Sekunden. Die Vollschrittzahl pro Motor und Takt beträgt je maximal 1000 Schritte vor und zurück.
    Gibt es mit Arduino einen Lösungsansatz oder sollte man eine andere Lösung suchen?

    • Hallo Herr Rickli,

      was verstehen Sie unter „bedingt synchronisiert“? Wenn alle Motoren die gleiche Bewegung ausführen sollen, ist das relativ einfach. Dann reichen am Arduino ein Takt- und ein Richtungspin. Die Signale sollten allerdings noch über Bustreiber verstärkt und dann an die Motortreiber verteilt werden.
      Wenn die Schrittzahl für die Vorwärtsfahrt bei jedem Motor anders ist, ist es etwas aufwendiger. Dann wären 112 I/Os erforderlich (oder 57, falls man ein gemeinsames Richtungssignal verwenden kann).

      Für eine kommerzielle Anwendung würde ich eher zu Motorsteuerungen greifen, die über einen Bus synchronisiert werden können. Das wäre allerdings bei so vielen und so kleinen Motoren ziemlicher Overkill. Wenn Sie die Details der Anwendung nicht öffentlich diskutieren wollen, können Sie sich gerne auch per Mail an mich wenden.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  3. Stefan sagt:

    Hallo Thorsten,

    sehr interessanter Artikel, gerade für Einsteiger wie mich 😉
    Ich würde gern ein Absperrventil mit einem Schrittmotor mit ca. 1,5 Nm zu bzw. aufdrehen. Mir wurde da ein Angebot über einen Motor mit Leistungselektronik. Preislich leider nicht interessant.

    Den Motor möchte ich eigentlich über eine Beckhoff SPS steuern. Zum Ausprobieren aber auch gern über ein Arduino. Kannst Du mir einen Motor und evtl. Zusatzgeräte (Endstufe) dafür empfehlen. Oder Du ein gutes Forum an das ich mich wenden kann?

    Ich suche dann auch noch eine passende Wellenkupplung und ein Tutorial, wie man solche Geräte anschließt.
    Ich weiß viele Fragen aber jeder fängt mal an 😉

    Grüße
    Stefan

    • Hallo Stefan,

      was heißt denn „preislich nicht interessant“? Vielleicht kann ich Dir ein besseres Angebot machen? Du kannst Dich mit den Details gerne per E-Mail an mich wenden. Du schreibst nichts dazu, wie die Schnittstelle zur SPS aussehen soll, und ob der Motor nur die Endlagen anfahren soll, oder auch Positionen dazwischen. Grundsätzlich könnte die programmierbare Schrittmotorsteuerung DS3044 von LAM in Kombination mit dem Motor M12303070S8 oder dem PKP268D28B-L von Oriental Motor deine Anwendung abdecken.

      Beckhoff hat ja eigene Klemmen für Schrittmotoren, z.B. die EL7041. Für einzelne Achsen ist das keine schlechte Lösung. Bei Anwendungen mit vielen Achsen geht das natürlich ins Geld, und der Verdrahtungsaufwand ist auch nicht ohne. Ein Forum, in dem sowohl Beckhoff SPS als auch Antriebstechnik allgemein behandelt wird ist das SPS-Forum. Ich habe mit den Elastomer-Kupplungen von R+W gute Erfahrungen gemacht. Ähnliche Lösungen gibt es aber auch von anderen Anbietern.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  4. Rudi Rickli sagt:

    Guten Tag Herr Ostermann,
    ich habe mich über Ihre Nachricht sehr gefreut.
    Mein Projekt hat keinen unternehmerischen Hintergrund, aber ich habe dar-an gebastelt, bis ich nicht mehr loslassen konnte. Ich entwickelte ein mech-anisch perfekt funktionierendes System und möchte ihm schliesslich auch Energie „einhauchen.“
    Zu Ihren Fragen und Anregungen:
    Die 56, allenfalls 54 Motoren drehen gleichzeitig, bewegen sich aber um ver-schiedene Drehwinkel und von Fall zu Fall vor oder zurück.
    Mit „bedingt synchronisiert“ meinte ich, dass, falls man zum Beispiel 2 Pro-zessorboards verwenden müssten, der Prozess nicht auf den Schritt syn-chronisiert zu sein bräuchte.
    Die übrigen Parameter des Systems sind bekannt:
    Nema 8 (möglichst kurz, vielleicht 28mm), 0,2A, 800 Vollschritte pro Sekun-de, Anlauf ohne Last (vielleicht ohne Rampe), Taktzeit des Drehstartes zirka eine Sekunde bei einer Durchschnittsdrehung von 200 Schritten , Prozess-dauer zirka 70 Sekunden. Einschaltdauer des Systems max. 30%.
    Ich bin Maschinenbauer und habe Kenntnisse in Elektrotechnik. Programmier-en kann ich nicht. Wenn jemand für mich ein „Arduino“ programmierte, könn-te ich mich vielleicht auch einarbeiten. Meine Kenntnisse in Physik und Ma-thematik sind gut.
    Sagen Sie etwas dazu.

    Freundliche Grüsse
    Rudi Rickli

    • Hallo Herr Rickli,

      Ihre Rückfrage ist mir irgendwie durchgegangen, ich bitte um Entschuldigung. Wenn keine Schritt-genaue Synchronisation erforderlich ist, kann man das Problem ggf. auch mehrere Controller verteilen, die dann jeweils z.B. nur 8 Motoren ansteuern müssen. Die Controller kann man untereinander z.B. per RS-485 oder CAN vernetzen, dann kann man sie im Bereich einger Millisekunden synchronisieren. Für so ein Projekt würde ich dann aber nach Möglichkeit auf den Einsatz des Arduino-Frameworks verzichten und direkt mit C-Code auf dem µC arbeiten.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  5. Stefan sagt:

    Hallo Thorsten,

    hab jetzt auch Dank Deiner Hilfe eigentlich so weit die Komponenten zusammen. Gerade eine Lösung für den Anschluss Vielzahn zu finden war nicht einfach.
    Als ich dann jetzt den Schrittmotor Nidec Servo KH56QM2-951 und Tiny-Step.plus II f. Hutschiene, 2,25A Mikroschritt-Endstufe bei Dir bestellen wollte ist mir aufgefallen, dass ich gar keine Stromversorgung habe.

    Welche Stromversorgung mit welcher Leistung würdest Du denn für dafür empfehlen?
    Fehlt mir sonst noich etwas um einen Testaufbau mit dem Arduino zu machen (abgesehen von den Kabel zum verbinden)?

    Grüße
    Stefan

  6. Uwe sagt:

    Hallo Herr Ostermann,
    ich möchte mit einem Arduino mit Schrittmotor ein Gewicht von ca. 1,5 kg zeitgesteuert hochziehen (ca 50cm) dann halten bis es wieder abgelassen wird.
    Können Sie mir einen Motor und die Steuerung dafür empfehlen?
    Vielen Dank
    Uwe

    • Hallo Uwe,

      wie schnell soll denn der Hebevorgang ablaufen? Und wie soll der Ablauf gesteuert werden? Denkbar wäre z.B. mit einem Puls zur Aktivierung einer Fahrt, Rückfahrt über einen weiteren Puls (ggf. über einen anderen Eingang) oder zeitgesteuert…

      Mit freundlichen Grüßen
      Thorsten Ostermann

  7. Jan sagt:

    Hallo Herr Ostermann,

    ich möchte mir ein System bauen, wobei ein Schrittmotor eine Gewindespindel antreibt, um ein dort befestigtes 1kg Objekt in präzisen Schritten hochzuziehen. Da ganze wollte ich aus kostengründen mit einem Arduino ansteuern, aber irgendwie komme ich nicht weiter. Ich habe folgendes Problem, gedankliche Blockade: Zunächst finde ich im Internet nur Schrittmotorsteuerungen mit Arduinos und Potentiometern zur Geschwindigkeitsregelung. Das drehen des Potentiometers möchte ich aber vermeiden und den Motor durch Code steuern. Ihr Artikel erwähnt keinerlei Potentiometer, was mich hoffen lässt, dass ich es ohne geht. Wandelt Tiny Step die Signale vom Arduino um? Nun zur nächsten Frage : So wie ich Arduinos verstehe programmiert man sie und der Code wird ausgeführt. Nun würde ich gerne Parameter ändern, ohne in den Code einzugreifen. Sozusagen eine PC zu Arduino Schnittstelle, bzw. Abfage, wobei vor dem Start die Parameter eingetragen werden müssen.

    Ich hoffe Sie können mir auf die Sprünge helfen.

    Mit freundlichen Grüßen
    Jan

    • Hallo Jan,

      die Tiny-Step wird über die Takt-/Richtungsschnittstelle gesteuert, die bei Schrittmotorsteuerungen den Quasi-Standard darstellt. Der Arduino muss also für jeden (Mikro)-Schritt, den der Schrittmotor machen soll, auf der Taktleitung einen Puls generieren. Die Vorgabe der Drehzahl an den Arduino kann aus dem Code, über einen analogen Eingang oder über eine beliebige andere Schnittstelle (z.B. USB) erfolgen. Wenn man Positionieren will, wird statt dessen die Position vorgegeben (dafür ist ein analoger Eingang nur in Ausnahefällen sinnvoll). Die Endgeschwindigkeit und die Beschleunigung können wahlweise fest vorgegeben sein oder ebenfalls über die Schnittstelle dynamisch angepasst werden. Das geht aber vom Funktionsumfang über das von mir bereitgestellte Beispiel hinaus.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  8. Timo sagt:

    Hallo Herr Ostermann,

    ich würde gerne diesen Motor

    https://nodna.de/NEMA-23-Bipolar-Praezisions-Schrittmotor-mit-15-1-Gearbox

    über einen Arduino betreiben, nur habe ich noch nicht die passende Vorstufe gefunden.

    Mit freundlichen Grüßen
    Timo

    • Das ist ein normaler Nema23-Motor mit Getriebe. Allerdings scheint der Anbieter selbst nicht genau zu wissen, was er da verkauft. Mal heißt es „Geschätzte Stromstärke: 2,8A“ (!), mal 3,0A. Auch das Ausgangsdrehmoment von 14,7Nm halte ich für sehr optimistisch. Da ist wohl von einem idealen Getriebe-Wirkungsgrad ausgegangen worden.
      Den Motor kann man z.B. mit der DS1044 von LAM ansteuern.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  9. Markus sagt:

    Hallo Herr Ostermann,

    ich würde gern folgenden Motor mittels Arduino ansteuern:
    https://www.conrad.de/de/schrittmotor-emis-sm-2862-5055e-70-nm-20-a-wellen-durchmesser-140-mm-196964.html
    Können Sie mir Netzteil empfehlen und kann ich Ihre TinyStep2 Endstuffe hierfür benutzen?

    Vielen Dank
    Markus

    • Hallo Markus,

      der verlinkte Motor ist ein Nema34-Motor. Das der nur 2,0A benötigt ist eher ungewöhnlich, hohe Dynamik ist da nicht zu erwarten. Da die Tiny-Step nur 1,6A Nennstrom bereit stellen kann und auch mit max. 35V arbeiten kann, würde ich für diesen Motor eher die DS1044 empfehlen.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  10. Christian sagt:

    Hallo Herr Ostermann,

    Ich möchte gerne mehrere Schrittmotoren nahezu gleichzeitig per Taster ansteuern.
    Leider komme ich bei der Programmierung hierbei nicht weiter und würde mich über Tipps oder Lösung von Ihnen sehr freuen

    MfG
    Christian

    • Hallo Christian,

      deine Anfrage ist sehr unspezifisch. Ich nehme mal an, die Frage bezieht sich auf die Ansteuerung mit einem Arduino? Aber wo klemmt es da genau? Was sollen die Antriebe tun? Müssen die Achsen synchronisiert sein? Dann wäre die AccelStepper.Lib ggf. nicht die richtige Lösung.

      Mit freundlichen Grüßen
      Thorsten Ostermann

      • Christian sagt:

        Hallo Herr Ostermann,

        ich versuche mich kurz zu fassen
        Taster 1= 1 Schritt Motor 1
        Taster 2= 2 Schritte Motor 1
        Taster 3= 3 Schritte Motor 1

        Das ganze mit einem Arduino gesteuert und gleichzeitig für 6 Motoren,
        bis einer der sechs einen Endlagenschalter betätigt, nach einer kurzen Pause sollen alle Motoren in Ihre Startposition fahren(unabhängig davon wieviele Schritte ein Motor dabei gemacht hat)
        Zur Registirung der Startposition würde ich ebenfalls einen Endlagenschalter verwenden
        Startfreigabe für alle Motoren über einen separaten Taster(allerdings erst, wenn alle Motoren die Startposition wieder erreicht haben)

        Ich hoffe, dass ist so verständlich
        MfG
        Christian

  11. Franziska sagt:

    Guten Abend,

    ich habe evenfalls vor den Schrittmotor mit dem Arduino anzusteuern.

    Kann man jeden beliebigen bipolaren Schrittmotoren verwenden?

    Wo kann man den am besten kaufen ?

    Liebe Grüße

    • Hallo Franziska,

      man kann jeden beliebigen bipolaren oder unipolaren Schrittmotor nehmen, aus Sicht der Software macht das keinen Unterschied. Der Motor sollte für die Anwendung genug Drehmoment bei der gewünschten Drehzahl liefern. Die Schrittmotorsteuerung muss zu dem Strombedarf des Motors und der erforderlichen Versorgungsspannung passen.

      Anbieter für Schrittmotoren und Schrittmotor-Steuerungen gibt es wie Sand am Meer. Gute Beratung bekommt man aber nicht überall, weswegen ich diesen Blog betreibe. Meine Angebote finden Sie unter mechapro.de

  12. Gerald sagt:

    Hallo Hr. Ostermann,
    ich würde gerne einen Nema mit Arduino UNO, genau wie in Ihrer Darstellung betreiben, bräuchte aber dazu ein Programm!
    es sollten über Endschalter zwei verschiedene Drehzahlen und Drehrichtungen anwählbar sein(Eilgang und Positionierung)!
    Dabe sollte der Weg mittels Schrittzahl parametriert werden können!
    Also: Wenn Eingangx 1 wird, dann fahr rechts oder links mit Drehzahl1 x, 4000 Schritte, dann schalte um auf Drehzahl2 x, fahre 200 Schritte bis Endlage erreicht (Eingang2 wird 1
    So in etwa sollte der Ablauf sein für 2 unabhängige Motoren! Können Sie mir dabei behilflich sein?
    Besten Dank im Voraus Gerald

  13. Gerald sagt:

    Ich muss noch zum vorigen Kommentar ergänzen, dass zu meiner Steuerung ein externer Controller LAM DS…. Verwendung findet!
    Gerald

    • Um welches Gerät von LAM handelt es sich denn? Die DS10-Serie wird angesteuert wie im Beispiel beschrieben. Die DS30-Serie hat ja eine eigene Positionierlogik. Welche I/Os dafür benötigt werden hängt davon ab, wie das Anwenderprogramm im Gerät aussieht.

      Mit freundlichen Grüßen
      Thorsten Ostermann

  14. Gerald sagt:

    Hallo,
    ich habe mir überlegt einen DS1041 mit dem kleinsten Strombereich zu verwenden, der würde für meine Anforderungen reichen, als Alternative habe ich mir auch noch überlegt eventuell auch ein Standartteil wie „Power Step PSD5042-2P“ zu verwenden weil ich so einen noch rumliegen habe!
    Aber ich bringe schon ihr Beispielprogramm nicht auf meinen UNO R3 zu laden!
    geht das überhaupt wenn Ihr Programm für einen Tiny geschrieben wurde??

    Danke für Info, Gruß Gerald

    • Das Beispiel passt für alle Schrittmotorsteuerungen, die mit Takt-/Richtungssignalen angesteuert werden. „Tiny-Step“ ist der Produktname einer der im Beispiel verwendeten Schrittmotorsteuerungen. Der Code ist für einen Arduino Uno geschrieben.

      Kostenlosen Support für Arduino-Projekte kann ich allerdings nicht leisten. Hier möchte ich auf Arduino-Foren oder auf Mikrocontroller.net verweisen.

Leave a Reply