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)
A D2
B D3
-
-

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

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.

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.

#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
      }
    }
  }
}

  • Zuletzt geändert: 2019-03-31 14:03