2013
ENCODER INCREMENTAL MECÁNICO DE UN MAUSE
1. INTRODUCCION.En muchas aplicaciones diarias (electrodomésticos, equipos de audio, de radio, etc.) encontramos un mando de selección que siempre posee un relieve importante en el frente de la aplicación y se presenta como una rueda de tamaño notorio. Se suele utilizar para ajustar volumen, sintonía de radio o para recorres las múltiples variantes de un menú de opciones. Es un mando que gira sin topes y al que podemos encontrarle infinitas aplicaciones prácticas dentro de nuestros proyectos. El propósito del artículo de hoy es poner en funcionamiento un circuito “ encoder ” y prepararlo para futuras aplicaciones que
pueden incluir control de velocidad de motores hasta el mando de sintonía de un receptor.. receptor
1
2013
La elección de este tipo de dispositivos radica en su facilidad de montaje, de su obtención y su bajo costo. Muchos viejos sistemas de sonido poseen este elemento que puede resultar muy útil para este trabajo. Su aspecto externo es el de un potenciómetro, pero sus conexiones devuelven una secuencia de contactos organizadas en cuadratura y entregadas en forma de contacto eléctrico como vemos en la imagen siguiente. Una de las cosas importantes a destacar en este punto es que estos dispositivos “no siempre”
respetan un orden universal en su distribución de pines. Es decir, en algunas oportunidades el punto central es el común a GND y en otros es alguno de los extremos. La manera de saber el correcto conexionado puede ser resuelto de dos maneras muy sencillas. Una es mirando el PCB de donde extraemos el dispositivo y observando la distribución de vías (será muy sencillo descubrir cuál es GND). La otra es utilizando el multímetro hasta descubrir el pin común a ambos interruptores. Porque en realidad es eso lo que posee un encoder en su interior, dos interruptores con una conexión común a GND. 2. Limitaciones.Como todo en la vida, las ventajas de facilidad de uso que brinda un encoder se ven opacadas por la rapidez en que estos componentes presentan algunas fallas. El deterioro de los contactos mecánicos internos y los problemas de ruidos eléctricos cuando son afectados por la suciedad, son las primeras causas de fallos en este tipo de dispositivos. Esos dos fantasmas siempre acechan a la durabilidad y eficiencia de un encoder. 3. Funcionamiento.El funcionamiento básico de un encoder se sustenta, como mencionamos antes, en dos llaves individuales con una conexión común a GND y que se activan una tras otra con un desfasaje de 90 grados. En uno de los sentidos de funcionamiento, uno de los impulsos obtenidos en los resistores pull-up (A) se adelantará 90° al otro (B) y en el sentido inverso B se adelantará a A. Así de simple y sencillo. Lo mismo ocurre con el programa del microcontrolador , cuando uno de los pines conectados a cada llave recibe el impulso antes que el otro, determina el modo de trabajo en que el software resolverá el sentido de giro y la cantidad de impulsos contados.
2
2013
4. Desarrollo.En esta etapa inicial no hablaremos de ninguna aplicación definida, sino que nos limitaremos a asignarle valores a una variable con el simple hecho de girar hacia un lado y hacia otro, la “rueda
de mando” .
Ahora veamos como reciclar y usar el Encoder Mecánico rotatorio del Mouse.
4.1.
Identificación de Terminales del Encoder Mecánico Rotatorio
La Identificación de pines del Encoder del Mouse es igual a los pines del Encoder Rotatorio tipo Potenciómetro.
3
2013
Circuito necesario para montar el Encoder de un Mouse.
Las señales generadas por el Encoder Mecánico son las siguientes:
Estas señales son aplicadas a las entradas del microcontrolador de la siguiente manera: PIN.A0 A →
PIN.A1 B →
4
2013
5. Circuito a Implementar.-
6. Firware Programadel microcontrolador pic en c-ccs compiler
#include <16f877A.h> #FUSES HS,NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOBROWNOUT #use delay(clock=20M, oscillator) #byte porta = 0x05
// Asignamos PortA.
#byte portb = 0x06
// Asignamos PortB.
#byte portC = 0x07
// Asignamos PortC.
#byte portD = 0x08
// Asignamos PortD.
5
2013
#use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) // ---------- Programa Principi al ----------
void main() { set_tris_a(0b11111111);
// Puerto A como entradas. Sólo usamos RA0 y RA1.
set_tris_b(0b00000000); // Puerto B como salidas, para los 8 LEDs. set_tris_C(0b00000000); // Puerto C como salidas, para los 8 LEDs. set_tris_D(0b00000000); // Puerto D como salidas, para los 8 LEDs. disable_interrupts(global); disable_interrupts(int_timer1);
// Inicializo el Micro y ... // deshabilitando todo lo no necesario ...
disable_interrupts(int_rda); disable_interrupts(int_ext); setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_spi(FALSE); setup_counters(RTCC_INTERNAL,RTCC_DIV_2); setup_timer_2(T2_DISABLED,0,1); port_b_pullups(FALSE); port_b_pullups(FALSE);// Sin resistencias pullups a las salidas del puerto B. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico.
//---- Fin de la configuración del 16F 877A ----
int
x=0;
int
enc=0; // Se almacenará el valor actual de RA0 y RA1, hasta la siguiente comparación.
int
aux; // Se almacenará el valor anterior de RA0 y RA1, hasta la siguiente comparación.
6
// Declaramos el valor de X como byte, se corresponderá con los 8 LEDs de salida.
2013
portC=0;
// Inicialmente ponemos a cero el puerto B.
While (true) { aux=enc; enc=porta & 3;
// Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'. // Aislamos RA0 y RA1 como un número de 2 bits y se carga en la variable 'ENC'.
If (((aux==2)&&(enc==3)) || ((aux==1)&&(enc==0)))// Si en la comparación hay flanco de subida, { DELAY_MS(10); x++;
// entonces incrementar una unidad el valor de X.
} If (((aux==3)&&(enc==2)) || ((aux==0)&&(enc==1))) { DELAY_MS(10); x--;
// entonces decrementar una unidad el valor de X.
} portC = x; }
}
7
// El valor de X sale por el puerto B, los 8 LED de salida.