Endschalter an einer Linearführung mit Arduino

Hallo zusammen,

ich möchte 02 Endschalter (Micro Rollenschalter / Endschalter - Bastelgarage Elektronik Online Shop) an einer Linearführung mit Schlitten benutzen, um zu erkennen ob der Schlitten am Rand (links oder rechts) der Linearführung befinden. Wenn ein der Endschaltern aktiviert ist muss der Motor sich stoppen. Die Steuerung der Linearführung mit einem NEMA 23 Motor habe ich schon geschafft.
jetzt mit ich gern wissen, welche Bibliothek am besten mit dem Endschalter passt? Muss überhaupt eine Bibliothek dafür benutzen? Soll ich unbedingt zur Verbindung der Endschaltern mit Arduino “Attiny” benutzen? Wenn ja wie funktioniert “Attiny”?

Zur Steuerung des Motors habe keine Bibliothek verwendet. Ich habe auch 02 Berührungssensoren die dann der Motor sagen in welche Richtung der drehen muss. Unten ist meine Code zur steuerung des Motors mit den Sensoren.

#define kap_Sensor1 A0
#define kap_Sensor2 A1
#define pulPin 10
#define dirPin 11
#define enPin 12
#define PulseproRevolution 12800


void setup() {
  Serial.begin(9600);
  // Pin als Outputs setzen
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);

  //Pin als Input setzen
  pinMode(kap_Sensor1, INPUT);
  pinMode(kap_Sensor2, INPUT);

}

void loop() {
  int touchwerte_1 = digitalRead(kap_Sensor1);
  int touchwerte_2 = digitalRead(kap_Sensor2);

  if (touchwerte_1 == HIGH) {
    Serial.print("Sensor1 funktioniert\t");
    digitalWrite(dirPin, HIGH); // Bewegung des Motors in Uhrzeigersinn
    for (int x = 0; x < PulseproRevolution; x++) {
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
//      digitalWrite(pulPin, LOW);
//      delayMicroseconds(10);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_1 == LOW;
    }
  }
  
  if (touchwerte_2 == HIGH) {
    Serial.print("Sensor2 funktioniert\t");
    digitalWrite(dirPin, LOW); //Bewegung des Motors gegen der Uhrzeigersinn
    for (int x = 0; x < PulseproRevolution; x++) {
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_2 == LOW;
    }
  }

}

(deleted)

Hi Peter-CAD-HST,

ich werde Kommentare hinzufügen und morgen posten. Aber mein Problem liegt eigentlich bei der Benutzung der Endschaltern. Welche Bibliothek soll ich dafür benutzen? Muss ich "Attiny" verwendet? Kann ich auch die Endschaltern ohne Bibliothek mit Arduino steuern?

Danke für die Antwort

(deleted)

Wozu brauchst Du eine Bibliothek für die Endschalter? Die kannst Du doch einfach an einen digitalen Eingang anschließen, und dann im Programm abfragen. Und wenn Du sie rein als Endschalter verwendest, musst Du sie noch nichtmal entprellen. Sobald der Schalter anspricht, stoppst Du die Bewegung in dieser Richtung.
Vielleicht schreibst Du ein bisschen mehr, was das Ganze werden soll. Dann kann man auch besser helfen. Und was für einen Arduino setzt Du ein?

(deleted)

Danke schön für eure Antwort, damit kann ich schon weiter machen.

Also ich möchte die Endschaltern verwendet um nur zu vermeiden, dass der Schlitten die beide Kante der Linearführung berührt. Am beiden Kante werde ich ein Endschalter fixieren, falls der Schlitten mit einem Endschalter im kontakt kommt muss der Motor gestoppt werden. Wie ich oben gesagt habe, verwende ich auch 02 sensoren um die Bewegungsrichtung des Motors du definieren. Das heißt, wenn der rechte Sensor aktiviert ist muss der Motor nach recht drehen und wird dann der Schlitten nach recht gefahren. Wenn der Schlitten der rechte Endschalter trifft muss seine Fahrt gestoppt und bleibt er an diese Stelle. Sobald der linke Sensor aktiviert ist, muss dann der Motor nach link drehen und so der Schlitten auch nach link fahren.
Kann auch sein, dass der Schlitten mit den Endschaltern nie im Kontakt kommt.

Hier unter die meine Code(mit Kommentar) zur Steuerung der Sensoren und des Motors.

