You are on page 1of 5

Vctor Solrzano Alejandro Alemn Tpicos selectos de control. Prof. Dr.

Horacio Orozco

Tacmetro usando Arduino Uno


Para medir velocidad se consideraron dos opciones: 1. Medir el tiempo entre dos pulsos (o alguna otra cantidad predefinida de pulsos) y calcular la velocidad correspondiente.

t=variable Cantidad de pulsos constante

2. Contar la cantidad de pulsos en un intervalo de tiempo predefinido.

t=constante Cantidad de pulsos variable

Se decidi utilizar la segunda opcin. En el programa de arduino se definieron las siguientes constantes: 1. interval Para facilitar la modificacin del intervalo de tiempo constante para el cual se cuentan los pulsos.

2. Pulsrev

Para facilitar la modificacin del encoder. Es la cantidad de pulsos que enva el encoder por cada revolucin.

La conversin a velocidad se realiza de la siguiente manera:

Donde: es la cantidad de pulsos contada. es el intervalo de tiempo fijado en la constante interval en ms. es el inverso de la cantidad de pulsos por cada revolucin (fijado en la constante pulsrev). El resto son factores de conversin de tiempo para ms -> min. La operacin en el Arduino se realiza de la siguiente manera:
velocidad=contador*1000*60; velocidad=velocidad/pulsrev; velocidad=velocidad/interval;

Esto se hace por que se est utilizando el tipo de datos entero, se busca tener un nmero grande antes de realizar las divisiones. Esto porque, si el resultado de una divisin es menor que 1 provocar un error en la medicin de la velocidad. Para medir el tiempo se utilizar la funcin de Arduino millis(), esta funcin cuenta el tiempo en milisegundos desde el momento en que comenz a funcionar el Arduino. El funcionamiento del programa depende de la funcin de interrupcin externa con que cuenta el Arduino. La mayora de los arduinos tienen la interrupcin 0 en el Pin2 digital, esta interrupcin es la que ser utilizada. Citando [1] Las interrupciones son un mecanismo por el que un dispositivo, ante la ocurrencia de un evento, pide al procesador que interrumpa el programa que se est ejecutando y pase a ejecutar temporalmente una subrutina especfica. Esta subrutina recibe el nombre de rutina de atencin a la interrupcin.

La interrupcin en el Arduino se inicializa de la siguiente manera:


attachInterrupt( 0, conteo, FALLING); | | | | | ->Dispara la interrupcin en el | | borde de bajada del pulso | | enviado por el encoder. | ->Al entrar la interrupcin llama a la | subrutina conteo. ->Se est utilizando la interrupcin 0 (Pin2 digital)

El material necesario es: Arduino Uno Optoswitch Motor Disco de encoder Resistencias

El diagrama de conexin es el siguiente

Al pin digital 2 del Arduino

Donde R2 es una resistencia limitadora de corriente para proteger el led del optoswitch. R1 sirve para que cuando el optoswitch est desactivado el pin2 del Arduino se aterrice de esta manera siempre tendr o 5V o 0V (si no se aterriza puede provocar errores en la lectura y por tanto en el disparo de la interrupcin). El diagrama de flujo de funcionamiento del programa es el siguiente:

El cdigo completo es:


const int buttonPin=2; const int ledPin=13; long previousMillis=0; long interval = 250; // pulsos por revolucion long pulsrev=55; long velocidad=0; volatile long contador=0; int buttonstate=0; int lastbuttonstate=0; void setup () { pinMode (buttonPin, INPUT); pinMode(ledPin,OUTPUT); attachInterrupt(0, conteo, FALLING); Serial.begin(9600); } void loop(){ unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; // Serial.print("cont = " ); //Serial.println(contador); if (contador<=2) { velocidad=0; contador=0; Serial.println(velocidad); } else{ velocidad=contador*1000*60; velocidad=velocidad/pulsrev; velocidad=velocidad/interval; Serial.println(velocidad); contador=0; } Serial.print("v = " ); } else{} void conteo() { contador = contador+1; }

//

Referencias [1] Zuloaga, A., Astarloa, A., 2008, Sistemas de procesamiento digital, Delta Publicaciones, Madrid, Espaa.