Controllare joypad wireless della PS2

Sono riuscito a controllare un joypad wireless della ps2.
Ho utilizzato questa libreria http://pspunch.com/pd/files/library/GPSX.zip

Questo è il programma

#include <GPSXClass.h>
#undef round
int asd =0;
void setup()
{
  Serial.begin(9600);
  PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_LOCK);
  
  PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);
  
  // Poll current state once.
  PSX.updateState(PSX_PAD1);
}

void loop()
{
  PSX.updateState(PSX_PAD1);
  int data1 = ANALOG_RIGHT_X(PSX_PAD1);
  int data2 = ANALOG_RIGHT_Y(PSX_PAD1);
  int data3 = ANALOG_LEFT_X(PSX_PAD1);
  int data4 = ANALOG_LEFT_Y(PSX_PAD1);

  
  if (IS_DOWN_CIRCLE(PSX_PAD1)) {
    PSX.motor(PSX_PAD1, MOTOR1_ON, ANALOG_RIGHT_X(PSX_PAD1));
   
  }
    
 if (PRESSED_CIRCLE(PSX_PAD1)) {
    Serial.println("Pressed circle");
  }

  if (RELEASED_CIRCLE(PSX_PAD1)) {
    Serial.println("Released circle");
    PSX.motor(PSX_PAD1, MOTOR1_OFF, 0);
  }    

  if (PRESSED_SQUARE(PSX_PAD1)) {
    Serial.println("Pressed square");
    PSX.mode(PSX_PAD1, MODE_DIGITAL, MODE_UNLOCK);
  }

  if (RELEASED_SQUARE(PSX_PAD1)) {
    Serial.println("Released square");
  }

  if (PRESSED_CROSS(PSX_PAD1)) {
    Serial.println("Pressed cross");
    PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_UNLOCK);
    PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);
  }

  if (RELEASED_CROSS(PSX_PAD1)) {
    Serial.println("Released cross");
  }

  if (IS_DOWN_TRIANGLE(PSX_PAD1)) {
    PSX.motor(PSX_PAD1,MOTOR1_ON ,ANALOG_LEFT_X(PSX_PAD1));
  }
  
  if (PRESSED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Pressed triangle");
  }

  if (RELEASED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Released triangle");
    PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00);
  }
  
  if (PRESSED_UP(PSX_PAD1)) {
    Serial.println("Pressed Up");
  }
  if (RELEASED_UP(PSX_PAD1)) {
    Serial.println("Released Up");
  }
  
  if (PRESSED_DOWN(PSX_PAD1)) {
    Serial.println("Pressed Down");
  }
  if (RELEASED_DOWN(PSX_PAD1)) {
    Serial.println("Released Down");
  }
  if (PRESSED_LEFT(PSX_PAD1)) {
    Serial.println("Pressed Left");
  }
  if (RELEASED_LEFT(PSX_PAD1)) {
    Serial.println("Released Left");
  }
  if (PRESSED_RIGHT(PSX_PAD1)) {
    Serial.println("Pressed Right");
  }
   if (RELEASED_RIGHT(PSX_PAD1)) {
    Serial.println("Released Right");
  }
  if (PRESSED_CROSS(PSX_PAD1)) {
    Serial.println("Pressed cross");
    PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_UNLOCK);
    PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE);
  }

  if (RELEASED_CROSS(PSX_PAD1)) {
    Serial.println("Released cross");
  }

  if (IS_DOWN_TRIANGLE(PSX_PAD1)) {
    PSX.motor(PSX_PAD1, MOTOR1_ON, ANALOG_LEFT_X(PSX_PAD1));
  }

  if (PRESSED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Pressed triangle");
  }

  if (RELEASED_TRIANGLE(PSX_PAD1)) {
    Serial.println("Released triangle");
    PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00);
  }
 if (PRESSED_R2(PSX_PAD1)) Serial.println("Pressed R2");
  
 if (RELEASED_R2(PSX_PAD1)) Serial.println("Released R2");
 
 if (PRESSED_R1(PSX_PAD1)) Serial.println("Pressed R1");
 
 if (RELEASED_R1(PSX_PAD1)) Serial.println("Released R1");
 
 if (PRESSED_L2(PSX_PAD1)) Serial.println("Pressed L2");
 
 if (RELEASED_L2(PSX_PAD1)) Serial.println("Released L2");
 
 if (PRESSED_L1(PSX_PAD1)) Serial.println("Pressed L1");
 
 if (RELEASED_L1(PSX_PAD1)) Serial.println("Released L1");
 
 if (PRESSED_SELECT(PSX_PAD1)) Serial.println("Pressed Select");
 
 if (RELEASED_SELECT(PSX_PAD1)) Serial.println("Released Select");
 
  if(PRESSED_STICK_RIGHT(PSX_PAD1)){
   Serial.println("analog right x= ");
   Serial.println(data1);
   Serial.println("analog right y= ");
   Serial.println(data2);
    } 
 
 if(RELEASED_STICK_RIGHT(PSX_PAD1)) Serial.println("Released Right Stick");

 if(PRESSED_STICK_LEFT(PSX_PAD1)){
   Serial.println("analog left x= ");
   Serial.println(data3);
   Serial.println("analog left y= ");
   Serial.println(data4);
    } 
 
 if(RELEASED_STICK_LEFT(PSX_PAD1)) Serial.println("Released Left Stick");
 
 if(PRESSED_START(PSX_PAD1)){
 Serial.println("analog right x= ");
 Serial.println(data1);
 Serial.println("analog right y= ");
 Serial.println(data2);
 Serial.println("analog left x= ");
 Serial.println(data3);
 Serial.println("analog left y= ");
 Serial.println(data4);
 }
 if(RELEASED_START(PSX_PAD1)) Serial.println("Released Start");
}

