Ratón PS/2 controlado por dsPIC

Proyecto realizado con un 30F6014 y C30
Se interpretan los movimientos del ratón y las pulsaciones de los botones
Con buffer de entrada que permite realizar otras tareas mientras tanto.
En este proyecto leemos la información que nos envía un ratón PS/2 y la interpretamos para saber cuál es el movimiento y/o las pulsaciones que el usuario hace sobre el mismo.

Se ha usado C30 y un dsPIC para hacerlo, pero no porque la tarea sea muy exigente, sino porque esto está extraído de un proyecto mayor (el famoso osciloscopio). De hecho, un simple 16F84 tiene potencia suficiente para controlar un ratón.

He obviado en la explicación todo lo referente a la visualización o proceso de la información capturada, aunque en mi caso he usado una interfaz gráfica para representar un cursor que interacciona con distintos botones, al estilo Windows.

CONEXIONES

El ratón tiene un conector tipo PS/2 con cuatro cables, conectados como sigue:

1- Data
2- No conectado
3- Masa
4- Alimentación +5V
5- Clock
6- No conectado

La alimentación es a 5V, por lo que podréis usar la misma del dsPIC.

En el proyecto he conectado las patillas Data y Clock a los pines RF2 y RB8 respectivamente.

PREPARATIVOS

Antes de meternos en fanea, hay que hacer una tarea previa, y se trata de comprobar la velocidad de oscilación de la señal Clock del ratón. Esto es así, porque como veremos luego, le vamos a dejar todo el trabajo a la UART del micro y a su interrupción de recepción de datos. Para que todo funcione como la seda, dicha UART debe estar sincronizada a la misma velocidad que el ratón transmita.

Para ver a qué velocidad oscila el ratón hay que alimentarlo y poner su pin de Data a masa. En ese momento el pin Clock comenzará a oscilar y tendremos que medir su frecuencia (yo usé un frecuencímetro, pero podéis usar el mismo dsPIC contando pulsos por el timer, por ejemplo).

EXPLICACIÓN DEL PROGRAMA

Definiciones, estructuras y variables

Aquí definimos las entradas y la frecuencia de oscilación del ratón que mencionábamos en el apartado anterior. Se diseñan también dos estructuras. La primera de ellas nos permitirá manejar con soltura toda la información que el ratón nos va enviando y la segunda soportará los objetos interactivos que están situados en el interfaz gráfico.

Las variables globales que se usan en el programa son las siguientes:

Inicialización

Para comenzar a trabajar hay que inicializar tanto el ratón como la UART. En la función de inicialización que pego a continuación están añadidas líneas que inicializan el Vídeo y dibujan la interfaz, y que no voy a explicar por no ser objeto de este artículo. Sólo indicar que reservan áreas de la pantalla como interactivas, de manera que al pulsar el botón del ratón sobre alguna de estas áreas, se devuelve el código de área pulsada, ya sea un botón o una zona sensible.

Inicialización del ratón

Para que el ratón comience a funcionar, no basta con conectarlo; hay que enviarle unos comandos de inicialización, que dependerán del uso que se pretenda de él. Hay comandos que ajustan la velocidad del movimiento, la resolución, y demás parámetros. Mi objetivo no es explicar todo esto, así que dejo este link por si alguien quiere ampliar información:

http://www.computer-engineering.org/ps2mouse/

La rutina de inicialización del ratón es la siguiente:

Lo primero que hacemos es asegurarnos que hay un ratón conectado, lo que podemos detectar si, estando como entradas los pines Data y Clock, leemos un 1 en ambos.

Posteriormente se envían al ratón todos los comandos de inicialización.

Para enviar información al ratón, hay que «jugar» con las señales Data y Clock de una determinada manera. La rutina que pongo a continuación envía un Byte y está autoexplicada.

Las funciones de espera de estado tanto de la señal Clock como de la señal Data son las siguientes:

Inicialización de la UART

Como mencionaba al principio, la UART nos hará todo el trabajo de recepción de datos del ratón, para lo cual hay que inicializarla de manera que reciba los datos a la velocidad del Clock del ratón.

La fórmula para calcular el baudvalue está sacada del datasheet de los dsPIC.

Se habrá observado en la rutina que activamos la interrupción de recepción. Esta es la rutina de interrupción:

Esta rutina va almacenando en un array cada byte que recibe de la UART e incrementa en uno el contador de datos recibidos.

Rutina principal

El programa principal está en un bucle infinito mirando si ha entrado algo en el array DatosRecibidos y actuando en consecuencia. Ni que decir tiene que esta estructura permite meter en el bucle cualquier otro proceso que sea capaz de acometer el dsPIC.

Además, como la variable DatosRecibidos la hemos dimensionado sobradamente con 90 posiciones, y teniendo en cuenta que cada movimiento/click del ratón supone el envío de 3 bytes, tendremos un buffer de 30 movimientos del ratón para que el dsPIC se ocupe de otras tareas y luego vuelva, ya que la interrupción estará haciendo su trabajo en segundo plano.

En nuestro caso, la función ProcesaMovimientoRaton() es la encargada de «desgranar» el contenido de los 3 bytes que el ratón nos envía cada vez y de actuar en consecuencia.

Proceso del movimiento y los clicks del ratón

Nuestra función es un bucle que va obteniendo triadas de bytes del array que hemos capturado. Cada triada está compuesta por:

Byte 1: cada bit tiene un significado, y se explican en la estructura de datos que definimos al principio
Byte 2: desplazamiento del movimiento horizontal
Byte 3: desplazamiento del movimiento vertical

El siguiente bloque del programa mueve las coordenadas del puntero en horizontal y vertical si hubiese algún movimiento. Esto se hace cambiando los valores de las variables Raton_CoorX y Raton_CoorY

Luego miramos si estas coordenadas del ratón están situadas sobre un botón o zona sensible, en cuyo caso cambiaremos de cursor (en lugar de flecha pondremos una manita) para indicar al usuario que puede hacer click cuando quiera.

De hecho, luego se comprueba si el usuario ha pulsado alguno de los dos botones y se genera el código de evento que corresponda en cada caso en la variable HayEvento.

DESCARGA

En la sección de Descargas tienes el programa completo, aunque no compilará directamente porque le falta toda la parte de vídeo. No obstante, tienes en modo texto todo lo que he explicado antes, para ahorrarte teclearlo.

Podéis ver una prueba de funcionamiento en un vídeo que tomé de mi osciloscopio dsPIC:

Share