Go Down

Topic: Wenn Taster für X Sekunden gedrückt, dann ... (Read 959 times) previous topic - next topic

Whandall

Der von mir gepostete Kode macht genau was du wolltest.

Taste A kontrolliert den Motor (5 Sekunden lang) danach ist er nur noch mit Taste B abzuschalten.

Was bei dir läuft kann ich nicht ahnen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX


Ich habe nur die Pins angepasst.
Wenn ich jetzt die Grundstellungstaste betätige, läuft der Motor. Wenn nach den ersten 5sek nach dem  druck ein 2ter druck kommt, bleibt er stehen. Das kann man beliebig wiederholen, erst wenn ein Tastendruck abgesetzt wurde und der Motor 5 steht, lässt er sich nicht mehr abstellen, leider gar nicht mehr.
Der Endschalter hat gar keine Funktion

Ich möchte jetzt aber nicht noch mehr deiner Zeit in Anspruch nehmen.

Code: [Select]


#include <Bounce2.h>

const byte pinTasteA = 12;  //Grundstellungstaste
const byte pinTasteB = 4;  // Endschalter
const byte pinMotor = 5;  // Motor
const byte pinMotorLed = 8;

const unsigned int MotorPulseLen = 2000;
const unsigned int LedPulseLen = 500;
const unsigned int langeGedrueckt = 5000;

Bounce TasteA, TasteB;

bool motorState;
unsigned long gedrueckt;;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinMotorLed, OUTPUT);
  TasteA.attach(pinTasteA, INPUT_PULLUP);
  TasteB.attach(pinTasteB, INPUT_PULLUP);
}

void loop() {
  static unsigned long lastBlink;
  static unsigned long lastPulse;
  if (motorState) {
    if (TasteB.update() && TasteB.fell()) {
      motorState = false;
    } else if (TasteA.update() && TasteA.rose()) {
      if (millis() - gedrueckt < langeGedrueckt) {
        motorState = false;
      }
    }
    if (!motorState) {
      digitalWrite(pinMotor, LOW);
      digitalWrite(pinMotorLed, LOW);
    }
  } else {
    if (TasteA.update() && TasteA.fell()) {
      motorState = true;
      gedrueckt = millis();
      lastPulse = micros();
      lastBlink = millis();
      digitalWrite(pinMotor, HIGH);
      digitalWrite(pinMotorLed, HIGH);
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
    }
    if (millis() - lastBlink >= LedPulseLen) {
      lastBlink += LedPulseLen;
      digitalWrite(pinMotorLed, !digitalRead(pinMotorLed));
    }
  }
}


Whandall

#17
May 17, 2017, 09:45 pm Last Edit: May 17, 2017, 09:50 pm by Whandall
Code: [Select]
const byte pinMotorLed = 8;

Das war früher der Motortakt.

Wenn ich jetzt die Grundstellungstaste betätige, läuft der Motor. Wenn nach den ersten 5sek nach dem  druck ein 2ter druck kommt, bleibt er stehen.
Bei mir nicht, beide blinken lustig weiter.

Ich habe nur die Pins angepasst.
Anscheinend nicht richtig.

erst wenn ein Tastendruck abgesetzt wurde und der Motor 5 steht, lässt er sich nicht mehr abstellen, leider gar nicht mehr.
Das kann ich nicht verstehen (semantische Analyse fehlgeschlagen, Widersprüche).

Der Endschalter hat gar keine Funktion
Die SD Karte auch nicht, sie kommt ja auch nicht im Sketsch vor.

Aber wenn du damit Taste B meinst, dann macht die bei mir genau was sie soll,
alles Blinken sofort stoppen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

Lass uns die Namesverwirrung zumindestens beseitigen

Code: [Select]
#include <Bounce2.h>
//#define _HERE_
#ifdef _HERE_
const byte pinTGrundstellung = 30;
const byte pinTEnschalterLinks = 31;
const byte pinMotor = 8;
const byte pinMotorLed = 9;
#else
const byte pinTGrundstellung = 12;  //Grundstellungstaste
const byte pinTEnschalterLinks = 4;  // Endschalter
const byte pinMotor = 8;  // Motor
const byte pinMotorLed = 5;
#endif

