Trasformare un joypad SNES in un controller USB per PC

Modifichiamo un joypad orginale del Super Nintendo e colleghiamolo via USB al PC o al Raspberry Pi. In un precedente articolo del 2008 (!) mostravo come collegare il controller SNES alla porta parallela, ormai superata. In questo post mostrerò invece come adattarlo alla porta USB ed utilizzarlo con gli emulatori più famosi (NES, SNES, Sega MegaDrive, Sega Master System, Atari etc..).

Questo è il joypad in questione:

SONY DSC

Sto parlando ovviamente del controller originale, quello in dotazione con la console stessa. Joypad di pregevole fattura, assolutamente indistruttibile e che funziona ancora al 100% dopo 20 anni! Il connettore è ahimè proprietario, ne DB9 ne ovviamente USB (lo standard USB sarebbe stato introdotto solo anni più tardi):
snes_connectorAnche il protocollo e i segnali sono proprietari e per “trasformarli” in USB occorre un apposito circuito convertitore. Questo circuito è sufficientemente piccolo da poter essere installato all’interno del controller stesso.

Circuito convertitore

Il convertitore può essere acquistato su RetroUSB. Si tratta di un microcontroller PIC miniaturizzato (formato TSOP) che converte i segnali generati dal controller in segnali USB

Screen Shot 2017-02-19 at 16.58.05

Il kit, chiamato NES/SNES RetroKit, trasforma quindi il controller in un joypad USB a tutti gli effetti. La compatibilità è garantita, il joypad risulterà al PC come un normale controller HID a 12 pulsanti e non sarà necessario installare alcun driver, ne su PC ne su Raspberry Pi (RetroPie).

Ecco come si presenta il convertitore:

retrousb_cable

pic_closeup

Installazione

L’installazione è abbastanza semplice. Apriamo il controller svitando le 5 viti posteriori:

joypad_aperto

A questo punto tagliamo via il cavo originale, spelliamo i 5 fili e bagniamo con stagno le estremità:

fili_tagliati

Per un un lavoro più pulito si potrebbe dissaldare il ricettacolo bianco e quindi “salvare” l’intero cavo originale, a voi la scelta! I 5 fili (marrone, bianco, giallo, rosso e arancio) vanno collegati sulle piazzole del convertitore, seguendo lo schema che il sito mette a disposizione:

sneskit

Lo schema non è chiarissimo, ma in sostanza si tratta di saldare i fili marrone e bianco rispettivamente sulle piazzole 2 e 3 del lato anteriore del convertitore, e di saldare i fili arancio, giallo e rosso rispettivamente alle piazzole 2,3 e 4 presenti nel lato opposto. Il risultato è mostrato qui sotto:

pic_collegato

A questo punto non ci resta che incollare il convertitore al PCB del joypad in modo tale che resti ben fermo e le saldature non si  indeboliscano:

pic_incollato

Basta ora richiudere il joypad assicurandosi che il convertitore non blocchi la chiusura in alcun modo, dovrebbe tranquillamente stare in posizione senza problemi:

joypad_usb_finale

Utilizzo

Il joypad è pronto per essere utilizzato! Non servono driver o altri software particolari perchè il convertitore interfaccia il controller come una periferica HID (Human Interface Device); tali periferiche sono previste dallo standard USB stesso e non richiedono driver per funzionare. Questo joypad USB è particolarmente adatto su RaspberryPi e RetroPie, tutti gli emulatori lo supportano correttamente

joypad_in_azione_dkc

Ovviamente non tutti gli emulatori supportano 12 tasti (l’Atari 2600 soltanto 1 bottone e 4 direzioni) ma nessun problema, i tasti superflui verranno esclusi e non avranno effetto.

Invio automatico di email con Raspberry Pi

pi2modb1gb_-comp

 

Il bello del Raspberry Pi è che può essere programmato per svolgere determinate attività ed essere lasciato acceso a fare il suo lavoro senza monitor e tastiera collegati, anche in posti remoti e non immediatamente raggiungibili. L’ideale sarebbe quindi poter tenere sotto controllo il Raspberry Pi in qualche modo: una idea interessante è quella di inviare email automaticamente ad una casella di posta prestabilita. Le email possono essere generate al verificarsi di eventi particolari oppure in maniera periodica per la trasmissione di log di sistema o altri file importanti che vogliamo tenere d’occhio.

Ad esempio, un sensore di temperatura collegato ai GPIO di sistema fa scattare l’invio di una email nel caso la temperatura salga oltre un certo limite impostato. Altro esempio: notificare al destinatario l’indirizzo IP del raspberry, con cadenza regolare oppure in maniera più efficiente solo nel caso in cui cambi (molti provider assegnano un indirizzo IP dinamico che cambia continuamente). Altro esempio ancora l’invio periodico dei dati prelevati da una stazione meteo.

Utilizziamo i pacchetti ssmtp e mutt rispettivamente per l’invio delle email e di eventuali allegati

Useremo i server smtp di gmail, quindi occorrerà avere un account gmail dedicato (ad esempio una email del tipo raspberrypi@gmail.com)

Per prima cosa aggiorniamo il repository locale:


apt-get update

Installiamo poi smmtp e mailutils


apt-get install ssmtp
apt-get install mailutils

A questo punto apriamo il file di configurazione di ssmtp


nano /etc/ssmtp/ssmtp.conf

cancelliamo tutto ed inseriamo i nostri dati di login gmail, in questo caso email “email@gmail.com” e password “123456”. Il resto rimane inviariato:

root=postmaster
mailhub=smtp.gmail.com:587
hostname=raspberrypi
AuthUser=email@gmail.com
AuthPass=123456
UseSTARTTLS=YES

A questo punto editiamo il file revaliases

