Go Down

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

Whandall

Also auf ein Neues.

Ich habe ein paar Motor Funktionalitäten in Routinen gepackt,
damit wird es einfacher zu lesen und zu managen.

Das Blitz-Delay habe ich mal willkürlich auf 5 Sekunden gesetzt.

Code: [Select]
#include <Bounce2.h>

int valAnalog;
int PotiZeit5;
int PotiZeit10;
int PotiZeit;
int Fakt5Wert;

const byte pinFaktor5 = 11; // Zeitfaktor 5
const byte pinRichtung = 5;
const byte pinPoti = A1;
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; // µs
const unsigned int langeGedrueckt = 2500; // ms

Bounce Grundstellung;
Bounce EndschalterLinks;
Bounce EndschalterRechts;
Bounce BlitzTakt;

bool motorState;
byte Richtung;
int halfPulses;
unsigned long lastPulse;
unsigned long beauftragt;
unsigned long genugGewartet;
unsigned long grundstellungGedrueckt;

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

void motorOn(byte iRichtung, unsigned int forPulses = 0, unsigned long inMillis = 0) {
  Richtung = iRichtung;
  digitalWrite(pinRichtung, Richtung);
  halfPulses = 2 * forPulses;
  genugGewartet = inMillis;
  if (inMillis) {
    beauftragt = millis();
  } else {
    motorStart();
  }
}

void motorStart() {
  motorState = true;
  lastPulse = micros();
  digitalWrite(pinMotor, HIGH);
}

void motorOff() {
  digitalWrite(pinMotor, LOW);
  halfPulses = 0;
  motorState = false;
  genugGewartet = 0;
}

void loop() {
  if (motorState) {
    EndschalterRechts.update();
    EndschalterLinks.update();
    if ((!EndschalterLinks.read() && !Richtung) ||
        (!EndschalterRechts.read() && Richtung)) {
      motorOff();
    }
    if (Grundstellung.update() && Grundstellung.rose()) {
      if (millis() - grundstellungGedrueckt < langeGedrueckt) {
        motorOff();
      }
    }
  } else {
    if (BlitzTakt.update() && BlitzTakt.fell()) {
      motorOn(HIGH, 1, 5000);
    } else if (Grundstellung.update() && Grundstellung.fell()) {
      grundstellungGedrueckt = millis();
      motorOn(LOW);
    } else if (genugGewartet && (millis() - beauftragt >= genugGewartet)) {
      genugGewartet = 0;
      motorStart();
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
      if (halfPulses && --halfPulses == 0) {
        motorOff();
      }
    }
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

#31
May 19, 2017, 02:28 pm Last Edit: May 19, 2017, 02:33 pm by AtomicIX
Super vielen dank bis hier schon mal.

Soweit läuft es. Das Poti habe ich jetzt auch eingebaut und es geht wie gewünscht.
Kann man das so machen, oder ist das doof?
Was nicht geht ist der "EndschalterRechts". Wenn ein neuer "BlitzTakt" kommt, geht der Motor immer einen Schritt weiter, das darf auf keinen Fall passieren.
Wobei das beim "EndschalterLinks" auch passiert. Wenn die Endlage(Grundgstellung) erreicht ist und ich immer wieder Grundgstellung drücke, kommt ein Takt durch, was auf der Seite nicht schlimm ist, aber für die Linke Seite.

Das hat bestimmt was mit der Reihenfolge der Abarbeitung des Programm zutun, oder?


Code: [Select]

#include <Bounce2.h>

int PotiWert=0;

const byte pinRichtung = 5;
const byte pinPoti = A1;
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;  // µs
const unsigned int langeGedrueckt = 2500; // ms

Bounce Grundstellung;
Bounce EndschalterLinks;
Bounce EndschalterRechts;
Bounce BlitzTakt;

bool motorState;
byte Richtung;
int halfPulses;
unsigned long lastPulse;
unsigned long beauftragt;
unsigned long genugGewartet;
unsigned long grundstellungGedrueckt;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinRichtung, OUTPUT);
  BlitzTakt.attach(pinBlitzTakt, INPUT_PULLUP);
  EndschalterRechts.attach(pinEndschalterRechts, INPUT_PULLUP);
  Grundstellung.attach(pinGrundstellung, INPUT_PULLUP);
  EndschalterLinks.attach(pinEndschalterLinks, INPUT_PULLUP);
 
}

void motorOn(byte iRichtung, unsigned int forPulses = 0, unsigned long inMillis = 0) {
  Richtung = iRichtung;
  digitalWrite(pinRichtung, Richtung);
  halfPulses = 2 * forPulses;
  genugGewartet = inMillis;
  if (inMillis) {
    beauftragt = millis();
  } else {
    motorStart();
  }
}

