Descripción
Optoacoplador encoder fotoeléctrico
En módulo FC-03
Sin módulo ITR9606
Conocer la posición o velocidad de un motor es muy importante en robótica, para lo cual existen diversas alternativas, siendo una de las más comunes el uso de encoders de tipo óptico. Los encoders en general son dispositivos que se encargan de convertir el movimiento angular o lineal en pulsos eléctricos que puedan ser interpretados por el controlador del sistema. Los encoders incrementales ópticos realizan la medición de movimiento con el uso de un haz de luz infrarrojo que se ve interrumpido por las ranuras de un disco acoplado al eje. La cantidad de ranuras por vuelta determinará la precisión del encoder.
Este sensor para encoder óptico utiliza el opto interruptor infrarrojo MOCH22A. El Dispositivo MOCH22A cuenta con dos partes: Un emisor IR y un receptor o sensor IR. Entre el emisor y receptor IR existe un espacio para el objeto que bloqueará el paso de luz (disco ranurado). Los pulsos son digitalizados por un opamp LM393 en modo comparador entregando pulsos TTL que pueden ser interpretados por un microcontrolador como Arduino o Pic. Se recomienda utilizar interrupciones por flancos de subida/bajada para detectar los pulsos. En Arduino Uno los pines de interrupción por flanco son: 2 y 3. Se recomienda agregar un capacitor de 100nF entre la linea de salida D0 y tierra a modo de filtro pasa bajo y así evitar falsos disparos en la interrupción. Otra recomendación es alimentar el módulo con 3.3V.
Este modelo de encoder ha sido diseñado para trabajar con plataformas de robótica móvil: seguidores de línea, sumos, laberinto. También son utilizados en contadores de RPM (Revoluciones por minuto) en motores DC/AC o como sensor de final de carrera.
Tipo de emisor: Fotodiodo IR
Tipo de detector: fototransistor
int encoder_pin = 2; //Pin 2, donde se conecta el encoder
unsigned int rpm = 0; // Revoluciones por minuto calculadas.
float velocity = 0; //Velocidad en [Km/h]
volatile byte pulses = 0; // Número de pulsos leidos por el Arduino en un segundo
unsigned long timeold = 0; // Tiempo
unsigned int pulsesperturn = 20; // Número de muescas que tiene el disco del encoder.
const int wheel_diameter = 64; // Diámetro de la rueda pequeña[mm]
static volatile unsigned long debounce = 0; // Tiempo del rebote.
void setup(){
Serial.begin(9600); // Configuración del puerto serie
pinMode(encoder_pin, INPUT); // Configuración del pin nº2
attachInterrupt(0, counter, RISING); // Configuración de la interrupción 0, donde esta conectado.
pulses = 0;
rpm = 0;
timeold = 0;
Serial.print(«Seconds «);
Serial.print(«RPM «);
Serial.print(«Pulses «);
Serial.println(«Velocity[Km/h]»);}
void loop(){
if (millis() – timeold >= 1000){ // Se actualiza cada segundo
noInterrupts(); //Don’t process interrupts during calculations // Desconectamos la interrupción para que no actué en esta parte del programa.
rpm = (60 * 1000 / pulsesperturn )/ (millis() – timeold)* pulses; // Calculamos las revoluciones por minuto
velocity = rpm * 3.1416 * wheel_diameter * 60 / 1000000; // Cálculo de la velocidad en [Km/h]
timeold = millis(); // Almacenamos el tiempo actual.
Serial.print(millis()/1000); Serial.print(» «);// Se envia al puerto serie el valor de tiempo, de las rpm y los pulsos.
Serial.print(rpm,DEC); Serial.print(» «);
Serial.print(pulses,DEC); Serial.print(» «);
Serial.println(velocity,2);
pulses = 0; // Inicializamos los pulsos.
interrupts(); // Restart the interrupt processing // Reiniciamos la interrupción
}
}
//Función que cuenta los pulsos buenos
void counter(){
if( digitalRead (encoder_pin) && (micros()-debounce > 500) && digitalRead (encoder_pin) ) {
// Vuelve a comprobar que el encoder envia una señal buena y luego comprueba que el tiempo es superior a 1000 microsegundos y vuelve a comprobar que la señal es correcta.
debounce = micros(); // Almacena el tiempo para comprobar que no contamos el rebote que hay en la señal.
pulses++;} // Suma el pulso bueno que entra.
else ; }
Valoraciones
No hay valoraciones aún.