Stepper Motor mit Fußschalter steuern

Hallo zusammen,

ich versuche für meinen Sohn ein kleines Projekt umzusetzen :slight_smile:

Wir möchten einen 24V Schrittmotor (Nema 23) mit einem Fußschalter bedienen können. Der Fußschalter hat folgende Anschlüsse NO / NC / COM.

Wir haben noch ein Arduino UNO, sowie einen Digitalen Stepper Driver DM542T.

Die Funktion soll am Ende wie folgt sein: Fußschalter betätigen und halten = Motor dreht z.b. links herum,
beim loslassen des Schalter dreht der Motor rechts herum. Endlagenschalter werden erstmal nicht benötigt.

Eigentlich ganz simple, für uns aber nicht umsetzbar :confused: Hoffentlich könnt ihr uns helfen :slight_smile:

Vielen Dank euch vorab.

Linda

(deleted)

Guten Morgen Peter, danke für deine Antwort und Hilfe.

Sorry dass ich nicht genau weiß wie man den Arduino Code richtig hier darstellt, ich füge ihn man "normal" ein.

Wo genau muss ich dann deinen Code mit einbauen?

// Defin pins

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

// Variables

int pd = 500;       // Pulse Delay period
boolean setdir = LOW; // Set Direction

// Interrupt Handler

void revmotor (){

 setdir = !setdir;
 
}


void setup() {

 pinMode (driverPUL, OUTPUT);
 pinMode (driverDIR, OUTPUT);
 attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING);
 
}

void loop() {
 
   pd = map((analogRead(spd)),0,1023,2000,50);
   digitalWrite(driverDIR,setdir);
   digitalWrite(driverPUL,HIGH);
   delayMicroseconds(pd);
   digitalWrite(driverPUL,LOW);
   delayMicroseconds(pd);

}

Danke für deine Hilfe.

(deleted)

Erstmal stellt sich die Frage, ob der Treiber zum Motor paßt. "Nema23" gibt nur die mechanische Größe an, für den Treiber sind aber die elektrischen Werte von Interesse. Wenn Du einen Produkt- oder Datenblattlink hast, dann her damit.

NO / NC / COM ist normal open / normal close / gemeinsamer Anschluß

COM an GND und NO an einen digitalen Eingang, NC unbeschaltet. Den Eingang im Programm auf INPUT_PULLUP setzen, dann wird er vom internen PullUp-Widerstand auf HIGH gezogen, bei Betätigung auf LOW.

Das Beispiel DigitalInputPullup findest Du in der IDE.

Interrupts benötigst Du nicht. Die Bibliothek MobaTools unterstützt Dein Vorhaben, kannst Du mit dem Bibliotheksmanager installieren.

(deleted)

(deleted)

Ja mein Code funktioniert.

Ist die Anpassung so dann korrekt?

// Defin pins
 
int reverseSwitch = 2;  // Push button for reverse
int driverPUL = 7;    // PUL- pin
int driverDIR = 6;    // DIR- pin
int spd = A0;     // Potentiometer
 
// Variables
 
int pd = 500;       // Pulse Delay period
boolean setdir = LOW; // Set Direction
 
// Interrupt Handler
 
void revmotor (){
 
  setdir = !setdir;
 
}
 
 
void setup() {
 
  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
pinMode (reverseSwitch, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING);
 
}
 
void loop() {
 
    pd = map((analogRead(spd)),0,1023,2000,50);
if (reverseSwitch)  setdir=0; else setdir=1;
    digitalWrite(driverDIR,setdir);
    digitalWrite(driverPUL,HIGH);
    delayMicroseconds(pd);
    digitalWrite(driverPUL,LOW);
    delayMicroseconds(pd);
 
}

(deleted)

Ok Peter, mache ich heute Abend und sage dir was passiert :slight_smile:

Nur zum Verständnis:

was passiert denn, wenn ich bei meinem normalen Code den Fußschalter anstelle vom Pushbutton setze und COM an GND und NO an PIN2 und PUL+ setze…

@agmue: Danke auch dir für deine Hilfe, ich schaue mir heute Abend das Beispiel DigitalInputPullup an und melde mich bei Fragen nochmal bei dir ok? :slight_smile:

Danke euch!

