Motor endschalter

hallo,

ich versuche seid einiger zeit einen motor anzusteuern mit endschaltern, für eine elektrisch aus/einfahrende schublade.
das problem ist das ich den gedrückten endschalter nicht frei bekomme (motor macht nichts solang er gedrückt ist), zeit gesteuert kommt nicht in frage zwecks sicherheit...

mein setup:
motorschield r3
ein taster für auf/zu
2 endschalter
motorsense (ueberwachung des stromes falls ein finger im weg ist ;D)

das ganze funktioniert soweit ja, bis auf den endschalter...motor stopt aber gibt nicht wieder frei...

das programm ohne sense

int startPin = 2; // start/stop
int DIRPin1 = 12; // richtung
int PWMPin2 = 3; //  pwm
int state1;  
int reading;
int previous = LOW;  
char pwmsignal=200; // MAX PWM
long time = 0; 
long debounce = 200; 
int pressCount = 1; 
int end1 = 4; // endschalter
int buttonState = 0;
void setup()
{
pinMode(end1, INPUT);
pinMode(startPin, INPUT);
pinMode(DIRPin1, OUTPUT);
pinMode(PWMPin2, OUTPUT);
}
void loop()
{
buttonState = digitalRead(end1);
  if (buttonState == HIGH) {           
    digitalWrite(DIRPin1, LOW);
    digitalWrite(PWMPin2, LOW);  
  }
{
  reading = digitalRead(startPin);
if (reading == HIGH && previous == LOW && millis() - time > debounce) 
{
state1 = !state1; 
pressCount++;
time = millis();

switch(pressCount%2)
 {
      case 0:
analogWrite(DIRPin1, 255);        // AUF
analogWrite(PWMPin2, pwmsignal); 
        break;
      case 1:
analogWrite(DIRPin1, 0);         // ZU
analogWrite(PWMPin2, pwmsignal);
        break;
    }
  }
 previous = reading;
  }

    }

hat jemand eine idee oder ist mein ganzer aufbau muell?
vielen dank im voraus...

int startPin = 2; // start/stop			// -> const byte
int DIRPin1 = 12; // richtung			// -> const byte
int PWMPin2 = 3; //  pwm				// -> const byte
int state1;								// -> bool/boolean
int reading;							// -> bool/boolean
int previous = LOW;						// -> bool/boolean
char pwmsignal = 200; // MAX PWM		// -> const byte/char
long time = 0;							// -> unsigned long
long debounce = 200;					// -> unsigned int
int pressCount = 1;						// -> byte
int end1 = 4; // endschalter			// -> const byte
int buttonState = 0;					// -> bool/boolean
void setup()
{
	pinMode(end1, INPUT);
	pinMode(startPin, INPUT);
	pinMode(DIRPin1, OUTPUT);
	pinMode(PWMPin2, OUTPUT);
}
void loop()
{
	buttonState = digitalRead(end1);
	if (buttonState == HIGH) {
		digitalWrite(DIRPin1, LOW);
		digitalWrite(PWMPin2, LOW);
		delay(50);						// Sollte für das einfache entprellen ausreichen, 
		// oder wie unten anwenden
	}

	// {								// unnötig
	reading = digitalRead(startPin);
	if (reading == HIGH && previous == LOW && millis() - time > debounce)
	{
		state1 = !state1;
		pressCount++;
		time = millis();

		switch (pressCount % 2)
		{
		case 0:
			digitalWrite(DIRPin1, HIGH);        // AUF
			analogWrite(PWMPin2, pwmsignal);
			break;
		case 1:
			digitalWrite(DIRPin1, LOW);         // ZU
			analogWrite(PWMPin2, pwmsignal);
			break;
		}
	}
	previous = reading;
	// }									// unnötig
}

Des weiteren passt die Logik glaube nicht ganz.

Motor AUF
Einschaltbedingung: NICHT Endschalter AUF && Start && Endschalter ZU
Abschaltbedingung: Endschalter AUF || Stop

Motor ZU
Einschaltbedingung: Endschalter AUF && Start && NICHT Endschalter ZU
Abschaltbedingung: Endschalter ZU || Stop

Motor AUF
Einschaltbedingung: NICHT Endschalter AUF && Start && Endschalter ZU
Abschaltbedingung: Endschalter AUF || Stop

Motor ZU
Einschaltbedingung: Endschalter AUF && Start && NICHT Endschalter ZU
Abschaltbedingung: Endschalter ZU || Stop

Wenn ich das richtig verstehe, hast du zwei Endschalter, die ZU und AUF heissen, und die entweder Kontakt haben oder NICHT.
Und wenn weder ZU noch AUF ansteht, kann man weder Motor AUF noch Moter ZU einschalten ? ...

Ne, es ist anders gemeint.

Motor Auf:
Einschaltbedingung(einmalig pro Fahrbewegung abfragen):
Endschalter AUF = 0 &&
Endschalter ZU = 1 &&
Start = 1

Stoppen, aber nicht Abschalten:
Wicklungsüberwachung = 1 (Zeit abwarten und weiter fahren versuchen, nach x Versuchen Anlage mit Störung in STOP setzen)

Abschaltbedingung(mehrmals pro Fahrbewegung abfragen):
Endschalter AUF = 1 ||
Start = 0

Motor Zu:
Einschaltbedingung(einmalig pro Fahrbewegung abfragen):
Endschalter ZU = 0 &&
Endschalter AUF = 1 &&
Start = 1

Stoppen, aber nicht Abschalten:
Wicklungsüberwachung = 1 (Zeit abwarten und weiter fahren versuchen, nach x Versuchen Anlage mit Störung in STOP setzen)