//Definition Pins Kapazitive Sensoren:
#define kap_Sensor1 A0
#define kap_Sensor2 A1
//Definition Pins Schrittmotor:
#define pulPin 10
#define dirPin 11
#define enPin 12
//Definition der Schritte pro Umdrehung
#define PulseproRevolution 12800


void setup() {
  Serial.begin(9600);
  // Pin als Outputs setzen
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);

  //Pin als Input setzen
  pinMode(kap_Sensor1, INPUT);
  pinMode(kap_Sensor2, INPUT);

}

void loop() {
  //Einlesen der werte der Sensoren
  int touchwerte_1 = digitalRead(kap_Sensor1);
  int touchwerte_2 = digitalRead(kap_Sensor2);

  if (touchwerte_1 == HIGH) {
    Serial.print("Sensor1 funktioniert\t");
    digitalWrite(dirPin, HIGH); // Bewegung des Motors in Uhrzeigersinn
    // Erzeugt 12800 Impulse für eine volle Umdrehung
    for (int x = 0; x < PulseproRevolution; x++) {
      //Durchführung 1 Schritt
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_1 == LOW;
    }
  }
  
  if (touchwerte_2 == HIGH) {
    Serial.print("Sensor2 funktioniert\t");
    digitalWrite(dirPin, LOW); //Bewegung des Motors gegen der Uhrzeigersinn
    // Erzeugt 128000 Impulse für zwei volle Umdrehungen
    for (int x = 0; x < PulseproRevolution; x++) {
      //Durchführung 1 Schritt
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_2 == LOW;
    }
  }

}

Ich benutze ein Arduino Mega

Du braucht pro Achse nicht zwei Endschalter.
Wenn du eine Referenzfahrt gemacht hast, kannst du die zweite Endposition ausrechnen und per Software begrenzen.
Dadurch weisst du dann nicht nur, das der Schlitten nicht rausfällt, sondern auch noch wo der Schlitten gerade ist

ich habe eine Frage bezüglich die den Anschluss der Endschalter am Arduino. Im Attachement ist die meine Zeichnung zum anschließen der beiden Endschaltern. Bitte können sie mir sagen ob das korrekt ist? Wenn nein was soll ich berücksichtigen?

Endschalter_Anschlüss.PNG

Nicht schlecht! Da brennen ja dann gleich die Kabel ab wenn ein Endschalter auslöst. Das is natürlich auch ne Idee den Motor zu stoppen, in dem man die Schlatung abbrennen lässt :o ::slight_smile:
...da wird doch ein Kurzschluss gebaut, wenn ein Schalter auslöst.

@themanfrommoon was ist bitte dein Vorschlag? Ich kenne mich nicht so gut mit der Verdrahtung von elektronische Komponenten.

NC und C tauschen, dann ziehst du die Eingänge schonmal auf Low oder High. Ob man dann aber noch Widerstände braucht weiss ich nicht. Damit hab ich mich noch nie beschäftigt. Bei deiner Schaltung gibt's einen Kurzschluss zwischen Spannungsversorgung und GND wenn du einen Schalter schließt.

So meinst du? (Attachement)

Endschalter_Anschluss.PNG

Jo, aber wie gesagt, ob man da noch Widerstände braucht weiss ich nicht

themanfrommoon:
Jo, aber wie gesagt, ob man da noch Widerstände braucht weiss ich nicht

Den internen Pullup würde ich auf alle Fälle aktivieren. Dann evtl. noch NC und NO vertauschen. Ein Kabelbruch wirkt dann wie 'Endschalter erreicht' und der Motor bleibt auch stehen.

Ich habe meine Code mit den Endschalter ergänzt. Ist es logisch was ich geschrieben habe? Was muss ich ändern?

//Definition Pins Kapazitive Sensoren:
#define kap_Sensor1 A0
#define kap_Sensor2 A1
//Definition Pins Schrittmotor:
#define pulPin 10
#define dirPin 11
#define enPin 12
//Definition Pins Endschalter:
#define Endschalter_1 4
#define Endschalter_2 5
//Definition der Schritte pro Umdrehung
#define PulseproRevolution 12800


void setup() {
  Serial.begin(9600);
  // Pin als Outputs setzen
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);

  //Pin als Input setzen
  pinMode(Endschalter_1, INPUT);
  pinMode(Endschalter_2, INPUT);
  pinMode(kap_Sensor1, INPUT);
  pinMode(kap_Sensor2, INPUT);

}

