NEMA 34 CL Schrittmotor mit Endstufe mittels Arduino ansteuern

Guten Tag Liebe Community

Ich habe mich hier angemeldet da ich für ein Schulprojekt einen Schrittmotor ansteuern muss, kenne mich elektrotechnisch gut aus aber programmiertechnisch mit dem Arduino komme ich nicht so ganz klar.

Ich hab schon einige Led Schaltungen und Grundlagen Programmiert jedoch komme ich mit meinem Schrittmotor nicht zum fahren so wie ich es möchte
Daher wende ich mich hierhin ob mir jemand vllt. den grundlegenden Code schreiben Könnte den ich selbst nur etwas abändern müsste (Steps und Delay Zeiten)

**Aufgaben wäre folgende: **

1:
Wenn der Arduino ein Input 1 Signal bekommt soll sich der Stepper zb um 3600 schritte (1U=800Impulse) innerhalb einer von mir vorgegebenen zeit (zb 3000ms)
danach stehen bleiben (1000ms)
dann wieder 3600 schritte zurückfahren (in 3000ms)
stehen bleiben(1000ms)
und das ganze sollte in nem loop ablaufen, bis ich das High Signal auf input 1 wegnehme.

2:
Wenn ein Signal auf input 2 kommt soll der stepper sich solange das Signal anliegt um 1000 impulse pro Sekunde in Richtung A weiterdrehen bis das Signal weg ist

3:
Wenn ein Signal auf input 3 kommt soll der stepper sich solange das Signal anliegt um 1000 impulse pro Sekunde in richtung B weiterdrehen bis das Signal weg ist

bei der Motor Endstufe habe ich folgenede Eingänge:

PULSE (ich weiß nicht wie ich HIGH impulse in einer gewissen zeit ausgeben kann....)
DIRECTION (High oder LOW Drehrichtung)
ENABLE (freigabe das der Motor läuft)

Welche Pins beim Arduino verwendet werden wird danach definiert. habs nur mal so angenommen

Umsetzen möchte ich das ganze mit einem oder mehreren Arduino Uno.

und einem NEMA 34 Motor mit CLOSED LOOP + Endstufe

wie diesen hier:
https://www.ebay.de/itm/4N-m-HSS86-Hybrid-Servotreiber-NEMA-34-Closed-Loop-Schrittmotor-Servomotor/263981753719?_trkparms=aid%3D222007%26algo%3DSIC.MBE%26ao%3D1%26asc%3D20140107083420%26meid%3D82418b6f3a87488ea51ffe2b2624805c%26pid%3D100011%26rk%3D4%26rkt%3D12%26sd%3D401497307534%26itm%3D263981753719&_trksid=p2047675.c100011.m1850

ich hoffe ihr könnt mir helfen, Vielen dank schonmal!

Soll der einfach nur drehen oder soll der etwas bestimmtes antreiben?
Für einfach drehen kommt der mir etwas arg teuer für ein Schulprojekt vor.

Da würde es z.B. ein Schrittmotor 28BYJ-48 mit Treiber-Platine (ULN2003) zur leichten Ansteuerung des Schrittmotors per Arduino auch tun.

Gruß Tommy

Tommy56:
Soll der einfach nur drehen oder soll der etwas bestimmtes antreiben?
Für einfach drehen kommt der mir etwas arg teuer für ein Schulprojekt vor.

Da würde es z.B. ein Schrittmotor 28BYJ-48 mit Treiber-Platine (ULN2003) zur leichten Ansteuerung des Schrittmotors per Arduino auch tun.

Gruß Tommy

ja er soll mittels Getriebe eine Presse antreiben,
ist schon eine etwas höhere Schule^^
projektbudget ist nicht das problem

Hi

Was passiert, wenn mehr als nur ein Input anliegt?
Was passiert, wenn während des Drehen der Input weg genommen wird?

Wie soll sich der Stepper in welcher Situation wirklich verhalten?