Abschaltbedingung(mehrmals pro Fahrbewegung abfragen):
Endschalter ZU = 1 ||
Start = 0

sorry sschultewolter steh vertseh ich nicht.....

nee im code ist jetzt nur ein enschalter definiert, auf zu ist rechts links drehen des motors, taster druecken links, erneutes druecken rechts bis endschalter stopt...laeuft aber bei gedruecktem zustand nicht wieder an..

also bin mehr oder weiniger ein blutiger anfaenger..dachte das man wenn endschalter gedrueckt wurde in die naechste schleife springen kann und die abfrage erneut beginnt oder so...

Wenn ich es richtig verstehe.....
Wie soll der Motor laufen wenn die verbindung gekappt wurde?
Wenn der endschalter gedrückt ist, ist doch ein Kabel nicht verbunden und da ist es jacke wie hose ob der Sketch dem Motor sagt links oder rechts rum.

Könntest du dein ganzes Vorhaben mal grob skizierren auf einem Blatt (geht am einfachsten) und dann einscannen abfotografieren.
Ich weiß nicht genau, was du genau jetzt machen möchtest.

Ich verstehe deine Lösung mit dem einen Endschalter nicht. Wenn du auffährst, muss du doch einen Endschalter anfahren, um die exakte Position zu ermitteln. Oder arbeiten Deine Motoren, sieht mir bisschen nach Servo aus, so genau?

Es wird ein Endschalter benötigt, der gedrückt wird, wenn Schublade offen, und ein Endschalter, der gedrückt wird, wenn Schublade zu.

Ah, ich seh gerade, der Endschalter wird bei dir auch garnicht im Sketch verarbeitet, somit hat Skorbi da schon recht. Wenn du wirklich den Motor auch wieder zurückfahren möchtest, wenn der Endschalter gedrückt ist, darf dieser nicht die Lastleitung des Motors trennen. Du solltest keine Lasttrennung machen mit dem Endschalter. Was geht, einen ersten Endschalter anbringen, der nur digital erfasst wird, und einen zweiten für alle Notfälle dahinter setzen, wenn der Motor nicht rechtzeitig abschaltet. Falls er dahin fährt, kann dein Sketch diesen aber nicht zurückfahren.

Hier mal eine Skizze wie man es machen könnte.

Endschalter Auf wird innerhalb der Schiene dauerhaft gedrückt. Erst wenn die Schiene weit genug herausgefahren ist, öffnet sich dieser. Das Signal geht an den Arduino. Motor soll stoppen.

Nun in der Gegenrichtung fährt der Motor solange bis der andere Motorschalter kommt.

Bezgl. der Sicherheit, da würde ich immer noch nicht mit einer Abschaltung über den Lastkreis der Endschalter gehen. Was du letzenendes zusätzlich einbauen kannst zum Schutz des Motors und der Anwender wäre ein Motorschutzrelais/Motorschutzschalter mit entsprechend Nennstromeinstellungen. Das stellste auf die In ein, dieses löst aus, wenn der Motor zuviel Strom braucht (zB. weil er gegen die Wand fährt). Danach ist der Motor abgeschaltet. Beim Motorschutzrelais kannst du einstellen, dass nach einer Zeitspanne x, das Motorschutzrelais den Motor wiederfreigibt. → Selbstzurücksetzend.
Beim Motorschutzschalter musst du dann jenach Ausführung wieder einen Hebel/Schalter von Hand umschalten.

ja der aufbau ist ja so, komme trotzdem nicht weiter...den motorschutz mache ich ueber den sense eingang....motorspannung mit lesen und wenn ein bestimmter wert ueberschritten wird stopt der motor bzw. haut die bremse rein für 10s, dann ist er wieder frei
das klappt ja alles nur wenn der endschalter gedruckt wird stopt der motor, aber wie setzte ich es um das der motor trotz high auf endschalter wieder anfaehrt, die drehrichtung wird ja ueber state1 gespeichert also kann er nur vom endschalter wegfahren...
oder anders gesagt solange der endschalter high ist bleibt er in der schleife haengen, das soll er aber nicht

ich lass mir eure post mal durch den kopp gehen....

danke euch

Ändere erst einmal deinen Sketch, vorallem die Defenitionen. Vom Aufbau her so

// Pinbelegung
const byte pinXy = c;
...

// Konstante Werte
const byte pwmSpeedForward = 255;
const byte pwm SpeedReward = 200;

....

Hallo,
das Zauberwort für MotorEndSchalter heißt UMSCHALTER- nicht Ein/Ausschalter.
Davon brauchst Du zwei Stück, einen für Schublade in, einen für Schublade out. Mit EINEM Taster am Arduino fährst Du dann Schublade ein/aus.
Gruß und Spaß
Andreas

habe für mich eine einfachere lösung gefunden, wenn der endschlalter auslöst dreht der motor in gegenrichtung bis er wieder frei ist ,dann stopt der motor.....

Tolle Lösung, nur wie soll sich der Motor drehen wenn kein Strom vorhanden?

dataOne:
habe für mich eine einfachere lösung gefunden, wenn der endschlalter auslöst dreht der motor in gegenrichtung bis er wieder frei ist ,dann stopt der motor.....

Ich denke, die einfachere Lösung wäre es die Endschalter in den Arduino einzulesen und dort alles zu machen.

hallo,
das auslesen habe ich ja nicht umsetzen können, bin aber jetzt soweit das der arduino das macht was er soll und ich das erst einmal so lasse als basis, um mich mit dem mechanischen teil beschäftigen zu können.....
strom ist da weil motor läuft!? :sweat_smile:
stromüberwachung ->Arduino Current Feedback Motor Torque Control - YouTube