Hallo,
ich habe einen 3 Phasen Schrittmotor (von ehemals Berger Lahr)
dazu passend den treiber Leadshine 3DM683
Dieser Schrittmotor soll eine Achse Betreiben. und sich später immer wieder auf einem endschalter null holen. (ist für eine cocktailmaschine)
das mit dem endschalter erst mal in den hintergrund.
Mir geht es erst mal um das verstehen was ich wie programmieren muss dass er auf knopfdruck z.b einen schritt im urzeigersinn macht und einen wieder zurück.
irgendwie bin ich mit google am ende und finde nix wo mir das ersichtlich macht oder mir hilft...
irgendwie bin ich mit google am ende
Klar, irgendwann ist das Internet am Ende....
Tipp:
Vielleicht mal die Doku zum Leadshine 3DM683 lesen.....
Klar die "Doku" / "Datenblatt" habe ich gelesen
Hier mal zum Veranschaulichen auf welchem stand ich bin und nicht mehr weiter komme ...
int pulPin = 10;
int dirPin = 11;
int enblPin = 12;
int ledPin = 13;
int loops = 0;
void setup() {
// put your setup code here, to run once:
pinMode(pulPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enblPin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pulPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(enblPin, LOW);
digitalWrite(dirPin, LOW); //Richtung der Drehung HIGH=Rechts LOW =Links
Serial.begin(96000);
Serial.println("init");
digitalWrite(enblPin, HIGH);
delay(100);
digitalWrite(enblPin, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(pulPin, HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(pulPin, LOW);
digitalWrite(ledPin, LOW);
delay(1);
}
Der Motor dreht sich konstant nach rechts oder links je nach digitalWrite(dirPin, LOW/HIGH)
Was ich aber will ist dass er z.b 100 Schritte CW macht und 50 Schritte dagegen.
So steht es bei Leadshine:
PUL+
PULPulse
signal: In single pulse (pulse/direction) mode, this input represents pulse
signal, each rising or falling edge active (software configurable); 4-5V when
PUL-HIGH, 0-0.5V when PUL-LOW. In double pulse mode (pulse/pulse) ,
this input represents clockwise (CW) pulse,active both at high level and low
level (software configurable). For reliable response, pulse width should be
longer than 2.5μs. Series connect resistors for current-limiting when +12V or
+24V used. The same as DIR and ENA signals.
DIR+
DIRDIR
signal: In single-pulse mode, this signal has low/high voltage levels,
representing two directions of motor rotation; in double-pulse mode (software
configurable), this signal is counter-clock (CCW) pulse,active both at high
level and low level (software configurable). For reliable motion response, DIR
signal should be ahead of PUL signal by 5μs at least. 4-5V when DIR-HIGH,
0-0.5V when DIR-LOW. Please note that rotation direction is also related to
motor-driver wiring match. Exchanging the connection of two wires for a coil
to the driver will reverse motion direction.
ENA+
ENAEnable
signal: This signal is used for enabling/disabling the driver. High level
(NPN control signal, PNP and Differential control signals are on the contrary,
namely Low level for enabling.) for enabling the driver and low level for
disabling the driver. Usually left UNCONNECTED (ENABLED).
Was ich aber will ist dass er z.b 100 Schritte CW macht und 50 Schritte dagegen.
Schön!
Verstehe ich!
Aber wo ist dein Problem?
Alternativ könntest du auch die AccelStepper: AccelStepper library for Arduino verwenden.
Die tuts auch mit deinem 3 Phasen Treiber
Meines Wissens gibt es keine 3 Phasen Schrittmotore.
Hab aber nicht Zeit den Motortyp zu suchen.
Grüße Uwe
Doch die 3-Phasen Schrittmotoren gibt es, inzwischen sogar 5 Phasen Schrittmotoren.
Und der Treiber ist auch speziell dafür ausgelegt.
Alles was man nun noch machen muss ist die Schritte zählen im Programm. Am einfachsten eine Schleife bauen die 200x durchlaufen wird und dabei jedes mal einen Impuls erzeugt. Also einmal auf Low und wieder auf High schalten. Momentan wird ja endlos getaktet.
Ich schau mir das mal mit der libary die tage an.
aufjedenfall schon mal danke für die bisherige hilfe.
Momentan wird ja endlos getaktet.
Genau.
Ohne etwas mehr Verständnis, ob, wie und wo man die Schritte zählt, die man zurücklegen will, hilft auch keine library ...
Würde gerne mit Hilfe von euch mal einen kompletten einfachen scetch durchgehen und schreiben...
ich teil das Programm mal in 3 Stücke dass es für mich übersichtlicher bleibt.
#include <AccelStepper.h>
#include <MultiStepper.h>
AccelStepper stepper(1,10,11); //stepper=belibiger Name
//Die erste Zahl steht für die Ansteuerung des Motors,
// in meinem Fall ein externes Treiberboard(Leadshine). =1
//Die zweite Zahl ist die Pin Nummer für den "Schritt-Takt" =10
// und die dritte Zahl die Pin Nummer für die Drehrichtung. =11
1.Frage: ich bin hingegangen und hab dem Arduino programm gesagt, er soll mir die AccelStepper Libary hinzufügen. bei mir stehn jetz aber 2 Libarys?! #include <AccelStepper.h>#include <MultiStepper.h>
2.Frage: Bei der AccelStepper definition fehlt da irgendwas ist da irgendwas nicht richtig? Ich meine es fehlt ja pin 12 und 13 wo nicht definiert ist? (enblPin = 12;int ledPin = 13) Sind die Pins einfach nur zum Ein und Ausschalten der Leadshine?
3.Frage: Fällt euch sonst noch irgendwas auf?
enblPin = 12
// in setup();
stepper.setEnablePin(12);
stepper.enableOutputs();
Hi,
bitte poste keine Fragemente deines codes;
Frage:
Wie sieht jetzt dein aktueller Code komplett aus und wo liegen deine Verständnisprobleme genau bzw. was klappt/klappt nicht?
Die Library ist ganz gut dokumentiert (wenn auch in englisch).
Hier mein vollständiger sketch.
#include <AccelStepper.h>
#include <MultiStepper.h>
AccelStepper stepper(1,10,11); //stepper=belibiger Name
//Die erste Zahl steht für die Ansteuerung des Motors,
// in meinem Fall ein externes Treiberboard(Leadshine). =1
//Die zweite Zahl ist die Pin Nummer für den "Schritt-Takt" =10
// und die dritte Zahl die Pin Nummer für die Drehrichtung. =11
void setup() {
stepper.setMaxSpeed(10000);
// Mit setMaxSpeed wird die maximale Schrittfrequenz festgelegt.
stepper.setAcceleration(500);
// setAcceleration definiert die Beschleunigung
// in Schritte / Sekunden^2
}
void loop()
{
stepper.runToPosition(500); // Der Schrittmotor soll 500 Schritte mit dem Urzeiger drehen.
delay(1000); // 10Sek. warten
stepper.runToPosition(-400); // Der Schrittmotor soll 400 Schritte gegen den Urzeiger drehen.
}
Mein großes Problem ist ich bekomme ihn z.b 500 Schritte in die eine Richtung gedreht...
aber dann will ich dass er danach in die andere richtung z.b 400 Schritte dreht.
Die 2 Links wo mal genannt wurden haben mich schon einiges weitergebracht...
Es ist so ich hab vorher ein paar schaltungen mit led's, Servo und so kleinkram gemacht. aber das mit dem Schrittmotor will mir nicht so richtig einleuchten. Ich bin weder elektriker noch student oder so, das ist rein für den Heimgebrauch. Mein englisch ist auch nicht so top aber für das sollte es noch reichen...
Mein großes Problem ist ich bekomme ihn z.b 500 Schritte in die eine Richtung gedreht...
aber dann will ich dass er danach in die andere richtung z.b 400 Schritte dreht.
Von Position 500 bis Position -400 sind halt 900 Schritte zu tun, und das tut das Ding auch...
Da machste nix gegen.... willste ja auch gar nicht wirklich...
Du brauchst bei nur einem Motor den Multistepper-Eintrag nicht.
Dann, wie @combie schon gesagt hat:
Der Befehl
stepper.runToPosition(x)
weist den Motor an, zu einer absoluten Position x zu marschieren; während dieser Zeit sind alle anderen code-Instruktionen blockiert und erst dann, wenn, +500 absolut erreicht ist, wird weiterer Code abgearbeitet.
Nehmen wir an, die Anfangsposition, wo der Motor steht, ist nach dem setup "0"; dann weist der Befehl
stepper.runToPosition(500)
den Motor an, 500 Schritte in positiver Richtung zu laufen; danach dein delay (1000) (-> in deinem Kommentar sprichst du von 10sec Wartezeit ???) stoppt alles und wartet eine Sekunde;
stepper.runToPosition(-400)
schickt den Stepper dann in die andere Laufrichtung, aber nicht, wie du geplant hast, um 400 Schritte, sondern von +500 nach -400 und das sind genau 900 Schritte!
Sofort danach (ohne delay diesmal) kommt der Befehl "gehe zu position 500" -> von -400 aus sind das dann wieder 900 Schritte... usw.
Eine wenig elegante (wg. delay und blockierender Funktion), wenn auch funktionierende Befehlsfolge sollte sein:
(Nicht vergessen, "position" vor loop() als integer Variable zu deklarieren)
void loop()
{
position = stepper.currentPosition(); // liest die aktuelle Ausgangsposition absolut ein
stepper.runToPosition(position+500); // Der Schrittmotor soll 500 Schritte mit dem Uhrzeiger drehen.
delay(1000); // 10Sek. warten //RPT007: wartet aber nur 1sec!!
position = stepper.currentPosition();
stepper.runToPosition(position-400); // Der Schrittmotor soll 400 Schritte gegen den Uhrzeiger drehen
delay(1000); // warte 1sec, bevor der Motor wieder anläuft
}
Übrigens: stepper.setMaxspeed(10000) bringt auf einem "normal schnellen" Arduino nichts. AccelStepper kann maximal 4000 steps/sec verarbeiten, weil es im Hintergrund mit dem ständigen Neuberechnen der Acceleration zu tun hat. Also diesen Wert auf max. 4000 stellen.
Zum Testen würde ich aber diesen Wert mal runter auf 200..300 setzen, damit du besser erkennst, was geschieht.
Leider bringt es mir immer noch eine fehlermeldung...
Sketch:
#include <AccelStepper.h>
#include <MultiStepper.h>
AccelStepper stepper(1,10,11); //stepper=belibiger Name
//Die erste Zahl steht für die Ansteuerung des Motors,
// in meinem Fall ein externes Treiberboard(Leadshine). =1
//Die zweite Zahl ist die Pin Nummer für den "Schritt-Takt" =10
// und die dritte Zahl die Pin Nummer für die Drehrichtung. =11
void setup() {
stepper.setMaxSpeed(300);
// Mit setMaxSpeed wird die maximale Schrittfrequenz festgelegt.
stepper.setAcceleration(100);
// setAcceleration definiert die Beschleunigung in Schritte / Sekunden^2
//Nicht vergessen, "position" als integer Variable zu deklarieren
stepper.setCurrentPosition(+0 0000 0000);
}
void loop() {
position = stepper.currentPosition(0); // liest die aktuelle Ausgangsposition absolut ein
stepper.runToPosition(position+500); // Der Schrittmotor soll 500 Schritte mit dem Uhrzeiger drehen.
delay(10000); // 10Sek. warten
position = stepper.currentPosition();
stepper.runToPosition(position+100); // Der Schrittmotor soll 400 Schritte gegen den Uhrzeiger drehen
delay(10000); // 10Sek. warten
}
Fehlermeldung:
Arduino: 1.6.9 (Windows 7), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
C:\Users\XXX\Desktop\Schrittmotor\marc\marc.ino: In function 'void setup()':
marc:23: error: expected ')' before numeric constant
stepper.setCurrentPosition(+0 0000 0000);
^
C:\Users\XXX\Desktop\Schrittmotor\marc\marc.ino: In function 'void loop()':
marc:29: error: 'position' was not declared in this scope
position = stepper.currentPosition(0); // liest die aktuelle Ausgangsposition absolut ein
^
marc:29: error: no matching function for call to 'AccelStepper::currentPosition(int)'
position = stepper.currentPosition(0); // liest die aktuelle Ausgangsposition absolut ein
^
C:\Users\XXX\Desktop\Schrittmotor\marc\marc.ino:29:40: note: candidate is:
In file included from C:\Users\Lisa\Desktop\Schrittmotor\marc\marc.ino:1:0:
C:\Users\XXX\Documents\Arduino\libraries\AccelStepper/AccelStepper.h:434:13: note: long int AccelStepper::currentPosition()
long currentPosition();
^
C:\Users\XXX\Documents\Arduino\libraries\AccelStepper/AccelStepper.h:434:13: note: candidate expects 0 arguments, 1 provided
exit status 1
expected ')' before numeric constant
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
-
Fehler
+0 0000 0000
kann keiner verstehen -
Fehler
marc:29: error: 'position' was not declared in this scope
hängst zusammen mit deinem eigenen Kommentar
marclechien:
//Nicht vergessen, "position" als integer Variable zu deklarieren
Tip:
int position = stepper.currentPosition(0); // liest die aktuelle Ausgangsposition absolut ein
Wie soll dieser Code mit dem Kommentar zusammenpassen?
stepper.runToPosition(position+100); // Der Schrittmotor soll 400 Schritte gegen den Uhrzeiger drehen