const unsigned int MotorPulseLen = 2000;
const unsigned int LedPulseLen = 500;
const unsigned int langeGedrueckt = 5000;

Bounce TGrundstellung, TEnschalterLinks;

bool motorState;
unsigned long gedrueckt;;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinMotorLed, OUTPUT);
  TGrundstellung.attach(pinTGrundstellung, INPUT_PULLUP);
  TEnschalterLinks.attach(pinTEnschalterLinks, INPUT_PULLUP);
}

void loop() {
  static unsigned long lastBlink;
  static unsigned long lastPulse;
  if (motorState) {
    if (TEnschalterLinks.update() && TEnschalterLinks.fell()) {
      motorState = false;
    } else if (TGrundstellung.update() && TGrundstellung.rose()) {
      if (millis() - gedrueckt < langeGedrueckt) {
        motorState = false;
      }
    }
    if (!motorState) {
      digitalWrite(pinMotor, LOW);
      digitalWrite(pinMotorLed, LOW);
    }
  } else {
    if (TGrundstellung.update() && TGrundstellung.fell()) {
      motorState = true;
      gedrueckt = millis();
      lastPulse = micros();
      lastBlink = millis();
      digitalWrite(pinMotor, HIGH);
      digitalWrite(pinMotorLed, HIGH);
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
    }
    if (millis() - lastBlink >= LedPulseLen) {
      lastBlink += LedPulseLen;
      digitalWrite(pinMotorLed, !digitalRead(pinMotorLed));
    }
  }
}

Ist es wirklich der linke Endanschlag der hier bearbeite wird?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

Okkaaayyyyyy ^^
Den Fehler wegen dem Abschalten habe ich gefunden. Mein Taster ist/war kaputt. Getauscht und siehe da, nach 5 sek kann ich auch abschalten.

Für die ersten 5 Sek bin ich mir jetzt nicht sicher, ob wir und da verstanden haben, oder ich mich blöde ausgedrückt.

In den ersten 5 Sek soll der Taster nur als Taster gelten. Taster HIGH -> Motor HIGH, Taster LOW -> Motor LOW
Das passiert aber nicht, durch druck auf den Taster läuft der Motor los, beim loslassen, läuft er weiter.
Beim erneuten Drücken bleibt er so lange stehen, bis der Taster wieder losgelassen wird.
Nach 5 Sek Druck soll er  als RS Glied dienen, das passiert jetzt ja auch.

Die Bezeichnungen sind jetzt aber richtig, auch die PINs, ja 8 ist der Motorpin.

Whandall

#20
May 17, 2017, 10:36 pm Last Edit: May 17, 2017, 10:38 pm by Whandall
Ersetze den Motor durch eine LED und überzeuge dich davon dass deine Beschreibung nicht mehr zutrifft.

Ich habe das hier aufgebaut und laufen, du kannst mir das ruhig glauben.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

okay, jetzt läuft alles.
Ich habe mit Dämpfungswiderständen die Eingänge auf Masse/LOW gezogen und über die Taster +5V als Signal geschaltet. Scheinbar ist das aber falsch gewesen.
Ich habe jetzt ein dauer HIGH auf den Eingängen und mein Tastendruck ein LOW, jetzt klappt auch alles wie gewünscht.

Ich bin dir echt sehr dankbar.
Werde morgen noch mal probieren den Code besser zu verstehen und anfegen meine Erweiterungen dort mit anzuheften , wie in den ersten versuchen ja schon gesehen.

Whandall

Wenn du INPUT_PULLUP benutzt, brauchst du keine externen Widerstände und solltest auch keine haben.
Schließen nach GND und gut ist.

Bei Verwendung von Bounce2 ist dann ein Drücken der Taste ein MeinTaste.fell().

Das Angenehme an der Library ist ja nicht nur das Debouncen, sondern auch die State-Change-Detection,
also ob eine Taste gedrückt wurde und nicht ob sie gedrückt ist (was man natürlich auch auswerten kann).
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