void loop() {
  //Einlesen der werte der Sensoren
  int kontakt1 = digitalRead(Endschalter_1);
  int kontakt2 = digitalRead(Endschalter_2);
  int touchwerte_1 = digitalRead(kap_Sensor1);
  int touchwerte_2 = digitalRead(kap_Sensor2);
  //wenn beide Endschlater nicht ausgelöst sind
  if ((kontakt1 == HIGH) && (kontakt2 == HIGH)) {
    sensor_1();
    sensor_2();
  }
  //wenn Endschalter_1 ausgelöst und Endschalter_2 nicht ausgelöst ist
  else if ((kontakt1 == LOW) && (kontakt2 == HIGH)) {
    digitalWrite(pulPin, LOW);//Kein impuls wird gesendet
    digitalWrite(enPin, HIGH);//Motor wird deaktiviert
    //falls kap_sensor2 aktiviert ist dann Bewegung des Motors gegen der Uhrzeigersinn
    sensor_2();
  }
  else if ((kontakt1 == HIGH) && (kontakt2 == LOW)) {
    digitalWrite(pulPin, LOW); //Kein impuls wird gesendet
    digitalWrite(enPin, HIGH);//Motor wird deaktiviert
    //falls kap_sensor2 aktiviert ist dann Bewegung des Motors in Uhrzeigersinn
    sensor_1();
  }
  else if ((kontakt1 == LOW) && (kontakt2 == LOW)) {
    digitalWrite(enPin, HIGH);//Motor wird deaktiviert
  }

}

void sensor_1() {
  //Einlesen der werte der Sensoren
  int touchwerte_1 = digitalRead(kap_Sensor1);
  int touchwerte_2 = digitalRead(kap_Sensor2);
  if (touchwerte_1 == HIGH) {
    Serial.print("Sensor1 funktioniert\t");
    digitalWrite(dirPin, HIGH); // Bewegung des Motors in Uhrzeigersinn
    // Erzeugt 12800 Impulse für eine volle Umdrehung
    for (int x = 0; x < PulseproRevolution; x++) {
      //Durchführung 1 Schritt
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_1 == LOW;
    }
  }
}

void sensor_2() {
  //Einlesen der werte der Sensoren
  int touchwerte_1 = digitalRead(kap_Sensor1);
  int touchwerte_2 = digitalRead(kap_Sensor2);
  if (touchwerte_2 == HIGH) {
    Serial.print("Sensor2 funktioniert\t");
    digitalWrite(dirPin, LOW); //Bewegung des Motors gegen der Uhrzeigersinn
    // Erzeugt 128000 Impulse für zwei volle Umdrehungen
    for (int x = 0; x < PulseproRevolution; x++) {
      //Durchführung 1 Schritt
      digitalWrite(pulPin, HIGH);
      delayMicroseconds(50);
      digitalWrite(pulPin, LOW);
      delayMicroseconds(50);
      touchwerte_2 == LOW;
    }
  }
}

Hallo pp_237,
ich hab mir Deinen Code jetzt nicht angesehen. Aber etwas Grundsätzliches: mit dem Arduino steuerst Du keinen Endschalter, sondern der/die Endschalter steuern den Arduino! Der / Die Endschalter werden durch den Schlitten Deines Linear-Antriebs gesteuert, und diese schalter schalten /steuern dann einen als Eingang definierten Pin des Arduino.

Dies ist ein kleiner, aber wichtiger Unterschied.

LG Stefan

Also, so wird das wohl nicht funktionieren.
Folgendes ist mir zumindest mal bei einem ersten schnellen Durchlesen aufgefallen:

  • Wenn Du keine externen Widerstände für die Endschalter verwendest, musst Du den Eingang mit INPUT_PULLUP initiieren.
  • Wenn der Endschalter anspricht, deaktivierst Du den Motor, aktivierst ihn aber nie wieder.
  • Du fragst den Endschalter nicht ab, wenn Du den Motor ansteuerst. D.h. während der Bewegung merkst Du nicht, ob das Ende erreicht ist. Das ist aber doch eigentlich das was Du willst.
  • und was diese Anweisung soll:
    touchwerte_2 == LOW;
    wurdest Du schon in #1 gefragt. Die ist sinnfrei.

(deleted)