Skocz do zawartości

Arduino Uno + Gamepad. Komunikacja przez SPI


Majki

Pomocna odpowiedź

Witam szanownych forumowiczów. Z góry przepraszam jeśli to zły dział.

Mam problem z nabytym niedawno w Botlandzie gamepadem firmy Dagu.

Link do produktu

Od kilku dni staram się uruchomić dostępny w linku przykładowy program, realizujący komunikację przez SPI. Jako 'master' służy Arduino Uno (oryginał, również z Botlandu).

Po poprawnym podłączeniu wszystkich pinów, wgraniu programu i włączeniu pada, w monitorze portu szeregowego widzę niestety tylko informację o inicjalizacji. Potem okienko zaczyna się przewijać w dół, ale przy wciskaniu klawiszy nie widzę żadnych cyfr.

Diody na gamepadzie migają (z tego co wiem, przy prawidłowym połączeniu powinny normalnie świecić), natomiast na odbiorniku świeci się czerwona dioda Power.

Teraz krótko o tym, czego już próbowałem:

Patrząc na składnię, zauważyłem, że przykładowy plik nie jest już najnowszy, więc dodałem kilka rzeczy (SPISettings, beginTransaction, endTransaction itp.). To niestety nie pomogło.

Mój lekko zmodyfikowany kod:

#include <SPI.h>
#define SCK 9
#define MOSI 11
#define MISO 12
#define SS 10

unsigned char PS2buf[10];
unsigned char i;

SPISettings settings(250000, LSBFIRST, SPI_MODE3);

void setup()
{
 Serial.begin(57600);
 Serial.println("Inization...");  
 SPI.begin();
 delay(100);
 Serial.println("Inizatin finished.");
}

void loop(){
 if(Get_PS2Dat(PS2buf))
   for(i=0;i<9;i++){
     Serial.print(PS2buf[i]);
     }
   Serial.println();
   delay(250);
}

unsigned char PS2_RWByte(unsigned char dat)
{
 SPI.transfer(dat);
 return SPDR;    
}

unsigned char Get_PS2Dat(unsigned char *buf)
{
 unsigned char i;
 SPI.beginTransaction(settings);
 digitalWrite(SS,LOW);
 delayMicroseconds(15);
 buf[0]=PS2_RWByte(0x01);delayMicroseconds(15); 
 buf[1]=PS2_RWByte(0x42);delayMicroseconds(15); 
 buf[2]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[3]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[4]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[5]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[6]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[7]=PS2_RWByte(0x00);delayMicroseconds(15); 
 buf[8]=PS2_RWByte(0x00);delayMicroseconds(15);
 digitalWrite(SS,HIGH);
 SPI.endTransaction();
 if((buf[0]==0xff)&&(buf[1]==0x41)&&(buf[2]==0x5a))  
 return 1;
 if((buf[0]==0xff)&&(buf[1]==0x73)&&(buf[2]==0x5a))
 return 2;
 return 0;
}

Próbowałem zmienić maksymalną prędkość komunikacji w SPISettings. Wcześniej był tam ustawiony Clock_Divider_64, więc po prostu podzieliłem 16MHz/64 = 250000. Taka jest też wartość, która najczęściej 'przewijała się' w materiałach odnośnie padów PS2. Okazyjnie próbowałem też z prędkościami 500k i 125k, ale na niewiele się to zdało.

Próbowałem pozamieniać kilka pinów - gdzieś czytałem, że użycie pinu 13 jako CLK może sprawiać problemy, poza tym zmieniałem też pin slaveSelect. Bez rezultatu.

Próbowałem zgodnie z innymi sugestiami dołożyć rezystory 1kOhm lub 10kOhm do Data, do CLK i do Command (Do każdego z osobna i do wszystkich na raz, szczerze mówiąc nie pamiętam już wszystkich kombinacji). Żadnej poprawy.

Starałem się manipulować opóźnieniami w przesyłaniu pakietów danych (wpisując różne wartości jako argument do funkcji delayMicroseconds). Mam tu na myśli zarówno to pierwsze, wstępne opóźnienie po przestawieniu pinu ss na LOW, jak i odstępy w przesyłaniu kolejnych bajtów. Zrobiłem nawet pętlę, która miała przetestować warianty od 0 do 200us dla obu tych wartości. Nic to nie dało.

