Stepper Motor reagiert nicht auf Endlagenschalter

Hallo liebe Arduino-Community!

Gleich vorweg schonmal, sitze gerade an meinem allerersten Arduino-Projekt und habe daher noch nicht besonders viel Ahnung.
Mein Ziel ist es, einen Spindelantrieb über zwei Taster (SW1 und SW2) zu bedienen. Ist SW1 gedrückt, soll die Spindel rechtsrum drehen, bei SW2 linksrum. Das funktioniert auch soweit. 8)
Ich verwende:

  • Arduino Nano 33 BLE
    -Motorsteuerung TB6600
    -24V PC Netzteil

Zusätzlich sollen nun noch zwei Endlagenschalter eingebaut werden. Wenn einer der beiden Endlagenschalter gedrückt wird, soll der Motor sofort stehen bleiben. Das funktioniert leider noch nicht.
Weil ich gerade keine Schalter/Taster zur Hand habe, stecke ich einfach ein Jumperkabel des entsprechenden Pins auf Ground am Breadboard, um das Drücken eines Tasters zu simulieren… vielleicht liegt da ja der Hund begraben…

Vielleicht kann ja jemand mal über meinen Code drüberschauen, und mir sagen, ob das überhaupt so funktionieren kann und was ich ggf. ändern muss… Das würde mir sehr weiterhelfen. : )

Liebe Grüße
Lea

Code:

#define SW1 2
#define SW2 3
#define SWOEL 4 // switch für obere Endlage
#define SWUEL 5 // switch für untere Endlage
#define ENA 10 // HIGH disables motor power
#define DIR 11
#define PUL 12 

#define CW 1 // clockwise
#define CCW 0 // counterclockwise 

// indicates motor is on
// this is built in LED on DP13.
#define motorOn 13

// sets how many pulses for 360 degrees
#define rot360 200

// HIGH on PUL will keep motor locked in position
// note motor will get hot after some time.

int x, y;

// this sets the motor speed
int pulseDelay = 3300; // in uSec.

void setup() {
  // DP13 LED
  pinMode(motorOn, OUTPUT);
  digitalWrite(motorOn, LOW);

  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SWOEL, INPUT_PULLUP);
  pinMode(SWUEL, INPUT_PULLUP);
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW);
  pinMode(PUL, OUTPUT);
  digitalWrite(PUL, LOW);
  pinMode(ENA, OUTPUT);
  digitalWrite(ENA, HIGH); 

}

void loop() {


  // manual CW when pushed
  while ((digitalRead(SW1) == 0) && digitalRead(SWOEL != 0) && digitalRead(SWUEL != 0))  {
    digitalWrite(motorOn, HIGH); // motor LED On
    digitalWrite(ENA, LOW); // enable motor power
    digitalWrite(DIR, CW);
    digitalWrite(PUL, 1);
    delayMicroseconds(500);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay * 2);
  } // end while

  // manual CCW when pushed
  while ((digitalRead(SW2) == 0)&& digitalRead(SWOEL != 0) && digitalRead(SWUEL != 0)) {
    digitalWrite(motorOn, HIGH); // motor LED On
    digitalWrite(ENA, LOW); // enable motor power
    digitalWrite(DIR, CCW);
    digitalWrite(PUL, 1);
    delayMicroseconds(500);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay * 2);
  } // end while

 
  delay(100);

} // end loop

// Die folgenden Code-Bausteine werden aktuell nicht benötigt, habe sie aber drin gellassen, weil sie später nützlich sein könnten

void motorRun(int count, byte dir_local )   {
  digitalWrite(motorOn, HIGH); // DP13 LED
  digitalWrite(ENA, LOW); // motor power ON
  digitalWrite(DIR, dir_local);
  count = count * rot360;
  for (int x = 0; x < count; x++)   {
    digitalWrite(PUL, 1);
    delayMicroseconds(500);
    digitalWrite(PUL, 0);
    delayMicroseconds(pulseDelay);
  } // end for
  digitalWrite(ENA, HIGH); // motor power OFF
  digitalWrite(motorOn, LOW);
}

