Console retrogaming con Raspberry Pi e RetroPie

Raspberry Pi 2 è il computer ideale da trasformare in un emulatore universale per le vecchie console anni 80-90.  Vi basterà la distro RetroPie, una micro SD card da almeno 8GB, un alimentatore da 2000mA ovviamente il Raspberry Pi 2 modello B.

yoshi_island

Prendete un Raspberry Pi 2 modello B. Su Amazon si trova a circa 40 euro. Consiglio il Pi 2 modello B perchè decisamente più veloce della prima versione.

Le caratteristiche del Pi2B, un piccolo mostro!

  • CPU ARM7 quad core a 900 MHz
  • 1GB di RAM
  • 40pin GPIO
  • 4 porte USB
  • HDMI
  • jack 3.5mm per audio/video analog
  • micro USB e porta micro SD
  • Lettore USB per schede micro SD

E’ possibile overcloccare il processore via software e portarlo fino a 1GHz ma occorrerà installare il dissipatore e magari una ventola. In ogni caso gli emulatori girano benissimo anche con la frequenza stock di 900MHz.

Lista dei componenti

Ecco un riassunto di tutto quello che serve:

  • Raspberry Pi 2 modello B
  • micro SD card da almeno 8GB
  • alimentatore (almeno 2000mA) con attacco micro USB (quello dei cellulari tanto per intendersi)
  • cavo HDMI
  • un joypad USB qualsiasi
  • tastiera USB (per la configurazione iniziale, poi non servirà più)
  • case più coperchio per Raspberry Pi 2 (non strettamente necessario ma sicuramente utile)

Io ho preso il kit da ThePiHut che per una cifra ragionevole include tutti componenti elencati a parte joypad e tastiera usb.

100643_5afeb6b7-85bc-4a77-8bc3-820ca529e089_1024x1024

RetroPie

Si tratta di una distribuzione Linux modificata contenente una vasta gamma di emulatori e il frontend EmulationStation che vi permetterà di gestire tutto il sistema tramite joypad senza mai ricorrere alla tastiera o al mouse.

Le macchine emulate da RetroPie sono le seguenti:

  • Amiga (UAE4ALL)
  • Apple II (LinApple)
  • Atari 800 (Atari800)
  • Atari 2600 (RetroArch/Stella)
  • Atari ST/STE/TT/Falcon (Hatari)
  • Apple Macintosh (Basilisk II)
  • C64 (VICE)
  • Amstrad CPC (#CPC4Rpi)
  • Final Burn Alpha (RetroArch/PiFBA, RetroArch/FBA)
  • Game Boy (RetroArch/Gambatte)
  • Game Boy Advance (GpSP)
  • Game Boy Color (RetroArch/Gambatte)
  • Sega Game Gear (Osmose)
  • Intellivision (jzIntv)
  • MAME (RetroArch/mame4all-pi, RetroArch/mame4all)
  • MSX (openMSX)
  • PC – x86 (rpix86)
  • NeoGeo (PiFBA, GnGeo)
  • Nintendo Entertainment System (RetroArch/FCEUmm)
  • Nintendo 64 (Mupen64Plus-RPi)
  • TurboGrafx 16 – PC Engine (RetroArch/Mednafen/pce_fast)
  • ScummVM
  • Sega Master System / Mark III (RetroArch/Picodrive, Osmose, DGen)
  • Sega Mega Drive / Genesis (RetroArch/Picodrive, DGen)
  • Sega Mega-CD / CD (RetroArch/Picodrive, DGen)
  • Sega 32X (RetroArch/Picodrive, DGen)
  • Playstation 1 (RetroArch/PCSX ReARMed)
  • Super Nintendo Entertainment System (RetroArch/Pocket SNES, snes9x-rpi)
  • Sinclair ZX Spectrum (Fuse, FBZX)

Più alcuni port di giochi per PC quali

  • Duke Nukem 3D
  • Doom
  • Quake 3 Arena

 

Installare RetroPie

Scaricate l’immagine ISO dal sito; il secondo link scarica la ISO per il raspberry Pi 2.

A questo punto occorre caricare la ISO nella scheda SD. Sotto Windows possiamo utilizzare l’ottimo Win32 Disk Imager. Inserite la micro SD nel vostro PC (o usate un adattatore USB) e tramite Win32DiskImager copiateci sopra il file immagine. L’operazione richiederà alcuni minuti.

Screen shot 2016-02-06 at 10.40.07 PM

Una volta terminata la copia estraete la card SD e inseritela nel RaspberryPi.

Accendete il RaspberryPi e dovreste vedere il classico log di boot Linux…

raspi2boot

 

Successivamente dovrebbe comparire lo splash screen standard di RetroPie…

splashscreen-300x169

e per finire il menù principale…

theming_system

Collegate la tastiera ad una delle prese USB e dovreste essere in grado di muovervi tra le voci del menu.

Configurazione RetroPie

E’ giunto il momento di configurare RetroPie.

Ho stilato un breve elenco delle cose da fare per configurare al meglio RetroPie:

  • configurazione dell’audio HDMI
  • configurazione joypad
  • espansione del file system sulla sd card
  • update dello script di RetroPie (opzionale)
  • cambio dell’emulatore SuperNintendo (Snes9x a PocketSnes)
  • caricare le ROM dei videogiochi

Configurazione audio HDMI

Di default l’audio non è configurato correttamente e l’uscita HDMI risulta muta (solo su alcune TV). Se siete fortunati l’audio funzionerà alla grande fin da subito, se non lo siete occorrerà forzare l’audio sull’uscita HDMI :-).

