GamePad USB do Raspberry Pi



W różnych projektach, w których stosujemy Raspberry Pi, przydałby się czasem pulpit do sterowania, nie połączony żadnym kablem do komputerka. Takim rozwiązaniem może być gamepad na USB.




Jest to tanie rozwiązanie i efektywne. Z racji swojej budowy, ma wiele możliwych kombinacji, ze względu na dużą ilość guzików i dwa joystick'i.

W moim przypadku posłużyłem się gamepadem VAKOSS, który kosztuje około 35 zł.


Gdzie sprawdzić czy Raspberry Pi widzi gamepad'a?


W tym caleu należy odpalić LXTerminal. Czy malina widzi gamepad'a możemy sprawdzić stosując dwie różne komendy.

lsusb
jest to komenda sprawdzająca jakie urządzenia są podpięte do portów USB.

Druga metoda to:

ls /dev/input
jest to komenda sprawdzająca zawartość katalogu /dev/input, która się zmienia w zależności od tego jakie urządzenia są podpięte do portów.



Na powyższym rysunku widać odpowiedzi maliny na powyższe komendy, w sytuacji gdy gamepad był podłączony do portu USB, oraz gdy nie był podłączony. Pierwsza komenda pozwala sprawdzić czy fizycznie udało sięgo podpiąć. Druga komenda pokazuje dwa nowe katalogi i dwa nowe pliki, na których będziemy dalej pracować.

Aby sprawdzić zawartość plików posłużymy się komendą cat.

cat /dev/input/event0
W efekcie pokazują się różne niezrozumiałem znaki, które są efektem naciskania guzików na gamepad'zie.
No nie bardzo jesteśmy w stanie na ich podstawie programować.


Jak go zamontować?


Dlatego musimy wykorzystać bibliotekę evdev.
Możemy ją zainstalować wpisując wterminalu komendę:

sudo pip3 install evdev

Jak udało się już zainstalować bibliotekę, opuszczamy terminal i przechodzimy do programowania w Python'ie. W tym celu odpalamy Python'a, tj. poprzez pasek menu, wybieramy programming, a mastępnie Python (Idle) 3.

Najprostszą metodą na sprawdzenie czy biblioteka siępoprawnie zainstalowała jest jej zaimportowanie i włączenie pomocy. Wykonuje się to w sposób następujący:

	import evdev
	help(evdev)
	

Jeżeli biblioteka jest źle zainstalowana, po komendzie import pojawi się komunikat o błędach. Jeżeli dobrze ją zainstalowaliśmy, wyświetli się "help" biblioteki, tak jak na rysunku poniżej.




Jeżeli już wiemy, że biblioteka się dobrze zainstalowała, możemy ją wykorzystać do sprawdzenia zawartości pliku event0.W główny oknie edycyjny Idle należy wpisać następujące komendy:

	from evdev import InputDevice, categorize, ecodes
	g=InputDevice('/dev/input/event0')
	print(g)
	

W efekcie otrzymujemy komunikat o podłączonym urządzeniu wykorzystującym plik event0. W moim przypadku jest to "ShanWan USB WirelessGamepad" (co widać na powyższym rysunku).

Wypadałoby jednak zacząć rozpoznawać przyciski gamepad'a. W tym celu musimy napisać nasz pierwszy program w Python'ie. Klikamy na pasku narzędzi File, następnie otwieramy nowy plik i piszemy następujący programik.

	from evdev import InputDevice, categorize, ecodes
	gamepad=InputDevice('/dev/input/event0')
	for event in gamepad.read_loop():
		print(event)

Program ten ma za zadanie drukować na ekranie wszelkie "zajścia" polegające na naciśnięciu klawisza na gamepad'zie. W tym celu przywołana jest pętla, w której program nasłuchuje zdarzeń

for event in gamepad.read_loop().




W efekcie po naciśnięciu dowolnego klawisza na gamepad'zie, na ekranie drukowany jest komunikat zawierajacy kilka informacji. W swobodnym tłumaczeniu komunikat brzmi następująco.

Wydarzenie o czasie (ta długa liczba to czas uniksowy, czyli liczony w sekundach od 1970 roku), kod, typ, wartość.

Aby móc lepiej oznaczyć zdarzenia musimy do naszego programu dopisaćdwie linijki, dzięki którym będizemy mogli rozpoznać "zajścia" poprzez ich kategoryzację.

		from evdev import InputDevice, categorize, ecodes
		gamepad=InputDevice('/dev/input/event0')
		for event in gamepad.read_loop():
			if event.type == ecodes.EV_KEY:
				print(categorize(event))
		



Tym razem kounikat jest trochę inny. Oprócz czasu wydarzenia, pojawia się nazwa własna klawisza (podana w nawiasach kwadratowych) oraz informacja czy został przyciśnięty "down", czy puszczony "up".

Skoro już wiey który guzik jest przyciskany, to możemy połączyć z tym zdarzeniem konkretne koendy wynikowe. Dlatego zmodyfikujmy program tak, aby po naciśnięciu konkretnego guzika drukował na ekranie komunikat, np."guzik nr 1". Kod takiego programu będzie wyglądał następująco:

	from evdev import InputDevice, categorize, ecodes, KeyEvent
		gamepad=InputDevice('/dev/input/event0')
		for event in gamepad.read_loop():
			if event.type == ecodes.EV_KEY:
				zmienna=categorize(event)
				if zmienna.keystyle == KeyEvent.key_down:
					if zmienna.keycode == 'BTN_BASE':
						print('guzik nr 1')
					elif zmienna.keycode == 'BTN_TOP2':
						print('guzik nr 2')
					elif zmienna.keycode == 'BTN_THUMB':
						print('guzik nr 3')
					elif zmienna.keycode == 'BTN_TOP':
						print('guzik nr 4')
	


Efekt powyższego kodu prezentuje poniższy rysunek.




To tyle w temacie. Powodzenia w realizacji projektów... :)

:)