Code mit State Change für Motorsteuerung

Hallihallo,

ca 3 Jahre nach meinem letzten Post hier habe ich mich mal wieder etwas mit dem Duino beschäftigt.

Allerdings ist mein Wissen stark eingerostet und ich suche vergeblich nach einem Lösungsansatz.

Folgendes sind die Rahmenbedingungen:

1 Motor der mittels eines Mosfet angesteuert wird und an einer Zahnradkonstruktion hängt
1 Momentary Switch, der sich innerhalb der Zahnradkonstruktion befindet und mittels einer ovalen Scheibe angesteuert wird (dh nach einer vollen Umdrehung wird der Switch kurz betätigt)
1 Pushbutton der den Motor anfahren lassen soll

Das Soll Szenario:

Ich drücke auf den Pushbutton und der Motor läuft solange, bis der Momentary Switch von 0 auf 1 geht. Und von vorne wenn ich wieder drücke. Klingt einfach, hat mich gestern aber 2h gekostet ohne Erfolg.

Das Problem ist, dass ich nicht garantieren kann dass der Momentary Switch manchmal an der Scheibe "hängt", also noch 1 ausgibt wenn der Motor steht, was ich also ignorieren möchte wenn der Button gedrückt wird.

Vereinfacht gesagt soll der Motor immer anlaufen wenn ich den Knopf einmal drücke, und immer stehenbleiben wenn sich das Reading des Momentary switch von 0 auf 1 ändert (nicht aber andersrum)

Habe schon so ziemlich alles mit ButtonStateChange, if-schleifen, while etc ausprobiert, aber irgendwie kein erfolg. entweder der Motor läuft einfach weiter, oder er bleibt stehen und läuft nicht mehr an oder...

Welchen Ansatz würdet ihr hier wählen, bzw welche Codeschnipsel wären hier passend?

Ich danke im Vorraus und viele Grüße

apogee

Für solche Kinkerlitzchen bemüht man keinen Rechner.
Würd ich LowTech machen: Sprungschalter und Taster parallel schalten, fertig. 8)
Braucht allerdings nen Sprungschalter, der EIN schaltet-ist aber easy, den zu besorgen.
-Wird Taster gedrückt, ist der Sprungschalter überbrückt und das Ding läuft
-Wird der Taster gehalten, läuft das Ding bis er losgelassen wird, und dann noch bis zum Ende (Sprungschalter trennt ebenfalls)
-Wird der Taster kurz gedrückt, läufts ne Umdrehung
Wenn man das mechanisch vernünftig baut, ist es nen Rundum-Sorglos-Paket.

Hi rabenauge,

danke schonmal für die Antwort.

Ich möchte aus verschiedenen Gründen einen Pro Mini benutzen, hätte ich vielleicht dazu schreiben können.

  • Es ist ein Umbau einer Kamera, dh ich kann nur an die gegebenen Kontakte "andocken" und nicht neues einbauen ausser einem Mini der gerade so reingeht
  • Die 5V vom Spannungswandler des Duino benutze ich noch anderswo im Aufbau
  • Es läuft später noch weiterer Code darauf der hier aber nicht relevant ist.
  • Kosten von 1.70 pro Stück für einen Duino Pro Mini 328 sind unschlagbar und noch dazu ist der Einbau sehr unaufwendig.
  • Der Aufbau bleibt reproduzierbar für evtl. Nachbauer

Ich suche also noch weiter nach möglichen Vorschlägen

apogee:
Vereinfacht gesagt soll der Motor immer anlaufen wenn ich den Knopf einmal drücke, und immer stehenbleiben wenn sich das Reading des Momentary switch von 0 auf 1 ändert (nicht aber andersrum)

Was Du machen möchtest, nennt sich auf Neudeutsch "state change detection" und dafür gibt es ein Arduino-Beispielprogramm.

Schaue mal in Deiner Arduino-IDE nach unter:
Datei - Beispiele - 02.Digital - StateChangeDetection

Anhand des Beispiels sollte es eigentlich klar werden, wie man eine bestimmte Statusänderung erkennt.

Danke auch für deine Antwort.

Wie ich ja bereits eingangs schrob, habe ich ButtonStateChange etc schon durchgearbeitet.

Hier ist das Problem, dass sich ja der Status auch wieder ändert wenn der Momentary von 1 auf 0 springt, was ganz am Anfang auch passieren kann. Dann läuft der Motor nicht an.

apogee:
Wie ich ja bereits eingangs schrob, habe ich ButtonStateChange etc schon durchgearbeitet.

Hier ist das Problem, dass sich ja der Status auch wieder ändert wenn der Momentary von 1 auf 0 springt, was ganz am Anfang auch passieren kann. Dann läuft der Motor nicht an.

OK, ich habe nochmal überlegt, eigentlich kannst Du den Zyklus anfängermäßig auch komplett straight-forward programmieren und es ganz billig machen.

Dass der Motor beim Einschalten noch auf seiner Ausschaltbedingung steht, muss man dadurch berücksichtigen, dass der Motor eben nicht abschaltet, bevor nicht der Motorschalter seinen Roundtrip-Status signalisiert hat. Mein Beispielprogramm wartet dazu nach dem Einschalten erstmal auf das Verschwinden des Abschaltsignals plus 5 Millisekunden zum Entprellen des mechanischen Kontakts.

Bei den Schaltern gehe ich davon aus, dass Du keine externen Pull-Widerstände verbaust, sondern die internen PullUp-Widerstände des Controllers verwendest, also die Schalter zwischen jeweils GND und Digitalpin anschließt.

Beispielprogramm:

// Buttonpin zwischen Pin-2 und GND
// Momentarypin zwischen Pin-8 und GND
// Motor schaltet mit Pin-13
const int buttonPin = 2;   // the pin that the pushbutton is attached to
const int momentaryPin=8;  // Motor-Abschaltkontakt
const int motorPin= 13;    // Schaltpin für Motor

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(momentaryPin, INPUT_PULLUP);
  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.println("Press button to start engine...");
  while (digitalRead(buttonPin)==HIGH); // Geht LOW wenn Button gedrückt
  digitalWrite(motorPin, HIGH);  // Motor an
  Serial.println("OK. Engine is running...");
  while (digitalRead(momentaryPin)==LOW); // über den Abschaltstatus drüberfahren
  delay(5); // Entprellen des mechanischen Kontakts
  while (digitalRead(momentaryPin)==HIGH); // warten auf Abschaltstatus
  digitalWrite(motorPin, LOW);  // Motor aus
  Serial.println("Motor STOP.");
}

Danke jurs für den Code!

Ich werde wenn ich morgen wieder daheim bin alles testen und dann berichten!

Viele Grüße

apogee