Entrate in console premendo F4 da qualsiasi punto del menu. Una volta premuto F4 dovrete premere invio o un alto tasto altrimenti il sistema ritornerà automaticamente al menu grafico.

Una volta in console abilitate l’utente root dando il comando:

sudo passwd

Scegliete una password per l’utente root, ad esempio “root” 🙂

Ora entrate in modalità  root digitando

su root

e date la password. A questo punto siete in grado di modificare le impostazioni dell’audio.

Aprite il file /boot/config.txt con il comando

 nano /boot/config.txt

e scommentate la riga hdmi_drive=2

In sostanza dovrete modifica la riga da cosi’:

#hdmi_drive=2

a cosi’:

hdmi_drive=2

Salvate il file, e riavviate digitando reboot (sempre come root).

A questo punto l’audio dovrebbe essere a posto. Tuttavia, finchè non avrete una ROM da provare non potrete testare l’audio.

Espansione del filesystem

Il file immagine di RetroPie che avete installato sulla sd card crea due partizioni, una di boot da qualche  MB e una più grande da 2GB. Per sfruttare tutta la capacità della sd card occorrerà espandere questa partizione fino alla dimensione massima possibile.

Entrate nel menu principale e andate alla voce “RetroPie”.

menu_retropie

Selezionate “Raspberry Pi configuration tool RASPI-CONFIG”

raspberry_pi_configurations

Selezionate “Expand Filesystem”

expand_filesystem

Riavviate tutto. Al boot dovrebbe partire l’operazione di espansione. A questo punto avete a disposizione tutti i GB della scheda SD per le ROM dei giochi.

Configurazione del JoyPad

L’operazione è semplicissima. Mentre siete nel menu principale collegate un joypad USB al Raspberry Pi, dovrebbe partire in automatico la fase di configurazione: premete i bottoni sul joypad secondo le indicazioni a schermo (alto, basso, sinistra, destra, pulsante “A”, pulsante “B” etc..etc…). La lista dei pulsanti è molto lunga (credo sia quella di un joypad playstation) se non avete “abbastanza bottoni” potete saltarne alcuni tenendo premuto per 2 secondi un tasto qualsiasi (anche un bottone già selezionato in precedenza)

Update dello script RetroPie

Un aggiornamento allo script principale vi risolverà grandi mal di testa in futuro. Dal menu principale selezionate “RetroPie” e quindi “RetroPie Setup”. Selezionate ora “Update RetroPie-Setup script”. Ovviamente è richiesta una connessione internet quindi il Raspberry Pi dovrà essere collegato al router tramite cavetto ethernet.

Cambio dell’emulatore di default del Super Nintendo

L’emulatore di default del Super Nintendo (snes9x) non sembra essere all’altezza di alcuni giochi (sopratutto quelli che sfruttavano il coprocessore grafico superFx, tipo Yoshi Island). Per fortuna una valida alternativa è data dall’emulatore PocketSnes, già presente in RetroPie e ottimizzato per processori ARM.

Andate nel menu “RetroPie”, quindi in “Edit retropie/retroarch configurations”

selezione_edit_retropie

Selezionate “Manually edit all configurations”

manually_edit_all_configurations

Selezionate “snes/emulator.cfg”

selezione_snes_emulators

e all’utima riga scrivete:

default=”lr-pocketsnes”

selezione_pocketsnes

Salvate e riavviate. A questo punto il nuovo emulatore è pronto ad essere utilizzato. Nessun rallentamento o glitch video e audio perfetto.

Caricare le ROM dei videogiochi sul Raspberry Pi

Anche questa operazione è semplicissima.

Potete trovare le ROM su internet, consiglio il famoso emuparadise. Mi raccomando però, in teoria potete scaricare solo le ROM dei giochi che già possedete, almeno questo è quello che dicono i disclaimer sui vari siti di download.

Collegate il Raspberry Pi alla LAN: RetroPie è configurato per condividere automaticamente la directory dove immagazzina tutte le ROM.  Da un PC qualsiasi collegato alla stessa rete dovreste vedere RetroPie sotto questo nome:

\\retropie

doppio click e trovate la cartella “rom”, all’interno altre sottocartelle, ognuna delle quali relativa ad un emulatore. Copiate le ROM nelle cartelle opportune.

Riavviate. Dal menu principale di RetroPie dovreste vedere ora tutti gli emulatori per i quali avete caricato le ROM!

emulatori

Selezionate un emulatore e troverete la lista completa delle ROM che avete caricato (per quell’emulatore).

lista giochi

 

Tutto a posto!

A questo punto staccate cavo ethernet e tastiera, non serviranno più. Tutto il sistema è gestibile via joypad, anche l’uscita da un emulatore (premete contemporaneamente i tasti start e pausa) e lo spegnimento del Raspberry Pi (dal menu, premete start e selezionate “shutdown”).

EDIT (19 Feb 2017)

In un recente articolo mostro come collegare un joypad originale del Super Nintendo al RaspberryPi tramite porta USB. La modifica è abbastanza semplice e non occorrono driver particolari

 

Autenticazione Google OAuth2 in PHP

Come integrare il login Google OAuth2 nelle nostre applicazioni web PHP. Si tratta del login Google che può essere selezionato al posto della normale registrazione tramite email e password.

 

sign_up_with_google_button-60e629008d4a889a84cf284b08a9998b

 

Molto più pratico di una registrazione normale, l’utente non deve scegliere una password o inserire dati particolari: l’unica cosa che deve fare è dare il consenso all’applicazione web per l’utilizzo dei suoi dati personali (di solito nome, email e foto profilo, mai la password).

Nelle normali registrazioni l’utente deve inserire un nome utente ed una password, questi dati vengono memorizzati dall’applicazione web e sono richiesti durante il login.

Con OAuth2 l’utente non deve fare nulla di tutto ciò: è sufficiente autorizzare l’applicazione web una volta e automaticamente otterrà l’accesso.

Il protocollo OAuth2 è disponibile anche per molti altri social network:

 

social-login

 

Il funzionamento è abbastanza semplice: l’utente clicca sul bottone “Log in con Google” e viene portato alla pagina di autorizzazione. Se l’utente approva il sito riceve un codice di autorizzazione. Questo codice di autorizzazione viene poi usato dall’applicazione stessa per richiedere il token di accesso tramite il server OAuth2 Google. Il token può essere usato dal sito stesso per recuperare i dati utente direttamente dal server Google (nome, email, foto profilo etc…).

 

webflow

 

Possiamo quindi memorizzare il token in un cookie e i dati utente (e in particolare l’id utente) nel nostro database: quando l’utente si ricollegherà useremo il cookie per recuperare di nuvo l’id utente tramite apposita API. Se l’id utente corrisponde a quello memorizzato nel database significa che l’utente si era già registrato.

Vediamo allora come integrare il login OAuth2 in una applicazione web PHP.

Il nostro script PHP ha bisogno di alcune credenziali per accedere al server OAuth2 di Google. Per prima cosa quindi occorre creare tali credenziali dalla Google Developer Console.

Setup credenziali OAuth2