void motorStart() {
  motorState = true;
  lastPulse = micros();
  digitalWrite(pinMotor, HIGH);
}

void motorOff() {
  digitalWrite(pinMotor, LOW);
  halfPulses = 0;
  motorState = false;
  genugGewartet = 0;
}

void loop() {
  if (motorState) {
    EndschalterRechts.update();
    EndschalterLinks.update();
    if ((!EndschalterLinks.read() && !Richtung) ||
        (!EndschalterRechts.read() && Richtung)) {
      motorOff();
    }
    if (Grundstellung.update() && Grundstellung.rose()) {
      if (millis() - grundstellungGedrueckt < langeGedrueckt) {
        motorOff();
      }
    }
  } else {
    if (BlitzTakt.update() && BlitzTakt.fell()){
      PotiWert = analogRead(pinPoti);
      motorOn(HIGH, 1, (PotiWert*8));
    } else if (Grundstellung.update() && Grundstellung.fell()) {
      grundstellungGedrueckt = millis();
      motorOn(LOW);
    } else if (genugGewartet && (millis() - beauftragt >= genugGewartet)) {
      genugGewartet = 0;
      motorStart();
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
      if (halfPulses && --halfPulses == 0) {
        motorOff();
      }
    }
  }
}


combie

#32
May 19, 2017, 03:24 pm Last Edit: May 19, 2017, 03:25 pm by combie
Wenn du deinen Code in sinnvolle Fraktionen aufteilen würdest...
Klare Schnittstellen schaffen, zwischen den Bereichen.....
Einige einzelne, scharf abgegrenzte, endliche Automaten.

Dann könnte der Motorbereich BEVOR er einen Schritt tut, die Endschalter abfragen.
Und jetzt der Luxus: Per Rückgabewert könnte der Anwendung mitgeteilt werden, ob der Schritt erfolgreich durchgeführt werden konnte.
Gutes Benehmen besteht darin, dass man verbirgt, wie viel man von sich selber hält und wie wenig von den anderen.
Quelle: Jean Cocteau

Whandall

#33
May 19, 2017, 06:28 pm Last Edit: May 19, 2017, 07:44 pm by Whandall

Wenn ich jetzt nicht die Endschalter verwechselt habe sollten alles gehen*.

Code: [Select]
#include <Bounce2.h>

const byte pinRichtung = 5;
const byte pinPoti = A1;
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;  // µs
const unsigned int langeGedrueckt = 2500; // ms

Bounce Grundstellung;
Bounce EndschalterLinks;
Bounce EndschalterRechts;
Bounce BlitzTakt;

bool motorState;
byte Richtung;
int halfPulses;
unsigned long lastPulse;
unsigned long beauftragt;
unsigned long genugGewartet;
unsigned long grundstellungGedrueckt;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinRichtung, OUTPUT);
  BlitzTakt.attach(pinBlitzTakt, INPUT_PULLUP);
  EndschalterRechts.attach(pinEndschalterRechts, INPUT_PULLUP);
  Grundstellung.attach(pinGrundstellung, INPUT_PULLUP);
  EndschalterLinks.attach(pinEndschalterLinks, INPUT_PULLUP);

}

void motorOn(byte iRichtung, unsigned int forPulses = 0, unsigned long inMillis = 0) {
  Richtung = iRichtung;
  digitalWrite(pinRichtung, Richtung);
  halfPulses = 2 * forPulses;
  genugGewartet = inMillis;
  if (inMillis) {
    beauftragt = millis();
  } else {
    motorStart();
  }
}

void motorStart() {
  motorState = true;
  lastPulse = micros();
  digitalWrite(pinMotor, HIGH);
}

void motorOff() {
  digitalWrite(pinMotor, LOW);
  halfPulses = 0;
  motorState = false;
  genugGewartet = 0;
}

void loop() {
  EndschalterRechts.update();
  EndschalterLinks.update();
  if (motorState) {
    if ((!EndschalterLinks.read() && !Richtung) ||
        (!EndschalterRechts.read() && Richtung)) {
      motorOff();
    }
    if (Grundstellung.update() && Grundstellung.rose()) {
      if (millis() - grundstellungGedrueckt < langeGedrueckt) {
        motorOff();
      }
    }
  } else {
    if (EndschalterLinks.read() && BlitzTakt.update() && BlitzTakt.fell()) {
      int PotiWert = analogRead(pinPoti);
      motorOn(HIGH, 1, PotiWert * 8);
    } else if (EndschalterRechts.read() && Grundstellung.update() && Grundstellung.fell()) {
      grundstellungGedrueckt = millis();
      motorOn(LOW);
    } else if (genugGewartet && (millis() - beauftragt >= genugGewartet)) {
      genugGewartet = 0;
      motorStart();
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
      if (halfPulses && --halfPulses == 0) {
        motorOff();
      }
    }
  }
}

* Und das war natürlich der Fall. Man muss immer alles testen.

Code: [Select]
#include <Bounce2.h>

const byte pinRichtung = 5;
const byte pinPoti = A1;
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;  // µs
const unsigned int langeGedrueckt = 2500; // ms

Bounce Grundstellung;
Bounce EndschalterLinks;
Bounce EndschalterRechts;
Bounce BlitzTakt;

bool motorState;
byte Richtung;
int halfPulses;
unsigned long lastPulse;
unsigned long beauftragt;
unsigned long genugGewartet;
unsigned long grundstellungGedrueckt;

void setup() {
  pinMode(pinMotor, OUTPUT);
  pinMode(pinRichtung, OUTPUT);
  BlitzTakt.attach(pinBlitzTakt, INPUT_PULLUP);
  EndschalterRechts.attach(pinEndschalterRechts, INPUT_PULLUP);
  Grundstellung.attach(pinGrundstellung, INPUT_PULLUP);
  EndschalterLinks.attach(pinEndschalterLinks, INPUT_PULLUP);

}

void motorOn(byte iRichtung, unsigned int forPulses = 0, unsigned long inMillis = 0) {
  Richtung = iRichtung;
  digitalWrite(pinRichtung, Richtung);
  halfPulses = 2 * forPulses;
  genugGewartet = inMillis;
  if (inMillis) {
    beauftragt = millis();
  } else {
    motorStart();
  }
}

void motorStart() {
  motorState = true;
  lastPulse = micros();
  digitalWrite(pinMotor, HIGH);
}

void motorOff() {
  digitalWrite(pinMotor, LOW);
  halfPulses = 0;
  motorState = false;
  genugGewartet = 0;
}

void loop() {
  EndschalterRechts.update();
  EndschalterLinks.update();
  if (motorState) {
    if ((!EndschalterLinks.read() && !Richtung) ||
        (!EndschalterRechts.read() && Richtung)) {
      motorOff();
    }
    if (Grundstellung.update() && Grundstellung.rose()) {
      if (millis() - grundstellungGedrueckt < langeGedrueckt) {
        motorOff();
      }
    }
  } else {
    if (EndschalterRechts.read() && BlitzTakt.update() && BlitzTakt.fell()) {
      int PotiWert = analogRead(pinPoti);
      motorOn(HIGH, 1, PotiWert * 8);
    } else if (EndschalterLinks.read() && Grundstellung.update() && Grundstellung.fell()) {
      grundstellungGedrueckt = millis();
      motorOn(LOW);
    } else if (genugGewartet && (millis() - beauftragt >= genugGewartet)) {
      genugGewartet = 0;
      motorStart();
    }
  }
  if (motorState) {
    if (micros() - lastPulse >= MotorPulseLen) {
      lastPulse += MotorPulseLen;
      digitalWrite(pinMotor, !digitalRead(pinMotor));
      if (halfPulses && --halfPulses == 0) {
        motorOff();
      }
    }
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

Super vielen dank. So läuft es  :)

Jetzt noch mal eine frage, die mir eben noch gekommen ist.
Ist es möglich den "ein Schritt" ausgelöst vom Blitztakt auch zu vervielfältigen?
Habe da an eine Poti Stellung in 3-4 Stufen gedacht oder über ein Register zB durch Tastendruck,
So das nach der Pause "PotiZeit" anstatt 1 Schritt, dann halt 2,3 oder 4 Schritte kommen?

Mein erster Gedanke war da sowas, aber ich denke da bestimmt wieder völlig  kompliziert, oder programmiertechnisch nicht korrekt ?


Hier nur ein Auszug vom Code, aber denke das Prinzip ist klar? Gehen tut es jedenfalls
Code: [Select]


 } else {
    if (EndschalterRechts.read() && BlitzTakt.update() && BlitzTakt.fell()) {
      int PotiWertW = analogRead(pinPotiW);
      int PotiWertT = analogRead(pinPotiT);
      motorOn(HIGH, PotiWertT/256+1, PotiWertW * 8);
    } else if (EndschalterLinks.read() && Grundstellung.update() && Grundstellung.fell()) {
      grundstellungGedrueckt = millis();
      motorOn(LOW);
    } else if (genugGewartet && (millis() - beauftragt >= genugGewartet)) {
      genugGewartet = 0;
      motorStart();
    }
  }


Whandall

Es wurde so konstruiert, dass eine Anzahl von Halbwellen verzögert ausgelöst wird,
die Anzahl von Impulsen sollte egal sein, solange die fertig sind, bevor der nächste Takt kommt.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

AtomicIX

Danke, dann lasse ich das so.
Dann werde ich Mal die Hardware fertig stellen.

Go Up