Inkrementalgeber mit Arduino nano

Hallo

Ich habe einen Grayhill Inkrementalgeber, den ich an meinem Arduino Nano nicht zum Laufen bekomme.

Mein Programm:

volatile int zaehler = 0;
void setup()
{
 Serial.begin(9600);                                        
  pinMode(3, INPUT);      //Pin 3 als Eingang
  pinMode(2, INPUT);      //Pin 2 als Eingang
  attachInterrupt(digitalPinToInterrupt(2), encoder_interrupt, CHANGE);   //Interruptprogramm erstellen
}

void loop() 
{
  Serial.print(zaehler, DEC);
  delay(250);
}

void encoder_interrupt()
{
  if(digitalRead(2) != digitalRead(3))   // A und B Signal des Inkrementalgebers vergleichen
    zaehler++;                           // wenn A und B ungleich ist, Wert um 1 erhöhen
  else
    zaehler--;                           //wenn A und B gleich sind Wert um 1 verringern
}

Habe den Inkrementalgeber laut Datenblatt angeschlossen.

Kann mir jemand helfen, warum er nicht funktioniert?

mfg

Von den Dingern gibt es mehrere verschiedene, da wäre der Typ eine wichtige Information.

Gruß Tommy

Schau doch mal in der Loop mit Serial.print die Ports 2 und 3 an, um zu sehen, ob sie sich durchs drehen
verändern.

Habe den Inkrementalgeber laut Datenblatt angeschlossen.

Fein!
Nur dummerweise sehen wir nichts davon.
Weder Datenblatt, noch was du getan hast.

Aber wenn das alles ohne jeden Makel wäre, dann müsste es doch funktionieren, oder?

Also suche den Makel!
Ich kann es nicht.

Sorry... ist ein Grayhill 62A optical encoder

Habe PIN 6 mit +5V, PIN 1 mit GND, PIN 5 mit D3 und PIN 4 mit D2 verbunden.

http://www.grayhill.com/assets/1/7/opt_encoder_62avd.pdf

Was ist mit den PullUp-Widerständen?

Gruß Tommy

Das Datenblatt mit Deinen Infos sind nicht eindeutig.

Die Versionen 62A22, 62A15 und 62A11 sind Encoder mit Totem Pole Ausgang. diese geben H und L aus.
Alle anderen Modele haben Open Collekltor Ausgänge und da braucht es wie im Datenblatt auf Seite 4 unten gezeigt Pullupwiderstände.

Ohne mit Interrupt herumzuprobieren. Kannst Du einfach mal den zustand von pin 2 auf pin 13 ausgeben und so siehst Du am LED L was da reinkommt.

setup()
{
pinMode( 2,INPUT);
pinMode(13,OUTPUT);
}

loop()
{
digitalWrite(13, digitalRead(2));
}

Grüße Uwe

Mit den Pullup Widerständen funktionierts.
Aber der Zähler zählt nur be jedem zweiten "klicken" rauf und runter. Gibt es da noch eine Lösung, dass er bei jedem "klicken" zählt?

Du wertest nur 2 von 4 möglichen Flanken aus.
Aus meiner Sicht, kein Wunder, dass es so die Pulse halbiert.

Wie kann ich alle vier Flanken auswerten? Sorry für die Frage aber ich weiß es leider nicht :confused:

Aua...

Wie wertest du denn die ersten 2 Flanken aus....?
Evtl. kann dir das ja als Vorlage für die anderen beiden dienen.

Später dann, wird in dir die Erkenntnis wachsen, dass der Pin Interrupt doch keine gute Idee ist, und dass es besser ist, die Angelegenheit in einen Timer Interrupt auszulagern.

Die ersten 2 werden so ausgewertet, dass der Zähler bei einem Flankenwechsel raufzählt. Aber bei den nächsten 2 gibt es ja wieder einen Flankenwechsel und er müsste raufzählen oder? So denke ich mir das?

