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;
}
}
}
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?
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?
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;
}
}
}
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?
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 :
...da wird doch ein Kurzschluss gebaut, wenn ein Schalter auslöst.
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.
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.
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.
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.