Danke, in meinem Buch habe ich nichts zu Bounche2 gefunden. Im Netz auch keine deutsche Anleitung. Mal sehen ob ich noch was brauchbares finde.
Ich habe wohl völlig falsch gedacht und zu sehr an meinen alten Grundkonzept  festgehalten.
Aber die Funktion, wie du es jetzt für mich umgesetzt hast, finde ich sehr interessant.

Whandall

Der obige Kode testet immer nur die relevanten Tasten, eigentlich sehr gradlinig.

Die Routine die testet ob sich an einer Taste etwas getan hat MeineTaste.update() wird zusätzlich
als Filter benutzt, da uns ja hier nur die Übergänge, also das Drücken und das Loslassen interessieren.

Die Dokumentation steht hier https://github.com/thomasfredericks/Bounce2/wiki.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

Ich bins noch mal,
Ich habe heute probiert das ganze zu erweitern. Habe mir mal die <bounche2.h> vorlage genommen, aber irgendwie will das nicht. Die ist vom Code her anders, als du genutzt hast.

###
Wenn Taste "BlitzTakt" betätigt und nicht "EndschalterRechts" soll der Motor einen Impuls bekommen.
Das ganze dann noch verzögert, je nach Analogwert von A1, aber das habe ich noch nicht eingebaut.
In meinem ersten Code lief das schon, aber da will ich erst später ran, erst mal das Bounche2 verstehen.
###

Ich hätte gedacht. ich habe die Vorlage verstanden  :(

Code: [Select]


#include <Bounce2.h>
int PotiPin=1; //Analog
int valAnalog=0; //Analog
int PotiZeit5=0; //Analog
int PotiZeit10=0; //Analog
int PotiZeit=0;
int Fakt5=11; // Zeitfaktor 5
int Fakt5Wert=0; // Zeitfaktor Merker
// int pinBlitzTakt = 9; // BlitzTakt eingabe
int pinRichtung = 5;  // Endschalter
int Richtung=0;
// int pinEndschalterRechts = 3;  // Endschalter


const byte pinGrundstellung = 12;  //Grundstellungstaste
const byte pinEndschalterLinks = 4;  // Endschalter Links
const byte pinEndschalterRechts = 3;  // Endschalter Rechts
const byte pinMotor = 8;  // Motor
const byte pinBlitzTakt = 9;  // BlitzTakt

const unsigned int MotorPulseLen = 2000;
const unsigned int langeGedrueckt = 2500;

Bounce Grundstellung, EndschalterLinks;
Bounce EndschalterRechts;
Bounce BlitzTakt;



bool motorState;
unsigned long gedrueckt;;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinBlitzTakt, INPUT_PULLUP);
  pinMode(pinEndschalterLinks, INPUT_PULLUP);
  BlitzTakt.attach(pinBlitzTakt);
  EndschalterRechts.attach(pinEndschalterRechts);
  BlitzTakt.interval(5);
  EndschalterRechts.interval(5);
 
  Grundstellung.attach(pinGrundstellung, INPUT_PULLUP);
  EndschalterLinks.attach(pinEndschalterLinks, INPUT_PULLUP);
  pinMode(Richtung, OUTPUT);
  Fakt5Wert=digitalRead(Fakt5);
 
}

void loop() {
  BlitzTakt.update();
  EndschalterRechts.update();
  int value1 = BlitzTakt.read();
  int value2 = EndschalterRechts.read();


    if ( value1== LOW && value2 == HIGH) {
    digitalWrite(pinMotor, HIGH );
    delay(2);
    digitalWrite(pinMotor, LOW );
  }
  else {
    digitalWrite(pinMotor, LOW );
  }








 
  static unsigned long lastBlink;
  static unsigned long lastPulse;
  if (motorState) {
    if (EndschalterLinks.update() && EndschalterLinks.fell()) {
      motorState = false;
    } else if (Grundstellung.update() && Grundstellung.rose()) {
      if (millis() - gedrueckt < langeGedrueckt) {
        motorState = false;
      }
    }
    if (!motorState) {
      digitalWrite(pinMotor, LOW);
    }
  } else {
    if (Grundstellung.update() && Grundstellung.fell()) {
      motorState = true;
      gedrueckt = millis();
      lastPulse = micros();
      lastBlink = millis();
      (EndschalterLinks.update() && EndschalterLinks.fell());
      digitalWrite(pinRichtung, LOW);
      digitalWrite(pinMotor, HIGH);
    }

  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
 
  } 
 }
}
 
 



