Rotary Encoder KY-040: Ein umfassender Leitfaden für dein nächstes Projekt
Der Rotary Encoder KY-040 ist ein vielseitiges Werkzeug, das in zahlreichen Elektronikprojekten eingesetzt wird. Seine Fähigkeit, präzise Drehbewegungen zu erfassen, macht ihn ideal für Anwendungen in der Robotik, im Automobilbau und in Heimautomatisierungsprojekten.
Aufbau und Funktionsweise
Der KY-040 besteht aus einem Drehknopf, der an einem Sensor befestigt ist. Dieser Sensor erfasst die Drehbewegungen und wandelt sie in elektrische Signale um. Mit diesen Signalen können Mikrocontroller wie Arduino oder Raspberry Pi die Position und Richtung der Drehung ermitteln.
Technische Spezifikationen
- Spannungsbereich: 3.3V bis 5V
- Auflösung: 20 Schritte pro Umdrehung
- Anschluss: 5 Pins (GND, VCC, SW, DT, CLK)
- Betriebstemperatur: -40°C bis +85°C
Anwendungsbereiche
Der Rotary Encoder KY-040 findet in vielen Projekten Anwendung. Hier sind einige Beispiele:
- Robotik: Steuerung von Roboterarmen oder Fahrgestellen.
- Automobilbau: Einstellen von Audiosystemen oder Klimaanlagen.
- Heimautomatisierung: Kontrolle von Beleuchtungssystemen oder Thermostaten.
Integration in Arduino-Projekte
Die Beschaltung des Rotary Encoders ist relativ einfach. CLK und DT sind die Ausgabepins und gehen an die Interrupt-Pins D2/D3. Dann noch VCC (5V) und GND. SW ist der Switch, d.h. hier können wir zusätzlich noch den Tastendruck abfragen.
Um den KY-040 mit einem Arduino zu verbinden, benötigst du lediglich einige grundlegende Programmierkenntnisse. Hier ist ein einfacher Codeausschnitt, um zu beginnen:
#define CLK 2 #define DT 3 int counter = 0; int currentStateCLK; int lastStateCLK; void setup() { pinMode(CLK, INPUT); pinMode(DT, INPUT); lastStateCLK = digitalRead(CLK); Serial.begin(9600); } void loop() { currentStateCLK = digitalRead(CLK); if (currentStateCLK != lastStateCLK) { if (digitalRead(DT) != currentStateCLK) { counter++; } else { counter--; } Serial.println(counter); } lastStateCLK = currentStateCLK; }
Vorteile des KY-040
- Präzision: Hohe Genauigkeit bei der Erfassung von Drehbewegungen.
- Einfachheit: Leichte Integration in bestehende Systeme.
- Vielseitigkeit: Einsatz in zahlreichen Anwendungsbereichen.
Für mein Projekt „Reifeschrank für Salami und Schinken“ habe ich mir eine umfangreichere Variante der Abfrage des Rotary Encoders herausgesucht. Diese wurde schon von Nikolaus Lüneburg vorgestellt und wurde ursprünglich im Play Ground von Arduino gefunden.
Besonderheiten sind hier, dass ich externe Interrupts verwende, die ein gerade laufenden Task im Rechner unterbrechen und die Drehimpulse lückenlos darstellen. Gleichzeitig wird in diesem Sketch das Entprellen der Impulse vorgenommen. So kann es nicht passieren, dass bei einem Drehimpuls versehentlich gleich mehrere Schritte zum Erhöhen oder erniedrigen der Werte erfolgen.
Auf der Arduino Website kannst du nachlesen, was du mit attachInterrupt() anstellen kannst.
#define encoderPinA 2 #define encoderPinB 3 volatile unsigned int encoderPos = 0; // a counter for the dial unsigned int lastReportedPos = 1; // change management static boolean rotating=false; // debounce management // interrupt service routine vars boolean A_set = false; boolean B_set = false; void setup() { pinMode(encoderPinA, INPUT); pinMode(encoderPinB, INPUT); digitalWrite(encoderPinA, HIGH); // turn on pullup resistors digitalWrite(encoderPinB, HIGH); // turn on pullup resistors attachInterrupt(0, doEncoderA, CHANGE); // encoder pin on interrupt 0 (pin 2) attachInterrupt(1, doEncoderB, CHANGE); // encoder pin on interrupt 1 (pin 3) Serial.begin(9600); // output } void loop() { rotating = true; // reset the debouncer if (lastReportedPos != encoderPos) { Serial.print("Index:"); Serial.println(encoderPos, DEC); lastReportedPos = encoderPos; } } // Interrupt on A changing state void doEncoderA() { if ( rotating ) delay (1); // wait a little until the bouncing is done if( digitalRead(encoderPinA) != A_set ) { // debounce once more A_set = !A_set; // adjust counter + if A leads B if ( A_set && !B_set ) encoderPos += 1; rotating = false; // no more debouncing until loop() hits again } } // Interrupt on B changing state, same as A above void doEncoderB(){ if ( rotating ) delay (1); if( digitalRead(encoderPinB) != B_set ) { B_set = !B_set; // adjust counter - 1 if B leads A if( B_set && !A_set ) encoderPos -= 1; rotating = false; } }
Hier die Ausgabe auf der seriellen Schnittstelle.
Fazit
Der Rotary Encoder KY-040 ist ein unverzichtbares Werkzeug für jeden Elektronikenthusiasten. Seine einfache Handhabung und Vielseitigkeit machen ihn zur idealen Wahl für zahlreiche Projekte. Egal, ob du ein Anfänger oder ein erfahrener Entwickler bist, der KY-040 wird deine Projekte bereichern und dir neue Möglichkeiten eröffnen.