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
Hier bei handelt es sich um ein Beispielprogramm, welches eine LED zum Leuchten bringt, wenn am Sensor ein Signal detektiert wurde. Als LED können z.B. auch unter anderem die Module KY-011, KY-016 oder KY-029 verwendet werden.
// 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_1 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 // Druchlauf mit dem Wert des aktuellen Durchlaufs vergleicht. 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
Programmierbeispiel in der Programmiersprache Python
# Benoetigte Module werden importiert und eingerichtet import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # Hier wird der Eingangs-Pin deklariert, an dem der Sensor angeschlossen ist. Zusaetzlich wird auch der PullUP Widerstand am Eingang aktiviert GPIO_PIN = 24 GPIO.setup(GPIO_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) print "Sensor-Test [druecken Sie STRG+C, um den Test zu beenden]" # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrt def ausgabeFunktion(null): print("Signal erkannt") # Beim Detektieren eines Signals (fallende Signalflanke) wird die Ausgabefunktion ausgeloest GPIO.add_event_detect(GPIO_PIN, GPIO.FALLING, callback=ausgabeFunktion, bouncetime=100) # Hauptprogrammschleife try: while True: time.sleep(1) # Aufraeumarbeiten nachdem das Programm beendet wurde except KeyboardInterrupt: GPIO.cleanup()
Anschlussbelegung Raspberry Pi:
Signal | = | GPIO24 | [Pin 18] |
+V | = | 3,3V | [Pin 1] |
GND | = | Masse | [Pin 6] |
Beispielprogramm Download
Zu starten mit dem Befehl:
sudo python SensorTest_RPi.py