Ps1 controller e arduino!

Ciao a tutti!

Sto facendo degli esperimenti con un vecchio controller della ps1 (o psx che dir si voglia) ed arduino, ma ho qualche problema:

Intanto tra i +5V che alimentano il controller e il gnd dell'arduino ci sono 7V di differenza, insomma il gnd dell'arduino è a -2V rispetto al gnd dell'alimentazione, il problema è che ho sempre 2-3V di tensione costante sui piedini che dal controller, portano i dati all'arduino, così quando leggo i valori dall'arduino, legge sempre 11111111....

Ho usato resistenze di pull down, e funzionano se l'arduino non è collegato al pc, ma quando lo collego non ci son santi, anche se collego il gnd dell'arduino al gnd dell'alimentazione non risolvo nulla :frowning:

Come potrei riuscire a portare tutto a 0 e verificare se funziona il controller?

Grazie a tutti in anticipo!

schema elettrico

Come stai alimentando il controller?
Prelevi 5V da arduino oppure usi un alimentatore esterno?
Quani volt?
Hai unito le masse?
Dai che non ti si consumano i tasti della tastiera :sweat_smile:

Il controller della play lavora tra i 5 e i 3.3V ho trovato su internet :slight_smile:

Alimento il controller con un alimentatore esterno, tarato sui 3V (ha più Voltaggi disponibili) ma che ne eroga 5.3 circa.

L'arduino è alimentato dall'usb collegata al PC, ho provato a collegare assieme i GND ma il problema non si risolve :frowning:

Santo cielo, regoli l'alimentatore a 3V e te ne da 5 e rotti?
Usalo per schiacciarci le noci e prendine un'altro più decente, vedrai che in futuro avrai meno problemi...
La massa comunque va sempre messa in comune quando usi più alimentazioni, ricordatelo in futuro.
Hai un regolatore di tensione? Magari prova a stabilizzare un attimo la tensione e vedi se la cosa cambia.

Una domanda solo per curiosità: sei sicuro che il controller è funzionante?

del controller me lo son chiesto pure io :grin: :grin:
Domani attacco la play e verifico se funziona :slight_smile:

Illo alimentatore non è un problema, adesso è regolato su 1.5 e ne da fuori 3.67 :D, comunque entro i limiti del controller.

Se scollego l'alimentatore dal controller, o scollego proprio completamente il controller, continua a leggere 111111.....smette solo se scollego anche il pin gnd dalla breadboard.

Ok ragazzi ho risolto!

Ho dato una sbirciatina al sorgente della libreria che usavo, in pratica utilizza una resistenza di pull-up interna all'arduino, che faceva casino con la mia di pull down, ho rimosso le mie resistenze e collegato tutto all'arduino direttamente e funziona :slight_smile:

Adesso sto cercando di scrivere qualcosina in python per gestire la pressione dei tasti al pc.

In C esiste qualcosa che simuli la pressione di un tasto della tastiera? oppure qualcosa che mi permetta di far vedere i comandi che arrivano dalll'arduino come comandi di una tastiera?

Potresti usare la seriale, elaborare con arduino i dati ricevuti dal controller e poi inviarli al pc, dove puoi implementare una piccola utility che legge dalla seriale i dati in arrivo da arduino (e quindi dal controller)

sto seguendo due vie parallele, una che utilizza un utility come dici tu, l'altra che sfrutta una libreria che fa vedere l'arduino al pc, come se fosse una tastiera, vi farò sapere come va :smiley:

ciao,
dimmi stai usando arduino 1.0? potresti inviarmi il tuo codice per favore? ho un problema con il library psx. sto cercando di collegare il mio controller ps1 con l'arduino, ma gia il codice non va bene è pieno di errori. penso che c'è un problema con la versione di arduino... ma non lo so - sto iniziando di lavorare con arduino.

scusatemi per l'italiano imperfetto, spero che qualcuno riesce a capire le frase precendenti...:wink:

saluti a tutti da düsseldorf

Ma per collegare il pad all'Arduino ti sei fatto un connettorino apposta o hai tirato i fili dal pad sui pin dell Arduino?

fortunahenne:
ciao,
dimmi stai usando arduino 1.0? potresti inviarmi il tuo codice per favore? ho un problema con il library psx. sto cercando di collegare il mio controller ps1 con l'arduino, ma gia il codice non va bene è pieno di errori. penso che c'è un problema con la versione di arduino... ma non lo so - sto iniziando di lavorare con arduino.

scusatemi per l'italiano imperfetto, spero che qualcuno riesce a capire le frase precendenti...:wink:

saluti a tutti da düsseldorf

Ciao, il tuo Italiano va bene, sei stato chiaro; se hai difficoltà puoi scrivere anche in tedesco, il nostro moderatore Uwe Federer lo parla perfettamente, ti farà lui da interprete. Ora aspettiamo Tobo e vediamo se riesce a mandarti il suo codice. :slight_smile:

Ragazzi scusate il ritardo, sono in fase di esame all'università e sto studiando molto. :~

Comunque, alla fine ho optato per usare un programma (scritto in python, mi andava bene perchè su ubuntu è presente di default, se ne può scrivere anche una versione in java comunque) che simula la pressione di un tasto della tastiera quando riceve via seriale un particolare comando dall'arduino.

Il programma funziona così: quando viene premuto un tasto, arduino invia un codice (un numero) via seriale, ed invia lo stesso numero quando viene rilasciato il tasto.
L'ho usato come esercizio sugli array quindi non uccidetemi se ce ne sono 3 di inutili :grin:

#include <Psx.h>                                          // Includes the Psx Library 
#undef round                                              //remove Whprogram.h problem

#define dataPin 12                  
#define cmndPin 11
#define attPin 10
#define clockPin 13


Psx Psx;                                                  // Initializes the library

unsigned int data = 0;                                    // data stores the controller response
unsigned int ControllerButtons[] = {psxLeft, psxDown, psxRight, psxUp, psxStrt, psxSlct, psxSqu, psxX, psxO, psxTri, psxR1, psxR2, psxL1, psxL2};
unsigned int flags[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int buttons[14][2];
int index;


void setup()
{
  Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 10);  // Defines what each pin is used
                                                          // (Data Pin #, Cmnd Pin #, Att Pin #, Clk Pin #, Delay)
  Serial.begin(57600);                                    // Delay measures how long the clock remains at each state,
                                                          // measured in microseconds.
  for (int i = 0; i < 14; i++)
  {
     buttons[i][0] = ControllerButtons[i];
     buttons[i][1] = flags[i];
  }                                         
  
}
void loop()
{
  data = Psx.read();                                      // Psx.read() initiates the PSX controller and returns
                                                           // the button data
  for (index = 0; index < 14; index++)
  {
    if ((buttons[index][1] == 0) && (data & buttons[index][0]))
    {
      Serial.println(buttons[index][0]);
      buttons[index][1] = 1;
      continue;
    }
    
    if ((buttons[index][1] == 1) && !(data & buttons[index][0]))
    {
      Serial.println(buttons[index][0]);
      buttons[index][1] = 0;
      continue;
    }
  }
  
}

il codice python funziona così:

quando riceve un numero, se non è mai stato inviato, simula la pressione di un tasto, se è già premuto, rilascia il tasto:

import serial
import pyatspi
def pressKey(keycode):
   """Takes an integer keycode. You can find these with xev."""
   pyatspi.Registry.generateKeyboardEvent(keycode, None,pyatspi.KEY_PRESS)
   
def releaseKey(keycode):
   pyatspi.Registry.generateKeyboardEvent(keycode, None,pyatspi.KEY_RELEASE)