void lockMotor(void) {
  digitalWrite(motorOn, HIGH);
  digitalWrite(ENA, LOW);
}

void unlockMotor(void) {
  digitalWrite(ENA, HIGH);
}

/*
Ex.
motorRun(10, CW);
motorRun(10, CCW);
motorRun(100, CW);
motorRun(50, CCW);
motorRun(50, CCW);
*/

Was ich vielleicht vergessen habe zu erwähnen:
-Ich verwende einen Nema23 Schrittmotor mit 4 Kabeln von Joy-It
-Was genau nicht funktioniert: Motor dreht zwar wenn SW1 oder SW2 gedrückt ist, und stoppt auch wenn nichts mehr gedrückt ist. Allerdings hört er nicht auf zu drehen, wenn zusätzlich noch ein Endlagenschalter gedrückt wird, sondern dreht sich einfach weiter.

lea11sophie:

  while ((digitalRead(SW1) == 0) && digitalRead(SWOEL != 0) && digitalRead(SWUEL != 0))  {

Statt der Endlagenschalter fragst Du nur Pin 1 ab. Prüfe Deine Klammerstruktur!

Es ist zu überlegen ob bei der Ansteuerung nach unten der obere Endschalter kontrolliert werden muß. Gleiches gilt für die Bewegung nach oben mit dem unteren Endschalter.
Des weiteren ist auch nachzudenken ob nicht jeweils ein zweiter Endschalter der etwas nach dem ersten ausgelöst wird und die Versorgungsspannung des Motors unterbricht.

Außerdem durch die delay() / delayMicroseconds() ist hier eine Verzögerung von 4 mS.

Grüße Uwe

DrDiettrich:
Statt der Endlagenschalter fragst Du nur Pin 1 ab. Prüfe Deine Klammerstruktur!

Oh, das war ja ein Leichtes. Daran hat's gelegen! Warum mir das nicht eher aufgefallen ist...
Vielen Dank für den Hinweis!

uwefed:
Es ist zu überlegen ob bei der Ansteuerung nach unten der obere Endschalter kontrolliert werden muß. Gleiches gilt für die Bewegung nach oben mit dem unteren Endschalter.
Des weiteren ist auch nachzudenken ob nicht jeweils ein zweiter Endschalter der etwas nach dem ersten ausgelöst wird und die Versorgungsspannung des Motors unterbricht.

Außerdem durch die delay() / delayMicroseconds() ist hier eine Verzögerung von 4 mS.

Grüße Uwe

Danke für die Hinweise. Stimmt, die ELS müssen natürlich nicht immer beide abgefragt werden. Es ist nur so, dass ich den Gesamtaufbau gerade nicht vorliegen habe und ich gerade nicht durchblicke in welche Richtung das Ganze letztendlich fährt. Gewinde sind einfach nicht so mein Ding... So bin ich auf Nummer Sicher.
Das mit der Verzögerung ist glaub nicht so tragisch.. Ich finde, der Motor fährt so schnell genug und stoppt auch rechtzeitig.
Das mit dem zusätzlichen ELS habe ich nicht ganz kapiert. Wie soll der denn noch ausgelöst werden, wenn der Motor schon steht?

lea11sophie:
Das mit dem zusätzlichen ELS habe ich nicht ganz kapiert. Wie soll der denn noch ausgelöst werden, wenn der Motor schon steht?

Das ist ein Hardware Stop, also ein Schutz, wenn deine CPU mal nicht mehr das macht was sie soll. Dann hilft der Stopp in deinem Programm nichts mehr, weil sich dann die CPU nicht mehr dafür interessiert, was das programm gerne hätte. Da gibt es dann die Endschalter in zweiter Reihe, die einfach die Spannung für die ganze Maschine abschalten.
Franz

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