CONTADOR DE PULSOS DE ENCODER CON ARDUINO Los encoders tienen como principio generar señales digitales en respuesta al movimiento, sea de un disco o cinta perforada. Éstos se utilizan, en su mayoría de las aplicaciones, para el control de posición y/o velocidad de un motor. Considerando básicamente el número de pulsos leído y la cantidad de ranuras que existen en un disco o cinta para controlar una posición específica o una velocidad.
Como se hace el conteo de pulsos que genera un encoder. Para ello se necesitará el sensor optoacoplador y el disco o cinta ranurada, resistencias que se especifican en el circuito más adelante y la placa Arduino. Recomendación: Si se desea fabricar uno disco recomiendo utilizar programas (como OPTICAL ENCODER ó CODEWHEEL GENERATOR) que puedan diseñar éstos e imprimirlos en cartulinas, tres o cuatro y pegarlas; ó pegar una hoja de cartulina impresa en un cartón. Pero no utilizar plástico a no ser que se pegue una cartulina impresa a cada lado. Bueno, el sensor optoacoplador generará pulsos de acuerdo a cuantas franjas blancas o transparentes detectó. Estos pulsos serán contados por Arduino. Como se sabe la sensibilidad de los sensores, es posible que en algunos casos no esté claro un pulso y exista errores pequeños que con el tiempo se van haciendo muy notorios y eso afecta el objetivo final. Razón suficiente para añadir un circuito extra ó un programa específico. En este caso se añade un disparador Schmitt (74LS14) previniendo dicho ruido.
Efecto del uso del schmitt trigger (B) en vez de un comparador (A)
Como se conoce los pulsos tienen únicamente dos respuestas ALTO (1) y BAJO (0), que da lugar a conectar a una entrada digital del Arduino, como se observa en la imagen.
Uso del CI 74LS14. Para este caso únicamente se utiliza 4 pines de conexión, puedes considerar cualquier par que sea más cómodo (Ij y Qj) y los de alimentación (VCC y GND).
Considerando al optoacoplador:
PROGRAMA (Cuenta pulsos, no mide rpm) boolean anterior = 0; boolean actual = 0; int contador = 0; void setup() { Serial.begin(9600); pinMode(2,INPUT); } boolean debounce(boolean dato_anterior) // filtrado del ruido de rebote por software { boolean dato_actual = digitalRead(2); if (dato_anterior != dato_actual) { delay(10); dato_actual = digitalRead(2);
} return dato_actual; } void loop() { actual = debounce(anterior); if ( anterior == 0 && actual == 1) { contador++; delay (100); Serial.println(contador); } anterior = actual; }
De esta manera, acoplando un disco o cinta, como se mencionó anteriormente, ó sólo para hacer la prueba podrían interrumpir con una cartulina o cartón interponiéndolo en el optoacoplador para observar el conteo de pulsos generado.
COMENTARIOS El detector mostrado en clases está basado en una antigua placa de Sparkfun, con el fotointerruptor CNZ1120. Existe otro fotointerruptor con salidas análogas y digital. Se recomienda girar a mano la ruedita y comparar la cuenta que da el Arduino con el número de vueltas conocido. Si el número de vueltas no coincide, se podría requerir un filtro antirebote o un disparador de Schmitt. Pero, revise antes si no hay algún cable suelto o una conexión mala, antes de agregar hardware. Una mala conexión puede generar señales ruidosas y falsear los datos. Preguntas: 1. ¿Con una única ranura en el disco, se puede controlar posición angular? 2. Con un disco de 4 ranuras, ¿cuál es la fórmula para calcular las RPM de un motor? (Pista: estudie el programa visto en clases y modifíquelo)