Änderungen

KY-040 Kodierter Drehschalter (Rotary Encoder)

2.217 Byte hinzugefügt, 14:24, 8. Apr. 2016
</div>
</div>
</div>
</div>
</div>
==Pin-Belegung==
[[Datei:5_CLK_DT_SW_V_G.png|457x294px|none|457x294px]]
==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. <pre class="brush:cpp">int redPin = 2;int yellowPin = 3;// Initialisierung benötigter Variablenint greenPin Counter = 40;int aPin = 6boolean Richtung;int bPin = 7Pin_clk_Letzter; int buttonPin = 5Pin_clk_Aktuell;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_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 (){ 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; int newPeriod = longPeriod + Counter--; } Serial.println (change * 1000"Drehung erkannt: "); if Serial.print (newPeriod >= 1000 && newPeriod <= 10000"Drehrichtung: ") { longPeriod = newPeriod; } if (count> targetCountRichtung) { setState Serial.println ("Im Uhrzeigersinn"); count = 0; } } else { delay Serial.println(1"Gegen den Uhrzeigersinn"); }int getEncoderTurn Serial.print("Aktuelle Position: "){ // Return -1, 0, or +1 static int oldA = LOW; static int oldB = LOW; int result = 0; int newA = digitalRead Serial.println(aPinCounter); int newB = digitalRead Serial.println(bPin"------------------------------"); if (newA ! } // Vorbereitung für den nächsten Druchlauf: // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert Pin_clk_Letzter = oldA || newB != oldB)Pin_clk_Aktuell; { //Something has changedReset-Funktion um aktuelle Position zu speichern if (oldA == LOW !digitalRead(button_pin) && newA Counter!== HIGH0) { result Counter = - 0; Serial.println(oldB * 2 - 1"Position resettet"); } } oldA  </pre> '''Anschlussbelegung Arduino:''' {| style= newA"height: 58px;padding-left: 30px;" width="228" oldB |-||CLK||= newB; return result;||[Pin 3]}|-int setState ()||DT{||= if (state ||[Pin 4]|-||Button||== 0) {||[Pin 5] setLights (HIGH, LOW, LOW);|- targetCount ||+||= longPeriod; state ||[Pin 5V]|-||GND||= 1; ||[Pin GND]|} else if (state '''Beispielprogramm Download''' [[Medium:KY-040_RotaryEncoder.zip|KY-040_RotaryEncoder.zip]] ==Codebeispiel Raspberry Pi== 1) {Programmierbeispiel in der Programmiersprache Python setLights (HIGH, HIGH, LOW); targetCount <pre class= shortPeriod;"brush:py"># Benoetigte Module werden importiert und eingerichtet state = 2;import RPi.GPIO as GPIO }import time else if GPIO.setmode(state == 2GPIO.BCM) { setLights # Hier wird der Eingangs-Pin deklariert, an dem der Sensor angeschlossen ist. Zusaetzlich wird auch der PullUP Widerstand am Eingang aktiviertGPIO_PIN = 24GPIO.setup(LOWGPIO_PIN, LOWGPIO.IN, HIGHpull_up_down = GPIO.PUD_UP); targetCount = longPeriod; state = 3;print "Sensor-Test [druecken Sie STRG+C, um den Test zu beenden]" } else if # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrtdef ausgabeFunktion(state == 3null): { print("Signal erkannt") setLights # Beim Detektieren eines Signals (LOWfallende Signalflanke) wird die Ausgabefunktion ausgeloestGPIO.add_event_detect(GPIO_PIN, HIGHGPIO.FALLING, LOWcallback=ausgabeFunktion, bouncetime=100); targetCount = shortPeriod; state = 0;# Hauptprogrammschleife }try:} while True:void setLights time.sleep(int red, int yellow, int green1){ digitalWrite (redPin, red);# Aufraeumarbeiten nachdem das Programm beendet wurde digitalWrite except KeyboardInterrupt: GPIO.cleanup(yellowPin, yellow</pre>'''Anschlussbelegung Raspberry Pi:''' {| style="height: 58px;padding-left: 30px;" width="228" digitalWrite (greenPin|-||Signal||=||GPIO24||[Pin 18]|-||+V||=||3, green);3V||[Pin 1]|-||GND||=||Masse||[Pin 6]|}'''Beispielprogramm Download''' [[Medium:SensorTest_RPi.zip|SensorTest_RPi.zip]] Zu starten mit dem Befehl: <pre class="brush:bash">sudo python SensorTest_RPi.py
</pre>
Bürokrat, Administrator
611
Bearbeitungen