Sonst wäre 'Blink_without_delay' (Beispiel in der IDE) wohl einen Blick wert.
Wenn der Stepper 1000 Schritte in einer Sekunde machen soll, muß jeder Schritt nach 1ms (1/1000stel Sekunde) ausgeführt werden.
Somit muß der Sketch in diesem Fall bei jedem loop()-Durchlauf prüfen, ob's schon wieder Zeit ist, einen Schritt auszuführen, wenn JA, ausführen und diesen Schritt zählen.
Wenn alle gewünschten Schritte gemacht wurden, wird sich die Start-Zeit der Pause gemerkt und eben auf das Ende der Pause gewartet - aber ob das Ende erreicht ist, wird in jedem loop()-Durchlauf explizit geprüft und dann entschieden, ob der nächste Schritt angefangen wird.
Hier ist Warten also nicht wirklich Warten, sondern eher so lange im Kreis rennen, bis die Zeit um ist.
Das hat hier keinen größeren Vorteil, sobald Du aber auch andere Dinge 'gleichzeitig' machen willst, ist diese Methode Gold wert.

So - nun das 'Rechtliche' :wink:
Wir durften uns schon 'die Tage' aufgrund von Hausaufgaben (bzw. es war wohl ein Wettbewerb) blöde anmachen lassen - es wäre also echt toll, wenn Du hier aktiv mitarbeitest.

Dazu gehört auch, daß Du zeigst, was Du bereits hast.
Sagst, was Du erwartest und auch, was Du statt Dessen bekommst.
Eigene Überlegungen, warum Das so ist, sind auch willkommen.

Wenn Ihr eine Presse baut, wäre auch eine NotAbschaltung sicherlich kein Fehler - so ein Finger wächst halt nicht nach und das Klassenzimmer ist dann auch versaut.

MfG

PS: Warum eigentlich einen closedloop? Mir fällt spontan kein Mehrwert ein - ok, man bekommt mit, wenn der Motor dem Befehl nicht mehr folgt - ginge mit einem normalem DC-Motor für 3€ vom Grabbeltisch + Encoder/Auswertung aber auch günstiger.

hi also danke schonmal für die Tipps.

wenn mehr als 1 input anliegt hab ich mir auch schon überlegt, da ich das ganze noch über ne SPS laufen lasse, auch zur sicherheit, werd ich es mit gegenseitiger verriegelung machen. Wollte im ersten post nicht zu sehr ausschweifen um das ganze übersichtlicher zu halten.

wenn während des drehens der input weg ist soll der motor einfach stehen,

die idee dahinter wie ich es geschrieben habe wäre auf input 1 ein automatik modus, presse fährt auf und wieder zu bis ich den input aus irgendeinem grund wegschalte, (werd ich über die SPS Programmieren)

das mit dem Bwd hab ich schon gelesen und werd ich mir auf jedenfall nochmal ansehen!

zum Rechtlichen, ich bin über jeden hilfreichen Ratschlag dankbar, und werde sicher keinen Blöd anmachen!

was ich bereits habe, ja die presse ist bestellt den stepper hab ich noch nicht nur das getriebe,
habe aber nen arduino starter Kit und einen kleinen 17HS4401 Stepper mit Treiber und den wollte ich heute mal programmieren, habs aber nur geschafft das er sich dreht und nicht meine gewünschten steps ausführt......

ich würde mir erwarten das ihr mich bei meinem vorhaben mit tipps unterstützt!

wegen der notabschaltung die mache ich mechanisch mit einem Not Aus und Lichtschranken usw. über die SPS

da habe ich auch keine Probleme damit mein Problem liegt nur in der Programmierung des arduino

einen closedloop habe ich genommen weil ich einen Motor mit ca 12Nm ausgangsmoment gebraucht habe und da die presse eig. einen hebel zum handbetrieb hat, und dieser am anschluss eine kreisbewegung macht, und die lösung mit dem stepper die eleganteste dafür ist.

Danke schonmal und ich hoffe ich konnte alles etwas aufklären.

