13 aprile 2025

Restauro del controller vintage Savage Ghibli LD 224

Savage Ghibli LD 224

Recentemente, durante le mie visite ai vari mercatini online, ho acquistato per pochi euro un lotto di vecchie carcasse elettroniche e, tra le varie cose, era presente questo stilosissimo controller con connettore di tipo Atari, quindi compatibile anche con il mio Commodore 64 e con il VIC 20.

In condizioni estetiche molto buone, probabilmente 40 anni fa le sue plastiche non tendevano al giallo, ma non sono uno di quelli fissati con il retrobright, per cui, per quanto mi riguarda, è perfetto così.

Ho un debole per gli oggetti elettronici con le plastiche trasparenti; in particolare, in questo caso si vedono i LED al suo interno che si accendono per ogni pulsante premuto.
Non è un’opzione necessaria per giocare, ma visivamente devo dire che fa la sua porca figura. Tamarrissimo!

dettaglio switch Sul lato sinistro è presente un selettore a 3 posizioni dove è possibile scegliere una delle tre modalità di funzione: normale, auto-fire e decathlon.
L'ultima modalità non la conoscevo; cito le uniche informazioni che ho trovato online a riguardo, tratte da una vecchia rivista italiana (Testo integrale della rivista K-Kappa n. 44):
Nel modo decathlon, mentre il tasto verde in alto viene premuto, il joystick reagisce come se andasse a destra, mentre quando viene rilasciato va a sinistra (molto pratico, ma chi ci gioca ancora a Decathlon?)
Purtroppo questo selettore non va a scatti, e questo lo rende molto scomodo nel caso in cui durante una partita si voglia attivare la posizione auto-fire centrale, in quanto occorre impostare la levetta perfettamente al centro e spesso basta pochissimo per non attivare correttamente la funzione.
A mio avviso sarebbe stato meglio avere la modalità decathlon al centro; in questo modo sarebbe stato molto più semplice passare dalla modalità normale a quella auto-fire.
Volendo, si potrebbe fare una piccola modifica invertendo un paio di fili, ma penso che lascerò il controller inalterato; l'opzione auto-fire l'ho sempre vista un po' come barare!
A livello funzionale questo controller ha sicuramente visto tempi migliori; infatti, la maggior parte dei pulsanti non funziona, occorre quindi aprirlo e ripararlo.

Una volta aperto, mi rendo subito conto del primo problema: uno dei due cavetti verdi si è staccato dalla PCB (quello verso il basso). dettaglio pcb Poco male, in ogni caso per poter accedere all'altro lato della PCB occorre dissaldare tutti i cavetti. Fortunatamente, su tutte le piste sono indicati, rigorosamente in italiano, i colori dei cavi corrispondenti.

