Zum Inhalt springen

Rotary Encoder KY-040

    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:

    1. Robotik: Steuerung von Roboterarmen oder Fahrgestellen.
    2. Automobilbau: Einstellen von Audiosystemen oder Klimaanlagen.
    3. 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.

    Rotary Encoder Beschaltung mit Arduino Nano
    Logo Fitzing.org

    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.


    0 Kommentare
    Inline Feedbacks
    View all comments
    Schlagwörter: