Tastersteuerung

Hallo,

..und wiedermal benötige ich eure Hilfe. :)

Und zwar habe ich vor, mithilfe von ZWEI Tastern die Richtung und die Geschwindigkeit eines Motors zu ändern. Mittlerweile habe ich dies erreicht: Beim einmaligen Drücken eines Tasters, bewegt sich der Motor einen kleinen Schritt nach oben, beim Betätigen des anderen Tasters, bewegt sich der Motor mit einem kleinen Schritt in die andere Richtung, also nach unten. Mithilfe eines delays kann man die Schritte pro Umdrehung (deshalb den Begriff Geschwindigkeit..) variieren. Mithilfe verschiedener Abfragen und Schleifen habe ich versucht, bei dem Betätigen beider Taster gleichzeitig, die Geschwindigkeit bzw. den Delay-Wert zu ändern. Dabei sollte sich der Delay-Wert, nachdem man das erste mal auf beide Taster gedrückt hat, z.B. auf Null ändern. Dies klappt auch soweit ganz gut (mithilfe einer if-Abfrage). Nun ist das Problem, dass sich der Wert durch eine weitere if-Abfrage nicht mehr ändern lässt. Mein Ziel ist es, den Array-Wert wieder z.B. auf 100 zu setzen, wenn man das zweite Mal die beiden Taster gleichzeitig gedrückt hat.

So sieht in etwa der Programmablauf aus:

Beim betätigen der Taster, kann man kleinschrittig in verschiedene Richtungen fahren.

Beim betätigen beider Taster gleichzeitig, wird von kleinen Schritten auf große Schritte umgestellt.

Nun verfährt der Motor auf Tastendruck mit großen Schritten.(bis hierhin funktioniert alles!)

Beim wiederholten drücken beider Taster, wird von großen Schritten auf Kleine wieder umgestellt.

Ich bin für Anregungen offen;)

Den Sketch würde ich zur Verfügung stellen, falls Jemand interessiert ist..

Grüße reuter328

Um dir zu helfen solltest du deinen Sketch hier posten. Bitte setze den Sketch in Code-Tags (Schaltfläche #).

Dann können wir besser erkennen, was nicht funktioniert.

Hallo, an Deinem Sketch wird niemand interessiert sein, aber man (Frau) könnte dann leichter nach Fehlern suchen. Gruß und Spaß Andreas

zuuu- langsam! >:( Gruß und Spaß Andreas

SkobyMobil: zuuu- langsam! >:( Gruß und Spaß Andreas

Nöö, nur später. ;)

Okey..hier ist der Teil, bei dem es Probleme gibt:

int t;

if (zustand1 == LOW && zustand2 == LOW)

{

x = 0;

t++;

}

if (zustand1 == LOW && zustand2 == LOW && t == 2)

{

x = 100;

t=0;

}

Hallo, Du könntest das einmal probieren:

#int t;

 # if ((zustand1 == LOW) && (zustand2 == LOW))
 # {
 #   x = 0;
 #   t++;
 # }
 # if ((zustand1 == LOW) && (zustand2 == LOW) && (t == 2))
 #{
 #  x = 100;
 #   t=0;
 # }

Dann sollten Deine Taster sehr gut entprellt sein, sonst rennt Dir das durch.

Wenn NUR Zeile #6 erfüllt ist, wird auch Zeile #1 ausgeführt.

Gruß und Spaß Andreas P.S.

  1. Code kopieren
  2. Schaltfläche "Code" anklicken
  3. Code einfügen
  4. in Zukunft machen

..danke:)

Als ich den Sketch in dieser Hinsicht verändert habe, hat sich allerdings nicht viel getan.. In der ersten If-Abfrage habe ich nun mal mit Serial.println den aktuellen Wert von t abgefragt. Dieser geht zwar von Null auf Eins, allerdings wird bei weiteren Abfragen der Wert nicht durch t++ erhöht... Und deshalb kommt er wahrscheinlich auch nicht in die zweite If-Abfrage. Hat Jemand eine Idee, woran dies liegen könnte?

reuter328:
Hat Jemand eine Idee, woran dies liegen könnte?

Ja, der Fehler liegt oft in dem Code der uns nicht gezeigt wird.
Also poste bitte den kompletten Sketch. So können wir nur raten.

Und setze den in Code-Tags. Das ist nicht die “Taste #”, sondern unter der Schaltfläche “Preview” die Schaltfläche “</>”.

Das war mein Fehler, habe die falsche Beschreibung genommen.

Okey…hier ist nun also der gesamte Sketch.

int smDirectionPin = 4; //Direction pin
int smStepPin = 5; //Stepper pin

int zustand1 = 0;
int zustand2 = 0;

int x = 100;

boolean v1 = true;
boolean v2 = true;

void setup() {

  pinMode(smDirectionPin, OUTPUT);
  pinMode(smStepPin, OUTPUT);

  pinMode(2, INPUT);
  pinMode(3, INPUT);



  Serial.begin(9600);
}

void loop() {
  zustand1 = digitalRead (2);
  zustand2 = digitalRead (3);
 

  if (zustand1 == LOW)
  {
    if (v1 == true)
    {
      digitalWrite(smDirectionPin, HIGH);
      for (int i = 0; i < 5; i++) {
        digitalWrite(smStepPin, HIGH);
        delayMicroseconds(700);
        digitalWrite(smStepPin, LOW);
        delayMicroseconds(700);
        v1 = false;
      }
    }
  }
  delay (x);
  v1 = true;




  if (zustand2 == LOW)
  {
    if (v2 == true)
    {
      digitalWrite(smDirectionPin, LOW);
      for (int i = 0; i < 5; i++) {
        digitalWrite(smStepPin, HIGH);
        delayMicroseconds(700);
        digitalWrite(smStepPin, LOW);
        delayMicroseconds(700);
        v2 = false;
      }
    }
  }
  delay (x);
  v2 = true;



 

int t;

  if ((zustand1 == LOW) && (zustand2 == LOW))
 {
    x = 0;
    t++;
    Serial.println(t);
  }
  if ((zustand1 == LOW) && (zustand2 == LOW) && (t == 2))
 {
   x = 100;
   t=0;
  }
}

reuter328:
Hat Jemand eine Idee, woran dies liegen könnte?

Wenn Du eine Variable lokal definierst, wird sie immer neu initialisiert. Abhilfe schafft eine globale Definition oder der Zusatz “static”, dann bleibt die Variable erhalten.

In Deinem Sketch habe ich ein paar Änderungen vorgenommen, weshalb sich seine Funktion Deinen Vorstellungen nähern sollte:

const int smDirectionPin = 4; //Direction pin
const int smStepPin = 5; //Stepper pin
bool zustand1 = 0;
bool zustand2 = 0;
int x = 100;
boolean v1 = true;
boolean v2 = true;

void setup() {
  pinMode(smDirectionPin, OUTPUT);
  pinMode(smStepPin, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Anfang");
}

void loop() {
  v1 = zustand1;
  zustand1 = digitalRead (2);
  v2 = zustand2;
  zustand2 = digitalRead (3);
  if (v1 != zustand1 || v2 != zustand2) {
    delay(30);
  }

  if (v1 && !zustand1 && zustand2)
  {
    digitalWrite(smDirectionPin, HIGH);
    for (int i = 0; i < 5; i++) {
      digitalWrite(smStepPin, HIGH);
      delayMicroseconds(700);
      digitalWrite(smStepPin, LOW);
      delayMicroseconds(700);
    }
    delay (x);
  }

  if (v2 && !zustand2 && zustand1)
  {
    digitalWrite(smDirectionPin, LOW);
    for (int i = 0; i < 5; i++) {
      digitalWrite(smStepPin, HIGH);
      delayMicroseconds(700);
      digitalWrite(smStepPin, LOW);
      delayMicroseconds(700);
    }
    delay (x);
  }

  static byte t = 0;

  if (!zustand1 || !zustand2) {
    delay(100);
    if (v1 && !zustand1 && v2 && !zustand2)
    {
      if (t >= 2)
      {
        x = 100;
        t = 0;
      } else {
        x = 0;
        t++;
      }
      Serial.println(t);
    }
  }
}

Die Verwendung von delay() bringt häufig Probleme mit sich. Alleine die Anforderung von zwei gleichzeitig gedrückten Tasten wird schwierig. Der Ablauf gerät durch delay() ins Stottern.

Vielen Dank für deine Bemühungen..:)

..Allerdings hat deine Variante auch nicht gefunkt.

Dein Tipp, die Variable mit static zu erweitern, hat mich aber nun endlich zum Ziel gebracht!

Nun kann ich problemlos die gewünschten Funktionen ausführen. Hier ist nun der geänderte Code-Teil:

static int t;

  if ((zustand1 == LOW) && (zustand2 == LOW))
 {
    x = 0;
    t++;
    Serial.println(t);
  }
  if ((zustand1 == LOW) && (zustand2 == LOW) && (t == 2))
 {
   x = 100;
   t=0;
   delay (1000);
   }

Vielen Dank agmue!:)