Sensorkit wiki admin (Diskussion | Beiträge) (→Keine Zusammenfassung) |
Sensorkit wiki admin (Diskussion | Beiträge) |
||
(5 dazwischenliegende Versionen des gleichen Benutzers werden nicht angezeigt) | |||
Zeile 8: | Zeile 8: | ||
==Kodierung== | ==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"> | <div class="level2"><div class="table sectionedit5"> | ||
{| class="inline" style="height: 178px; border-color: #000000;" width="359" | {| class="inline" style="height: 178px; border-color: #000000;" width="359" | ||
Zeile 14: | Zeile 18: | ||
! class="col1"|B | ! class="col1"|B | ||
|- class="row1" style="border-color: #000000;" | |- 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="col0"|1 | ||
| class="col1"|1 | | class="col1"|1 | ||
− | |- class=" | + | |- class="row4" |
| class="col0"|0 | | class="col0"|0 | ||
| class="col1"|1 | | class="col1"|1 | ||
− | |- class=" | + | |- class="row5" |
| class="col0"|0 | | class="col0"|0 | ||
| class="col1"|0 | | class="col1"|0 | ||
− | |- class=" | + | |} |
− | | class="col0"| | + | '''<br /><u>Gegen den Uhrzeigersinn</u> [B ändert sich zuerst] -> Pin_DT''' |
+ | |||
+ | <div class="level2"><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"|0 | ||
| class="col1"|0 | | class="col1"|0 | ||
− | |- class=" | + | |- class="row2" |
+ | | class="col0"|0 | ||
+ | | class="col1"|1 | ||
+ | |- class="row3" | ||
| class="col0"|1 | | class="col0"|1 | ||
| class="col1"|1 | | class="col1"|1 | ||
− | |- class=" | + | |- class="row4" |
| class="col0"|1 | | class="col0"|1 | ||
| class="col1"|0 | | class="col1"|0 | ||
− | |- class=" | + | |- class="row5" |
| class="col0"|0 | | class="col0"|0 | ||
| class="col1"|0 | | class="col1"|0 | ||
− | | | + | |} |
− | + | ||
− | + | </div> | |
− | + | </div> | |
+ | |||
+ | </div> | ||
+ | |||
</div> | </div> | ||
==Pin-Belegung== | ==Pin-Belegung== | ||
− | [[Datei: | + | [[Datei:5_CLK_DT_SW_V_G.png|none|457x294px]] |
==Codebeispiel Arduino== | ==Codebeispiel Arduino== | ||
− | <pre class="brush:cpp"> | + | 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. |
− | int | + | |
− | + | Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben. | |
− | int | + | Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position. |
− | int | + | |
− | + | '''Für die serielle Ausgabe: Baudrate= 115200''' | |
− | + | ||
− | + | <pre class="brush:cpp">// Initialisierung benötigter Variablen | |
− | int | + | int Counter = 0; |
− | int | + | boolean Richtung; |
− | int | + | int Pin_clk_Letzter; |
− | void setup () | + | int Pin_clk_Aktuell; |
− | { | + | |
− | + | // Definition der Eingangs-Pins | |
− | + | int pin_clk = 3; | |
− | + | int pin_dt = 4; | |
− | + | int button_pin = 5; | |
− | + | ||
− | + | ||
− | } | + | void setup() |
− | void loop () | + | { |
− | { | + | // Eingangs-Pins werden initialisiert... |
− | + | pinMode (pin_clk,INPUT); | |
− | + | pinMode (pin_dt,INPUT); | |
− | + | pinMode (button_pin,INPUT); | |
− | + | ||
− | + | // ...und deren Pull-Up Widerstände aktiviert | |
− | + | digitalWrite(pin_clk, true); | |
− | + | digitalWrite(pin_dt, true); | |
− | + | digitalWrite(button_pin, true); | |
− | + | ||
− | + | // 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() | |
− | + | { | |
− | + | // Auslesen des aktuellen Statuses | |
− | + | Pin_clk_Aktuell = digitalRead(pin_clk); | |
− | + | ||
− | + | // Überprüfung auf Änderung | |
− | + | if (Pin_clk_Aktuell != Pin_clk_Letzter) | |
− | + | { | |
− | + | ||
− | + | if (digitalRead(pin_dt) != Pin_clk_Aktuell) | |
− | + | { | |
− | + | // Pin_CLK hat sich zuerst verändert | |
− | + | Counter ++; | |
− | + | Richtung = true; | |
− | + | } | |
− | + | ||
− | + | else | |
− | + | { // Andernfalls hat sich Pin_DT zuerst verändert | |
− | + | Richtung = false; | |
− | + | Counter--; | |
− | + | } | |
− | + | Serial.println ("Drehung erkannt: "); | |
− | + | Serial.print ("Drehrichtung: "); | |
− | + | ||
− | + | if (Richtung) | |
− | + | { | |
− | + | Serial.println ("Im Uhrzeigersinn"); | |
− | + | } | |
− | + | else | |
− | + | { | |
− | + | Serial.println("Gegen den Uhrzeigersinn"); | |
− | + | } | |
− | + | ||
− | + | Serial.print("Aktuelle Position: "); | |
− | + | Serial.println(Counter); | |
− | + | Serial.println("------------------------------"); | |
− | + | ||
− | + | } | |
− | + | ||
− | + | // Vorbereitung für den nächsten Druchlauf: | |
− | + | // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert | |
− | + | Pin_clk_Letzter = Pin_clk_Aktuell; | |
− | + | ||
− | + | // Reset-Funktion um aktuelle Position zu speichern | |
− | + | if (!digitalRead(button_pin) && Counter!=0) | |
− | + | { | |
− | + | Counter = 0; | |
− | + | Serial.println("Position resettet"); | |
− | + | } | |
− | + | ||
− | } | + | } |
+ | |||
+ | </pre> | ||
+ | |||
+ | '''Anschlussbelegung Arduino:''' | ||
+ | |||
+ | {| style="height: 58px; padding-left: 30px;" width="228" | ||
+ | |- | ||
+ | ||CLK | ||
+ | ||= | ||
+ | ||[Pin 3] | ||
+ | |- | ||
+ | ||DT | ||
+ | ||= | ||
+ | ||[Pin 4] | ||
+ | |- | ||
+ | ||Button | ||
+ | ||= | ||
+ | ||[Pin 5] | ||
+ | |- | ||
+ | ||+ | ||
+ | ||= | ||
+ | ||[Pin 5V] | ||
+ | |- | ||
+ | ||GND | ||
+ | ||= | ||
+ | ||[Pin GND] | ||
+ | |} | ||
+ | |||
+ | '''Beispielprogramm Download''' | ||
+ | |||
+ | [[Medium:KY-040_RotaryEncoder.zip|KY-040_RotaryEncoder.zip]] | ||
+ | |||
+ | ==Codebeispiel Raspberry Pi== | ||
+ | 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. | ||
+ | |||
+ | <pre class="brush:py"> | ||
+ | # coding=utf-8 | ||
+ | # Benoetigte Module werden importiert und eingerichtet | ||
+ | import RPi.GPIO as GPIO | ||
+ | import time | ||
+ | |||
+ | GPIO.setmode(GPIO.BCM) | ||
+ | |||
+ | # Hier werden die Eingangs-Pins deklariert, an dem der Sensor angeschlossen ist. | ||
+ | PIN_CLK = 16 | ||
+ | PIN_DT = 15 | ||
+ | BUTTON_PIN = 14 | ||
+ | |||
+ | GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP) | ||
+ | GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP) | ||
+ | GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) | ||
+ | |||
+ | # Benötigte Variablen werden initialisiert | ||
+ | Counter = 0 | ||
+ | Richtung = True | ||
+ | PIN_CLK_LETZTER = 0 | ||
+ | PIN_CLK_AKTUELL = 0 | ||
+ | delayTime = 0.01 | ||
+ | |||
+ | # Initiales Auslesen des Pin_CLK | ||
+ | PIN_CLK_LETZTER = GPIO.input(PIN_CLK) | ||
+ | |||
+ | # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrt | ||
+ | def ausgabeFunktion(null): | ||
+ | global Counter | ||
+ | |||
+ | PIN_CLK_AKTUELL = GPIO.input(PIN_CLK) | ||
+ | |||
+ | if PIN_CLK_AKTUELL != PIN_CLK_LETZTER: | ||
+ | |||
+ | if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL: | ||
+ | Counter += 1 | ||
+ | Richtung = True; | ||
+ | else: | ||
+ | Richtung = False | ||
+ | Counter = Counter - 1 | ||
+ | |||
+ | print "Drehung erkannt: " | ||
+ | |||
+ | if Richtung: | ||
+ | print "Drehrichtung: Im Uhrzeigersinn" | ||
+ | else: | ||
+ | print "Drehrichtung: Gegen den Uhrzeigersinn" | ||
+ | |||
+ | print "Aktuelle Position: ", Counter | ||
+ | print "------------------------------" | ||
+ | |||
+ | def CounterReset(null): | ||
+ | global Counter | ||
+ | |||
+ | print "Position resettet!" | ||
+ | print "------------------------------" | ||
+ | Counter = 0 | ||
+ | |||
+ | # Um einen Debounce direkt zu integrieren, werden die Funktionen zur Ausgabe mittels | ||
+ | # CallBack-Option vom GPIO Python Modul initialisiert | ||
+ | GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=50) | ||
+ | GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50) | ||
+ | |||
+ | |||
+ | print "Sensor-Test [druecken Sie STRG+C, um den Test zu beenden]" | ||
+ | |||
+ | # Hauptprogrammschleife | ||
+ | try: | ||
+ | while True: | ||
+ | time.sleep(delayTime) | ||
+ | |||
+ | # Aufraeumarbeiten nachdem das Programm beendet wurde | ||
+ | except KeyboardInterrupt: | ||
+ | GPIO.cleanup() | ||
+ | |||
+ | |||
+ | </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> | </pre> |
Aktuelle Version vom 8. April 2016, 15:01 Uhr
Bild
Technische Daten / Kurzbeschreibung
Die aktuelle Position des Drehschalters wird kodiert über die Ausgänge gegeben.
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.
Im Uhrzeigersinn [A ändert sich zuerst] -> Pin_CLK
A | B |
---|---|
0 | 0 |
1 | 0 |
1 | 1 |
0 | 1 |
0 | 0 |
Gegen den Uhrzeigersinn [B ändert sich zuerst] -> Pin_DT
A | B |
---|---|
0 | 0 |
0 | 1 |
1 | 1 |
1 | 0 |
0 | 0 |
Pin-Belegung
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
// Initialisierung benötigter Variablen int Counter = 0; boolean Richtung; int Pin_clk_Letzter; int Pin_clk_Aktuell; // Definition der Eingangs-Pins int pin_clk = 3; int pin_dt = 4; int button_pin = 5; void setup() { // Eingangs-Pins werden initialisiert... pinMode (pin_clk,INPUT); pinMode (pin_dt,INPUT); pinMode (button_pin,INPUT); // ...und deren Pull-Up Widerstände aktiviert digitalWrite(pin_clk, true); digitalWrite(pin_dt, true); digitalWrite(button_pin, true); // 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() { // Auslesen des aktuellen Statuses Pin_clk_Aktuell = digitalRead(pin_clk); // Überprüfung auf Änderung if (Pin_clk_Aktuell != Pin_clk_Letzter) { if (digitalRead(pin_dt) != Pin_clk_Aktuell) { // Pin_CLK hat sich zuerst verändert Counter ++; Richtung = true; } else { // Andernfalls hat sich Pin_DT zuerst verändert Richtung = false; Counter--; } Serial.println ("Drehung erkannt: "); Serial.print ("Drehrichtung: "); if (Richtung) { Serial.println ("Im Uhrzeigersinn"); } else { Serial.println("Gegen den Uhrzeigersinn"); } Serial.print("Aktuelle Position: "); Serial.println(Counter); Serial.println("------------------------------"); } // Vorbereitung für den nächsten Druchlauf: // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert Pin_clk_Letzter = Pin_clk_Aktuell; // Reset-Funktion um aktuelle Position zu speichern if (!digitalRead(button_pin) && Counter!=0) { Counter = 0; Serial.println("Position resettet"); } }
Anschlussbelegung Arduino:
CLK | = | [Pin 3] |
DT | = | [Pin 4] |
Button | = | [Pin 5] |
+ | = | [Pin 5V] |
GND | = | [Pin GND] |
Beispielprogramm Download
Codebeispiel Raspberry Pi
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.
# coding=utf-8 # Benoetigte Module werden importiert und eingerichtet import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # Hier werden die Eingangs-Pins deklariert, an dem der Sensor angeschlossen ist. PIN_CLK = 16 PIN_DT = 15 BUTTON_PIN = 14 GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) # Benötigte Variablen werden initialisiert Counter = 0 Richtung = True PIN_CLK_LETZTER = 0 PIN_CLK_AKTUELL = 0 delayTime = 0.01 # Initiales Auslesen des Pin_CLK PIN_CLK_LETZTER = GPIO.input(PIN_CLK) # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrt def ausgabeFunktion(null): global Counter PIN_CLK_AKTUELL = GPIO.input(PIN_CLK) if PIN_CLK_AKTUELL != PIN_CLK_LETZTER: if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL: Counter += 1 Richtung = True; else: Richtung = False Counter = Counter - 1 print "Drehung erkannt: " if Richtung: print "Drehrichtung: Im Uhrzeigersinn" else: print "Drehrichtung: Gegen den Uhrzeigersinn" print "Aktuelle Position: ", Counter print "------------------------------" def CounterReset(null): global Counter print "Position resettet!" print "------------------------------" Counter = 0 # Um einen Debounce direkt zu integrieren, werden die Funktionen zur Ausgabe mittels # CallBack-Option vom GPIO Python Modul initialisiert GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=50) GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50) print "Sensor-Test [druecken Sie STRG+C, um den Test zu beenden]" # Hauptprogrammschleife try: while True: time.sleep(delayTime) # Aufraeumarbeiten nachdem das Programm beendet wurde except KeyboardInterrupt: GPIO.cleanup()
Anschlussbelegung Raspberry Pi:
CLK | = | GPIO16 | [Pin 36] |
DT | = | GPIO15 | [Pin 10] |
SW | = | GPIO14 | [Pin 8] |
+ | = | 3,3V | [Pin 1] |
GND | = | Masse | [Pin 6] |
Beispielprogramm Download
Zu starten mit dem Befehl:
sudo python KY-040_RPi_RotaryEncoder.py