Apriamo la sezione su Google+ API e generiamo un nuovo set di credenziali:

 

Screen shot 2015-11-15 at 12.28.32 PM

 

Dobbiamo inserire un nome di riferimento (ad esempio “OAuth2 per il mio sito web”) e il redirect url che sarà l’URL al quale l’utente ritornerà automaticamente non appena avrà dato il consenso sul form di login Google.

Per far funzionare il nostro script di esempio dovremo puntare il redirect URL direttamente alla URL dove abbiamo caricarto lo script (lo script di esempio non funziona in locale!).

 

Screen shot 2015-11-15 at 12.35.34 PM

 

Annotiamoci il Client ID e il Client Secret.

Script di esempio per login Google Oauth2 in PHP

Lo script è veramente semplice. Si compone di un singolo file “googleauth.php” che contiene il codice di login vero e proprio e una cartella “Google” che contiene la libreria OAuth2 Google.

Per prima cosa includiamo la libreria OAuth2 e settiamo le credenziali generate sul Google Developer Console:

 

session_start();
require_once ('Google/autoload.php');

$client_id = 'XXXXXXXXXXXXXXXXX';
$client_secret = 'XXXXXXXXXXXXXXXX';
$redirect_uri = 'redirect url';

Creiamo ora l’oggetto Google_Client() e passiamo le credenziali $client_id e $client_secret più il nostro URL redirect.

 

// Creiamo il Google client
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("email");
$client->addScope("profile");

Il Google_client() è il client grazie al quale comunichiamo con le Google API.

Creiamo ora l’instanza Google_Service_Oauth2(). Questo oggetto è l’interfaccia vera e propria per il protocollo OAuth2.

 

// Creiamo l'interfaccia API OAuth2
$service = new Google_Service_Oauth2($client);

Settiamo ora la callback con la quale il nostro script riceverà il codice di autorizzazione dal server OAuth2 di Google. Questo codice è invocato automaticamente dalla pagine di autorizzazione di Google quando l’utente accetta l’autorizzazione. Il nostro URL redirect deve puntare a questa porzione di codice. Nel nostro caso abbiamo messo questo codice direttamente nel file “googleauth.php” quindi l’URL redirect deve puntare al file “googleauth.php” stesso. Nulla vieta comunque di avere questa callback in un altro script PHP a parte.

Lo script legge il codice di autorizzazione inviato in GET dal server Google e richiede il token vero e proprio. Poi salva il token nella sessione PHP corrente (volendo potremmo anche salvarlo in un cookie).

 

// Callback per il servizio OAuth2 di Google.
// Salviamo il token nella sessione PHP e ricarichiamo la pagina
if(isset($_GET['code']))
{
 $client->authenticate($_GET['code']);
 $_SESSION['access_token'] = $client->getAccessToken();
 header('Location: '.$_SERVER['PHP_SELF']);
 exit;
}

Definiamo un modo per effettuare il logout. Questa porzione di codice semplicemente cancella il token dalla sessione PHP corrente. E’ sufficiente chiamare lo script settando la variabile GET “logout=” (i.e. “googleauth.php?logout=”).

Lo script ora si dirama in due direzioni differenti. Se il token è presente in sessione vengono recuperati i dati utente direttamente dal server Google. Altrimenti si provvede a mostrare una pagina di login col classico bottone rosso “Log in tramite Google”:

 

// L'utente è già loggato oppure no?
if(isset($_SESSION['access_token']) && $_SESSION['access_token'])
{
	// Si, l'utente è loggato, recuperiamo i dati dell'utente
	
	$client->setAccessToken($_SESSION['access_token']);
	$user = $service->userinfo->get();
	
	echo "Benvenuto ".$user->name."!";
	echo "User ID = ".$user->id;
	echo "Email = ".$user->email;
	echo "Google page = ".$user->link;
	echo "Avatar = ".$user->picture;
	echo "";
	echo "<a href='?logout='>Esci</a>";
}
else
{	
	// No, l'utente non è loggato, mostriamo la pagina di login

	$authUrl = $client->createAuthUrl();
	
	echo '<div align="center">';
	echo '<h3>Login</h3>';
	echo '<a class="login" href="' . $authUrl . '">';
echo '<img src="signin.png" /></a>';
}

