Beginner Frage zu Encodern

Hallo liebes Forum,

ich habe schon viele Einträge zum Thema “Encoder” gelesen, somit weiß ich auch, dass mein Anliegen vermutlich schon einen langen Bart hat.

Trotzdem komme ich nicht klar und würde zumindest gerne mal wissen, ob mein Ansatz grundlegend falsch ist.

In meinem Beispiel habe ich lediglich zwei Encoder. Encoder 1 soll bei der Drehung nach rechts den Wert 2 ausgeben und bei der Drehung nach Links den Wert 1. Bei Encoder 2 sind es die Werte 4 und 3.

In meinem Sketch funktioniert das auch soweit, allerdings nicht besonders präzise. D.h. drehe ich beispielsweise Encoder 1 nach rechts, sollte er ja pro Schritt den Wert 2 ausgeben. Aber hin und wieder mogelt sich der Wert 1 dazwischen. Lustigerweise dann, wenn ich den Encoder eher langsam drehe. Ich hätte da erwartet, dass dies bei besonders schnellen Drehbewegungen passiert, aber nein.

Vielleicht mag sich mal jemand meinen Sketch ansehen und sagen, ob das so überhaupt richtig ist. Möglicherweise liegt es ja auch am Encoder!?

Ist einer von Alps

Und hier ist der Code

int numEnc = 2;
int encpinl[2]           = {52, 48};
int encpinr[2]           = {50, 46};
int encl[2]              = {0};
int encr[2]              = {0};
int encoderoutputl[2]    = {1, 3};
int encoderoutputr[2]    = {2, 4}; 
int encoderwert          = 0;                                       


int digpin[4]            = {46, 48, 50, 52};
int i                    = 0;     


void setup() {
  Serial.begin(38400);
  while (!Serial);
  for ( i = 0; i < 4; i++) {
  pinMode(digpin[i], INPUT_PULLUP);
  }

}

void loop() {

encoder();


}

void encoder() {
  
  for ( i = 0; i < numEnc; i++) {

  encr[i] = digitalRead(encpinr[i]);
 
    if (encr[i] == 0 && encl[i] == 1)
{
    if (digitalRead(encpinl[i]) == 0)
    {
    encoderwert = encoderoutputr[i];
    }
else
    {
    encoderwert = encoderoutputl[i];
    }
 Serial.println (encoderwert);
}
       encl[i] = encr[i];
}
delay(1);
}

Hallo,

weil die mechanischen Dinger schön prellen ->Encoder Grundlagen: Drehgeber – Mikrocontroller.net
Desweiteren gehört delay hier überhaupt nicht rein.
Bau deinen Sketch erstmal mit einem Encoder auf.

(Fast) alle mechanischen Kontakte prellen: Beim Schließen hüpft der bewegliche Kontakt einige Male auf dem festen Kontakt und bleibt erst dann mit diesem verbunden. Darum ergibt das Signal nicht einen sauberen LOW - HIGH Übergang sondern es gibt dazwischen mehrere Spitzen. Auch Beim Öffnen eines Kontaktes kann ein Prellen vorkommen. Das Prellen muß elektrisch oder über Sofftware "entstört" werden.

Grüße Uwe

beatpiet:

...

Zum eigentlichen Problem ist ja schon hilfreiches gesagt.

Mir ist aufgefallen, dass Dein Sketch ziemlich übel formatiert ist. Als Anfänger hast Du vermutlich schon erlebt, wie viel „Spaß“ die Fehlersuche machen kann. Tu Dir einen Gefallen und mache Dir die Fehlersuche einfacher. Mein bester Tipp dazu ist das Schreiben von „schönem Code“. Guck hier.

Gruß

Gregor