Änderungen

KY-040 Kodierter Drehschalter (Rotary Encoder)

5.187 Byte hinzugefügt, 15:01, 8. Apr. 2016
==Kodierung==
Die Idee bei einem Drehschalter/Drehgeber ist es, dass zu jedem gedrehten "Schritt", sich der Zustand jeweils immer nur einer der beiden Ausgangs-Pins ändert. Je nachdem welhcer der beiden sich zuerst geändert hat, so kann man auf die Drehrichtung schließen, wenn man auf die folgende Kodierung achtet.
 
'''<u>Im Uhrzeigersinn</u> [A ändert sich zuerst] -> Pin_CLK'''
 
<div class="level2"><div class="table sectionedit5">
{| class="inline" style="height: 178px; border-color: #000000;" width="359"
! class="col1"|B
|- class="row1" style="border-color: #000000;"
| class="col0"|0
| class="col1"|0
|- class="row2"
| class="col0"|1
| class="col1"|0
|- class="row3"
| class="col0"|1
| class="col1"|1
|- class="row2row4"
| class="col0"|0
| class="col1"|1
|- class="row3row5"
| class="col0"|0
| class="col1"|0
|}'''<br /><u>Gegen den Uhrzeigersinn</u> [B ändert sich zuerst] - > Pin_DT''' <div class="row4level2"><div class="table sectionedit5">{| class="inline" style="height: 178px; border-color: #000000;" width="359"|- class="row0"! class="col0"|A! class="col1"|B|- class="row1" style="border-color: #000000;"| class="col0"|10
| class="col1"|0
|- class="row5row2"| class="col0"|0| class="col1"|1|- class="row3"
| class="col0"|1
| class="col1"|1
|- class="row6row4"
| class="col0"|1
| class="col1"|0
|- class="row7row5"
| class="col0"|0
| class="col1"|0
|- class="row8"}| class="col0"|0| class="col1"|1</div>|}</div> </div> 
</div>
==Pin-Belegung==
[[Datei:3_S_V_G5_CLK_DT_SW_V_G.png|none|457x294px]]
==Codebeispiel Arduino==
Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt. Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht. Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position. '''Für die serielle Ausgabe: Baudrate= 115200''' <pre class="brush:cpp">int redPin = 2;// Initialisierung benötigter Variablenint yellowPin Counter = 30;int greenPin = 4boolean Richtung;int aPin = 6Pin_clk_Letzter; int bPin = 7Pin_clk_Aktuell;int buttonPin = 5;int state = 0;int longPeriod = 5000; // Time at green or redDefinition der Eingangs-Pinsint shortPeriod pin_clk = 7003; // Time period when changing int targetCount pin_dt = shortPeriod4;int count button_pin = 05; void setup (){ // Eingangs-Pins werden initialisiert... pinMode (aPinpin_clk, INPUT); pinMode (bPinpin_dt, INPUT); pinMode (buttonPinbutton_pin, INPUT); pinMode // ...und deren Pull-Up Widerstände aktiviert digitalWrite(redPinpin_clk, OUTPUTtrue); pinMode digitalWrite(yellowPinpin_dt, OUTPUTtrue); pinMode digitalWrite(greenPinbutton_pin, OUTPUTtrue); // Initiales Auslesen des Pin_CLK Pin_clk_Letzter = digitalRead(pin_clk); Serial.begin (115200); // Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden// Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.// Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen// Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.// Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.// Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position. void loop (){ count++ // Auslesen des aktuellen Statuses Pin_clk_Aktuell = digitalRead(pin_clk); // Überprüfung auf Änderung if (Pin_clk_Aktuell != Pin_clk_Letzter) { if (digitalRead (buttonPinpin_dt)!= Pin_clk_Aktuell) { setLights (HIGH, HIGH, HIGH) // Pin_CLK hat sich zuerst verändert Counter ++; Richtung = true; } else { // Andernfalls hat sich Pin_DT zuerst verändert int change Richtung = getEncoderTurn false; Counter--; } Serial.println ("Drehung erkannt: "); int newPeriod = longPeriod + Serial.print (change * 1000"Drehrichtung: "); if (newPeriod >= 1000 && newPeriod <= 10000Richtung) { longPeriod = newPeriod Serial.println ("Im Uhrzeigersinn"); } if (count> targetCount) else { setState Serial.println("Gegen den Uhrzeigersinn"); count = 0; } } delay Serial.print(1"Aktuelle Position: ");} Serial.println(Counter);int getEncoderTurn Serial.println("------------------------------");{ } // Return -1, 0, or +1Vorbereitung für den nächsten Druchlauf: static int oldA // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert Pin_clk_Letzter = LOWPin_clk_Aktuell; static int oldB // Reset-Funktion um aktuelle Position zu speichern if (!digitalRead(button_pin) && Counter!= LOW;0) int result { Counter = 0; int newA = digitalRead Serial.println(aPin"Position resettet"); int newB } }  </pre> '''Anschlussbelegung Arduino:''' {| style= digitalRead (bPin)"height: 58px;padding-left: 30px;" width="228" if (newA !|-||CLK||= oldA ||[Pin 3]|-||DT|| newB != oldB) {||[Pin 4] //Something has changed|- if (oldA ||Button||=||[Pin 5]|-||+||= LOW && newA ||[Pin 5V]|-||GND||=||[Pin GND]|} '''Beispielprogramm Download''' [[Medium:KY-040_RotaryEncoder.zip|KY-040_RotaryEncoder.zip]] ==Codebeispiel Raspberry Pi== HIGH) {Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht. result Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position. <pre class= "brush:py"># coding=utf- 8# Benoetigte Module werden importiert und eingerichtetimport RPi.GPIO as GPIOimport time GPIO.setmode(oldB * 2 - 1GPIO.BCM); } }# Hier werden die Eingangs-Pins deklariert, an dem der Sensor angeschlossen ist. oldA PIN_CLK = newA;16 oldB PIN_DT = newB;15 return result;BUTTON_PIN = 14}int setState GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP){ if GPIO.setup(state PIN_DT, GPIO.IN, pull_up_down == 0GPIO.PUD_UP) { setLights GPIO.setup(HIGHBUTTON_PIN, LOWGPIO.IN, LOWpull_up_down = GPIO.PUD_UP); targetCount # Benötigte Variablen werden initialisiertCounter = longPeriod;0 state Richtung = 1;True }PIN_CLK_LETZTER = 0 else if (state PIN_CLK_AKTUELL =0delayTime = 10.01 # Initiales Auslesen des Pin_CLKPIN_CLK_LETZTER = GPIO.input(PIN_CLK) { setLights # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrtdef ausgabeFunktion(HIGH, HIGH, LOWnull);: targetCount = shortPeriod;global Counter  state PIN_CLK_AKTUELL = 2;GPIO.input(PIN_CLK) } else if (state PIN_CLK_AKTUELL !== 2)PIN_CLK_LETZTER: { setLights if GPIO.input(LOW, LOW, HIGHPIN_DT);!= PIN_CLK_AKTUELL: targetCount Counter += longPeriod;1 state Richtung = 3True; } else if (state : Richtung =False Counter = 3)Counter - 1 { setLights (LOW print "Drehung erkannt: "  if Richtung: print "Drehrichtung: Im Uhrzeigersinn" else: print "Drehrichtung: Gegen den Uhrzeigersinn"  print "Aktuelle Position: ", HIGH, LOWCounter print "------------------------------" def CounterReset(null);: targetCount = shortPeriod;global Counter  state print "Position resettet!" print "------------------------------" Counter = 0; }}# Um einen Debounce direkt zu integrieren, werden die Funktionen zur Ausgabe mittelsvoid setLights # CallBack-Option vom GPIO Python Modul initialisiertGPIO.add_event_detect(int redPIN_CLK, int yellowGPIO.BOTH, int greencallback=ausgabeFunktion, bouncetime=50){ digitalWrite GPIO.add_event_detect(redPinBUTTON_PIN, redGPIO.FALLING, callback=CounterReset, bouncetime=50); digitalWrite (yellowPin print "Sensor-Test [druecken Sie STRG+C, yellowum den Test zu beenden]" # Hauptprogrammschleifetry: while True: time.sleep(delayTime); digitalWrite # Aufraeumarbeiten nachdem das Programm beendet wurdeexcept KeyboardInterrupt: GPIO.cleanup(greenPin, green)  </pre>'''Anschlussbelegung Raspberry Pi:''' {| style="height: 58px;padding-left: 30px;" width="228"|-||CLK||=||GPIO16||[Pin 36]|-||DT||=||GPIO15||[Pin 10]|-||SW||=||GPIO14||[Pin 8]|-||+||=||3,3V||[Pin 1]|-||GND||=||Masse||[Pin 6]|}'''Beispielprogramm Download''' [[Medium:KY-040_RPi_RotaryEncoder.zip|KY-040_RPi_RotaryEncoder.zip]] Zu starten mit dem Befehl: <pre class="brush:bash">sudo python KY-040_RPi_RotaryEncoder.py
</pre>
Bürokrat, Administrator
611
Bearbeitungen