SNES controller Bluetooth HID

Salve, ho finito in questi giorni il prototipo del mio nuovo gamepad..
La mia intenzione era utilizzare il controller del super nintendo su qualsiasi pc, magari con la comodità della comunicazione bluetooth.
Ho trovato alcuni progetti in rete riguardanti l'utilizzo del controller che si sono rilevati molto utili..
Tuttavia nessuno di questi progetti faceva affidamento al riconoscimento della periferica tramite bluetooth HID e si affidavano ad eventuali driver/applicazioni sul sistema host per interpretare i segnali mandati dal gamepad.

Cercherò di evidenziare brevemente solo la parte riguardante l'utilizzo del modulo bluetooth HID, la parte che a me ha fatto più sudare, visto che il resto del progetto é praticamente identico a tutti gli altri.

Devo ancora sistemare tutto ciò che riguarda l'alimentazione ed un'eventuale batteria.

Materiali Utilizzati:
-Arduino Pro mini 3.3V
-BlueSMiRF HID
-un controller snes (super nintendo entertainment system) croce direzionale + 8 pulsanti

Link utili:
Video spiegazione funzionamento controller snes:http://www.instructables.com/id/Bluetooth-SNES-Controller-for-Android/
Altro progetto simile con anche foto utili per l'assemblaggiohttp://forum.xda-developers.com/showthread.php?t=1146205
tutorial bluesmirf hid: HOW TO GET WHAT YOU WANT

Parte "più complessa del progetto":
Per far riconoscere la vostra periferica come controller HID, va impostato il modulo bluetooth tramite ovviamente seriale. I parametri importanti, oltre la velocità comunicazione del'interfaccia seriale sono le flags hid del dispositivo.

Da terminale seriale collegato al modulo bluetooth:
$$$ //si entra in CMD mode
CMD //risposta
SN,snesGP //imposta il nome device
S~,6 //imposta il profilo HID se non fosse già impostato
SM,6 //imposta la riconnessione automatica ad un eventuale riavvio
SH,0010 //dichiaro la periferica un gamepad
SU, //imposta il baudrate della seriale, da concordare rispetto i dati che invia arduino.
--- //esce dal CMD mode

Tutte le modifiche vengono applicate alla successiva avvensione del modulo.

Una volta applicate le HID flags a 0010, il modulo si aspetta di ricevere un input composto in 8 BYTE, io personalmente nn ho trvato modo di cambiare la struttura del frame.
la struttura é la seguente
BYTE 0 = 0xFD (il preambolo che identifica un raw input)
BYTE 1 = 6
BYTE 2 = Asse0
BYTE 3 = Asse1
BYTE 4 = Asse2
BYTE 5 = Asse3
BYTE 6 = Btns0
BYTE 7 = Btns1

ogni Asse rapptesenta l'asse con un intero da 127 a -127 in complemento a 2
ogni Btns rappresenta 8 pulsanti, 1 se premuto, 0 altrimenti

Sostanzialmente ho codificato la croce direzionale del snes su 2 assi e i bottoni in un unico byte.
Arduino non deve far altro che spedire 8byte tramite seriale al modulo, che inoltrerà i dati tramite comunicazione bluetooth.

A breve posterò eventuale codice, foto e spiegazioni un po' meno frettolose.

ottimo lavoro, sono curioso di vedere il resto

x iscrizione

Intanto alcune foto del progetto e dei collegamenti tra le varie componenti
https://plus.google.com/photos/114917699839149086112/albums/5886429668947354177
spero si possano vedere :drooling_face:

sottolineo il fatto che devo ancora integrare tutte le componenti nel gamepad e scegliere un'adeguata batteria, a tal proposito ho dei problemi, di spazio ovviamente.

Il codice di arduino, molto beta, sicuramente si può rendere più compatto :slight_smile:
https://docs.google.com/file/d/0B4d4UZvUxZYKa2ZaWE9ORVNBZGc/edit?usp=sharing

aggiorno, tutto funziona, al momento mi sono accorto di aver invertito l'asse y, infatti l'asse y deve decrementare se va verso l'alto e aumentare se va verso il basso.. sono semplici concetti che si trovano anche in grafica che io non sapevo.

Altro problema sono i descrittori, infatti da linux:

jstest /dev/input/js1
Driver version is 2.1.0.
Joystick (SNESTone) has 4 axes (X, Y, Z, Rx)
and 16 buttons (BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR, ?, ?, ?, ?).
Testing ... (interrupt to exit)

mi da questi nomi ai tasti, cosa che vorrei evitare, ma purtroppo non so come fare tramite bluesmirf, non penso ci sia alcuna maniera di togliere i nomi ai tasti.

Scusa se mi allaccio al tuo topic di pad bt, stiamo parlando anche su altro topic, ce un ottimo pad della sony a basso prezzo che include già batteria ricaricabole e caricatore via usb, credo sia hid, magari se non per comprarlo puoi prendere spunti.
Volendolo usare per pilotare arduino, esempio su un auto telwcomabdata, basterebbe il profilo spp invece di hid. Spp lo si fa con moduli da 5%, mentre hid è piu costoso, ma non sembra esistano pad bt spp, sai se esistono ?

Volendo usare il tuo pad hid verso arduino basta prendere un hid anche lato arduino, servono librerie hid ?