Dissaldo tutti i cavi e finalmente accedo dall'altro lato. pulsanti rotti Come prevedibile, solo un paio di switch funzionano correttamente; tutti gli altri no. Uno di questi è completamente distrutto, altri invece sono bloccati e, anche premendoli, non vanno giù (come quello nella seconda foto). dettaglio pulsanti rotti dettaglio pulsanti rotti
busta componenti di recupero Decido di sostituirli tutti. Ho una busta piena di componenti di recupero, vediamo se riusciamo a trovare dei ricambi funzionanti!
Switch sostitutivi trovati, sono abbastanza simili agli originali, forse un filo più alti, ma dovrebbero andare bene ugualmente.
Li ho controllati tutti con il multimetro (in modalità prova-diodi o test di continuità) e funzionano perfettamente.
Mi armo di pistola dissaldante e procedo alla sostituzione! pistola dissaldante
nuovi pulsanti saldati Sostituzione effettuata!
Visto che ci sono, controllo con l'ESR meter che il condensatore elettrolitico funzioni ancora correttamente.
Il condensatore è da 100uF / 16V. Secondo la tabella presente sullo stesso ESR meter, dovrebbe avere una ESR al massimo di 0.7 ohm. tabella esr condensatori
misurazione esr condensatore 0.373 ohm, direi che siamo ben al di sotto del valore massimo.
Con il multimetro (perdonatemi, ma ho dimenticato di fare la foto) ho anche verificato il suo valore ed era circa 90uF, ragionevolmente in tolleranza.
Insomma, il condensatore è ok!
È arrivato il momento di effettuare la pulizia della PCB con alcol isopropilico per eliminare i residui di flussante.
Avrei dovuto farlo dopo aver risaldato i cavi; infatti, successivamente l'ho nuovamente pulita. pulizia pcb Pulizia effettuata! pulizia pcb effettuata
sostituzione pulsante in cima Procedo alla sostituzione di uno dei due pulsanti in alto.
Sostituzione effettuata.
Il secondo pulsante in alto, invece, utilizza un meccanismo diverso.
Funziona già abbastanza bene, occorre semplicemente dargli una pulita con l'alcol isopropilico.
Per fare questo, basta mettere una goccia di alcol sullo switch, un pezzettino di carta tra le lamelle, chiudere il contatto e strisciare la carta in modo che si porti via eventuali tracce di sporco.
pulizia pulsante in cima
Visto che ci sono, pulisco anche il selettore di funzioni.
A questo punto pulisco e disinfetto tutte le plastiche con dell'alcol denaturato. pulizia pulsante in cima
viti sporchissime Le viti sono messe molto male.
Nel peggiore dei casi sono arrugginite, ma magari sono solo molto sporche.
Provo a pulirle con la lavatrice a ultrasuoni.
Questa l'avevo comprata tempo fa per pulire gli occhiali, ma devo dire che si sta rivelando molto utile per pulire tante altre cose.
La vedrete spesso su queste pagine. lavatrice ad ultrasuini
Facciamo un tentativo.
Insieme all'acqua ho messo una goccia di detersivo per i piatti.
viti nella lavatrice ad ultrasuoni
Dopo un ciclo di 10 minuti, ecco tutta la sporcizia che si è staccata dalle viti! sporcizia staccata dalle viti
viti come nuove Viti come nuove.
Molto meglio di prima!
viti come nuove Finalmente è arrivato il momento di rimontare il tutto.
Piccolo problema: come avevo già scritto prima, i nuovi switch che ho saldato sono un po' più alti dei precedenti.
Per questo motivo, una volta montato il circuito nel case, mi rendo conto che le plastiche dei pulsantoni rossi (i tasti azione) mantengono premuti gli switch, rendendoli inutilizzabili.
Invece, per gli switch corrispondenti alla leva di comando non c'è nessun problema.
problema nuovi pulsanti
carteggio pulsanti rossi Nulla di grave, si risolve carteggiando leggermente la base dei pulsanti rossi.
riassemblo il controller Posso riassemblare il controller!
Finalmente lo collego al VIC 20 per provarlo, ma si presenta un altro (e spero ultimo) problema: il connettore è troppo ballerino e non tutti i pin fanno contatto con il computer.
Probabilmente i pin interni, con il tempo, hanno perso la loro elasticità e si sono allargati.
Alcuni comandi, infatti, non funzionano.
Si rende necessaria la sostituzione.
Prima di procedere, devo segnarmi a quali fili corrispondono i singoli pin del connettore.
È un lavoro molto noioso, ma necessario.
Per fare questo, ho preso un piccolo filo metallico (uno di quelli che avanzano quando si saldano le resistenze), collegato ai vari pin del connettore, e uno per uno ho verificato con il tester, in modalità test di continuità, a quale filo corrispondesse sulla PCB, segnandomi il tutto su un post-it.
verifica dei pin del connettore dettaglio del filo metallico in un pin del connettore
taglio del connettore Una volta ottenuto il pinout completo, posso procedere con la decapitazione del connettore.
Il connettore sostitutivo è un banale DB9 femmina, ovvero il classico connettore delle porte seriali RS232.
Questi su AliExpress costano pochissimo.
connettore DB9 femmina
saldatura fili al nuovo connettore Procedo alla saldatura dei cavetti.
Un altro lavoro noioso, ma qualcuno dovrà pur farlo.
Con il nuovo connettore, il controller funziona perfettamente! nuovo connettore montato
Notare che il pulsantone in alto attiva il movimento verso destra.
Utile per sparatutto a scorrimento orizzontale, come ad esempio Defender!

Conclusioni

Un controller, secondo me, ben fatto, solido e con buone plastiche, sicuramente meritava una seconda vita.
Peccato per lo switch poco utile per selezionare la modalità di gioco, ma me ne farò una ragione.
Sembrerebbe anche abbastanza raro, vista la scarsità di informazioni trovate sul web.
Penso di aver fatto un buon lavoro in questo restauro; sicuramente mi sono divertito nel farlo.
Speriamo che i nuovi switch durino nel tempo.
23 marzo 2025

CSS Trick: background animato sul logo

Per questo blog ho usato il framework Hugo con il tema Risotto; mi piace il minimalismo e questa combinazione mi ha particolarmente convinto, essendo semplice e senza troppi fronzoli. Ho apportato qualche modifica al tema per adattarlo alle mie esigenze, e quella di cui vorrei parlare in questo post riguarda l’animazione dello sfondo del logo.

