Arduino joypad mouse

Molti giochi di ruolo per computer come Dungeon&Dragons Online (ddo), non funzionano con i joypad.

Vediamo allora come costruire un piccolo joypad universale che vada bene per tutti i giochi per computer.

Il cuore di tutto è un Arduino Micro, o Pro Micro (meno di 3 Euro su Aliexpress), va bene anche un Leonardo, altre versioni non funzionano.

Ci servono dei pulsanti da fissare su una millefori, un po’ di cavi sottili, si può trovare tutto su Aliexpress o eBay digitando 30awg wire, micro switch, pcb breadboard, ci servirà anche un piccolo contenitore di plastica.

  

Bisogna saldare i pulsanti sulla millefori, e i cavetti come da schema, non serve saldare altro in quanto useremo le resistenze interne di pullup.

 

Bisogna forare il contenitore con pazienza per permettere alla usb di entrare, non usate colla a caldo dentro lo spinotto o se vi capita toglietela con uno spillo, isolate le saldature con del nastro adesivo.

Lasciate un foro laterate per la ventilazione, una volta entrare l’aria salirà e uscirà dai fori della basetta millefori, ci servirà anche un comune cavo usb micro.

Io ne ho messi 5 ma potete mettere quanti pulsanti volete, fino ad usare tutte le uscite del microcontrollore.

Arduino Micro può essere riconosciuto come tastiera usb o mouse, e quindi possiamo programmarlo per prendere il controllo del computer e fargli eseguire alcune operazioni ripetitive o noiose, come digitare ripetutamente dei tasti o bot pesca più compatti, oppure emulare la pressione di tasti di direzione e skill per videogiochi, scrittore automatico di testi, guanti joypad, robot e quant’ altro vi venga in mente.

L’alimentazione arriva dalla usb e il consumo è di circa 30mA, la programmazione avviene come un normale Arduino Uno, ricordatevi però di scegliere la scheda Arduino Micro e controllare che la porta COM sia selezionata.

Ecco il codice:

