Medir velocidad rpm de un motor usando encoder, arduino, interrupciones externas, interrupciones temporales.

Medir velocidad rpm de un motor usando encoder, arduino, interrupciones externas, interrupciones temporales.

Práctica: Medición de velocidad (RPM) de un motor usando encoder, Arduino, interrupciones externas y temporales

Objetivos:

  • Medir la velocidad en revoluciones por minuto (RPM) de un motor usando un encoder.
  • Utilizar las interrupciones externas del Arduino para detectar los pulsos generados por el encoder.
  • Implementar interrupciones temporales utilizando la librería TimerOne para calcular la velocidad en intervalos regulares de tiempo.

Materiales:

  • Arduino Uno.
  • Encoder (con resolución conocida, en este caso 64 pulsos por revolución).
  • Motor DC con eje acoplado al encoder.
  • Pantalla LCD (16x2) para mostrar la velocidad en RPM.
  • Cables y protoboard para las conexiones.

Diagrama de Conexión:

  1. Encoder:
    • Conectar el pin de salida del encoder (generalmente marcado como "A" o "Signal") al pin digital 2 del Arduino, que corresponde a la interrupción externa 0.
    • Conectar VCC y GND del encoder a los pines correspondientes del Arduino.
  2. LCD:
    • Conectar el LCD a los pines 12, 11, 6, 5, 4, 3 del Arduino según lo especificado en el código.
  3. Motor DC:
    • Asegúrate de que el encoder esté acoplado al eje del motor para generar pulsos mientras el motor gira.

Desarrollo del Código:

El código que has proporcionado es funcional y mide correctamente la velocidad del motor en RPM usando un encoder. A continuación, te guiaré en la implementación práctica.

Explicación del Código:

  1. Interrupciones externas: Se utiliza la función attachInterrupt() para detectar cuando el encoder genera un pulso cada vez que pasa una marca en el disco del encoder.
  2. Interrupciones temporales: Usamos la librería TimerOne para generar una interrupción cada 1 segundo, momento en el cual se calcula la velocidad en RPM.
  3. Cálculo de RPM: El cálculo se realiza dividiendo el número de pulsos por la resolución del encoder y multiplicando por 60 para convertirlo en revoluciones por minuto.

Código Mejorado:

#include <LiquidCrystal.h> // Librería para manejar el LCD #include "TimerOne.h" // Librería para manejar interrupciones temporales LiquidCrystal lcd(12,11, 6, 5, 4, 3); // Pines para configurar el LCD int pinInterrupcion = 0; // Uso del pin de interrupción externa 0 = pin digital 2 long pulsos = 0; // Variable para contar los pulsos int resolucion = 64; // Resolución del encoder, número de pulsos por revolución double rpm; // Variable para almacenar el cálculo de la velocidad RPM // Función que se ejecuta cuando hay una interrupción externa void deteccion() { pulsos++; // Se incrementa la variable "pulsos" en uno cada vez que ocurre un pulso } // Función que se ejecuta cuando se cumple el tiempo de interrupción temporal (cada 1 segundo) void segundo() { rpm = ((double)pulsos / resolucion) * 60.0; // Cálculo de la velocidad RPM pulsos = 0; // Reiniciar el conteo de pulsos } void setup() { lcd.begin(16,2); // Iniciar el LCD Serial.begin(9600); // Iniciar la comunicación serial // Configurar el temporizador para que se ejecute cada 1 segundo Timer1.initialize(1000000); // Cada 1 segundo (1000000 µs) Timer1.attachInterrupt(segundo); // Establecer la función de interrupción // Configurar la interrupción externa attachInterrupt(pinInterrupcion, deteccion, RISING); // Detectar flanco de subida } void loop() { // Mostrar la velocidad en RPM en el monitor serial Serial.print("RPM: "); Serial.println(rpm); // Mostrar la velocidad en el LCD lcd.setCursor(0,0); // Posición (0,0) en la LCD lcd.print("RPM:"); // Mostrar texto lcd.setCursor(5,0); // Posición (5,0) en la LCD lcd.print(rpm); // Mostrar el valor de la variable rpm delay(500); // Esperar medio segundo antes de actualizar de nuevo }

Explicación:

  1. Interrupción Externa: Cada vez que el pin 2 (donde está conectado el encoder) detecta un cambio de bajo a alto (RISING), se incrementa el valor de pulsos.
  2. Interrupción Temporal: La función segundo() se ejecuta cada 1 segundo, calcula la velocidad en RPM basada en el número de pulsos acumulados durante ese tiempo y luego resetea la variable pulsos para el siguiente ciclo de medición.
  3. Visualización: La velocidad en RPM se muestra en la pantalla LCD y también se envía al puerto serial para poder observarla desde el monitor serial.

Conclusión:

Esta práctica te permitirá medir la velocidad de un motor DC en RPM usando un encoder y un Arduino con interrupciones para una medición precisa y eficiente. La combinación de interrupciones externas y temporales asegura que el conteo de pulsos y el cálculo de la velocidad sean realizados de manera precisa y con bajo consumo de recursos del microcontrolador.

Simulación en Proteus:

Puedes simular este sistema en Proteus conectando el Arduino, un encoder virtual y el motor DC. La pantalla LCD debe estar conectada para visualizar las RPM en tiempo real.       Código Arduino

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *