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 programiki-przykł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ć dzwię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ń:
2 z 4
Rys. 1. Wtyk złącza gamepada playstation
Oznaczenie i kolor
Pin Opis
przewodu
Tą linią kontroler przesyła dane do
1 DATA
playstation
Linią plastation przesyła komendy do
2 CMD
kontrolera
Zasilanie silników generujących wibracje
8 MOTOR
pada 7-9V
4 GND Masa
5 VCC Zasilanie 3.3-5V
Niskim stanem niskim na tej linii
6 ATT playstation sygnalizuje rozpoczęcie
transmisji
Sygnał zegara, taktujący dane na liniach
7 CLK
DATA i CMD, generowany przez playstation
8 NC. Nie podłączony
Pad potwierdza odbiór jednego bajtu
9 ACK
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, =0;
,r= ;
, = ;
, = ;
for( =0; i< ; i++, byte>>= )
(i= ; <8; ++, >>=1)
( = ; < ; ++, >>= )
( = ; < ; ++, >>= )
{
{
{
{
CLK_CLR;
;
;
;
if( & 0x01) CMD_SET; else CMD_CLR;
(byte & ) ; ;
( & ) ; ;
( & ) ; ;
CLK_SET;
;
;
;
r>>= ;
>>=1;
>>= ;
>>= ;
if( ) r|= ;
(DATA_IN) |=0x80;
( ) |= ;
( ) |= ;
}
}
}
}
CMD_SET;
;
;
;
_delay_us( );
(20);
( );
( );
return r;
;
;
;
}
}
}
}
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<< )|(1<< ) // WÅ‚Ä…cza SPI AVRa w trybie MASTER
=( << )|( << )
=( <=( << )|( << )
|(1<< ) // LSB wysyłany pierwszy
|( << )
|( <|( << )
|(1<< ) // SCK normalnie w stanie wysokim
|( << )
|( <|( << )
|(1<< ) // Próbkowanie po wznoszącym zboczu SCK
|( << )
|( <|( << )
|(1<< )|(1<< ); // Częstotliwość sygnału SCK fosc/128
|( << )|( << );
|( <|( << )|( << );
// Wysyła jeden bajt poprzez SPI
unsigned char pad_byte( )
(unsigned char byte)
( )
( )
{
{
{
{
SPDR = byte;
= ;
= ;
= ;
while(!( & (1<< )));
(!(SPSR & ( <(!( & ( << )));
(!( & ( << )));
_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
znalezć 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.
4 z 4
Bit Bit
Bit 0 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7
1 2
Bajt
SELECT - - START UP RIGHT DOWN LEFT
nr 4
Bajt
L2 R2 L1 R1 trójkąt kółko krzyżyk kwadrat
nr 5
Bajt dżojstik prawy, wychylenie w kierunku lewo-prawo, 0x00 -
nr 6 max. w lewo, 0xff-max. w prawo
Bajt dżojstik prawy, wychylenie w kierunku góra-dół, 0x00 - max.
nr 7 w górę, 0xff-max. w dół
Bajt dżojstik lewy, wychylenie w kierunku lewo-prawo, 0x00 - max.
nr 8 w lewo, 0xff-max. w prawo
Bajt dżojstik lewy, wychylenie w kierunku góra-dół, 0x00 - max. w
nr 9 górę, 0xff-max. 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 (1-9) 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 znalezć w dokumencie: Playstation 2 controller
protocol notes
16.10.11 ABXYZ
Copyright © 2009-2011 ABXYZ - Wszelkie prawa zastrzeżone


Wyszukiwarka

Podobne podstrony:
Kurs AVR GCC Wyświetlacz LCD od Nokii310
Kurs AVR GCC cz 5
Kurs AVR GCC, cz 3
Kurs AVR GCC cz 2
Kurs AVR GCC Dekoder RC5
Kurs AVR GCC cz 3
Kurs AVR GCC cz 1
Kurs AVR GCC, cz 1
Kurs AVR GCC, cz 5
Kurs AVR GCC, cz 4
Kurs AVR GCC, cz 2
Kurs AVR GCC cz 4
Using the EEPROM memory in AVR GCC
AVR GCC w Linuksie przykład instalacji ze źródeł
AVR GCC kompilator C dla mikrokontrolerów AVR, część 12
AVR GCC kompilator C dla mikrokontrolerów AVR, część 11

więcej podobnych podstron