Da bei einer Presse ja doch einige Massen zu bewegen sind, wären evtl. An- und Ablauframpen sinnvoll.
Dazu solltest Du Dir mal die Lib AccelStepper und die dort mitgelieferten Beispiele anschauen.

Gruß Tommy

Tommy56:
Da bei einer Presse ja doch einige Massen zu bewegen sind, wären evtl. An- und Ablauframpen sinnvoll.
Dazu solltest Du Dir mal die Lib AccelStepper und die dort mitgelieferten Beispiele anschauen.

Gruß Tommy

Da hast du recht, das werd ich mir ansehen,
Ich hab mir auch gedacht das ich die letzten 1000 steps zb langsamer laufen lasse, da der motor laut kennlinie im unteren bereich das max drehmoment hat,

Hi

Dann haben Wir Das ja schon Mal geklärt :slight_smile:

Nach dem BWD-Beispiel (wow, was eine Abkürzung, musste in meinem Post erst schauen, was Du damit meinen könntest ;)) baust Du Dir mehrere Ablauf-Steuerungen.
Je nach gesetztem Eingang wird eine dieser Abläufe abgearbeitet.
Am Einfachsten: Du fängst mit EINEM an - z.B. kontinuierlich in eine Richtung, bis vom Stepper ein Error kommt.
Der aktuelle Step, Den der Stepper gemacht hat, sollte wohl global gezählt werden, also noch vor setup() initialisieren.
Einen Null-Punkt brauchst Du ggf. auch, um herauszufinden, wo sich Dein Stepper gerade befindet (bzw. wie weit die Welle/das Handrad gedreht wurde).
Da um unteren Totpunkt wohl das Pressgut im Weg liegt, ggf. den oberen Totpunkt zum Referenzieren hernehmen.

Stelle mir den Ablauf wie folgt vor:

  • Start Arduino
  • eigenständige Ref-Fahrt, wenn kein NOT-AUS anliegt (oder Enable, von mir aus)
  • Einlesen eines Befehl (seriell?) oder prüfen der Eingänge
  • wir haben hier jetzt NUR den Eingang 'durchgehend abwärts, bis Error gemeldet wird'. Error könnte ein weiterer Input sein
  • ist 'durchgehend abwärts' gesetzt?
    -- ist die Wartezeit seit dem letzten Step vorbei?
    --- führe nächsten Step durch, merke Dir die aktuelle Zeit
  • ist ERROR gesetzt?
    -- beende 'durchgehend abwärts'

Damit sollte sich Dein Stepper beim Start nach Oben referenzieren und beim Anlegen des Befehl 'durchgehend runter' so lange runter fahren, wie der Befehl anliegt und kein Error anliegt. Stop irgendwo unten, wo der Stepper nicht mehr hinterher kommt (Pressgut oder Spindelende - wobei man Letzteres noch mitzählen könnte, damit man nicht auf Bock fährt)

Wie bereits geschrieben, MALE Dir auf, was wie ablaufen soll - danach kannst Du das Programm entwerfen.
Packe möglichst Viel in eigene Funktionen, Mülle Dir nicht loop() mit Funktionalitäten zu, Die Du auslagern kannst (und Du kannst Alles auslagern).
Das macht das Warten des Code um Welten einfacher, auch ist eine weitere Funktionalität so schnell in loop() eingefügt, ohne die anderen Funktionalitäten immer umkrempeln zu müssen.

In den Funktionen möglichst lokale Variablen verwenden (in der Funktion deklariert), damit Dir der Speicher zur Laufzeit nicht hoffnungslos ausgeht.

Nun ja - geschwätzt ist Das recht schnell - geschrieben und entbuggt dauert wohl etwas länger

Viel Erfolg

MfG

PS: Da Du einen Encoder am Motor hast, wird Dir die Error-LED direkt Bescheid geben, wenn der Motor langsamer angesprochen werden will - Da sehe ich kein Problem.
Ein Problem könnte sein, daß dann die AccelStepper auch die bremsende Rampe fahren möchte, wo der Motor schon lange stecken geblieben ist - ob Das dienlich ist, wird sich herausstellen.

