Stepper Motor mit Fußschalter steuern

Guten Abend Franz-Peter,
ich habe den Sketch aufgespielt und ausprobiert.
Du glaubst nicht mit welchem breiten grinsen ich gerade den Hobbyraum verlassen habe und mich vor den PC gesetzt habe, um dir zu antworten... ungefähr so: :smiley:

Das Sketch ist klasse. Genau wie ich es mir vorgestellt habe. Ich danke dir!

Wie du aus unserer vergangener Kommunikation bestimmt schon bemerkt hast, bin ich manchmal auch ein kleines dummerchen ::slight_smile: Deswegen muss ich nochmal eine Sache nachfragen:

ich habe fleißig mit der StepMax-Funktion gespielt. Für eine Umdrehung muss bei mir die ca. Zahl 4000 stehen... ?!
Ich dachte immer, dass für eine Umdrehung die Zahl 200 dort stehen muss...

Ich fing mit der Zahl 200 an und der Motor drehte sich minimal...

Ok, ca. 4000 eine volle Umdrehung. ca. 10 Umdrehungen dann 40000?!
Und dann ab noch höheren Zahlen spielt man den Sketch zwar auf, aber es wird ein "Fehler" in orange angezeigt: "warning: large integer implicitly truncated to unsigned type [-Woverflow]
const uint16_t stepMax = 170000;"

Ich verstehe es nicht. Weißt du woran es liegt? Ich habe extra nochmal bei der Motorbeschreibung nachgeschaut: Vollschrittwinkel 1,8° (200 Schritte)

Weißt du woran es liegt könnte?

Wie ist denn dein Treiber eingestellt? Wenn der mit Microsteps arbeitet, muss Du die Zahl der Microsteps mit den 200 des Motors multiplizieren. Als z.B. bei 1/16 Microsteps wären es dann 16*200 = 3200 Steps/Umdrehung.

Und wenn Du so viele Steps brauchst, musst Du die Variablen für die Schrittzählung als uint32_t definieren:

const uint32_t stepMax = 170000;
uint32_t stepCount = 0;

Dann reicht der Zahlenbereich für die Variablen bis 4294967295 ( bei uint16_t geht der Zahlenbereich nur bis 65535 - das ist für deine 170000 zu wenig ).

Franz-Peter, du bist großartig! Vielen Dank.
Es funktioniert.

linda89:
Es funktioniert.

Jetzt solltest Du Dich nochmal mit der MobaTools-Variante auseinandersetzen, wegen der Rampe ist sie besser, denn ein Schrittmotor möchte einen Sanftanlauf.

Guten Tag zusammen,
ich bin´s mal wieder :slight_smile:
Könnt ihr mir bitte nochmal ein paar Tipps geben und über den Script schauen?
Mich stört folgendes momentan: ich habe ja einen Schrittmotor, Schrittmotor-Treiber, 24V Netzteil, 5v Netzteil, Arduino und einen Handschalter.
Das gesamte System ist permanent unter Spannung, auch wenn ich den Motor gar nicht benötigte. Mit der Zeit (ich habe es mal 24 Std getestet, wird der Schrittmotor sowie das 24V Netzteil warm. Nicht heiß oder so, aber warm. Klar, es liegt ja permanent Spannung an. Und bei einem Schrittmotor auch normal, da durch die Spannung ja die Motorwelle "gehalten" wird.

Ich brauche aber diese permanente Spannung nicht und würde gerne bei Benutzung des Handschalters die Spannung zuschalten und nachdem der Handschalter wieder losgelassen wird und der Schrittzähler wieder bei Null ist die Spannung ausschalten.

Ich habe dazu versucht ein Relais einzubinden, das Script kann ich aufspielen, aber es funktioniert nicht.
Könnt ihr bitte mal drüber schauen:

int reverseSwitch = 2; // Push button for reverse
int driverPUL = 7; // PUL- pin
int driverDIR = 6; // DIR- pin

int RELAIS = 8; // Pin 8 am Arduino festlegen

// Variables
const uint32_t stepMax = 162000;
uint32_t stepCount = 0;

int pd = 500; // Pulse Delay period
const int highSpeed = 40;
const int lowSpeed = 100;
boolean setdir = LOW; // Set Direction

void doOneStep () {
digitalWrite(driverPUL, HIGH);
delayMicroseconds(pd);
digitalWrite(driverPUL, LOW);
delayMicroseconds(pd);
}

void setup() {

pinMode (driverPUL, OUTPUT);
pinMode (driverDIR, OUTPUT);
pinMode (reverseSwitch, INPUT_PULLUP);

pinMode(RELAIS, OUTPUT); // Initialisieren des Ausgangs

}

void loop() {
if (digitalRead(reverseSwitch)) setdir = 0; else setdir = 1;
digitalWrite(driverDIR, setdir);
if ( setdir ==1 ) digitalWrite(RELAIS, HIGH); // Schaltet RELAIS für Vorwärtsdrehen ein
if ( setdir ==0 ) digitalWrite(RELAIS, HIGH); // Schaltet RELAIS für Rückwärtsdrehen ein
if ( setdir ==1 ) pd = lowSpeed;
if ( setdir ==0) pd = highSpeed;


if ( setdir ==1 && stepCount <= stepMax ) {
// Endpunkt beim Vorwärtsdrehen noch nicht erreicht -> 1 Step ausführen
stepCount++;
doOneStep();
}

if ( setdir ==0 && stepCount > 0 ) {
// Endpunkt beim Rückwärtsdrehen noch nicht erreicht -> 1 Step ausführen
stepCount--;
doOneStep();
if ( stepCount = 0 ) digitalWrite(RELAIS, LOW); // Schaltet RELAIS aus
}
}

Ich habe das Relais auf PIN8 gelegt und dann den Ausgang initialisiert. Dann habe ich versucht, dass das Relais per Fußschalter gesteuert werden kann und ganz am Ende wenn der Schrittzähler wieder bei 0 ist, das Relais die Spannung wieder trennt

Wenn du den Pin RELAIS auf LOW setzt, setzt du ihn auch gleich wieder (im nächsten loop() -Durchlauf) auf HIGH.
Ich würde bei der Gelegenheit auch in der Start-Phase (reverseSwitch wechselt HIGH->LOW ) erstmal das Relais einschalten, einige ms warten (auch um den reverseSwitch zu entprellen) und erst dann den Stepper loslaufen lassen.

Hat der Treiber nicht auch einen ENA-Pin zum Freigeben des Treibers. Dann könntest Du auch den verwenden.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.