Skocz do zawartości

Raspberry Pi i Arduino, połączenie bluetooth, sterowanie w grach


Pomocna odpowiedź

Witam,

Jako, że to mój pierwszy post na forum chciałbym się przywitać i pozdrowić forumowiczów 🙂

Ale do sedna:

Mam Raspberry Pi 3 model B i Arduino UNO R3, próbuję stworzyć mini konsolę do gier. Arduino jest połączone z joystickiem , klawiaturą i modułem bluetooth HC-06.

Schematy połączeń:

Kod z Arduino:

int xPin = A1;
int yPin = A0;
int buttonPin = 2;

int xPosition = 0;
int yPosition = 0;
int buttonState = 0;

void setup() {
 // initialize serial communications at 9600 bps:
 Serial.begin(9600); 

 pinMode(xPin, INPUT);
 pinMode(yPin, INPUT);

 //activate pull-up resistor on the push-button pin
 pinMode(buttonPin, INPUT_PULLUP); 

 //#
 pinMode(8, HIGH);
 digitalWrite(8, HIGH);

}

void loop() {
 xPosition = analogRead(xPin);
 yPosition = analogRead(yPin);
 buttonState = digitalRead(buttonPin);

 Serial.print("X: ");
 Serial.print(xPosition);
 Serial.print(" | Y: ");
 Serial.print(yPosition);
 Serial.print(" | Button: ");
 Serial.print(buttonState);

 Serial.println(" ");

 adc_key_in = analogRead(5);    // read the value from the sensor

 if (adc_key_in > 557) {
   if (adc_key_in < 572) {
     Serial.println("Button 1 pressed"); }}

 if (adc_key_in > 621) {
   if (adc_key_in < 636) {
     Serial.println("Button 2 pressed"); }}

 if (adc_key_in > 701) {
   if (adc_key_in < 714) {
     Serial.println("Button 3 pressed"); }}

 if (adc_key_in > 769) {
   if (adc_key_in < 782) {
     Serial.println("Button 4 pressed"); }}

 if (adc_key_in > 876) {
   if (adc_key_in < 899) {
     Serial.println("Button 5 pressed"); }}

 delay(1000); // add delay
}

Wszystko działa niby prawidłowo, moduł prawidłowo wyświetla (przesyła) wiadomości na aplikację 'bluetooth terminal' na telefonie z androidem.

Screen z telefonu:

I teraz pytanie:

Jak przesłać (odebrać) te informacje na Raspberry (niestety nie mam z nim doświadczenia), tak, aby dało się symulować klawiaturę?

Czyli:

Przyciskając Button 1-5 żeby Raspberry odbierał to jak przyciski z GamePada, lub ewentualnie poprostu symulować wciśnięcie jakis przycisków na klawiaturze.

A Joystick jako strzałki (prawo, lewo, góra, dół)

Zakładam, że problemem jest stworzenie skryptu w raspbianie który będzie odbierał informacje od Arduino i wykonywał odpowiednie czynności. Niestety nie natrafiłem na żadne pomocne materiały używając wujka google 👹

Z poziomu raspberry jestem się w stanie połączyć z HC-06 i sparować, niestety nie mam pojęcia co dalej (a pomocą paczki bluez urządzenie zostaje wykryte i da się z nim połączyć)

Druga sprawa: Czy da się napisać skrypt pod raspbiana aby łączył się z tym "padem" automatycznie po resecie urządzenia (obojętnie którego) ? W tym momencie, jeśli wyłącze Arduino i włącze ponownie urządzenia zostają rozłączone i nie parują się automatycznie z powrotem po włączeniu. Czy da się tak zrobić aby przy starcie linuxa automatycznie łączył się on z padem jeśli go wykryje?

Z góry dziękuję za pomoc i pozdrawiam 😳

Link to post
Share on other sites

Masz kilka możliwości, w zależności od tego jak bardzo lubisz programować niskopoziomowo w kernelu i jak dużo się chcesz nauczyć.

1. Użyć drugiego Arduino, które będzie udawać klawiaturę albo gamepad po USB. Dobrze do tego nadają się tanie moduły Pro Micro. Kod do tego https://github.com/NicoHood/HID

2. Napisać program w czymkolwiek, który będzie odczytywał z urządzenia szeregowego, które się pojawia jak sparujesz HC-06 z komputerem, i będzie w jakiś sposób symulował klawiaturę lub gamepad. Robi się to różnie, w zależności od tego, czy ma to działać pod X-ami czy w konsoli...

