En este nuevo proyecto he creado en Trackball Arcade para el PC con componentes y pulsadores Arcade.
Por un lado un Trackball PS2 que controla tres pulsadores a trabes del protocolo I2C y yo le he añadido tres pulsadores más para terminar de completar las funciones que deseaba.
También podéis observar que hay un Joystick de Arduino a que a la hora de probar el proyecto me di cuenta que para acercarme a la opción deseada era un poco lento y me decidí conmutar el Joystick para desplazarme más rápidamente por la pantalla, aprovechando el pulsador del mismo Joystick.
La placa utilizada es una Leonardo, que la podemos substituir por otro como la Pro Micro, siempre y cuando lleve integrado el Chip 32U4 que es la que nos permite emular teclados y ratones .
Materiales:
Esquema:
Aplicación:
/* Autor: Josep Martínez Fecha: 6 de marzo de 2024 He seguido el tutorial de: https://www.youtube.com/watch?v=g277RcPrJ_8 */ #include <PS2Mouse.h> #include <Mouse.h> //Definimos los pines SDA y SCL del Arduino #define TRACKBALL_DATA 2 #define TRACKBALL_CLOCK 3 PS2Mouse trackball(TRACKBALL_CLOCK, TRACKBALL_DATA, STREAM); // Pulsadors extres #define pb1 5 // Pantalla final #define pb2 6 // Pantalla inicio #define pn1 4 // Rojo #define led 8 int contador = 0; // Joystick arduino int horzPin = A0; // Salida analógica del pin X del joystick horizontal int vertPin = A1; // Salida analógica del pin Y del joystick vertical int selPin = 7; // Seleccione el pin del botón del joystick // Definimos las variables del joystick int vertZero, horzZero; // Almacena el valor inicial de cada eje, normalmente alrededor de 512 int vertValue, horzValue; // Almacena la salida analógica actual de cada eje const int sensitivity = 200; // Valor de sensibilidad más alto = ratón más lento, debería ser <= unos 500 int mouseClickFlag = 0; //int invertMouse = 1; // Invierte el joystick en función de la orientación int invertMouse = -1; // Joystick no invertido basado en la orientación int val; int opcio = 0; unsigned long temps; // Almacena el tiempo transcurrido "Evitamos delay()" void setup() { Serial.begin(9600); Mouse.begin(); pinMode(pb1, INPUT_PULLUP); pinMode(pb2, INPUT_PULLUP); pinMode(pn1, INPUT_PULLUP); pinMode(led, OUTPUT); digitalWrite(led, HIGH); trackball.initialize(); // Joystick pinMode(horzPin, INPUT); // Establece los dos pinos analógicos como entradas pinMode(vertPin, INPUT); pinMode(selPin, INPUT); // Establece el botón de selección del pin como entrada delay(1000); // Retraso corto para dejar que las salidas se asienten vertZero = analogRead(vertPin); // Obtenemos los valores iniciales horzZero = analogRead(horzPin); // El joystick debe estar en posición neutra al leerlos } void loop() { if(millis() >= temps + 250){ temps = millis(); // Serial.println("Han pasado más de 250 segundos"); if(digitalRead(selPin) == 0){ digitalWrite(selPin, HIGH); if(opcio == 0){ opcio = 1; } else opcio = 0; Serial.println(opcio); } } if(opcio == 0) { bola(); } else { joystick(); } } void joystick(){ vertValue = analogRead(vertPin) - vertZero; // Leer desplazamiento vertical horzValue = analogRead(horzPin) - horzZero; // Leer desplazamiento horizontal if (vertValue != 0) Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0); // Mou el ratolí a l'eix y if (horzValue != 0) Mouse.move((invertMouse * (horzValue / sensitivity)), 0, 0); // Mueve el ratón al eje x if (digitalRead(pn1) == LOW){ Mouse.click(MOUSE_MIDDLE); Serial.println("Pulsador para Scroll"); } else Mouse.release(MOUSE_MIDDLE); if (digitalRead(pb1) == LOW){ // Pulsador azul arriba Mouse.press(MOUSE_RIGHT); Serial.println("Pulsador derecho"); } else Mouse.release(MOUSE_RIGHT); if (digitalRead(pb2) == LOW){ // Pulsador azul abajo Mouse.click(MOUSE_LEFT); Serial.println("Pulsador izquierdo"); } else Mouse.release(MOUSE_LEFT); } void bola(){ // Contol del Joystick vertValue = analogRead(vertPin) - vertZero; // Leer desplazamiento vertical horzValue = analogRead(horzPin) - horzZero; // Leer desplazamiento horizontal if (vertValue != 0) Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0); // Mueve el ratón al eje y if (horzValue != 0) Mouse.move((invertMouse * (horzValue / sensitivity)), 0, 0); // Mueve el ratón al eje x //Declaramos el array data que será donde se meterá la información que nos devuelva la trackball int16_t data[3]; //Definimos las variables que almacenarán los valores de si está pulsado o no un botón del reatón int Left_Click; int Right_Click; int Middle_Click; if (digitalRead(pn1) == LOW){ // Botón rojo Mouse.click(MOUSE_LEFT); Mouse.click(MOUSE_LEFT); Serial.println("Doblle Clic"); } if (digitalRead(pb1) == LOW){ // Inici pagina sin retardo Mouse.move(0, 0, 1); Serial.println("inici"); } if (digitalRead(pb2) == LOW){ // Inici pagina sin retardo Mouse.move(0, 0, -1); Serial.println("Final"); } // Recopilamos la información pasada por la trackball y la guardamos en el array declarado anteriormente trackball.report(data); // Convertimos a byte la primera cadena que envía de información byte N = data[0]; // Asignamos a cada variable del botón del ratón el valor del bit que le corresponde en la posición del byte y le hacemos un AND lógico Left_Click = ((N >> 0) & 1); Right_Click = ((N >> 2) & 1); Middle_Click = ((N >> 1) & 1); // Movemos el ratón con los datos de las dos cadenas siguientes que envía la trackball Mouse.move(-data[1],data[2]); // Comprobamos si se pulsan los botones del trackball y si es así se pulsan en el ratón if (Left_Click) { Mouse.press(MOUSE_LEFT); } else Mouse.release(MOUSE_LEFT); if (Right_Click) { Mouse.press(MOUSE_RIGHT); } else Mouse.release(MOUSE_RIGHT); if (Middle_Click) { Mouse.press(MOUSE_MIDDLE); } else Mouse.release(MOUSE_MIDDLE); }