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 |
A̅ | - |
B̅ | - |
Code
Die folgenden beiden Bilder zeigen die Impulsfolge beim Drehen des Encoders (Kanal 1 ist Encoder-Ausgang A, Kanal 2 ist Encoder-Ausgang B).
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, doEncoder, CHANGE); Serial.begin (9600); } void loop() { if (pos != lastPos) { Serial.println (pos, DEC); lastPos = pos; } } void doEncoder() { if (micros() - debounceLast > debounceThreshold) { debounceLast = micros(); if (PIND & B00000010) { if (PIND & B00000001) { pos--; // counter-clock-wise } else { pos++; // clock-wise } } } }