User manual

71 72
9.2 Incrementalgeber mit Wertausgabe
Das Programm wird nun erweitert. Hier wird ein Zähler rauf- und runtergezählt und der Wert auf der Konsole
des PC ausgegeben. Dazu müssen nun die einzelnen Phasen in Zähleraktionen umgerechnet werden. In der
Praxis entwickelt man dazu ein Statediagramm. Im Programm gibt es zwei Variable, die den Durchlauf steuern
- „state“ hält den augeblicklichen Status von A und B fest und hat die Werte 0,1,2,3 für alle Kombinationen.
„oldstate“ merkt sich den Wert der vorherigen Abfrage. Damit kann man die Drehrichtung bestimmen.
A=1 dann state =1 oder 3 und B=1 dann state=2 oder 3. Sagt noch nichts über die Drehrichtung aus. A und B
können ja nur in bestimmter Reihenfolge ablaufen, wie wir vorher gesehen haben. Diese Code nennt man auch
Gray-Code, er ist in der Technik ein sehr wichtiger Code und wird häug verwendet.
+
-
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
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_25 Incrementalgeber Wertausgabe Konsole
#dene SWITCHA 2 // PD2 A
#dene SWITCHB 3 // PD3 B
#dene SWITCHT 4 // PD4 Taste
#dene PULLUP 5 // optional
#dene PORTLED6 6 // Kontrol
#dene PORTLED7 7 // Ausgaben
#dene PORTMOSILED 11 // Kontrolle
#dene PORTSCLKLED 13 //f. Taste
void setup() {
Serial.begin(9600); // Konsolte verwenden !
pinMode(SWITCHA,INPUT_PULLUP); // Wie vor-
her
pinMode(SWITCHB,INPUT_PULLUP); // alles mit
pinMode(SWITCHT,INPUT_PULLUP); /// Pullups
pinMode(PULLUP,OUTPUT); // Port 7 als Aus-
gang 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() { // Schleife
static int counter = 0; // Unser Zaehler
int a= digitalRead(SWITCHA); // A lesen
int b= digitalRead(SWITCHB); // B lesen
int state = 0; // State aktuell
static int oldstate = 99; // vorheriges
99=neu
int sw = digitalRead(SWITCHT); // Schalter
if (a==HIGH) { // erst state denieren
digitalWrite(PORTLED6,HIGH);
state = 1;
} else { // sonst 0
digitalWrite(PORTLED6,LOW);
state = 0;
}
if (b==HIGH) { // auch fuer Kontakt B
digitalWrite(PORTLED7,HIGH);
state += 2; // State +2 ist Trick gibt 2
oder 3
} else {
digitalWrite(PORTLED7,LOW);
state += 0; // nur zur Schoenheit
}
switch(state) { // der neue Zustand
case 0: // AB=00
if (oldstate == 1) { // wenn vor-
her 1
counter--; // dann rueckwaerts
} else if (oldstate == 2) {
counter++; // Bei 2 vorwaerts
} // sonst halten
break;
case 1: // AB=10
if (oldstate == 0) { // wenn 0
counter++; // dann vorwaerts
} else if (oldstate == 3) {
counter--; // bei 3 Rueckwaerts
} // sonst halten
break;
case 2: // AB=01
if (oldstate == 3) { // wenn 3
counter++; // dann zaehlen vor-
waerts
} else if (oldstate == 0) {
counter--; // wenn 0 dann
rueckwaerts
} // sonst halten
break;
case 3: // AB=11
if (oldstate == 2) { // wenn vorher
2
counter--; // dann rueckwaerts
} else if (oldstate == 1) {
counter++; // wenn 1 dann vor-
waerts
} // sonst halten
break;
}
oldstate = state; // wird in oldstate
gespeichert
if (sw==HIGH) { // Taste hat sonst
digitalWrite(PORTMOSILED,HIGH); //
keine funktion
digitalWrite(PORTSCLKLED,LOW); //
nur LEDs steuern
} else {
digitalWrite(PORTMOSILED,LOW); //
und umgekehrt
digitalWrite(PORTSCLKLED,HIGH); //
zur Kontrolle
}
Serial.println(counter); // WICHTIG:
Ausgabe auf Konsole
}
A B state
0 0 0
1 0 1
0 1 2
1 1 3
0
1
3
2
vorwärts
0
1
3
2
rückwärts
Was passiert? Das verhalten der
LED bleibt gleich wie im vorherigen
Beispiel. Auf dem Terminal des PCs
sieht man aber zusätzlich einen
Zählerstand, der je nach Drehrich-
tung erhöht oder verringert wird.
A
B
Enter
10 k
Incremental
Encoder
ACHTUNG:
Terminal aktivieren!
Dazu beim Arduino Pro-
gramm, CTRL und SHIFT
und M drücken (CTRL=STRG
je nach Tastatur).
Dann poppt ein Fenster
hoch in dem die Infos
stehen.
Ggf. muss man die Bau-
drate im Terminalfenster
auf 9600 einstellen, so
daß diese mit unserer im
Programm übereinstimmt.