User manual
69 70
9. Rotationsgeber
9.1 Der Incrementalgeber Brick
Incremental Drehgeber, oder englisch incremental encoder. Solche Bausteine werden gerne bei Bedienteilen
verwendet. Durch zwei phasenverschobene Kontakte lässt sich z.B. mit einem Prozessor die Drehrichtung be-
stimmen. Durch den Knopfdruck, wird zusätzlich ein Tastkontakt geschlossen, mit dem man auch
eine beliebige Aktion auslosen kann. Je nach Bautyp werden pro Umdrehung ca. 18 bis 36 Kontaktvorgänge
ausgelöst. Der Geber hat zwei Ausgänge die mit A und B bezeichnet werden. Wenn man nun an dem Geber
dreht, dann werden die Kontakte auf bestimmte Weisse geschlossen
Winkel A B
0 0 0
1 1 0
2 1 1
3 0 1
Anhand der Reihenfolge kann man nun Vor- oder Rückrichtung eindeutig bestimmen. Es wird immer nur EIN
Kontakt dazu- oder weggeschaltet, dadurch wird die Drehrichtung eindeutig.
Unser Brick hat zusätzlich einen Druckkontakt der, wie bei einer Taste, beliebig verwenden werden kann. Die
Kontakte A und B muss man nicht entprellen !
+
-
9V
1A
Downsi de
UP
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
I²C
LED
LED
LED
LED
Portbelegung
Kürzel Port Parameter
SCK PB5 #13
MOSI PB3 #11
B1 PB1 #9
SS PB2 #10
MISO PB4 #12
B0 PB0 #8
// DE_24 Incrementalgeber
#dene SWITCHA 2 // Kontakt A
#dene SWITCHB 3 // Kontakt B
#dene SWITCHT 4 // Tastenkontakt
#dene PULLUP 5 // Dient nur als Pullup
#dene PORTLED6 6 // Anzeige von A
#dene PORTLED7 7 // Anzeige von B
#dene PORTMOSILED 11 // Tasteenzustand
#dene PORTSCLKLED 13 // komplementaer
void setup() {
pinMode(SWITCHA,INPUT_PULLUP); // Alle Tasten mit Pullup
pinMode(SWITCHB,INPUT_PULLUP); // Alle Tasten mit Pullup
pinMode(SWITCHT,INPUT_PULLUP); // Alle Tasten mit Pullup
pinMode(PULLUP,OUTPUT); // Port 7 als Ausgang schalten
digitalWrite(PULLUP,HIGH); // zusaetzlich pullup
pinMode(PORTLED6,OUTPUT); // Port 6 als Ausgang schalten
pinMode(PORTLED7,OUTPUT); // Port 7 als Ausgang schalten
pinMode(PORTMOSILED,OUTPUT); // PORTMOSILED als Ausgang schalten
pinMode(PORTSCLKLED,OUTPUT); // PORTSCLKLED als Ausgang schalten
}
void loop() {
int a= digitalRead(SWITCHA); // A einlesen
int b= digitalRead(SWITCHB); // B einlesen
int sw = digitalRead(SWITCHT); // Taste einlesen
if (a==HIGH) { // hier statisch ausgeben
digitalWrite(PORTLED6,HIGH); // LED 6 zeigt A an
} else {
digitalWrite(PORTLED6,LOW); // und 0 wenn A=0
}
if (b==HIGH) {
digitalWrite(PORTLED7,HIGH); // LED 7 zeigt B an
} else {
digitalWrite(PORTLED7,LOW); // und 0 wenn B=0
}
if (sw==HIGH) { // Auch die Taste soll was tun
digitalWrite(PORTMOSILED,HIGH); // Eine LED auf 1
digitalWrite(PORTSCLKLED,LOW); // dier andere 0
} else {
digitalWrite(PORTMOSILED,LOW); // und umgekehrt
digitalWrite(PORTSCLKLED,HIGH); // wenn gedrueckt.
}
}
Was passiert? Beim Drehen zeigen die LEDs an Port 6 und 7 den Graycode des Incrementalgebers an
(rechte senkrechte LED-Gruppe). Man sollte dazu ggf. ganz langsam drehen, also auch zwischen dem
Einrastvorgang. Dann kann man die Schaltvorgänge besser beobachten. Wenn man auf den Regler
drückt, dann wechseln die beiden LEDs am Port MOSI und SCLK (linke horizontale LED-Gruppe).
A
B
Enter
10 k
Incremental
Encoder










