XYZ Hobby Robot-Kurs AVR-GCC Gamepad od PlayStation.pdf

(82 KB) Pobierz
XYZ Hobby Robot-Kurs AVR-GCC Gamepad od PlayStation
1 Z 4
Artykuł pochodzi ze strony XYZ HOBBY ROBOT ( xyz.isgreat.org )
Kurs AVR-GCC. Gamepad od Sony PlayStation
16.10.11 ABXYZ
Zwykle na płytkach startowych, przeznaczonych do nauki
programowania różnych typów mikrokontrolerów, wlutowuje się dwa,
trzy lub cztery przyciski. Spotyka się również płytki z klawiaturą
zrobioną z przycisków wlutowanych w kilu rzędach. Jest to wygodne,
gdyż można uruchamiać proste programikiprzykłady. Jednak obsługa
w programie wielu przycisków okazuje się nieco uciążliwa, a
dodatkowo występuje problem drgania styków przycisków. Zamiast
walczyć z przyciskami polecam podłączyć do płytki gamepad od
konsoli Sony PlayStation2, w ten sposób temat przycisków zostanie w
prosty i elegancki sposób rozwiązany.
Na fotografii poniżej wydać gamepad do PS2, który kosztował jakieś
tam kilkanaście zł. Nie jest to oryginalny pad PlayStation, ale za to
ma "bajerancką" obudowę z przezroczystego tworzywa i jest
podświetlany niebieskimi diodami LED. Jest to tzw. "analogowy" pad,
obok czternastu przycisków posiada dodatkowo dwie gałki(
analogowe "dżojstiki"). Wcześniejsze model "cyfrowe" miały jedynie
przyciski. Odczytywać można nie tylko które z przycisków gamepada
zostały wciśnięte, ale też siłę nacisku na przyciski. Pad posiada
również dwa silniki z niesymetrycznymi ciężarkami na osi do
generowania wibracji; wibracje mogą na przykład zastąpić dźwięk
brzęczyka. Możemy sterować prędkością silnika z większym
ciężarkiem, drugi silnik, z mniejszym ciężarkiem można tylko włączać
i wyłączać. A to jeszcze nie wszystko, bo dostępne są również
bezprzewodowe wersje pada dla playstation2, w cenie już od ok 20zł.
Bardzo łatwo można zrealizować radiowe sterowanie na odległość
kilku metrów.
Fot. 1. Gamepad do konsoli playstation 2 . Do wykorzystania 14 przycisków z możliwością
odczytu siły nacisku, dwa dżojstiki analogowe, dwa silniki do generowania wibracji.
Gamepad playstation wyposażony jest w szeregowy interfejs,
możemy go wprost podłączyć do sprzętowego interfejsu SPI AVRa.
Wtyk na końcu przewodu pada ma dziewięć wyprowadzeń:
728055193.006.png 728055193.007.png 728055193.008.png
2 Z 4
Rys. 1. Wtyk złącza gamepada playstation
Pin Oznaczenie i kolor
przewodu
Opis
1
DATA
Tą linią kontroler przesyła dane do
playstation
2
CMD
Linią plastation przesyła komendy do
kontrolera
8
MOTOR
Zasilanie silników generujących wibracje
pada 79V
4
GND
Masa
5
VCC
Zasilanie 3.35V
6
ATT
Niskim stanem niskim na tej linii
playstation sygnalizuje rozpoczęcie
transmisji
7
CLK
Sygnał zegara, taktujący dane na liniach
DATA i CMD, generowany przez playstation
8
NC.
Nie podłączony
9
ACK Pad potwierdza odbiór jednego bajtu
danych ustawiając tę linię w stan niski
Tab. 1. Opis wyprowadzeń złącza gamepada playstation
Konsola playstation rozpoczyna komunikację z padem ustawiając na
linii ATT stan niski. Transmisja danych odbywa się jednocześnie
w dwóch kierunkach. Linią CMD playstation przesyła komendy do
pada, jednocześnie linią DATA gamepad przesyła do playstation
informacje o stanie przycisków. Na linii CLK playstation generuje
sygnał zegara taktujący dane na obu liniach danych CMD i DATA.
Normalnym stanem początkowym sygnału zegara to stan wysoki.
Próbkowanie linii danych (CMD i DATA) następuje po narastającym
zboczu sygnału CLK. Dodatkowo gamepad potwierdza odebranie
kolejnych bajtów danych ustawieniem linii ACK w stan niski(
z wyjątkiem ostatniego bajtu). Bity w bajcie przesyłane są
w kolejności od najmłodszego do najstarszego.
Poniżej wkleiłem funkcję "pad_byte", która wysyła/odbiera jeden bajt
z/do gamepada.
unsigned char pad_byte
( unsigned char byte
)
{
unsigned char i
,r
= 0
;
for
(i
= 0
; i
< 8
; i++,
++, byte>>=
>>= 1
)
{
CLK_CLR
;
if
(byte
& 0x01
) CMD_SET
; else CMD_CLR
;
CLK_SET
;
r>>=
>>= 1
;
if
(DATA_IN
) r|=
|= 0x80
;
}
CMD_SET
;
_delay_us
( 20 );
));
return r
;
}
++,
>>=
>>=
||=
);
728055193.009.png 728055193.001.png
3 Z 4
Listing 1. Funkcja wysyłająca/odbierająca jeden bajt do/z gamepada
Możemy również przyłączyć pad poprzez sprzętowy interfejs SPI
AVRa, poniżej mamy drugą wersję funkcji "pad_byte", która właśnie
wykorzystuje sprzętowy SPI mikrokontrolera atmega.
// Konfiguracja SPI AVRa
SPCR =(
=( 1 <<
<<SPE)|(
)|( 1 <<
<<MSTR
) // Włącza SPI AVRa w trybie MASTER
|(
|( 1 <<
<<DORD
) // LSB wysyłany pierwszy
|(
|( 1 <<
<<CPOL
) // SCK normalnie w stanie wysokim
|(
|( 1 <<
<<CPHA
) // Próbkowanie po wznoszącym zboczu SCK
|(
|( 1 <<
<<SPR0)|(
)|( 1 <<
<<SPR1);
); // Częstotliwość sygnału SCK fosc/128
// Wysyła jeden bajt poprzez SPI
unsigned char pad_byte
( unsigned char byte
)
{
SPDR
= byte
;
while (!(
(!(SPSR
&
( 1 <<
<<SPIF)));
)));
_delay_us
( 20 );
));
return SPDR
;
}
Listing 2. Funkcja wysyłająca/odbierająca jeden bajt do/z gamepada, korzystając ze
sprzętowego interfejsu SPI mikrokontrolera atmega
Gamepad potwierdza odbiór bajtu danych ustawiając na chwilkę linię
ACK w stan niski, lecz w zamieszczonych tutaj przykładach nie będzie
to wykorzystywane, linię ACK pozostawiłem niepodłączoną.
Rozmowa mikrokontrolera z gamepadem odbywa się w następujący
sposób: Najpierw mikrokontroler ustawia linię ATT w stan niski, co
aktywuje interfejs gamepada. Dalej, wywołując wielokrotnie funkcję
"pad_byte", mikrokontroler wysyła do gamepada ciąg bajtów
zawierający zakodowaną komendę wraz z parametrami. Jednocześnie
wielokrotnie wywoływana funkcja "pad_byte" zwraca ciąg bajtów
odczytany z gamepada, który zawiera na przykład informację o stanie
przycisków i dżojstików analogowych.
Przykładowo, żeby odczytać stan przycisków gamepada i stopień
wychylenia drążka dżojstików analogowych wyślemy do gamepada
dziewięć bajtów zawierających komendę: 0x42"Controller poll", jak
w tablicy poniżej. Opis pozostałych komend gamepada playstation2
znaleźć można w dokumencie Playstation 2 controller protocol notes
Nr Bajt wysþany Bajt odebrany
1 0x01 0x0xff
2 0x42 0x73
3 0x00 0x5A
4 0x00 dane
5 0x00 dane
6 0x00 dane
7 0x00 dane
8 0x00 dane
9 0x00 dane
Tab. 2. Ciąg bajtów wysyłanych/odebranych do/z gamepada. Wysyłany bajt 0x42 to kod
komendy "Controller poll"
Odczytane z gamepada bajty numer 4 i 5 zawierają informacje
o stanie przycisków, wartość bitu 0 oznacza, że przycisk jest
wciśnięty; a bajty numer 6..9 zawierają informację o stopniu
wychylenia gałek dżojstików analogowych.
==(
<<<
)|(
<<<
||(
<<<
||(
<<<
||(
<<<
||(
<<<
)|(
<<<
));
(!(
<<<
);
728055193.002.png 728055193.003.png 728055193.004.png
4 Z 4
Bit 0
Bit
1
Bit
2
Bit 3 Bit 4 Bit 5 Bit 6 Bit 7
Bajt
nr 4
SELECT START UP RIGHT DOWN LEFT
Bajt
nr 5
L2 R2 L1 R1 trójkąt kółko krzyżyk kwadrat
Bajt
nr 6
dżojstik prawy, wychylenie w kierunku lewoprawo, 0x00
max. w lewo, 0xffmax. w prawo
Bajt
nr 7
dżojstik prawy, wychylenie w kierunku góradół, 0x00 max.
w górę, 0xffmax. w dół
Bajt
nr 8
dżojstik lewy, wychylenie w kierunku lewoprawo, 0x00 max.
w lewo, 0xffmax. w prawo
dżojstik lewy, wychylenie w kierunku góradół, 0x00 max. w
górę, 0xffmax. w dół
Tab. 3. Odczytane z gamepada bajty numer 4 i 5 zawierają informacje o stanie przycisków;
bajty numer 6..9 zawierają informację o stopniu wychylenia gałek dżojstików analogowych.
Przykþadowy programik
Przykładowy program był testowany na mikrokontrolerze atmega
z częstotliwością pracy 8MHz. Obok gamepada ps2, dołączyłem do
portów we/wy AVRa osiem diod LED i cztery przełączniki. Z użyciem
przełączników wybieramy który numer bajtu (19) ma być pokazany
na ośmiu diodach LED.
Katalog z plikami projektu można pobrać klikając w link ps2_pad.zip .
Na zakończenie podpowiem jeszcze, że ,aby uzyskać informacje
o stopniu siły nacisku na przyciski, a i mieć możliwość sterowania
silnikami wibracji, potrzeba wcześniej te funkcje aktywować,
wysyłając jednorazowo kilka komend konfiguracyjnych. Wszytko na
ten temat można znaleźć w dokumencie: Playstation 2 controller
protocol notes
16.10.11 ABXYZ
Copyright © 20092011 ABXYZ Wszelkie prawa zastrzeżone
Bajt
nr 9
728055193.005.png
Zgłoś jeśli naruszono regulamin