Encoder Rotativo Arduino

Indice

  1. arduino y encoder rotativo

1. arduino y encoder rotativo

// Entradas del codificador rotatorio
#define CLK 2   // Pin de reloj (CLK)
#define DT 3    // Pin de datos (DT)
#define SW 4    // Pin del botón pulsador (SW)

int counter = 0;          // Contador que almacena la posición actual
int currentStateCLK;      // Estado actual del pin CLK
int lastStateCLK;         // Último estado registrado del pin CLK
String currentDir = "";   // Dirección actual de giro: "CW" (horario) o "CCW" (antihorario)
unsigned long lastButtonPress = 0;  // Tiempo del último evento de pulsación del botón

void setup() {
  // Configurar los pines del codificador como entradas
  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);  // Usamos resistencia pull-up interna para el botón
  
  // Inicializar el Monitor Serie
  Serial.begin(9600);
  
  // Leer el estado inicial del pin CLK
  lastStateCLK = digitalRead(CLK);
}

void loop() {
  // Leer el estado actual del pin CLK
  currentStateCLK = digitalRead(CLK);
  
  // Si el estado actual y el anterior de CLK son diferentes, hubo un pulso
  // Reaccionamos solo a un cambio de estado (flanco de subida) para evitar doble conteo
  if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
    // Si el estado de DT es diferente al de CLK,
    // el codificador está girando en sentido antihorario (CCW), decrementamos
    if (digitalRead(DT) != currentStateCLK) {
      counter--;
      currentDir = "CCW";
    } else {
      // De lo contrario, gira en sentido horario (CW), incrementamos
      counter++;
      currentDir = "CW";
    }
    
    // Mostrar la dirección y el contador por el Monitor Serie
    Serial.print("Dirección: ");
    Serial.print(currentDir);
    Serial.print(" | Contador: ");
    Serial.println(counter);
  }
  
  // Guardar el estado actual de CLK para la próxima iteración
  lastStateCLK = currentStateCLK;
  
  // Leer el estado del botón
  int btnState = digitalRead(SW);
  
  // Si detectamos señal LOW, el botón está presionado
  if (btnState == LOW) {
    // Si han pasado más de 50ms desde la última pulsación,
    // significa que el botón se ha presionado de nuevo (anti-rebote)
    if (millis() - lastButtonPress > 50) {
      Serial.println("¡Botón presionado!");
    }
    // Recordar el momento de esta pulsación
    lastButtonPress = millis();
  }
  
  // Pequeña pausa para ayudar a eliminar el rebote de las lecturas
  delay(1);
}

Explicación del funcionamiento:

  • Codificador rotatorio: Los pines CLK y DT generan señales digitales cuando giras la perilla. Comparando el estado de DT con CLK, el programa determina si giras a la derecha (CW) o izquierda (CCW).
  • Contador: Se incrementa o decrementa según el sentido de giro.
  • Botón: El pin SW (con pull-up interno) se pone a LOW cuando presionas. Se usa un antirrebote de 50ms para evitar lecturas falsas.
  • Monitor Serie: Muestra en tiempo real la dirección de giro y el valor del contador.

Este código es ideal para interfaces hombre-máquina con perillas rotatorias, como controles de volumen, menús, etc.