|
ultimo aggiornamento 11 febbraio 2012 |
|
Per impartire i comandi ad un
robot è possibile utilizzare un controller che di solito è utilizzato nella
console per videogiochi tipo Playstation 2 della Sony
Per pilotare ArduinoBOT può essere utilizzato qualunque controller compatibile
con la versione originale.
Su di esso sono presenti sedici pulsanti di cui quattro formano un pad direzionale e quattro tasti (identificati dai simboli triangolo, cerchio, croce e quadrato) verranno utilizzati per il movimento della telecamera, sono poi presenti due joystick analogici
Anche se ogni tasto può essere
configurato per eseguire un'azione specifica, tutti funzionano sullo stesso
principio. Ogni pulsante è un interruttore che completa un circuito quando è
premuto; come già detto sono presenti due joystick analogici che sono realizzati
con due potenziometri (resistenze variabili) posti ad angolo retto tra loro
sotto il joystick.
In base alla posizione, il joystick varia la resistenza del potenziometro
interno e, di conseguenza, anche la tensione in uscita. Leggendo questa tensione
con un convertitore analogico, è possibile determinare l'angolo in cui si trova
il joystick, e determinare la risposta appropriata sulla base di tale angolo.
Un'altra particolarità del controller (se è della serie Dual Shock), è il force
feedback che fornisce una stimolazione tattile. Il Force feedback è realizzato
attraverso l'uso di un dispositivo molto comune: un semplice motore elettrico,
inserito in ogni impugnatura. Sull'albero di ciascun motore è montato un peso
sbilanciato. Quando l'alimentazione è fornita al motore, il peso inizia a
girare.
Poiché il peso è sbilanciato, il motore cerca di oscillare ma, essendo il motore
bloccato all'interno del controller, l'oscillazione si traduce in una vibrazione
del controller stesso. l’azionamento dei motori è controllato da un processore
che li codifica e li trasmette tramite una linea seriale a 8bit.
L’uscita è rappresentata da uno speciale connettore a 9 pin Figura 15) le cui
funzioni dei pin sono riportate nella Tabella
Pin | Nome | Descrizione |
1 |
DATA | Questo pin porta il
segnale che il controllore invia ad Arduino ogni volta che si preme
un tasto. Si tratta di una trasmissione seriale a 8-bit. |
2 |
COMMAND | Questo pin è utilizzato
da Arduino per inviare informazioni al controller. Tali informazioni possono azionare i motori in un controller Dual Shock al momento opportuno. Si utilizza una trasmissione seriale a 8 bit. |
3 |
NON USATO | |
4 |
MASSA | |
5 |
ALIMENTAZIONE | Questo pin fornisce l’alimentazione che può variare dai 3 ai 5V. |
6 |
ATT | Questo pin è utilizzato
da Arduino per avvertire il controller che sta per trasmettere dei
dati. ATT è usato per ottenere l'attenzione del controller. Questo segnale andrà a livello basso per la durata di una trasmissione. |
7 |
CLOCK | Usato per mantenere le unità in sincronia. Segnale inviato dalla scheda Arduino. |
8 |
NON USATO | |
9 |
ACKNOWLEDGE | Questo pin invia un segnale alla scheda Arduino dal controller dopo ogni comando che si riceve sul pin 2. |
Cavo interfaccia controller-Shield
Come abbiamo visto il controller
ha uno speciale connettore per il collegamento alla console di gioco. Per
evitare di dover tagliare il cavo è possibile utilizzare un apposito adattatore
reperibile sul sito
Lynxmotion con il
codice PS2C-01.
Il cavo presenta da un lato lo speciale connettore mentre all’altro capo i cavi
sono raggruppati in 4 connettori secondo lo schema riportato sotto.
Esempio di utilizzo del controllo sul mio robot ArduinoBOT
Utilizzo delle librerie
Per l'interpretazione dei comandi
forniti dal controller verso Arduino sono disponibili due tipologie di librerie:
GPSX e PSX.
La prima denominata GPSX è più completa poiché permette anche di monitorare i
joystick analogici e il controllo dei due motori che forniscono il force
feedback.
La seconda PSX è più semplice e fornisce solo l’indicazione dei tasti premuti.
La libreria GPSX può essere scaricata a questo indirizzo http://pspunch.com/pd/files/library/GPSX.zip ( https://github.com/madsci1016/Arduino-PS2X) è in grado di gestire 2 joypad. I tasti che possono essere premuti sul joypad e definiti dalla libreria, sono:
|
I pulsanti sono considerati in 3 casi:
Sono premuti, quindi l'istruzione sarà PRESSED_nometasto(padNo) e l'istruzione restituirà un 1 se è vera uno 0 se è falsa.
Restano premuti, l'istruzione sarà
IS_DOWN_nome tasto(padNo) e l'istruzione
restituirà un 1 se è vera o uno 0 se è falsa.
Es. while (IS_DOWN_SQUARE(PSX_PAD1)
==1){ //fai qualcosa} Arduino fa qualcosa dentro al loop while fino quando il
tasto quadrato rimane premuto
Sono rilasciati, quindi l'istruzione sarà RELEASED_nome tasto(padNo) e l'istruzione restituirà un 1 se è vera o uno 0 se è falsa. Inoltre possiamo leggere dati analogici dai due joystick sulla manopola lungo i 2 assi, i valori restituiti dalle seguenti istruzioni saranno compresi tra 0 e 255.
ANALOG_RIGHT_X(padNo); ANALOG_RIGHT_Y(padNo); ANALOG_LEFT_X(padNo); ANALOG_LEFT_Y(padNo)
Nelle manopole della playstation 2 ci sono 2 motori (Dual Shock) ed è possibile abilitarli e disabilitarli. Un motore da una vibrazione più forte mentre l'altro da una vibrazione più lieve.
PSX.motorEnable(padNo, Motor1Enable, Motor2Enabl
Dove:
• padNo = PSX_PAD1 | PSX_PAD2
•
Motor1Enable = MOTOR1_ENABLE | MOTOR1_DISABLE
• Motor2Enable = MOTOR2_ENABLE | MOTOR2_DISABLE
La vibrazione è regolabile via software con una semplice istruzione.
PSX.motor(padNo, Motor1OnOff, uint8_t Motor2Speed)
Dove:
• padNo = PSX_PAD1 | PSX_PAD2
• Motor1OnOff = MOTOR1_ON | MOTOR1_OFF
• Motor2Speed = uint8_t che assumerà il valore zero se sarà uguale a 0x00 fino
ad arrivare a 255 se posto uguale a 0xFF.
Possiamo infine decidere via software, se usare la manopola in modalità digitale, (quindi il joystick sinistrò avrà lo stesso effetto di freccia sù, freccia giù, sinistra destra, e il joystick sinistro avrà lo stesso effetto di triangolo, cerchio quadrato e x), oppure in modalità analogica quindi i joystick, se mossi, restituiranno un valore analogico come visto nella funzione precedente ANALOG_xxx_YYY_asse(padNo)).
•PSX.mode(padNo, mode, lock)
Dove:
• padNo = PSX_PAD1 | PSX_PAD2
• mode = MODE_DIGITAL | MODE_ANALOG
• lock = MODE_UNLOCK | MODE_LOCK
Utilizzo della libreria
Per utilizzare i comandi bisognerà prima di tutto scaricare la libreria da questo link: http://pspunch.com/pd/files/library/GPSX.zip Il file andrà poi scompattato all’interno della cartella GPSX a sua volta posta nella cartella delle librerie Arduino. Dentro questa cartella troverete i seguenti files:
GPSX.c
GPSX.h
GPSXClass.cpp
GPSXClass.h
keywords.txt
README_en.txt
README_ja.txt
Schematic.bmp
Compresa una cartella denominata “Example” al cui interno troverete un programma “interface_pad1.pde” per testare il controller. Prima di utilizzare il programma occorrerà editare la libreria GPSX.c con un editor di testo (notepad andrà benissimo), e una volta aperto il file sostituite nelle righe #define il numero del pin effettivamente utilizzato. Per cui le linee:
#define DAT_PIN 7 // CTL1 Data
#define CMD_PIN 6 // CTL2 Command
// CTL3 9V for Motor (Optional)
// CTL4 GND
// CTL5 VCC
#define AT1_PIN 5 // CTL6 Attention (PAD1)
#define CLK_PIN 4 // CTL7 Clock
// CTL8 N/C
#define ACK_PIN 3 // CTL9 ACK
#define AT2_PIN 2 // CTL6 Attention (PAD2) per un eventuale secondo joypad
Diventano nella nostra applicazione:
#define DAT_PIN 2 // CTL1 Data
#define CMD_PIN 3 // CTL2 Command
// CTL3 9V for Motor (Optional)
// CTL4 GND
// CTL5 VCC
#define AT1_PIN 4 // CTL6 Attention (PAD1)
#define CLK_PIN 5 // CTL7 Clock
// CTL8 N/C
#define ACK_PIN 6 // CTL9 ACK
#define AT2_PIN 7 // CTL6 Attention (PAD2)
Una volta fatta la modifica, salvate il file e assicuratevi che l'estensione sia sempre .c Ora potete aprire il programma Arduino e controllare se la libreria è stata installata correttamente.
LibreriaPSX
Anche questa libreria permette ad Arduino di interfacciarsi con uno controller
digitale standard Playstation (o suoi cloni). Ciascun pulsante è definito nella libreria, i tasti riconosciuti sono: Left,
Down, Right, Up, Strt, Slct, Squ, X, O, Tri, R1, L1, R2, L2.
Utilizzo della libreria
Per l'installazione bisognerà scaricare la libreria da questo link: http://arduino.cc/playground/uploads/Main/Psx.zip Si dovrà poi decomprimere il pacchetto nella directory Arduino \ librerie. Dentro questa cartella troverete i seguenti files:
.DS_Store
gpl.txt
keywords.txt
Psx.cpp
Psx.h
Compresa una cartella denominata “Example” al cui interno troverete un programma
“Psx.pde” per testare il controller. L'uso della biblioteca è semplice, richiedendo solo un’inizializzazione,
un’assegnazione dei pin e un comando di lettura.
Comandi:
Psx ()
Usato per inizializzare la libreria: Es: Psx Psx;
setupPins (dataPin, cmndPin, attPin, clockPin, ritardo)
Definisce i pin di Arduino a cui è collegato il controller, così come il ritardo
per cui il clock rimane alto o basso: Ex: Psx.setupPins (2, 3, 4, 5, 10)
read ()
Legge i dati pulsante dal controller playstation.: Es: data = Psx.read
();
I dati sono restituiti come numeri interi senza segno, e ogni bit rappresenta un
pulsante specifico. Può essere testati utilizzando un semplice if.: Es: If (dati
& psxUp)
Ciascun pulsante è definito nella libreria, quindi non c'è bisogno di usare codici esadecimali durante il test. I tasti riconosciuti sono riportati nella tabella sotto riportata
psxLeft |
0x0001 |
psxDown |
0x0002 |
psxRight |
0x0004 |
psxUp |
0x0008 |
psxStrt |
0x0010 |
psxSlct |
0x0080 |
psxSqu |
0x0100 |
psxX |
0x0200 |
psxO |
0x0400 |
psxTri |
0x0800 |
psxR1 |
0x1000 |
psxL1 |
0x2000 |
psxR2 |
0x4000 |
psxL2 |
0x8000 |
Dual Stick Gamepad - Transparent GM-1520T
Elenco revisioni | |
11/02/2012 | Emissione preliminare |