(deleted)

linda89:
@agmue: Danke auch dir für deine Hilfe, ich schaue mir heute Abend das Beispiel DigitalInputPullup an und melde mich bei Fragen nochmal bei dir ok? :slight_smile:

Natürlich ok. Sollte ich draußen nach Sternschnuppen Ausschau halten, wird Dir ein anderer Aktiver helfen.

Ich fange halt immer bei grundlegenden Dingen wie Spannugsversorgung und dergleichen an, weil nicht wenige Probleme aus dieser Ecke stammen.

Peter-CAD-HST:
Moin Linda,

COM an den Arduino

und

NO an GND

Gruss Peter
und Gesund bleiben

Warum gefällt es Dir umgekehrt nicht?
Grüße Uwe

(deleted)

Hallo Uwe,

was meinst du genau? Deiner Meinung nach NO an Arduino, COM an GND?

Warum denkst du, dass es so eher passt?

Üblicherweise verbindet man bei diesen Schaltern den COM ( =gemeinsam ) Anschluss an das feste Potential - hier Gnd - und kann dann durch Auswahl von NC oder NO den Ruhe- oder den Arbeitskontakt auswählen und mit dem Arduinopin verbinden.

Du solltest auf jeden Fall noch den Interrupt komplett rausschmeißen - das brauchst Du nicht. Und dann musst Du hier:

if (reverseSwitch)  setdir=0; else setdir=1;

den Eingangspin auch lesen. Also

if ( digtalRead(reverseSwitch) )  setdir=0; else setdir=1;

Guten Abend zusammen und danke für eure Unterstützung.
Ich habe jetzt die zusätzlichen Anmerkungen zum Quellcode von Peter und Franz-Peter eingefügt.
Auch habe Ich den fußschalter angeschlossen.
COM an GND und NO an PIN2 und PUL+.
Der Quellcode zeigt keine Fehler, das hochladen auf das arduino ohne Probleme.

Der Motor läuft. Aber nur in eine Richtung. Bei Betätigung des fußschalter passiert nichts.

Habe auch mal den Anschluss vom fußschalter gewechselt, also COM an PIN 2 und NO an GND aber den Richtungswechsel macht der Motor beim betätigen vom fußschalter nicht.

Habt ihr noch weitere Ideen?

Hier habe ich nun nochmal den aktuellen Quellcode. Ich habe etwas interessantes und eventuell für euch nützliches ausprobiert: wenn ich den Fußschalter gar nicht anschließe und PIN2 und GND nicht ansteuer, läuft der Motor trotzdem. So als wenn der Fußschalter gar nichts ausrichtet - egal ob angeschlossen oder nicht... Das hat mich verwundert.

// Defin pins
 
int reverseSwitch = 2;  // Push button for reverse
int driverPUL = 7;    // PUL- pin
int driverDIR = 6;    // DIR- pin
int spd = A0;     // Potentiometer
 
// Variables
 
int pd = 500;       // Pulse Delay period
boolean setdir = LOW; // Set Direction
 
// Interrupt Handler
 
void revmotor (){
 
  setdir = !setdir;
 
}
 
 
void setup() {
 
  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
  pinMode (reverseSwitch, INPUT_PULLUP);
  
 
}
 
void loop() {
 
    pd = map((analogRead(spd)),0,1023,2000,50);
    if (reverseSwitch)  setdir=0; else setdir=1;
    if (digitalRead(reverseSwitch)) setdir=0; else setdir=1;
    digitalWrite(driverDIR,setdir);
    digitalWrite(driverPUL,HIGH);
    delayMicroseconds(pd);
    digitalWrite(driverPUL,LOW);
    delayMicroseconds(pd);
 
}

linda89:
Habt ihr noch weitere Ideen?

Hast Du nicht korrigiert, siehe #15:

if (reverseSwitch)  setdir=0; else setdir=1;

Hi Agmue, danke das auch du wieder dabei bist :slight_smile:

Doch ich habe es unter Void loop eingefügt. Siehe hier nochmal:

void loop() {
 
    pd = map((analogRead(spd)),0,1023,2000,50);
    if (reverseSwitch)  setdir=0; else setdir=1;
    if (digitalRead(reverseSwitch)) setdir=0; else setdir=1;