nano /etc/ssmtp/revaliases

ed inseriamo questa riga

root:root@raspberrypi:smtp.gmail.com:587

fatto ciò salviamo e settiamo i giusti permessi per il file di configurazione

chmod 774 /etc/ssmtp/ssmtp.conf

Invio di una email

L’invio della email è semplicissimo. Dalla console digitiamo:

echo "testo della email" | mail -s "oggetto" destinatario@dest.com

e dopo qualche istante l’email sarà inviata. Ovviamente il comando può essere impartito da uno script apposito o da una regola cron.

Se vogliamo aggiungere un file in allegato (log, immagini o quant’altro) utilizzamo questo altro comando:

echo "testo della email" | mutt -a /file/da/allegare.dat -s "oggetto" -- destinatario@dest.com

Nel caso dovesse verificarsi un errore è possibile che gmail stia bloccando il client ssmtp perchè considerato non sicuro (vecchia versione affetta dal bug heartbleed ad esempio). In questo caso occorre prima andare nelle impostazione della casella gmail e abilitare l’accesso alle app meno sicure, come spiegato qui

screen-shot-2016-12-15-at-00-32-40

SidBerry2 – enhanced Raspberry Pi 6581 SID player

I post here the great work of Davide aka Thoroide (thoroide@gmail.com). He took my Raspberry Pi SID player project and enhanced it creating SidBerry2. It features a new power stage, a better audio output stage and much more:

Here the original post:

Time ago, I recovered a 6581 SID chip from a dead C64, and then I wondered if you could connect it to an Arduino or RaspberryPi.

I have done several researches, finding various projects, most of them abandoned. Having a Raspberry card on which I was doing other work, I chose the SIDBerry project by Gianluca Ghettini
That seemed the easiest.

First of all I have slightly changed the hardware part. The original hardware was pretty basic, although perfectly functional.
To do this, I got a similar project schematic created for Arduino platform called RealShield https://github.com/atbrask/RealSIDShieldand I took some parts in order to design a more powerful version of SidBerry.

First I got a component to generate +12V from 5V (MC34063A) of which you can see the functional diagram taken from the datasheet. Starting from this schematic a proper component value were calculated in order to obtain an increase of the voltage. The original circuit generates the +12V only using MC34063A, but this require some precision resistors on feedback, so I preferred to generate an higher voltage (+ 18V / + 20V) and then using an linear regulator 78L12 to be sure that the 12V was accurate. This to avoid the premature dead of MOS6581 chips, that can burn easily if the voltages are not accurate.

image001

If you don’t like to make a Step-Up with spare components, you can easily buy an already done DC/DC like http://uk.rs-online.com/web/p/isolated-dc-dc-converters/6895015/

image003

The second modification is about the audio output stage, creating one very similar to the original C64. In RealSIDShield, the network is a bit more complex, but the stage is a simple transistor amplifier.

image005

For all remaining digital connections i use the SIDBerry original schematic.

Software

For software part I done a step by step guide to make a working SIDBerry code, starting with a clean jassie image and a RaspberryPi 3.

I started with a clean image, jessie, in particular mine was the 2016-09-23-raspbiam-jessie.zip downloaded directly from the official source.

I followed this guide for a complete update of the fresh installation. https://www.raspberrypi.org/blog/introducing-pixel/

Next configure a static IP for easily remote connect the RPI, editing the file dhcpcd.conf
sudo nano /etc/dhcpcd.conf and added at the end these following lines:


interface eth0
static ip_address=[your preferred fixed IP]/24
static routers=[your preferred gateway]
static domain_name_servers=[your preferred DNS1][your preferred DNS2]

Then I activate a VNC server to easily remote control the raspberryPi using a following commands:


sudo apt-get install -y realvnc-vnc-server
sudo vncinitconfig -service-daemon
sudo systemctl enable vncserver-x11-serviced.service

then configure from desktop (clicking on the tray VNC icon) the preferred authentication method for access on your PI via VNC.
These steps are optional, if you prefer can use an HDMI monitor with keyboard/mouse or SSH connection.

Next you need to install a WiringPi library, to make C++ program able to control I/O resources. Use the following commands:


sudo apt-get install git-core
sudo git clone git://git.drogon.net/wiringPi
cd wiringPi
sudo ./build

If you have problems with wiringPi see this link: http://wiringpi.com/download-and-install/

So next you need to get the SIDberry sources:

Return to home dir (cd ..)


sudo git clone https://github.com/gianlucag/SidBerry
cd SidBerry

Take ownership of all files


sudo chown pi:root *

Now edit with your preferred editor the file main.cpp to fix 2 little problems:


1) add #include <unistd.h> after the line #include <sys/time.h>
2) search for \mread and replace with \nread

Now compile the sources to obtain the working executable


sudo g++ -o SidBerry mos6502.cpp SidFile.cpp main.cpp -lwiringPi

Now you can test your work using this command


sudo ./SidBerry R-Type.sid 0

where 0 is the song index of the SID file.
Each SID file my contain various song or variations that you can play changing the index.

If you like to know something more about SID file format, follow this link:
http://cpansearch.perl.org/src/LALA/Audio-SID-3.11/SID_file_format.txt

qnjvo2

Fitted protoboard on PI

image010

image011

image014

You can see a video of operating hardware here:

Next?

I don’t know when, but I would try to generate a 1Mhz clock for the SID using a PI internal timer, also can be interesting make a python GUI for the SIDBerry.

Also, but a little harder, try to change the 6502 player to allow to play a SID format that includes samples, in fact this player, actually was unable to play many famous SID+PCM song that include digitized instruments or voices. When you try to play this there are a SID format error. There are not a official documentation for this mode, and probably is not really standard.