Philips Videopac+ G7400 black screen
16 Maggio 2024PicoZX
25 Luglio 2024Con la riparazione di un joystick NES Advantage, vediamo come costruire un tester per questo sistema e come funziona.
Nel progetto ho utilizzato Arduino R4 WiFi, perché?
Beh, in realtà non ci serve la funzione di rete, ma è comodo perché ha un piccolo display a matrice di led che ci può far vedere lo stato dei pulsanti senza dover aggiungere led esterni o altri display.
Piccolo ripasso.
Come già detto in un video, il classico joystick tanto copiato dell’Atari, utilizza un pin per ogni direzione/pulsante, questo pin viene chiuso su un contatto comune che di solito è connesso a GND. Il vantaggio è avere tutti i pulsanti e direzioni subito disponibili per la lettura, di contro il gran numero di cavi.. Infatti sui classici joystick con DB9 avevamo solo un pulsante, questo dovuto anche al fatto che quando fu progettato, i giochi non erano così avanzati e un pulsante era più che sufficiente.
Il sistema più moderno del NES/SNES prevede invece un invio di tutti i pulsanti e direzioni in modalità seriale. Un ottimo sistema che prevede l’utilizzo di solo 5 fili (alimentazione compresa) ma con la possibilità di gestire molti più pulsanti. Di contro abbiamo che essendo una lettura seriale, sarà un po’ più lento ricevere tutti gli stati dei tasti (cosa trascurabile se le letture sono fatte rapidamente e di continuo).
Il protocollo
A differenza del classico joystick tanto copiato dell’Atari, che utilizza un pin per ogni direzione/pulsante che viene chiuso su un filo comune che di solito è connesso a GND, il joypad/joystick NES usa una comunicazione seriale.
Il vantaggio? beh avere tutti i pulsanti e direzioni su un filo separato, ci rende subito disponibile per la lettura un qualsiasi stato ma di contro c’è il gran numero di fili per gestirli tutti.
Il sistema più moderno del NES/SNES prevede invece un invio di tutti i pulsanti e direzioni in modalità seriale.
Un ottimo sistema che prevede l’utilizzo di solo 5 fili (alimentazione compresa) ma con la possibilità di gestire molti più pulsanti.
Di contro abbiamo che essendo una lettura seriale, sarà un po’ più lento ricevere tutti gli stati dei tasti (cosa trascurabile se le letture vengono fatte rapidamente e di continuo).
Di fianco il pinout della porta joystick del NES.
Come si vede abbiamo pochi fili collegati, i pin 6/7 non sono usati dai normali controller.
Per richiedere lo stato del joy, useremo il Clock e il Latch per ricevere i dati dal pin Data.
Ovviamente dobbiamo anche fornire l’alimentazione al joystick.
Ma quanti tasti ha un joypad NES?
4 tasti e le 4 direzioni, per un totale di 8 comandi da gestire.
Come si può intuire bastano giusti giusti per un DB9 se consideriamo il filo in comune dove richiudere il contatto.
Però se facessimo così non potremmo aggiungere un filo di alimentazione per poter gestire un auto-fire o dei led ed inoltre nel caso volessimo aggiungere un tasto non ci sarebbe più spazio!. Infatti il controller SNES ha ben 4 tasti in più!! ma gli stessi pin, anche se connettore diverso.
Ora vediamo come leggere questi tasti tramite 3 fili.
All’interno del joystick/pad troviamo uno shift-register che leggerà lo stato dei pulsanti e delle direzioni e li invierà sul pin data, uno alla volta, clock dopo clock.
Cominciamo la lettura, i pin Clock e Latch li gestiamo noi e li teniamo a livello basso, il pin Data viene settato dallo shift-register e li possiamo trovare lo stato del pulsante, livello alto con pulsante non premuto, livello basso compulsante premuto.
Primo step (start), diamo un impulso sul pin Latch, il controller memorizzerà lo stato dei pulsanti/direzioni e setterà la sua uscita data con lo stato del primo pulsante (il pulsante A).
Second step, leggiamo gli altri dati, diamo un impulso sul pin Clock e troveremo sul pin Data il successivo pulsante (pulsante B).
Avete capito? beh, penso proprio di si.. Continuando a dare ulteriori impulsi di clock si leggeranno in sequenza tutti gli altri stati.
La sequenza completa di lettura è la seguente:
A – B – START – SELECT – SU – GIU – SINISTRA – DESTRA
Una volta arrivati all’ultima direzione (7 clock) dobbiamo dare un impulso di Latch per far ripartire la sequenza.
Quindi: (Latch) -> tasto A -> Clock -> tasto B -> Clock -> tasto Start … fino a direzione destra e ricominciamo con il Latch.
Il TESTER
Ora che sappiamo bene come funziona, realizziamo lo sketch di Arduino.
Ho usato i pin 2 come Clock, 3 come Latch e 4 come Data e una piccola animazione all’avvio.
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
#define nData 4
#define nClock 2
#define nLatch 3
const uint32_t joy[] = {
0x10038e44,
0xc6e4403,
0x9b11b000,
66
};
const uint32_t r[] = {
0x3f02182c,
0xc2cc2182,
0xd82ac398,
66
};
void setup() {
pinMode(nData, INPUT_PULLUP);
pinMode(nClock, OUTPUT);
pinMode(nLatch, OUTPUT);
digitalWrite(nClock, LOW);
digitalWrite(nLatch, LOW);
matrix.begin();
matrix.loadFrame(joy);
delay(1000);
matrix.loadFrame(r);
delay(1000);
}
void loop() {
uint8_t frame[8][12] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
digitalWrite(nLatch, HIGH);
digitalWrite(nLatch, LOW);
if (digitalRead(nData) == LOW) {
frame[6][11] = 1;
frame[6][10] = 1;
frame[5][11] = 1;
frame[5][10] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[6][8] = 1;
frame[6][7] = 1;
frame[5][8] = 1;
frame[5][7] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[1][10] = 1;
frame[1][9] = 1;
frame[1][8] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[3][10] = 1;
frame[3][9] = 1;
frame[3][8] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[0][3] = 1;
frame[1][2] = 1;
frame[1][3] = 1;
frame[1][4] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[6][3] = 1;
frame[5][2] = 1;
frame[5][3] = 1;
frame[5][4] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[3][0] = 1;
frame[4][1] = 1;
frame[3][1] = 1;
frame[2][1] = 1;
}
digitalWrite(nClock, HIGH);
digitalWrite(nClock, LOW);
if (digitalRead(nData) == LOW) {
frame[3][6] = 1;
frame[4][5] = 1;
frame[3][5] = 1;
frame[2][5] = 1;
}
matrix.renderBitmap(frame, 8, 12);
delay(10);
}
Potete copiare il codice e incollarlo su uno sketch di Arduino e caricarlo sulla versione R4 WiFi, se volte adattarlo senza usare il display, per altre versioni di Arduino (tipo il Nano, Micro etc.) potete modificare il codice togliendo la parte del display Matrix.
Per gli utenti Patreon potete scaricare il file nella pagina download o a questo link
Funzionamento
Vediamo ora come funziona il tester per il joystick/pad NES
Ho disegnato sul Matrix display i tasti e le direzioni come compaiono sul joystick Advantage. Questa schermata è visibile appena si accende Arduino e scompare poco dopo. Premendo un tasto o una direzione dobbiamo vedere il relativo simbolo apparire sul display, se così non fosse ci sarà un problema sul joystick/pad, magari un contatto sporco, una saldatura o una pista interrotta..
Nei casi peggiori, potrebbe anche essersi guastato lo shift-register, nulla di costoso o complicato da sostituire, non è un componente zoccolato ma lo si può dissaldare facilmente.
Questo in basso è il nostro Arduino con il programma caricato, come si presenta all’avvio.
L’unica cosa che ci servirà per fare un lavoro pulito è un connettore NES femmina per poter collegare il joystick/pad senza dover fare dei fili volanti e inserirli nei pin del suo connettore.
Ed ecco il video con la riparazione del joystick NES Advantage e la realizzazione del tester.
Ricordatevi che per supportare il nostro lavoro potete iscrivervi al canale, è gratuito ed è un gesto carino come ringraziamento.
Se volete unirvi a Patreon vi lascio il nostro link: patreon.com/retrofixer