Per ottenere l’effetto di gradiente rotante che si vede attualmente, ho inizialmente sperimentato con un po’ di JavaScript, in questo modo:

document.addEventListener("DOMContentLoaded", () => {
    const DEG_STEP = 2.8125   // equivale a 360 / 128;
    const INTERVAL = 62.5     // equivale a 8000 / 128
    let deg = 42;
	let logo = document.querySelector(".page__logo-inner");

    setInterval(() => {
        deg += DEG_STEP;
        deg %= 360;
        logo.style["background-image"] = `linear-gradient(${deg}deg, rgb(247, 115, 241), rgb(16, 180, 215))`;
    }, INTERVAL)
});

All’apertura della pagina, quindi, parte il setInterval, che a cadenza di 62.5 millisecondi modifica lo stile background-image, ruotando di fatto il linear-gradient.
Il loop dura 8 secondi. In 8 secondi vengono disegnati 128 fotogrammi, e ad ogni fotogramma la rotazione avanza di 2.8125 gradi.

Funzionava tutto perfettamente, ma avevo notato un problema: quando aprivo gli strumenti di sviluppo, l’utilizzo della CPU si impennava.
Questo succedeva perché nel tab Elements degli strumenti di sviluppo è visibile il DOM della pagina, con gli stili inline visibili in chiaro.
Lo stile del tag con classe .page__logo-inner, infatti, viene costantemente aggiornato, e il browser consuma CPU per visualizzare le modifiche, che, come detto prima, avvengono ogni 62.5 millisecondi. Probabilmente per il 99,99% degli utenti questo non rappresenta un vero problema, ma ho voluto comunque provare a risolverlo.

Ho deciso, quindi, di implementare lo stesso loop usando opportunamente il CSS al posto di JavaScript.
Ho provato inizialmente a impostare 3 keyframes, in questo modo:

.page__logo-inner {
    background-image: linear-gradient(42deg, rgb(247, 115, 241), rgb(16, 180, 215));
    animation: logo_anim 8s linear infinite;
}

@keyframes logo_anim {
	0% {
		background-image: linear-gradient(42deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	50% {
		background-image: linear-gradient(222deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	100% {
		background-image: linear-gradient(42deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
}

Mi aspettavo che il browser calcolasse tutti i fotogrammi mancanti e rendesse quindi l’animazione fluida, ma non ha funzionato. L’animazione, infatti, si componeva di soli 3 frame, senza alcuna interpolazione, come si può vedere nella gif qui sotto.
animazione logo errata

Occorreva quindi scrivere esplicitamente tutti e 128 i keyframe per ottenere lo stesso effetto avuto con JavaScript. In questo modo il browser non avrebbe dovuto eseguire alcun calcolo, ma soltanto leggere i valori pre-calcolati.
Ma non avevo alcuna intenzione di farlo a mano, così ho scritto un piccolo programma JS da far girare direttamente sulla console del browser, che mi producesse la regola CSS con tutti i keyframe in formato testuale, da copiare e incollare direttamente nel file CSS.

const STEPS = 128;
const START_DEG = 42;
const DEG_STEP = 2.8125;

let percent_step = 100 / STEPS;

let output = "@keyframes logo_anim {\n";

for (let i=0; i<STEPS; i++) {
	let percent = i * percent_step;
	let deg = (START_DEG + (i * DEG_STEP)) % 360;
	output += `\t${percent.toFixed(2)}% {\n\t\tbackground-image: linear-gradient(${deg}deg, rgb(247, 115, 241), rgb(16, 180, 215));\n\t}\n`;
}

output += "}";

console.log(output);

A questo punto, dopo averlo fatto girare in console, è bastato copiare l’output stampato a video e incollarlo nel file CSS.

.page__logo-inner {
    background-image: linear-gradient(42deg, rgb(247, 115, 241), rgb(16, 180, 215));
    animation: logo_anim 8s linear infinite;
}

@keyframes logo_anim {
	0.00% {
		background-image: linear-gradient(42deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	0.78% {
		background-image: linear-gradient(44.8125deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	1.56% {
		background-image: linear-gradient(47.625deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}

	/* ... */

	97.66% {
		background-image: linear-gradient(33.5625deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	98.44% {
		background-image: linear-gradient(36.375deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
	99.22% {
		background-image: linear-gradient(39.1875deg, rgb(247, 115, 241), rgb(16, 180, 215));
	}
}

Problema risolto! Adesso l’utilizzo della CPU resta basso anche aprendo gli strumenti di sviluppo.

bit sparkle

Un blog sulla programmazione, elettronica e roba vecchia

Tags