Raspberry Pi: GPIO per PS3 Controller in Python steuern

So,
ich bin nun endlich dazu gekommen eine kleine Anleitung für die Steuerung von Motoren mit einem PS3 Controller (Wireless, Dualshock) zu schreiben.

Als erstes benötigt man einen Bluetooth Dongle.
Ich hatte noch einen bei mir rumliegen, daher kann ich nichts zum Hersteller, etc sagen.
Ich denke aber dass, hier jeder Bluetooth Dongle klappen sollte.

Bei der Einrichtung der Bluetoothverbindung verweise ich direkt auf diese Anleitung:

http://www.raspians.com/Knowledgebase/ps3-dualshock-controller-install-on-the-raspberry-pi/

Hier gab es keinerlei Probleme, wenn man dies Schritt für Schritt befolgt, daher muss ich die Schritte nicht nochmal hier abtippen.

Nachdem der Controller erkannt wurde und der Bluetoothmaster im Controller angepasst wurde kann es losgehen.

(P.S. Meine anfängliche Angst, dass der Controller danach für die PS3 unbrauchbar wird, war unbegründet. Nach dem Ändern des Bluetoothmasters erkennt die PS3 den Controller zwar nicht mehr, aber durch das Anschließen des Controllers per USB-Kabel an die PS3 werden die ursprünglichen Einstellungen wiederhergestellt und der Controller wird wieder wie gewohnt von der Konsole erkannt)

Die eigentliche Steuerung der Motoren übernimmt ein Python Script.

Rc-car-ps3.py

In diesem Beispiel funktioniert die Steuerung wie auf dem Video zu sehen:

R2= Analogwippe zur Geschwindigkeitsregelung

Steuerkreuz = Richtungsangabe

R2 muss immer betätigt werden während eine Richtungstaste gedrückt wird.

Vor dem Start der .py Datei muss „sixad“ entweder als Daemon laufen, oder vorab per

§ sixad

gestartet werden.

Ab und zu gab es kleine Probleme mit der Paarung des Controllers.

Hierzu habe ich noch keine Ursache gefunden.
Eine Lösung war meist eine Kombination aus den folgenden Befehlen:

– Ein Neustart des Bluetooth Dienstes per:

– § service bluetooth restart
– § sixad –restore
– § sixad –stop
– § sixad- start

Die Nummern der Achsen in dem Programm können sehr einfach geändert werden, um die Steuerung für Euch anzupassen.

Mit dem Shell Befehl:

§ sudo jstest / dev/input/js0

 

erhält man eine Übersicht aller Achsen und Knöpfe des Controllers.
Betätigt man nun die Achsen oder Knöpfe, so kann man erkennen welche Achse zu welchem Knopf gehört.
Nun kann auch schon das Python Script nach Euren Wünschen angepasst werden.

Wichtig zu erwähnen ist noch die Verkabelung in meinem Fall.
Bei einer anderen Verkabelung sind natürlich auch die GPIO Ausgänge entsprechend zu ändern.

Mein Anschlussplan:
GPIO 17 – Motor links vor
GPIO 24 – Motor links zurück
GPIO 23 – Motor rechts zurück
GPIO 24 – Motor rechts vor
GPIO 1 (PWM) – liegt an BEIDEN „Enable“ Eingängen des L298

 

P.S. Beim Start der Datei wird das Script eine Reihe von endlosen Debug-Befehlen ausgeben. Dies scheint aber ein Bug von pygame zu sein. Bisher konnte ich keine Lösung dafür finden.

Falls jemand die Steuerung komplett über die Analogsticks löst, wäre ich auch an der Lösung interessiert 😉

7 Gedanken zu „Raspberry Pi: GPIO per PS3 Controller in Python steuern

  1. Pingback: Anleitung: Ansteuerung der GPIO Ausgänge per PS3 Controller online | ElektronXElektronX

  2. Hallo Leute,

    ein wirkich nettes Projekt!

    Ich würde gerne mit dem Ps3 Controller Kommandozeilen Befehle ausführen, jedoch habe ich keinen Erfolg.

    Controller wird erfolgreich erkannt etc..

    Beispielsweise möchte ich mit der

    —>Taste "X"

    —> "sudo reboot"

    —> system startet neu…

    etc … man hat ja dann viele Möglichkeit

    Lichtsteuerung etc..

    Ich hab mich ein bisschen an python scripts versucht, jedoch ohne Erfolg.

    Die Verbindung zum Controller steht.

    Alle Tasten werden jedoch mit -37268??

    Wenn ich eine taste betätige wird die zahl 0 dann positiv..

    Eventuell kann mir einer von euch helfen und mir ein skript schreiben..

    Ich selbst bin glaub ich an den if abfragen gescheitert…

    Würde mich freuen,

    Lg Hausi

    • Hey, zu einer Sache kann ich dir weiterhelfen:
      Es ist ganz normal, dass der Wer erst negativ und beim fester Drücken positiv wird. Daran siehst du, dass selbst die normalen Taster druckempfindlich sind. Es ist mir allerdings kein Spiel auf der Playstation bekannt, das die 4 Aktionsknöpfe als "analoge Buttons" behandelt. Lege mit "if-Abfragen" einen Bereich fest, zb >=0. Sobald das eintritt, führst du deine Aktion aus.

  3. Solche if Abfragen habe ich probiert.

    == 0

    >0

    >=0

    >1000

    Hat aber leider nie funktioniert.

    Wärst du so nett und könntest du mir das Beispiel vl runtertippen?

    Mit einer endlosschleife, sodass er laufend abfragt.

    Ich wäre dir super dankbar!

    Liebe Grüße,

    Hausi

    • Mach eine Endlosschleife mit

      while (True):

      //Code hier

      time.sleep(0.1)

      Diese Schleife frägt nun 10 mal pro Sekunde ab, ob ein Knopf gedrückt wurde. Das ist allerdings ungenau. Besser ist es, du machst "Event Listener" …

      Mit den GPIO-Pins gibt es so ein "Action-Detect". Da kannst du steigende und fallende Flanken abfragen. Musst du dich mal einlesen. 🙂

      … aber ob das mit nem USB-Controller auch geht, weiß ich nicht.

  4. Ja ich hab das eig so probiert..

    Vl hab ich vergessen etwas einzubinden oder so?

    Kann mir vl jemand ein kurzes Programm für einen knopf schreiben?

    Das würde mir schon reichen, dass ich etwas zum vergleichen hab oder so..

Kommentar verfassen