void setup()
{
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(5,INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{ 
 Keyboard.begin(); 
 if (digitalRead(2)==0) 
 {
 Keyboard.press('w'); 
 }
 else if(digitalRead(3)==0)
 {
 Keyboard.press('a');
 }
 else if (digitalRead(4)==0) 
 {
 Keyboard.press(' ');
 Keyboard.press('w');
 }
 else if(digitalRead(5)==0)
 {
 Keyboard.press('d');
 } 
 else if (digitalRead(6)==0) 
 {
 Keyboard.press('s');
 }
 delay(100);
 Keyboard.releaseAll(); 
}

In pinmode oltre al tipo di ingresso, si dichiarano anche le resistenze interne di pullup, in pratica sono delle resistenze interne già collegate con un capo a +5V, l’altro capo è collegato ai pin D2 D3 D4 ecc… quindi a noi basterà chiudere il contatto a massa per dare un segnale al pin.

Con Keyboard.begin() diciamo quando l’emulazione di tastiera comincia a funzionare, per terminarla o magari per riprendere il controllo del computer bisogna usare Keyboard.end(), in questo caso a noi non serve perchè vogliamo che Arduino emuli per tutto il tempo in cui rimarrà collegato alla presa usb del computer.

Per ora vogliamo che emuli i tasti direzione e salto, l’altra mano userà il mouse per ora, In genere i controlli di direzione nei giochi sono wasd o frecce e il salto barra spazio.

Vediamo l’esempio del primo tasto, se il pulsante al pin D2 è premuto, quindi se questo ingresso è uguale a 0 (LOW), allora Arduino dovrà premere w.

E’ importante distinguere se premere w come carattere o premere w e mantenerlo premuto, nel primo caso ci sarà un comando off-w-off e si userà più per scrivere testi, nel secondo caso il pulsante sarà premuto e mantenuto premuto cioè w-w-w e si userà più per giochi.

Il primo caso si usa per una emulazione per scrittura e si usa Keyboard.print(‘w’) per digitare una lettera w, a noi invece interessa il secondo caso ovvero la pressione continua per un gioco, quindi useremo Keyboard.press(‘w’) e il tasto da quel momento rimarrà premuto.

Poi Arduino controllerà tutte le if e premerà tutti i pulsanti richiesti, una volta finito attenderà 100 millisecondi con delay(100) e dopodichè rilascerà tutti i tasti con Keyboard.releaseAll(), se non ci fosse questo comando i tasti rimarrebbero premuti per sempre, i delay sono degli antirimbalzo e variano un po’ di gioco in gioco, eventulmente fate delle prove tra 250 e 50.

Quindi finchè noi premiamo il primo pulsante, Arduino premerà la lettera w quando rilasceremo anche Arduino rilascerà.

Ricordiamo che Arduino può eseguire un solo ciclo, quindi se dovete simulare più tasti premuti contemporaneamente, potete premerli uno dopo l’altro dentro le if, oppure potete mettere altri pulsanti dedicati.

Sul sito Arduino.cc in reference trovate esempi e guide, come anche esempi di sketch nell’ide di Arduino.

Se volete scrivere dei testi invece dovrete usare Keyboard.print(“Scrivi qua il tuo testo”).

Vediamo invece come controllare il mouse del computer sempre con Arduino pro micro.

Intanto ci servirà qualche pulsante in più.

Con questo codice si potrà muovere il mouse con dei pulsanti:

int tempo=4;
int x=0;
int y=0;
void setup()
{
 pinMode(2,INPUT_PULLUP);
 pinMode(3,INPUT_PULLUP);
 pinMode(4,INPUT_PULLUP);
 pinMode(5,INPUT_PULLUP);
 pinMode(6,INPUT_PULLUP);
 pinMode(10,INPUT_PULLUP);
 Mouse.begin();
}

void loop()
{
 if(digitalRead(2)==0) 
 { 
 y--; 
 }
 if(digitalRead(3)==0)
 { 
 x--;
 }
 if (digitalRead(4)==0) 
 {
 Mouse.click(MOUSE_LEFT);
 delay(200);
 }
 if(digitalRead(5)==0)
 { 
 x++;
 } 
 if(digitalRead(6)==0)
 { 
 y++;
 }
 if (digitalRead(10)==0) 
 {
 Mouse.click(MOUSE_RIGHT);
 delay(200);
 }

Mouse.move(x,y);
delay(tempo); 
x=0;
y=0;
}

Il comando Mouse.move(x,y,z) permette di muovere il mouse, x è lo spostamento orizzontale, y quello verticale, z è lo scroll e se è 0 si può omettere, x e y sono le coordinate rispetto a 0, lo 0 è la posizione corrente della freccia, x e y possono assumere valori positivi o negativi quindi +1, +40, -20 -1 ecc…

Con questo codice ogni volta che verrà premuto un pulsante verrà incrementata o decrementata la variabile x oppure y, e mossa la freccia di una sola unità, questo porterà il mouse a spostarsi di pochissimo, dopodichè verranno azzerate entrambe le variabili ad ogni ciclo interrompendo lo spostamento e il ciclo si ripeterà, questo produrrà un movimento costante e continuo del cursore fintanto che il pulsante rimarrà premuto.

Il delay è semplicemente un ritardo ed imposta la velocità della freccia, valori molto bassi avranno una velocità maggiore ma minore precisione e viceversa.

Il comando Mouse.begin() permette ad Arduino di prendere il controllo del mouse, Mouse.end() lo interrompe.

Il comando Mouse.click() o Mouse.press() permettono di premere i pulsanti del mouse, il primo comando è un solo click, il secondo permette di premere e mantenere premuto il tasto, per rilasciarlo c’è Mouse.release().

Mouse.click(MOUSE_LEFT) premerà il tasto sinistro del mouse, Mouse.click(MOUSE_RIGHT) quello destro, eventualmente c’è anche Mouse.click(MOUSE_MIDDLE) per il centrale.

Se invece volete far compiere al cursore dei movimenti automatici ripetitivi, quindi un bot, potete usare questo codice:

int x=0;
int y=0;
int velox=4;
int pausa=3000;
void setup()
{
 Mouse.begin();
}

void loop()
{
 sposta_lentamente_x(0,100);
 delay(pausa);
 sposta_lentamente_x(100,0);
 delay(pausa);
 sposta_lentamente_y(0,100);
 delay(pausa);
 sposta_lentamente_y(100,0);
 delay(pausa);
 sposta_lentamente_x(0,-100);
 delay(pausa);
 sposta_lentamente_x(-100,0);
 delay(pausa);
}
void sposta_lentamente_x(int xi, int xf)
 {
  while(xi!=xf)
  { 
  if(xi<xf)
  {
   xf--;
   x=1;
  }
  else 
  {
   xf++;
   x=-1;
  }
  Mouse.move(x,0);
  delay(velox);
  }
 }
void sposta_lentamente_y(int yi, int yf)
 {
  while(yi!=yf)
 { 
  if(yi<yf)
  {
   yf--;
   y=1;
  }
  else 
  {
   yf++;
   y=-1;
  }
  Mouse.move(0,y);
  delay(velox);
  }
 }

Questo codice usa la funzione sposta_lentamente_x per far muovere lentamente il cursore del mouse, esattamente come se ci fosse qualcuno ad usare un mouse.

La funzione usa una posizione iniziale xi e una finale xf per le x, anche per le y c’è una funzione simile, se il valore iniziale xi e finale xf sono diversi, mandano a 1 o -1 il valore di x, facendo muovere il mouse, diversamente il valore sarà 0 e il mouse non si muoverà, se il valore di xi è inferiore di xf si muoverà in modo positivo, viceversa negativo..

Quando il cursore si muoverà di una posizione, la variabile xf verrà decrementata di una unità, contando quanti movimenti avrà fatto il cursore, quando i due valori xi e xf saranno identici, il programma non eseguirà più la funzione.

Arduino ripeterà all’infinito questo ciclo di istruzioni, ricordate che Arduino prende come riferimento il cursore alla attuale posizione quindi calibratelo a mano prima di usarlo e assicuratevi che funzioni, almeno le prime volte.

Per cambiare la velocità del cursore basterà cambiare i valori di velox, se invece volete movimenti istantanei da un punto ad un altro, quindi molto più rapidi, potete semplicemente scrivere una serie di Mouse.move(x,y) dove andrete a scrivere le coordinate, per ogni punto desiderato.

Potete usarlo come scherzo di fantasmi o per eseguire un lavoro ripetitivo, o con un gioco, insomma come preferite, un saluto e alla prossima.

Precedente Bici solare 2 Successivo Interruttore luce radiocomandato