3. Napisać własny sterownik bluetooth, który będzie emulował klawiaturę.

4. Zamiast HC-06 użyć modułu bluetooth, który potrafi być widoczny jako urządzenie HID (na przykład coś jak https://www.sparkfun.com/products/retired/10938). Da się też podobno podmienić firmware w HC-06, ale skądś trzeba je wziąć.

Link to post
Share on other sites

Witam kolegę, dziękuję za odpowiedź

1. Użyć drugiego Arduino, które będzie udawać klawiaturę albo gamepad po USB. Dobrze do tego nadają się tanie moduły Pro Micro. Kod do tego https://github.com/NicoHood/HID

Po USB odpada, w całym projekcie chodzi mi o to aby ograniczyć użycie kabli do minimum. Docelowo planuje aby jedynymi połączeniami było zasilanie do Raspberry i kabel do minitora/TV (Arduino będzie w obudowie z baterią).

2. Napisać program w czymkolwiek, który będzie odczytywał z urządzenia szeregowego, które się pojawia jak sparujesz HC-06 z komputerem, i będzie w jakiś sposób symulował klawiaturę lub gamepad. Robi się to różnie, w zależności od tego, czy ma to działać pod X-ami czy w konsoli...

Ten sposób byłby dobry, poleciłby kolega może jakieś materiały na ten temat? Tutoriale lub dokumentację?

Chodzi o to ze arduino wraz z joystickiem, przyciskami i modułem będzie zamknięte w obudowie i to będzie cały PAD, sterować on będzie raspberry(przez bluetooth) w ten sposób aby dało się nim przykładowo chodzić w grach które planuje stworzyć albo poprostu sciagnac jakies emulatory. Jako, że jestem można powiedzieć laikiem w tej kwestii, przydało by się jakieś naprowadzenie 🙂

3. Napisać własny sterownik bluetooth, który będzie emulował klawiaturę.

Jak wyżej, poleciłby kolega jakieś materiały z którymi mógłbym rozpocząć? Czy ten sposób nie będzie zbyt pracochłonny i skomplikowany?

4. Zamiast HC-06 użyć modułu bluetooth, który potrafi być widoczny jako urządzenie HID (na przykład coś jak https://www.sparkfun.com/products/retired/10938). Da się też podobno podmienić firmware w HC-06, ale skądś trzeba je wziąć.

Przedmiot na podanej stronie nie istnieje, czy chodzi o cos takiego?:

https://botland.com.pl/moduly-bluetooth/2473-bluefruit-ez-key-kontroler-klawiatury-hid-bluetooth-12-wejsc.html

Czy to byłby najlepszy/najszybszy sposób? Wolałbym oczywiście poskładać to z cześci które mam żeby nie generować kosztów ale jeżeli ta płytka ma załatwić całą komunikację to oczywiście warta byłaby przemyślenia.

I jeszcze pytanie odnośnie tego kontrolera klawiatury, nim się steruje podając tylko sygnał cyfrowy na odpowiednie wejścia w płytce?

Dzięki za pomoc! 😅

Link to post
Share on other sites

Nie mówię, że to drugie Arduino, połączone po USB, nie może samo mieć jakiegoś modułu radiowego (bluetooth czy cokolwiek innego) i komunikować się z arduino w kontrolerze. Wtedy nie masz kabli.

Materiałów nie polecę, bo nie znam -- orientuję się tylko mniej więcej, że takie coś jest możliwe. Prawdopodobnie po prostu musiałbyś poczytać dokumentację do kernela.

Link oczywiście forum zepsuło, spróbuj z URL-a usunąć nawias i kropkę. To co ty podlinkowałeś wygląda na bardzo ograniczone urządzenie -- robi tylko za klawiaturę i to z paroma klawiszami. Nie mam pojęcia czy daje się także skonfigurować jako gamepad.

Generalnie jak chcesz się bawić w robienie tego w ten sposób, to przygotuj się na naukę o protokole bluetooth i standardach urządzeń HID, bo prawdopodobnie będziesz musiał temu modułowi powiedzieć dokładnie co się ma znaleźć w każdej wysyłanej ramce. Zaleta tego jest taka, że twój pad będzie działać z każdym komputerem i telefonem bez potrzeby instalowania sterowników albo jakichś dziwnych programów. (Rozwiązanie z dwoma Arduino także ma tą zaletę.)

Link to post
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

Kurcze nie ma jak to sobie robić pod górkę. Nie wiem jakie gry cię interesują, ale jak retro to wystarczą ci dwa scalaki konkretnie MCP23017 na I²C. Więcej masz TUTAJ

Schematu nie ma, ale z opisu można go samemu spróbować odtworzyć, raczej żadnej magi tu nie ma, właściwie wszystko skupia sie do określania adresów układów scalonych i tyle.

W sumie są podae w opisie 🙂.

2×16 GPIO pins

Overall, the two GPIO expanders provide 32 GPIO pins for arbitrary usage. With revision 2.X of the Raspberry Pi, these pins can be accessed via the SPI interface of the Raspberry Pi. With revision 1.X of the ConterolBlock, these pins can be accessed via the I2C interface with the I2C addresses 0x20 and 0x27.

Dla mnie projekt trochę przerośnięty bo lepiej byłby sobie to zrobić na scalakach w SMD, a jeszcze lepiej jak sam budujesz pada, to włożyć bezpośrednio do niego. 1 pad 1 chip.

Jak już musisz mieć łączność bezprzewodowa, to nie wiem czy za pomocą modułów radiowych nie da sie przesłać informacji z I2C, ale musiałby byc one dwukierunkowe. Ostatecznie łącze jednokierunkowe, a zamiast tego MPC23017 jaka ATTiny która będzie go udawać na jako SLAVE I2C i jednocześnie odbierać dane z pada. Chyba w sumie najprostsze podejście jak ma to być układ bezprzewodowy własnej roboty, ale będzie to układ dedykowany dla konkretnego rozwiązania. Jedyna opcja gotowa, to pad dla X360, ten na bluetooth dla PC.

PS. Ja też jestem na etapie budowy konsoli na Pi-ętaszku, ale na razie nie planuję budowy pada, spróbuję wykorzystać to co mam, czyli pady XBOXowe. Ogólnie zrobienie samemu pada bezprzewodowego nie jest łatwe, bo będziesz musiał napisać sterownik dla systemu który go obsłuży.

Link to post
Share on other sites

Panowie dzięki za podpowiedzi.

Niestety mój projekt zakłada wykorzystanie Arduino do budowy pada więc tego nie przeskoczę, poza tym wszystko już zostało zakupione więc nie chcę zmieniać schematu. No i jak się znudzi to zawsze będzie można rozebrać i zrobić coś innego 😃

Znacie może Panowie jakąś dobvrą bibliotekę do obsługi bluetooth w pythonie lub C++ ?

Bo w sumie z tym co mam to chyba się do tego sprowadzi - napisania kodu który połączy się z HC-06 i prawidłowo odbierze wysyłane przez niego sygnały. Wolałbym nie wgrywać nowego firmware do HC-06 bo nie wiem jak 😃

Jeśli się tak nie da to chyba najszybszym(i najprostrzym) rozwiązaniem będzie (aby nadal wykorzystać arduino i resztę części) wymienić HC-06 na "Bluefruit EZ-Key - kontroler klawiatury HID" i wtedy raspberry powinien z automatu otrzymać przez bluetooth odpowiednie sygnały jak ze zwykłej klawiatury HID, przykłądowo strzałki i WSAD które pozniej w tworzonych grach można przypisać pod odpowiednie akcje.

Czy przyjąłem dobry schemat rozumowania?

Miłego dnia i pozdrawiam 🙂

Link to post
Share on other sites

Do odczytywania danych, które dostajesz z hc-06 wystarczy ci biblioteka pySerial, bo po sparowaniu pojawia się w systemie urządzenie szeregowe, na którym pojawiają się wszystkie odebrane dane.

Natomiast możesz się jeszcze zastanowić nad dokupieniem Pro Micro i HC-05, sparowaniem hc-05 z twoim hc-06 i zaprogramowaniem Pro Micro jako gamepada usb -- wtedy będziesz mieć "dongla", który podłączasz do dowolnego komputera, żeby używać twojego pada. Wiele fabrycznych gamepadów tak robi, tylko nie używają wtedy bluetooth, tylko tańszych modułów radiowych, takich jak NRF24L01.

  • Pomogłeś! 1
Link to post
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.