Das hört sich echt gut an!!!

Also so wie du das erklärst kann ich mehrere Loops setzen?

Wegen dem start und der referenzfahrt, das möchte ich so lößen:
Ein Endschlter oben und einer unten
Auto mode lässt sich nur starten wenn der untere endschalter aktiv ist

Mode runter endschalter unten ausgelöst verrigelt den befehl

Mode rauf endschalter oben ausgelöst verriegelt den befehl

Die verriegelung bau ich mittels NC Endschaltern auf

Also braucht der arduino nur je nach dem eingang den er bekommt

-Rauf
-Runter
-Auto betrieb rauf-runter-rauf-runter.....

Ich werd das mal versuchen zu programmieren

Also mal rauf bzw runter,

Danke schonmal habt mir sehr geholfen!

Vorsicht, Du hast da was missverstanden: Du kannst nicht mehrere Loops programmieren.

Du kannst mehrere Funktionen im Loop ausführen. Wenn Du auf Endschalter reagieren musst, dann kein delay und keine blockierenden Schleifen.
Schau Dir BlinkWithoutDelay an und verstehe es.

Gruß Tommy

MartinwUNO:
ja er soll mittels Getriebe eine Presse antreiben,

Wenn man mit dieser Presse Lebewesen Schaden zufügen könnte, dann bedarf es Sicherheitsvorkehrungen. Ich denke da an Schutzgitter, NotAus, gegenseitige Verriegelungen und dergleichen. Sollte Dein Lehrer davon nichts wissen, dann mache ihn bitte darauf aufmerksam, damit er sich über den aktuellen Stand informiert!

agmue:
Wenn man mit dieser Presse Lebewesen Schaden zufügen könnte, dann bedarf es Sicherheitsvorkehrungen. Ich denke da an Schutzgitter, NotAus, gegenseitige Verriegelungen und dergleichen. Sollte Dein Lehrer davon nichts wissen, dann mache ihn bitte darauf aufmerksam, damit er sich über den aktuellen Stand informiert!

ich hätte vllt. erwähenn sollen das es bei dem Projekt für die schule um die Meisterschule in Automatisierungstechnik geht,

also macht euch um die sicherheitsgeschichten keine sorgen , die mache ich alle mittels SPS da habe ich keine bedenken,

Da auch die Motorversorgung über einen schütz geht, also wenn die SPS sagt es ist aus oder NOT AUS dann steht die Presse,

mir geht es hier rein nur um die Programmierung des Arduinos!

Tommy56:
Vorsicht, Du hast da was missverstanden: Du kannst nicht mehrere Loops programmieren.

Du kannst mehrere Funktionen im Loop ausführen. Wenn Du auf Endschalter reagieren musst, dann kein delay und keine blockierenden Schleifen.
Schau Dir BlinkWithoutDelay an und verstehe es.

Gruß Tommy

OK ja ich werd mir diese funktion mal genauer ansehen sobald ich zeit finde,
wenn es einfacher ist kann ich auch 3 arduinos verwenden wenn ich in jedem nur einen LOOP ablaufen lassen kann, wobei ich alles über einen laufen zu lassen bevorzugen würde!

hab jetzt mal was programmiert nur mit einem taster aufgebaut(taster wird aber seriell erkannt0-1) einfach um den motor von hand einzuschalten, funktioniert aber iwie nicht…

#include <Stepper.h>


// KONSTANTEN
int zeit = 80;     //(Brauche ich das?)
int schritte = 800;  //(Brauche ich das?)
const int PUL1 = 7; //Pulse für drehung    OUT
const int DIR1 = 6; //Richtung pin         OUT
const int ENA1 = 5; //Freigabe Pin         OUT
const int LEFT = 4; //hanmode Left Pin      IN
const int RIGHT = 3; //handmode Right Pin   IN
const int AUTO = 2; //Automode Pin          IN

