Dies ist eine alte Version des Dokuments!


ZSS600-001-100B-5L mit Arduino Pro Micro auslesen

Der/die/das(?) ZSS600-001-100B-5L ist ein Dreh-Encoder, wie er z.B. in Funkgeräten oder CNC-Handsteuerungen verwendet wird. Die Dinger findet man bei eBay, wenn man nach „cnc hand wheel“ oder „cnc handrad“ sucht.

Als Versorgungsspannung werden 5V benötigt. Pro voller Umdrehung sendet er 100 Impulse.

Zum Auslesen der Impulse nutze ich einen Arduino Pro Micro.

Die Beschaltung ist relativ einfach:

Encoder Arduino Pro Micro
0V GNC
Vcc RAW (5V direkt von USB)
A D2
B D3
-
-

Die folgenden beiden Bilder zeigen die Impulsfolge beim Drehen des Encoders (Kanal 1 ist Encoder-Ausgang A, Kanal 2 ist Encoder-Ausgang B).

Drehen im Uhrzeigersinn Drehen gegen den Uhrzeigersinn

Wenn A auf High steht, muss geprüft werden, ob B auf Low (Drehung im Uhrzeigersinn) oder auch auf High (Drehung gegen den Uhrzeigersinn) steht.

Damit das ganze zügig passiert, wird A mittels Interrupt überwacht.

Der Zustand der Pins wird über das entsprechende Input-Register direkt eingelesen, um mit der Abarbeitung des Interrupt-Handlers so schnell wie möglich fertig zu werden.

Der Encoder prellt, daher ist ein Debouncing notwendig. ~700µSec hat sich in meinen Tests als guter Wert herausgestellt.

#define pinA  2
#define pinB  3

volatile unsigned long debounceThreshold = 700; // microseconds
volatile unsigned long debounceLast = 0;

volatile int pos = 0;
int lastPos = 0;

void setup() {
  pinMode(pinA, INPUT);
  pinMode(pinB, INPUT);

  attachInterrupt(1, doEncoderA, CHANGE);

  Serial.begin (9600);
}

void loop() {
  if (pos != lastPos) {
    Serial.println (pos, DEC);  

    lastPos = pos;
  }
}

void doEncoderA() {
  if (micros() - debounceLast > debounceThreshold) {
    debounceLast = micros();

    if (PIND & B00000010) {
      if (PIND & B00000001) {
        pos--; // counter-clock-wise
      }
      else {
        pos++; // clock-wise
      }
    }
  }
}

Wenn ein anderer Arduino-Typ verwendet werden soll, muss der Teil mit dem Einlesen der Input-Register angepasst werden. Und wahrscheinlich ist der verwendete Interrupt auch ein anderer.
  • Zuletzt geändert: 2019-03-31 15:47