Se il token è settato prendiamo i dettagli utente invocando $service->userinfo->get().

Se non è settato creiamo il link per andare alla pagina di autorizzazione Google. Il link viene creato con la API createAuthUrl().

Trovate lo script di esempio completo di libreria GoogleAPI su GitHub.

Come continuare ad utilizzare una vecchia e costosa stampante non più compatibile con Windows 7/8/10

La stampante è uno di quei strumenti che cambi solo quando si rompe oppure… quando non è più compatibile con l’ultimo aggiornamento di Windows.

Ma spesso è frustrante dover cambiare una stampante solo perchè non più supportata dal nuovo sistema operativo, soprattutto se la stampante in questione possiede queste caratteristiche:

  1. funziona ed ha funzionato sempre benissimo
  2. è costata parecchio
  3. è di ottima qualità
  4. consuma poco inchiostro

Nel mio caso ho avuto a che fare con una stampante professionale da ufficio Develop 1650D. La stampante ha sempre funzionato egregiamente con WindowsXP, funzionava in alcuni casi ristretti su Windows7 ed un bel giorno ha smesso del tutto di funzionare dopo l’ultimo aggiornamento del suddetto sistema operativo.

529ef87ed1beb529d4026ee8ed4ab96c33430541

La stampante non ha porte Ethernet o Wifi. Ha una singola porta USB ed una porta parallela: ciò significa che deve essere collegata direttamente ad un computer.

Soluzione “semplice” è buttare la stampante da 2000 e rotti euro e comprarne una nuova: non ci piace.

 

Tentativo: utilizzo di un print server commerciale

Acquistare un print server commerciale sembrerebbe la soluzione ottimale: il print server funge da ponte tra la stampante e la rete LAN dell’ufficio scavalcando del tutto il problema del sistema operativo.

41NowUSrunL._SY300_

Purtroppo però tutti i print server in circolazione supportano solo alcuni modelli specifici di stampanti ed in genere solo quelle più recenti. Inutile dire che non andava bene per il modello Develop 1650D.

 

Tentativo: Macchina XP dedicata e condivisione stampante

Una soluzione alternativa è collegare un PC WindowsXP direttamente alla stampante e condividerla in rete. Questa soluzione non ha funzionato in quanto, sebbene la stampante fosse perfettamente visibile in rete dagli altri PC Windows7, le stampe non partivano a causa dell’incompatibilità tra i driver XP  e i PC utilizzatori (Windows7).

 

Soluzione finale: print server ad-hoc

La soluzione è consistita nel disaccoppiare utenti Windows7 e stampante tramite l’utilizzo di una stampante virtuale PDF. Un PC WindowsXP dedicato gestisce la stampante reale via USB e al tempo stesso condivide in rete una stampante virtuale PDF. I PDF (le stampe degli utenti) vengono creati sul disco della macchina XP all’interno di una directory specifica che funge da coda di stampa. Un programma ad-hoc realizzato in .NET C# (printserver.exe) e residente nella macchina XP provvede a scodare i file PDF dalla directory e a stamparli sulla stampante reale.  Il programma è avviato automaticamente e non richiede alcun intervento manuale per funzionare.

Screen shot 2015-11-02 at 5.38.30 PM

Lato utente il meccanismo è del tutto trasparente: in rete è visibile solo la stampante virtuale. Ogni comando di stampa verso la stampante virtuale si traduce in una stampa vera e propria sulla Develop 1650D.

Screen shot 2015-11-02 at 5.38.15 PM

Il tutto realizzato su un comunissimo PC desktop privo di mouse, tastiera e schermo. L’unica cosa da ricordare è accendere il printserver la mattina prima di utilizzare la stampante!

printserver

 

Aspetti interessanti della soluzione

Allo stato attuale i PDF vengono scodati, stampati e quindi cancellati; Nessuno però vieta di copiare i PDF in una ulteriore cartella di backup in modo da mantenere uno storico digitale delle stampe.

E’ possibile estendere il meccanismo ad altre stampanti obsolete e collegarle tutte alla stessa macchina XP; l’unico limite è il numero di porte USB e parallele disponibili (di solito 4 o 6 USB e 1 o 2 parallele).

La stampante funzionerà anche con Windows 8, Windows 10 e anche sistemi Linux e Mac.