ecco un video in cui tento di spiegare come funziona... spero che capiate tutto e che vi sia utile... è un po' tirato via a causa del fatto che non so editare video su linux :smiley:

Great :slight_smile:
Dove l'hai recuperata la scatolina trasparente del regolatore a 9V?
Io quando provo a bucarle spacco sempre tutto :stuck_out_tongue:

i sample della maxim li mandano in quelle scatoline :smiley: ho usato una punta da trapano per il legno e un cacciavite!

ah dimenticavo che la vibrazione si può usare per un feedback che viene dalla sensoristica...

a me li han mandati dentro i soliti tubi trasparenti. Cosa ti hanno mandato dalla Maxim per avere quelle scatole? la voglio anche io!!! :smiley: :D: D

grande.

moooolto figo. Ha intenzione di postarlo sul tuo blog insieme al codice?
Oppure sul PlayGround?

La tua parlata toscana mi fa impazzire!
Un bel lavoro!

++

ok ora scrivo i tutorial che avevo promesso :smiley: un plugin per gedit per l'indentazione del playground sarebbe dimolto utile...

http://www.arduino.cc/playground/Italiano/ArduinoPsx

Creato... spero che vada bene :smiley:

un plugin per gedit per l'indentazione del playground sarebbe dimolto utile...

indendi una cosa di questo tipo?

Calamaro, dai un'occhiata qui: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267975899

implementazione del controller PS2 wireless alla lettera! :smiley:

ottima cosa, era quello che volevo fare, ma purtroppo il mio cinesino mega mi ha salutato... quindi ora sarà il caso di prenderne uno originale e trattarlo con rispetto :smiley:

Uhm, non puoi saldarci sopra un altro ATmega? non dovrebbe essere complicato, se è lui il problema :wink:

no no mi sa che è l'integrato della usb... se metto la mega il pc non vede nulla sulla porta tty/usb0 se metto il diecimila me lo vede... poi non so... ora provo a fare uno scambio tra FTDI e se non va peace and love... ne prendo un'altra!

Ciao a tutti. Ho realizzato il circuito qui proposto. Innanzi tutto volevo farvi i miei complimenti per le spiegazioni dettagliatissime e complete!! Ho però avuto dei problemini :'(... Tutto funziona e mi riconosce il controller wireless, purtoppo però nessun tasto corrisponde alla descrizione. Secondo voi è un problema dovuto alla differenza di marca del controller?
Non vorrei riconfigurare tutti i tasti :'(... Grazie mille e buon Arduino a tutti...

con l'ultima manopola wireless che ho comprato mi da codesto problema anche a me... per 10 euro su ebay non potevo pretendere più di tanto. Con l'altra dell' extreme non ho mai avuto problemi, finchè non l'ho rotta :smiley:

Dici che mi conviene riconfigurare tutti i tasti? E' fattibile anche se veramente sbatti. Che marca hai preso? Io ne avevo uno GAMESTOP in casa e ho usato quello.

quello nuovo non ha marca :smiley: il problema grosso è non switcha da analogico a digitale, o meglio non ho avuto voglia di riscrivere tutto il codice da 0... quello dell'extreme lo presi a mediaworld quando comprai la ps2, ci sta che nel frattempo con l'uscita della ps3 sia cambiato qualcosa nel protocollo boh :frowning: