Neben der Steuerung des Raspberry Pi’s über Infrarot Fernbedienungen, 433 Mhz Sender, Instant Messenger und vielen weiteren, kann auch ein kabelloser Xbox 360 Controller vom Raspberry Pi ausgelesen werden und entsprechend darauf reagiert werden. So kann das Gamepad als externe Maus (im Desktop Modus) verwendet werden oder Skripte und somit die GPIOs angesteuert werden. In RetroPie kann der Xbox Controller außerdem als Eingabemedium für Spiele auf dem Raspberry Pi genutzt werden.
In diesem Tutorial werden mehrere dieser Möglichkeiten aufgezeigt. Angefangen von der Installation der benötigten Software, über die Verwendung als Maus bis hin zum Schalten der GPIOs und dem Steuern eines Servo Motors mit Hilfe des Joysticks.
Zubehör
Um den Raspberry Pi mit dem Xbox 360 Controller nutzen zu können, ist nicht viel Zubehör erforderlich:
Jedes Raspberry Pi mit mind. einem freien USB Port kann also verwendet werden, wie z.B. das leistungsstärkere Raspberry Pi 3.
Falls du das kleine Projekt unten nachbauen willst, benötigst du außerdem noch:
- Servo Motor
- 4 LEDs (Rot, Grün, Blau, Gelb)
- 4x 330Ω Widerstände
- Breadboard
- Jumper Kabel
Raspberry Pi Software für Xbox 360 Controller
Für Linux Distributionen gibt es einen entwickelten Treiber, speziell für die Kommunikation mit Xbox Controllern.
Wir installieren also zuerst den Treiber, damit mit dem Controller kommuniziert werden kann:
sudo apt-get install xboxdrv
Jetzt kann der USB Empfänger angeschlossen werden. Mit lsusb
kannst du überprüfen, ob er erkannt wurde:
pi@raspberrypi:~ $ lsusb Bus 001 Device 005: ID 045e:0291 Microsoft Corp. Xbox 360 Wireless Receiver for Windows Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Nun kannst du den Controller anschalten und testen, ob er erkannt wird. Dazu startest du den Treiber mittels:
sudo xboxdrv --detach-kernel-driver
Anschließend sollte sich beim Drücken der Tasten der Log verändern, der angibt, welche Taste(n) gedrückt sind und ggf. dessen Wert.
Auf der Dokumentation-Seite gibt es alle Befehle mit kurzer Erklärung dazu. So ist es bspw. möglich die LEDs des Xbox 360 Controllers leuchten/blinken zu lassen (--led NUM
) oder vibrieren lassen (-r 255,255
). Insgesamt können bis zu 4 Funkcontroller verwendet werden und angesprochen bzw. ausgelesen werden.
Xbox 360 Controller als Rasbperry Pi Maus verwenden
Eine Funktion die mir besonders gefällt, ist die Maus-Option. Da ich bereits selten eine Tastatur am Raspberry Pi angeschlossen habe (ich nutze fast ausschließlich SSH und manchmal den Remotedesktop) und noch seltener eine Maus, finde ich es sehr praktisch den Xbox 360 Wireless Controller auch als Maus für den Raspberry Pi nutzen zu können. Alles was dazu benötigt wird, haben wir bereits installiert.
Lediglich ein weiterer Parameter muss angegeben werden:
sudo xboxdrv --detach-kernel-driver --silent --mouse
Die Geschwindigkeit und Auswahl der Tasten kannst du außerdem auch ändern (wie steht in der Dokumentation). Falls der Befehl bereits bei Systemstart ausgeführt werden soll, kannst du entweder ein Autostart Skript schreiben oder crontab nutzen.
Folgende (Standard) Belegung der Tasten für die Verwendung als Maus gilt:
- A: Linksklick
- B: Rechtsklick
- X: Mittlere Maustastenklick
- Y: Eingabe / Enter
- Linker Controller: Mausbewegung
- Rechter Controller: Scrollrad
- Steuerkreuz: Pfeiltasten
- Start: Vorwärts
- Back: Zurück
- LB: Bild auf
- RB: Bild ab
Mit dem Xbox 360 Controller Skripte und Befehle starten
Eine Möglichkeit den Treiber in eigenen Skripten zu vewenden wäre das manuelle Auslesen der Ausgabewerte. Um uns diesen Aufwand zu ersparen, können wir aber auf eine bereits erstellte Python Bibliothek zurückgreifen.
git clone https://github.com/FRC4564/Xbox cd Xbox
Anbei ist auch ein Beispiel (sample.py
), welches man sich ggf. ansehen kann.
Ich habe daher mal ein kleines Beispiel mit einem Servomotor und 4 LEDs als Inspiration aufgebaut. Die Verkabelung ist recht einfach (Vorwiderstand an die LEDs), daher nur hier als schematischer Aufbau gezeigt:
Wie ein Servomotor genau angesteuert werden kann, ist in diesem Tutorial nachzulesen.
Der Code dazu ist folgender (Datei z.B. mit sudo nano xbox360_example.py
erstellen und mit STRG+X,O speichern und beenden):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
import RPi.GPIO as GPIO import math import xbox GPIO_LED_GREEN = 23 GPIO_LED_RED = 22 GPIO_LED_YELLOW = 27 GPIO_LED_BLUE = 17 GPIO_SERVO_PIN = 25 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(GPIO_LED_GREEN, GPIO.OUT) GPIO.setup(GPIO_LED_RED, GPIO.OUT) GPIO.setup(GPIO_LED_YELLOW, GPIO.OUT) GPIO.setup(GPIO_LED_BLUE, GPIO.OUT) GPIO.setup(GPIO_SERVO_PIN, GPIO.OUT) def updateServo(pwm, angle): duty = float(angle) / 10.0 + 2.5 pwm.ChangeDutyCycle(duty) def angleFromCoords(x,y): angle = 0.0 if x==0.0 and y==0.0: angle = 90.0 elif x>=0.0 and y>=0.0: # first quadrant angle = math.degrees(math.atan(y/x)) if x!=0.0 else 90.0 elif x<0.0 and y>=0.0: # second quadrant angle = math.degrees(math.atan(y/x)) angle += 180.0 elif x<0.0 and y<0.0: # third quadrant angle = math.degrees(math.atan(y/x)) angle += 180.0 elif x>=0.0 and y<0.0: # third quadrant angle = math.degrees(math.atan(y/x)) if x!=0.0 else -90.0 angle += 360.0 return angle if __name__ == '__main__': joy = xbox.Joystick() pwm = GPIO.PWM(GPIO_SERVO_PIN, 100) pwm.start(5) while not joy.Back(): # LEDs led_state_green = GPIO.HIGH if joy.A() else GPIO.LOW led_state_red = GPIO.HIGH if joy.B() else GPIO.LOW led_state_yellow = GPIO.HIGH if joy.Y() else GPIO.LOW led_state_blue = GPIO.HIGH if joy.X() else GPIO.LOW GPIO.output(GPIO_LED_GREEN, led_state_green) GPIO.output(GPIO_LED_RED, led_state_red) GPIO.output(GPIO_LED_YELLOW, led_state_yellow) GPIO.output(GPIO_LED_BLUE, led_state_blue) # Servo x, y = joy.leftStick() angle = angleFromCoords(x,y) if angle > 180 and angle < 270: angle = 180 elif angle >= 270: angle = 0 updateServo(pwm, angle) joy.close() pwm.stop() |
Anschließend kannst du den Code ausführen (sudo nano xbox360_example.py
) und mit den Buttons die LEDs an und ausschalten, sowie mit dem linken Joystick den Servomotor lenken. Um zu stoppen, drücke die BACK Taste.
Im nachfolgenden Video kannst du dir dieses kleine Projekt außerdem anschauen:
Darüber hinaus können noch viele weitere Sachen mit dem Raspberry Pi und Xbox 360 Controller angestellt werden. Ich plane z.B. eine Robotersteuerung mit Hilfe des Joysticks und verändern der Modi anhand der Knöpfe.
Nun, was wären eure nächsten geplanten Projekte mit dem Controller? 🙂
37 Kommentare
Hallo,
bei meinem Versuch kommt eine Fehlermeldung. Hängt es mit Python und Python3 zusammen? Da das Modul xbox vo 11/9/13 ist?
Danke für eine Antwort.
Die Fehlermeldung:
pi@raspberrypi:~/roboter $ sudo python3 xbox360_example.py
Traceback (most recent call last):
File „xbox360_example.py“, line 49, in
joy = xbox.Joystick()
File „/home/pi/roboter/xbox.py“, line 67, in __init__
raise IOError(‚Unable to detect Xbox controller/receiver – Run python as sudo‘)
OSError: Unable to detect Xbox controller/receiver – Run python as sudo
pi@raspberrypi:~/roboter $
Hast du es denn mal mit Python2.7 versucht und bekommst du damit den selben Fehler?
Ist hier schon eine Lösung gefunden worden?
Bei mir erscheint die selbe Fehlermeldung, unabhängig davon ob python3 oder 2.7.
Hey!
Ich habe die Lösung gefunden.
Man kann den Controller einmal verwenden nach einem Reboot. Dannach nicht mehr. Das liegt daran, dass das Programm nicht ordnungsgemäß über STRG+C beendet wurde sondern einfach geschlossen. Dann führt sich der Befehl „joy.close()“ nie aus.
Das heißt einmal den Raspberry Pi neustarten und in Zukunft die Programme mit STRG+C beenden, damit „joy.close()“ durchlaufen kann.
Mare
Hallo tolles Tutorial :),
Mein Controller tut sich öfter mal schwer die Bluetoothverbindung herzustellen.
Weißt du ob und wie man das verbessern könnte?
Hallo Felix,
danke für die Antwort. Hier die Fehlermeldungen:
pi@raspberrypi:~ $ cd roboter
pi@raspberrypi:~/roboter $ sudo python xbox360_example.py
^X^CTraceback (most recent call last):
File „xbox360_example.py“, line 67, in
x, y = joy.leftStick()
File „/home/pi/roboter/xbox.py“, line 233, in leftStick
return (self.leftX(deadzone),self.leftY(deadzone))
File „/home/pi/roboter/xbox.py“, line 111, in leftX
raw = int(self.reading[3:9])
KeyboardInterrupt
pi@raspberrypi:~/roboter $
pi@raspberrypi:~/roboter $ sudo python2.7 xbox360_example.py
^CTraceback (most recent call last):
File „xbox360_example.py“, line 67, in
x, y = joy.leftStick()
File „/home/pi/roboter/xbox.py“, line 233, in leftStick
return (self.leftX(deadzone),self.leftY(deadzone))
File „/home/pi/roboter/xbox.py“, line 118, in leftY
return self.axisScale(raw,deadzone)
File „/home/pi/roboter/xbox.py“, line 135, in axisScale
if abs(raw) < deadzone:
KeyboardInterrupt
pi@raspberrypi:~/roboter $
Hast du die Ausführung unterbrochen (STRG+C)? Oder trat der Fehler einfach so auf?
Ja, da sich nichts (für mich sichtbares) tat, hab ich unterbrochen, war das ein Fehler?
Naja, dann ist es wohl kein Softwarefehler. Eventuell wird der Controller nicht erkannt. Hast du die Testdateien aus diesem Tutorial denn ausprobiert?
Danke für die Antwort.
Morgen gehe ich das Tutorial noch einmal exakt durch, Wäre doch gelacht, wenn es nichts wird.
Ich frage mich, warum mein Programm keine Fehlermarke mich Compiliert
In Python sind die Einrückungen wichtig, da es keine Klammernotation gibt. Die sind bei dir komplett zufällig. Das kann so nicht funktionieren.
Hallo Felix,
ich bekomme immer wieder die Fehlermeldung „No module named xbox“.
Wie gehe ich damit um? Für mich ist das Raspberry Pi komplettes neuland…
Ich habe bereits den Treiber installiert und getestet. Müsste alles passen.
Die Datei xbox.py muss im selben Verzeichnis wie dein Skript sein.
Wie kann ich einen zweiten Controller verwenden?
Wenn ich z.B. den selben Aufbau nochmal mache und aus einem Programm beide Aufbauten mit jeweils einem Controller steuern kann.
Ja, aber du musst diese per Code identifizieren.
Wie muss das denn aussehen?
Ich hab ziemlich viel recherchiert und komme einfach nicht drauf:(
Hallo,
Weis jemand wie man mit Hilfe eines ps3 Controllers anstatt des Xbox 360 Controllers die gpio pins steuern kann?
Vielen Dank im Voraus.
Funktioniert dieser Aufbau auch mit dem Xbox 360 Controler für Windows?
Ja, ist der selbe nur kabelgebunden.
Hallo Felxi,
ich bekomme beim Ausführen folgende Fehlermeldung:
Traceback (most recent call last):
File „xbox1.py“, line 13, in
joy = xbox.Joystick()
File „/home/pi/xbox.py“, line 72, in __init__
raise IOError(‚Unable to detect Xbox controller/receiver – Run python as sudo‘)
IOError: Unable to detect Xbox controller/receiver – Run python as sudo
Die Erkennung des Controllers mit:
sudo xboxdrv –detach-kernel-driver
funktioniert ohne Probleme.
Ist es eventuell ein Problem mit der xbox.py?
LG
Norbert
Hast du das Python Skript mit sudo python xxx.py gestartet?
Ich habe das selbe Problem wie Norbert. Ich habe das Python Script sowohl als sudo python als auch ohne sudo gestartet. Der Fehler tritt immer wieder auf.
Der Controller ist an und kann auch verwendet werden (sowohl mit sudo xboxdrv –deatch-kernel-driver selbst aber auch als sudo xboxdrv –detach-kernel-driver –silent –mouse
Ist der Fehler bereits irgendwem bekannt, bzw. gibt es dafür eventuell sogar schon eine Lösung?
Ich hatte das nicht, aber ihr könntet ggf. mal beim Entwickler auf Github nachfragen.
Gibt es mittlerweile eine Lösung? Wenn ja wäre es praktisch diese oben zu verlinken o.Ä…
Hey!
Ich habe die Lösung gefunden.
Man kann den Controller einmal verwenden nach einem Reboot. Dannach nicht mehr. Das liegt daran, dass das Programm nicht ordnungsgemäß über STRG+C beendet wurde sondern einfach geschlossen. Dann führt sich der Befehl „joy.close()“ nie aus.
Das heißt einmal den Raspberry Pi neustarten und in Zukunft die Programme mit STRG+C beenden, damit „joy.close()“ durchlaufen kann.
Mare
Funktioniert das Tutorial auch mit dem XBox One Controller?
Nein.
Muss ich Änderung an der xbox.py Datei machen wenn ich zwei Controller gleichzeitig abfragen will?
Gibt’s was neues ? Hab den Fehler bei „joy = xbox.Joystick()“
Hallo,
schoen waere es auch, wenn man die Funktion eines XBOX One Controllers der ueber Bluetooth emulieren koennte. Zum Beispiel wenn man eine Raspberry Pi Zero W dafuer benutzen koennte, waere es auch noch guenstig.
(Sorry die Tastatur hat keine Umlaute)
Wie kann ich lb, lt, dd, dl, usw abfragen?
A abfragen klappt ja über Joy.A()
Das klappt mit joy.lb() oder joy.dd() nicht.
Hallo Felix,
das Tutorial sieht gut aus und die Umsetzung funktioniert bei mir auch bis zu einem gewissen Punkt.
Das Problem vermute ich „auf meinem Pi“:
Das Modul xbox.py greift auf eine Funktion aus dem Modul „wpilib“ zurück.
Woher bekomme ich die? Kannst Du mir da bitte helfen?
Danke, Kai
Hallo
Ich bekomme bei der verwendung des xbox.py
den Fehler
File „xbox.py“, line 53
waitTime = time.time() + 2.0
Hat da wer eine Lösung
Danke und gesund bleiben
Lg Hans
Vielen Dank für das tolle Tutorial!
Ich habe mir direkt einen xbox controller bestellt 🙂
Ist für die RasPi 3B+ ebenfalls ein USB-Empfänger erforderlich? Bluetooth stünde doch onboard bereits zur Verfügung?
Besten Gruß,
Hallo,
erstmal vielen Dank für die tolle Zusammenfassung. Ich habe mir auch schon seit längerem überlegt, einen Controller als Sender für ein RC-Auto zu nutzen. Dazu habe ich jetzt auch einen schönen Leitfaden 😉
Ich kenne mich bei diesem Thema also noch nicht so ganz aus.
Wäre es auch möglich einen ein PS4 oder XBOX ONE-Controller als Sender zu nutzen? Empfänger bleibt natürlich der RPI.
Hallo ich versuche das Projekt mit den LED und mit dem Roboter hinzukriegen aber die gleiche Meldung taucht bei mir auf: Joy = xbox.Joystick() raise IO error Unable to detect Xbox controller/receiver.
ich hab alle Antworte durchgelesen und das Program mit sudo python ausgeführt, wenn ich das mache taucht bei mir die Meldung: No Module named RPi.GPIO auf.
könnte jemand bitte mir was helfen?
LG