Hallo,

dieser Code kann niemals sauber die Richtung erkennen und erst recht nicht sauber zählen. Der Zähler müßte damit immer nur um eins hoch und wieder runter wechseln.

if(digitalRead(2) != digitalRead(3))   // A und B Signal des Inkrementalgebers vergleichen
    zaehler++;                           // wenn A und B ungleich ist, Wert um 1 erhöhen
  else
    zaehler--;                           //wenn A und B gleich sind Wert um 1 verringern

Es müssen immer beide Signale gleichzeitlich eingelesen und alle 4 möglichen Zustände betrachtet werden.
Grundlagen dafür gibts hier Drehgeber – Mikrocontroller.net

dieser Code kann niemals sauber die Richtung erkennen und erst recht nicht sauber zählen.

Du solltest dir eine Logiktabelle aufmalen und die Antwort nochmal überdenken.
(schätze ich mal so)

Hi

Der Sketch-Snipped oben ist die Billig-Auswertung eines Drehencoder.
Bei Flankenwechsel an A (alternativ B) wird der andere Pin eingelesen und darüber bestimmt, wie herum wir drehen.
Dadurch haben wir aber den Flankenwechsel an B völlig ignoriert - somit nur die halbe Auflösung und bei prellenden Kontakten geht die ganze Maschinerie nach hinten los.

Bei so zeitkritischen Abläufen wie ein händisches Drehen sollte loop() vollkommen ausreichend sein, um diese Eingänge zu pollen.
Beim Prellen wird halt vor/zurück gezählt - Alles kein Problem, da eh immer nur ein Eingang prellen wird (der Andere ist schon laange damit fertig).
Und spätestens nach den 4 Impulsen pro Rastung hast Du den internen Zähler 4 höher oder tiefer - je nach Drehrichtung.
Dein Sketch verwendet intern von diesem Zähler halt nur 1/4tel des Zähler - da die Zwischenpositionen, also zwischen den Rasten, für z.B. eine geänderte Variable überhaupt keine Rolle spielen.

Wenn der Encoder in Ruhestellung prellt/wackelt, nimmt man halt die dem Punk gegenüber liegende Flanke als Null an.

MfG

Wenn der Encoder in Ruhestellung prellt/wackelt,

Du kannst dir recht sicher sein, dass ein 60 Euroen Encoder nicht sonderlich wackelt.
:o :o :o :o

Hi

Die Wenigsten hier werden aber mit einem Industrie-Encoder um die Ecke kommen.
(wobei ich auch ein/zwei demontierte Industrie-Encoder in meinem Funds habe, wo die CNC-Drehbank halt nicht immer so wollte)
Viel häufiger dürften die 'Zwölf für Eins Fuffzich' Encoder sein - und dort könnte so Etwas ggf. vorkommen.

:o

MfG

combie:
Du solltest dir eine Logiktabelle aufmalen und die Antwort nochmal überdenken.
(schätze ich mal so)

Das ist doch Unsinn.
Der Code kann nur feststellen ob beide Signale gleich oder unterschiedlich sind.
Der Code kann nicht feststellen welches Signal sich geändert hat.
Daraus kann man keine Drehrichtung ableiten.
Man muss sich merken wie die Signale vorher waren und was sich geändert hat.

Hi

Das ist kein Unsinn.
Diese Prüfung kommt IMMER nach der gleichen Flanke des anderen Kanal.
Somit ist die Drehrichtung bekannt.
Ist halt anfällig für Prellen und man verringert die Anzahl der auswertbaren Flanken.
Siehe:
Drehgeber#Warum_Sparvarianten_nicht_gut_sind, mc.net

MfG

Man muss sich merken wie die Signale vorher waren und was sich geändert hat.

Muss man nicht.

Du solltest dir eine Logiktabelle aufmalen und die Antwort nochmal überdenken.

Du solltest dir eine Logiktabelle aufmalen und die Antwort nochmal überdenken.