Ratón con piezas Arcade

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:

Placa Leonardo
Trackball
Joystick
Pulsadores

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);

}
Scroll al inicio