Pewna zmiana następuje, gdy w void loop() przed rozpoczęciem pętli for dodam dodatkową linię (np. Serial.print("abc")). Wtedy zaczynam widzieć ciągi cyfr, ale nie mają one nic wspólnego z naciskanymi klawiszami - na początku powtarza się 166000000 (czyli po prostu 'command byte' który próbuję przesłać do pada), a po nim 10000000 i 00000000. Ogólnie widzę, że składnia w tej funkcji loop też jest nieco 'dziwna' (brak klamr po 'if' itp.), ale nie wiem co mógłbym zmienić, żeby doprowadzić ją do działania.

W akcie desperacji przerzuciłem się na bibliotekę PS2X. Przyznam, że nie spędziłem z nią jak dotąd zbyt wiele czasu, ale również nie widzę poprawy. Wyskakuje komunikat "No controller found'.

Powoli kończą mi się opcje. Przyznaję, że jestem początkujący, i to moja pierwsza próba połączenia czegokolwiek przez SPI, więc możliwe, że przegapiam coś zupełnie oczywistego. Będę bardzo wdzięczny za wszelkie sugestie.

Link do komentarza
Share on other sites

Dzięki za odpowiedź. Usunąłem te dwie linie kodu (pin ss jako wyjście i stan wysoki), bo gdzieś przeczytałem, że SPI.begin() zajmuje się tym automatycznie. Teraz dodałem je znowu, ale to niestety nie pomaga.

Link do komentarza
Share on other sites

Pozwolę sobie na mały bump - od ostatniego posta minęło trochę czasu, a może ktoś kiedyś skorzysta i nauczy się czegoś na moich błędach 😉

Zdecydowałem się kontynuować testy z biblioteką PS2X. Niestety, w większości przypadków nadal otrzymuję następujący komunikat:

No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips. Unknown Controller type found.

Udało mi się zrobić malutki krok naprzód po wprowadzeniu dwóch zmian.

1. Podłączyłem kabel Vcc gamepada do pinu 5V na Arduino zamiast zalecanego 3.3V

2. Dodałem rezystor 10k Ohm łączący linie Vcc i DATA

Dalej pojawia się ten sam komunikat, jednak zauważyłem, że kiedy poruszam linią VCC (najlepiej szybko odłączając i podłączając napięcie), w monitorze portu szeregowego zaczynam widzieć informacje o naciskanych klawiszach! Co prawda są to tylko losowe komunikaty (bo nic w danej chwili nie naciskam), ale imho świadczy to o tym, że problem leży nie po stronie software'owej, ale raczej w moim obwodzie. Pytanie brzmi, co można by zmienić, żeby doprowadzić go do działania?

Obecnie testuję umieszczanie dodatkowych rezystorów o różnych wartościach na linii DATA lub Vcc (lub obydwu), jak na razie bez rezultatu.

Może ktoś z bardziej doświadczonych elektroników mógłby naprowadzić mnie na jakiś trop, lub stwierdzić z czego może wynikać takie zachowanie obwodu?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To już ostatni bump, dla ludzi, którzy mogą mieć kiedyś podobny problem co ja.

Otóż zaryzykowałem i kupiłem innego pada do PS2. Odpalenie go z biblioteką PS2X zajęło mi tym razem jakieś 30 sekund - wszystkie problemy przeszły jak ręką odjął.

Wygląda na to, że niektóre pady po prostu 'mają problem' jeśli chodzi o komunikację z czymś innym niż prawdziwe PlayStation 2, a mnie akurat przydarzył się taki egzemplarz.

Tak więc wniosek jest następujący: Jeżeli spróbowaliście już wszystkiego, i nie widać poprawy - spróbujcie z innym padem.

PS: Ten pad, który zadziałał u mnie to nie żaden oryginał od Sony, ale podróbka za 30zł, jakich wiele na rynku. Z licencjonowanymi padami pewnie jest większe prawdopodobieństwo sukcesu, ale, jak widać, wśród tańszych zamienników też da się znaleźć coś co zadziała.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.