Verwendung vieler Encoder

Hallo,

ich habe bisher noch keine Ahnung von Arduino, habe aber mit anderen Atmels schon gearbeitet.
Mich würde interessieren, ob jemand einen einfachen Weg weiß, viele (ca.20-30) Encoder (zur manuellen Eingabe von Daten) an einen Arduino (oder notfalls auch mehrere, miteinander verbundene) anzuschließen. Dabei kommt es nicht auf Geschwindigkeit an, es darf ruhig gelegentlich mal ein Impuls "übersehen" werden; es müssen auch nicht mehrere Encoder gleichzeitig ausgewertet werden. Dafür sollte es mit allen gängigen, billigen Encodern (12-24 Schritte) funktionieren, möglichst ohne viel Schaltungsaufwand...

Grüsse,
Matthias

Hallo,

muss ich gegenfragen: Welche Art von Encodern meinst Du denn?

Gruß,
Ralf

So wie ich's aus dem Post verstanden habe handelt es sich um elektromechanische Inkrementalgeber ("incremental rotary encoder") - d. h. zwei Schalter aus deren Zustandsänderung eine Drehrichtung ausgelesen werden kann.

Genau, die meine ich. Also kleine, rastende endlos-Drehgeber mit Knopf zur manuellen Einstellung von Werten, wie z.B. beim Autoradio, wie z.B.
http://www.reichelt.de/Drehimpulsgeber/STEC12E07/3/index.html?&ACTION=3&LA=446&ARTICLE=73922&GROUPID=3714&artnr=STEC12E07

Matthias

Laut dem hier:
http://www.mikrocontroller.net/topic/300730#3220173

Geht das:
http://www.mikrocontroller.net/articles/Drehgeber

für 5 Encoder. Ob man das auf 20-30 skalieren kann ist ne andere Frage...

Ah ja, okay, ich habe mal genau für diesen Decoder einen Artikel geschrieben, wie man ihn anschließt und dann abfragt und die Abfrage auswertet. Wen es interessiert der Artikel ist hier: elektronik-bastelkeller.de

Oftmals wird das so gemacht, dass der Encoder einen Interrupt auslöst, wenn ein Kontakt sich schließt, wenn also dran gedreht wird. Durch das Prellen der Kontakte kann es aber leicht passieren, dass der Controller dann nur noch mit Encoder-Auswertung in der Interrupt-Service-Routine beschäftigt ist. Deshalb habe ich das anders gelöst, indem ich 1000 Interrupts pro Sekunde erzeuge, in denen der Encoder abgefragt wird. Die Auswertung findet mit einer Art fest programmierter Gray-Code-Logik statt. Dadurch wird das Prellen der Kontakte ziemlich sicher überlesen.

Ich würde eigentlich kein Problem darin sehen, z.B. mit mehren PCF 8574 über den I²C-Bus eine ganze Menge von solchen Encodern abzufragen und das dann auszuwerten. Die Abfragefrequenz kann sicherlich noch vermindert werden, ohne die Sicherheit der Erkennung zu gefährden.

Gruß,
Ralf

Schachmann:
Deshalb habe ich das anders gelöst, indem ich 1000 Interrupts pro Sekunde erzeuge, in denen der Encoder abgefragt wird.

So funktionieren auch der Code bei Mikrocontroller.net :slight_smile:

Bei vielen Dekodern sollte man aber vielleicht auf das sehr langsame digitalRead() verzichten und das mit Port-Manipulation oder der digitalWriteFast Lib machen:
http://code.google.com/p/digitalwritefast/downloads/list

@Serenifly: Mit dem schnelleren Einlesen der Ports muss ich Dir völlig Recht geben. In der Regel sollte man ja im Interrupt-Service immer so schnell wie nur möglich arbeiten.
Ich habe mir den Code im Microcontroller.net angesehen. Ja, im ersten Beispiel der Code ist sinngemäss das Gleiche wie in meinem Beispiel. Aber anders herum, wie will man es mit dem Gray-Code auch großartig anders machen? Es ist halt wichtig alle Zustandsänderungen die in mehr als einem Bit Änderung resultieren zu verwerfen. Solche Encoder gibt es sogar in Hardware gegossen. Oder z.B. hier: Quadratur-Decoder      auch das gleiche Prinzip.
Gruß,
Ralf