[:es]Objetivos:
Medir la velocidad rpm de cualquier motor usando un encoder.
Material:
Arduino uno
Motor DC con Encoder
LCD o LCD shield
Desarrollo:
Investiga como función un Encoder.
Lo primero que tenemos que saber es la resolución del enconder a usar.
La resolución de un encoder es el número de pulsos que se generan en una revolución del motor.
La formula para medir la velocidad rpm es la siguiente.
Vrpm=( #pulsos_en_1_seg/ resolucion)*60;
Programa:
#include <LiquidCrystal.h>
const int senrpm = 13; // El interruptor a utilizar sera el 0 es decir el pin digital 2
int pulsos=0; // variable para contar los pulsos en 1 segundo
int resolucion = 300; // pulsos por revolución del encoder resplucion
int tiempo;
double rpm;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
// put your setup code here, to run once:
lcd.begin(16, 2);
pinMode(senrpm, INPUT); //declaramos el boton como entrada
}
void loop() {
// put your main code here, to run repeatedly:
velocidadrpm();
}
void velocidadrpm(){
// Serial.println(tiempo);
int pulsos=0;
boolean bandera=LOW;
unsigned long currentTime=0;
unsigned long startTime=millis();
while(currentTime<=1000)
{
if(digitalRead(senrpm)==HIGH)
{
bandera=HIGH;
}
if(digitalRead(senrpm)==LOW && bandera==HIGH)
{
pulsos++;
bandera=LOW;
}
currentTime=millis()-startTime;
}
rpm=((double)pulsos/resolucion)*60;
// rpm=int(60000./float(1000))*pulsos/resolucion;
/// Serial.println(rpm);
lcd.setCursor(0,1);
lcd.write("vel:");
lcd.setCursor(5,1);
lcd.print(rpm);
}
Notas:
Otra forma de medir la velocidad rpm es usando un iman acoplado al eje de rotación del motor y sensor de efecto hall.
[:en]Estimados lectores les muestro un nuevo código en Arduino para medir la velocidad rpm de cualquier motor usando un encoder.
Lo primero que tenemos que considerar es saber la resolución de un enconder
La resolución de un encoder es la el número de pulsos que da el enconder por una revolución del motor.
La formula para medir la velocidad rpm es la siguiente
Vrpm=( #pulsos_en_1_seg/ resolucion)*60;
Nuestro programa lo que mide es el número de pulsos que salen del encoder en un 1 seg.
Para medir los pulsos usamos interrupciones externas cada que llega un pulso se produce la interrupción y contamos el número de pulsos
Para medir el tiempo utilizamos la función millis() de arduino para contar el tiempo y otra función que reinicia el tiempo cada segundo que pasa.
Programa:
#include <LiquidCrystal.h>
double rpm, tiempo; // variables a usar
int Interruptor = 0; // El interruptor a utilizar sera el 0 es decir el pin digital 2 de Arduino
// Autor: Christian A. Vazquez para proyectosarduino.xyz y microcontroalodores.com.mx
LiquidCrystal lcd(12,11, 6, 5, 4, 3); // conexión a lcd
int pulsos=0; // variable para contar los pulsos
int resolucion = 24; // resolucion del encoder ( numero de pulsos por revolución)
extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;
//Esta seria nuestra funcion interrupcion exte.
void interrupcion_isr() // se ejecuta cada interrupcion
{
pulsos=pulsos+1; // contador de pulsos
}
void setup()
{
lcd.begin(16,2);
attachInterrupt(Interruptor, interrupcion_isr, FALLING); // se activan interrucciones externas por detección de alto
}
void loop()
{
tiempo =millis(); // mide el tiempo en microsengudos
if(tiempo==1000){ // si el tiempo es igual a 1 seg.
setMillis(new_value); // reinicia el tiempo
rpm=((double)pulsos/resolucion)*60; // formula para calcular rpm
lcd.clear();
lcd.setCursor(0,0);
lcd.print("rpm");
lcd.setCursor(5,0);
lcd.print(rpm);
pulsos=0; // reinicia la cuenta de los pulsos
}
}
void setMillis(unsigned long new_millis){ // función para reiniciar el tiempo a cero
uint8_t oldSREG = SREG;
cli();
timer0_millis = new_millis;
SREG = oldSREG;
}
Diagrama en Proteus

La simulación es muy buena ya que nuestra LCD se muestra la misma velocidad rpm que marca el motor CD de proteus.
Esto se puede usar para cualquier motor. Normalmente lo encoder de cuadratura traen dos salida el canal A y el canal B en este caso solo usaremos uno de los dos canales
[:]