Whandall

Ich versuche mal zusammenzufassen:

Du hast einen Motor mit zwei Endanschlägen, einem Richtungs- und einem Impulseingang.
4 ms lange HIGH/LOW Zyklen bewegen den Motor und der kann 250 Schritte/s aus dem Stand leisten.
Es gibt mehrere Konfigurationsschalter und ein? Poti die eine Zeiteinstellung kontrollieren.
Es gibt mehrere Bedientaster.
Der Flanken-gesteuerte Impulseingang löst eine verzögerte Sequenz aus.
Der Motor kann kontinuierlich, für eine Anzahl von Schritten und u.U. verzögert gestartet werden.

Ich denke du solltest zunächst einmal vollständig zusammenfassen was du wirklich willst,
oder ob ich etwas missverstanden habe, also was genau wann passieren soll.

Was soll die verzögerte Sequenz genau machen?
Welche Tasten sollen unter welchen Umständen was auslösen?

Mit dem Dazustricken und Erweitern wird das nichts.

Leg mal die Karten auf den Tisch.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

#27
May 18, 2017, 10:12 pm Last Edit: May 18, 2017, 10:33 pm by AtomicIX
Okay, ich hätte gedacht ist ist einfacher und ich brauche nur bei einem Abschnitt Hilfe und den Rest selber ran zu basteln. Dem scheint aber nicht so.

Also ich habe:

1 Schrittmotor inkl Steurboard. (Negative Flanke ein Schritt, Rechst/Links, Halb/Vollschritt über Masse gesteuert)
2 Endlagenschalter
1 Grundstellungstaster
1 Impulseingang ( Kontakt ) von Fotoapparat
1 Poti zur Zeiteinstellung
1 Taster für Halb/Vollschritt


Ich bekomme vom Fotoapparat einen Impuls,
dann soll nach PotiZeit ca. 1-10 sek ( muss nicht präzise sein ) ein Puls an den Schrittmotor geschickt werden. Der ist abhängig vom Halb/Vollschritt Taster. Wenn alles am ende angekommen ist (EndlageLinks) bleibt es stehen.
Durch kurzem Druck auf Grundstellung läuft der Motor kurz zurück. Nach längerem Druck, läuft er bis zum EndlageschalterRechts zurück.


Ich hoffe ich habe nichts vergessen.

Das Ganze habe ich schon mal mit Timer ( NE555 ) und vielen Transistoren .... umgesetzt, wollte es jetzt aber gern auf nem Arduino haben.


Whandall

Ich bekomme vom Fotoapparat einen Impuls,
dann soll nach PotiZeit ca. 1-10 sek ( muss nicht präzise sein ) ein Puls an den Schrittmotor geschickt werden. Der ist abhängig vom Halb/Vollschritt Taster. Wenn alles am ende angekommen ist (EndlageLinks) bleibt es stehen.
Ein einstellbarer Puls, der bis zum Ende reicht? Merkwürdig...
Im anderen Modus schickst du fünf Sekunden lang 250 Pulse pro Sekunde.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

#29
May 18, 2017, 10:41 pm Last Edit: May 18, 2017, 10:46 pm by AtomicIX
Es kommt von Fotoapparat ein Impuls, der soll verzögert  (Poti ) an den Schrittmotor gegeben werden. Ja nur ein ( Halb/Vollschritt) , die Impulse wiederholen sich immer wieder, gesteuert von der Kamera. das andere ist nur der Rücklauf, da brauche ich halt die Impulse um den Motor / Schlitten wieder in Grundstellung zu Fahren.

Go Up