RATÓN PS2 Funciona con el protocolo I2C. • Frecuencia 100 muestras/segundo. • Resolución de 4 pasos por mm. • Sin escalado. Nota.- Se puede cambiar por envió de comandos al ratón El ratón nos informa de: 1) Desplazamiento X codificado con 9 bits en complemento 2. Rango [-256, 255]. 2) Desplazamiento Y codificado con 9 bits en complemento 2. Rango [-256, 255]. 3) Estado de los botones (pulsado o no). Esta información la envía en 3 bytes: MSB LSB Bit 7 6 5 4 3 2 1 0 Byte 1 YV XV YS YS 1 B. Medio B. Der B. Izq Byte 2 X7 X6 X5 X4 X3 X2 X1 X0 Byte 3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y7 YV Desbordamiento de datos en Y XV Desbordamiento de datos en X YS Signo de Y XS Signo de X X7 - X0 Movimiento eje X en complemento a 2. Y7 -YX0 Movimiento eje X en complemento a 2. B. Medio, B. Derecho y B. Izquierdo = 1 Indica que está pulsado Ejemplo Byte 1 = 0011 1100 Desplazamiento abajo e izquierda. Botón Medio pulsado. Cada paquete (trama) está formado por 11 bits 1 inicio + 8 bits datos + 1 paridad + 1 parada. DOS MODOS DE TRABAJO DEL RATÓN • Stream envía los datos a intervalos regulares. • Remoto envía los datos cuando recibe la orden del controlador. COMANDOS que envía el controlador para manejar el ratón. 0xFF 0xF6 0xF5 0xF3 0xF2 0xF0 0xEA 0xEB 0xE9 Reset Valores por defecto Desactivar envío de información (stream) Establecer un nuevo periodo de muestreo. Solicitar el ID al dispositivo (su dirección interna). El ratón estándar dará 0 Entrar en modo remoto Entrar en modo stream Pide el paquete de datos en modo remoto Pide el paquete de estrado del ratón ACK del ratón 0xFA El ratón responde con este comando cuando recibe y acepta un comando. INICIALIZACIÓN DE UN RATÓN Write (escribir) Read (leer) Read (leer) Read (leer) Write (escribir) Read (leer) delayMicroseconds Reset ACK Modo Remoto ACK 100 microsegundos Escribir 0xFF; El ratón reponde con 0xFA, 0xAA y 0x00 Leer 0xFA; ACK = Bit de reconocimiento Leer 0xAA Leer 0x00 // dirección del dispositivo Escribir 0xF0; Leer 0xFA; ACK Retardamos unos 100 microsegundos. Después de inicializar, pedimos los datos al ratón: PEDIR DATOS Write (escribir) Read (leer) Read (leer) Pide datos de movimiento y botones pulsados ACK Byte 1 (desbordamiento, signo, botón pulsados) Read (leer) Read (leer) Byte 2 (desplazamiento eje X) Byte 3 (desplazamiento eje Y) Escribir 0xBE Leer 0xFA Leer 0x08 // Ej. Ratón parado. Sin botones pulsados Leer 0x00 // No hay desplazamiento X Leer 0x00 // No hay desplazamiento Y Bytes a leer según el comando que se envié: 0xFF 0xF6 0xF2 0xF0 0xEA 0xEB 0xE9 COMANDO (escribir) Reset Valores por defecto Solicitar ID Modo Remoto Modo Stream Pedir datos Pedir paquete de estado 0xFA 0xFA 0xFA 0xFA 0xFA 0xFA 0xFA RESPUESTA (leer) 0xAA 0x00 0x00 0xZZ 0x40 0xXX 0x02 0xYY 0x64 Comunicación esclavo al maestro Comunicación maestro a esclavo Comunicación maestro a esclavo detallada (a) Es el tiempo que tarda el dispositivo en comenzar a generar pulsos de reloj. Menor de 15 ms (b) Es el tiempo que tarda en enviar el paquete. Menor de 2 ms. Si alguno de estos tiempos no se cumple el maestro genera un error. La frecuencia de reloj está entre los 10KHz y 16,7KHz (entre 30 y 50 µs). En mi programación en el Arduino medí una transmisión de 12 ciclos de reloj en 1000 µs 83 µs/ciclo 12 KHz. Los 12 ciclos son: 1 inicio, 8 dato, 1 paridad, 1 parada y 1 espera ACK. Medí la transmisión de 8bits en 664 µs 664/8 = 83 µs/ciclo Por lo que deduzco ambas líneas están en alto, como hemos pedido los datos al PS2 esté está disponible para contestar, por lo que envía el bit de inicio a ‘0’ y al poco el reloj comienza a funcionar: bajo-alto-bajo-alto… El dato lo leo en el flanco de bajada, pero el dato que recibo va conmutando en el flanco de subida.