// VARIABLEN
int LEFTBUTTON = 0; //Tasterzustand
int RIGHTBUTTON = 0; //Tasterzustand
int AUTOBUTTON = 0;  //Tasterzustand

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode (PUL1, OUTPUT);
  pinMode (DIR1, OUTPUT);
  pinMode (ENA1, OUTPUT);
  pinMode (LEFT, INPUT);
  pinMode (RIGHT, INPUT);
  pinMode (AUTO, INPUT) ;
  digitalWrite(ENA1, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:
                                                                          int LEFTBUTTON;
  LEFTBUTTON = digitalRead (LEFT);
                                                                          Serial.println(LEFTBUTTON,DEC);  //SCHALTERZUSTAND LEFTBUTTON
   if (LEFTBUTTON == HIGH);
               
  digitalWrite(DIR1, HIGH);  //richtung  high-> uhrzeigersinn
  digitalWrite(ENA1, HIGH);  // Freigabe Motor
  digitalWrite(PUL1, HIGH);  //
  delayMicroseconds(80);
  digitalWrite(PUL1, LOW);
  delayMicroseconds(100);

MartinwUNO:
ich hätte vllt. erwähenn sollen das es bei dem Projekt für die schule um die Meisterschule in Automatisierungstechnik geht,

Ja, hättest Du. Sicherheit, Verantwortung und Haftung dürften dann ja Themen der Ausbildung sein. In einem Meisterbetrieb dürfte das genau geregelt sein, bei einem öffentlichen Forum bin ich da nicht so sicher. Daher bin ich lieber mal die Spaßbremse, als irgendwann vor dem Richter zu stehen. Später als Meister wirst Du selbst mal in dieser Rolle sein.

Während meines Praktikums mußte der Ausbildungsmeister nur seine linke Hand hochheben. Da wußte jeder Lehrling, es ging um Sicherheit, denn es fehlte ein Finger.

MartinwUNO:
... wobei ich alles über einen laufen zu lassen bevorzugen würde!

Ich auch, sonst wird es zu kompliziert.

Dein SPS-Wissen wird Dir vermutlich im Wege stehen, sei drauf gefaßt.

Die Bibliothek Stepper bindest Du zwar ein, benutzt sie aber nicht. Nimm besser AccelStepper, die unterstützt auch Deinen Treiber (DRIVER).

Hi

Dein Sketch ist nicht vollständig (wird Dir aber wohl bekannt sein).
Studiere erst ein Mal das Beispiel Blink_without_delay - dann baust Du in dieser Form Den Ablauf, wie Dein Motor angesteuert werden will, profan gesagt:

  • Motor enablen
  • Richtung schalten
  • wenn seit dem letzten Impuls genügend Zeit vergangen ist und Endwert < Schritt: nächsten(ersten) Step auslösen, Zeit merken
  • nach Impulszeit Step rücksetzen+ Schritt++ (wir haben einen Schritt gemacht)
    … Das so lange, wie Schritt < dem Endwert ist - bzw. danach rennt loop() immer noch im Kreis, macht aber Nichts mehr, weil die aktuelle Aufgabe erledigt ist.
    Hier kannst Du dann in einen anderen Status wechseln, z.B. eine Wartezeit, Die der Druck anhalten muß, bevor wieder hoch gefahren werden soll.
    Alles eigene Status! Mein Tip(p) immer noch: Male Dir auf, was wann passieren soll - wirklich: MALEN

Enable, Richtung setzen dürfen gerne eigene Status sein.
Je nach Gegebenheit wird halt Richtung auf VOR oder ZURÜCK gesetzt (also der DIR HIGH oder LOW angesteuert).
Je nach gewünschter Geschwindigkeit wird halt gewartet, bis die Zeit um ist (millis() ist hier Dein Freund, kommt aber auch im BWD Beispiel vor).
Wenn millis() zu grob ist (immerhin Millisekunden), kannst Du auch micros() benutzen, sind dann µs (also 1000 x pro ms).

Das Ansteuern des Stepper gerne jetzt schon in eine Funktion auslagern - Du müllst Dir loop() unglaublich schnell voll und bekommst dann kaum einen Überblick mehr rein - ich spreche Da aus Erfahrung :wink: (nein: nicht stolz drauf gg)

MfG

@postmaster-ino,

danke ich werds so mir das mit dem blink without delay mal genau ansehen, hab schon ein paar beispiele angeschaut aber noch nicht ganz kapiert.

Ich werd mir das ganze mal optisch auf nen zettel aufmalen wie du sagst!

Und jetzt ist mal mein nächstes ziel das sich mein motor in eine richtung dreht in einer von mir vorgegeben zeit und weg!

Danke erstmal, aber ich werd erst am we dazu kommen bis dahin kann ich nicht viel machen....

Ich kanns zwar nicht sicher sagen aber 1,25 Umdrehung in einer Sekunde mit Beschleunigung und Abbremsen bzw 1,5 RPM für 4,5 Umdrehungen in 3 Sekunden sind nicht ohne.
Ich habe den Verdacht daß der Motor das nicht mitmacht bzw nicht viel Kraft mehr hat. Wenn Du das mit Schrittmotoren machen willst würd ich die 5 bis 10 fache Zeit veranschlagen.

Aber das mal Ausprobieren bring Sicherheit und Ihr könntet ja sehen daß meine Bedenken unbegründet sind.

Grüße Uwe

uwefed:
Ich kanns zwar nicht sicher sagen aber 1,25 Umdrehung in einer Sekunde mit Beschleunigung und Abbremsen bzw 1,5 RPM für 4,5 Umdrehungen in 3 Sekunden sind nicht ohne.
Ich habe den Verdacht daß der Motor das nicht mitmacht bzw nicht viel Kraft mehr hat. Wenn Du das mit Schrittmotoren machen willst würd ich die 5 bis 10 fache Zeit veranschlagen.

Aber das mal Ausprobieren bring Sicherheit und Ihr könntet ja sehen daß meine Bedenken unbegründet sind.

Grüße Uwe

Rein rechnerrisch da ich eine gesamtübersetzung von ca 30 habe müsste ich in 3sec ca 15umdrehungn schaffen

Der anschluss an der presse muss sich in 3sec ca 180grad drehen

Das würde einer drehzahl von 300umin entsprechen,

Ich hoffe ich denk mir das jetz richtig...

MartinwUNO:
Rein rechnerrisch da ich eine gesamtübersetzung von ca 30 habe müsste ich in 3sec ca 15umdrehungn schaffen

Das verstehe ich gar nicht. Ist das Getriebe 1:30 (Ausgang 30 mal langsamer) oder 30:1 (Ausgang 30 mal schneller aber auch ca 30 mal schwächer)

Der anschluss an der presse muss sich in 3sec ca 180grad drehen

Das würde einer drehzahl von 300umin entsprechen,

Ich hoffe ich denk mir das jetz richtig...

180 grad in 3 Sekunden sind 1 Umdrehung (360°) in 6 Sekunden und darum 1/6 Umdrehung pro Sekunde was 10 RPM sind.

Vielicht solltest Du etwas Deine Rechenkünste auffrischen.

Grüße Uwe

uwefed:
Das verstehe ich gar nicht. Ist das Getriebe 1:30 (Ausgang 30 mal langsamer) oder 30:1 (Ausgang 30 mal schneller aber auch ca 30 mal schwächer)
180 grad in 3 Sekunden sind 1 Umdrehung (360°) in 6 Sekunden und darum 1/6 Umdrehung pro Sekunde was 10 RPM sind.

Vielicht solltest Du etwas Deine Rechenkünste auffrischen.

Grüße Uwe

Ist jetzt vllt. Ein bisschen falsch rüber gekommen

Motor --------->
Fäht 15 umdrehungen

getriebe---------------->
1:30 ins langsame

presse antrieb
muss sich um 180% drehen 0,5 umdrehungen

Da für den vorgang 3sec zeit sind

15/3=. 5U/sec

5u/sec x60 = 300umin

Sollte passen oder?