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 22 – Motor rechts vor
GPIO 18 (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 😉

20 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..

  5. Grüße ich bin hier gerade auf deine Seite gestoßen
    Doe sache mit deinem Controller würde mich arg vorran bringen.

    Jedoch hast du in deinem anschlussplan zwei mal pin 24 aungegeben könnte einer davon pinn 22 sein ?
    Und GPIO 1 (PWM) – liegt an BEIDEN „Enable“ Eingängen des L298
    welcher ist gpio 1 ? meinst du hier GPIO18 PIN 12 (PWM) ?

    DAnke Norbert

    • Hey, du hast recht.
      Ich habs korrigiert.
      Der letzte ist GPIO 22.

      Der PWM Pin sollte auch GPIO 18 sein. (Pin 12)
      Schau mal in die über dem Video verlinkte Python Datei. Dort sind die Pins korrekt.

      Danke für den Hinweis

  6. Grüße nochmal
    ich habe nun endlich Zeit gefunden mich mit dem ps3 Controller zubefassen.
    Leider geht dein oben angeführter Link „Einrichtung der Bluetoothverbindung“
    nicht mehr. dennoch bich ich ein Stück weit vorran gekommen.
    nun fehlt scheinbar nur noch „sixad“ kannst du mir evt. erklären,
    wie ich dieses auf dem pi einrichte oder sagen wo ich eine Erklärung finde?
    danke Norbert

    • Hey,
      Name geändert 😉

      Muss es zwingend der PS3-Controller sein? habe gestern auch gesehen, dass der Link nicht mehr aktuell ist. Im gleichen Zug, habe ich ein neues Roboter-Auto mit einem PS4-Controller steuerbar gemacht. Durch einen anderen Treiber ging die Einrichtung auch um einiges einfacher.

      Ich versuche die Anleitung dazu heute Abend online zu stellen.

  7. Grüße Christoph
    Ja. im Moment sollte es der PS3.C sein.
    Diesen habe ich mir erst vor kurzem besorgt.
    (..und gestern zum ersten mal verbunden. nun fehlt scheinbar nur noch sixad)
    Um mein Projekt welches im Augenblick via ‚curse‘ über TastaTur gesteuert wird,
    komfortabler zu bediennen.
    (Dieses möchte ich später über eine 2,4Ghz Verbindung über größere
    Entfernung steuern (bis 300m).)
    Es handelt sich dabei um ein Kettenfahrzeug als Grundgestell,
    Greifarm,Schiebeschild, Schneefrese.Mähbalken etz optional..

    Auch wenn ich denke die der PS4.C-Anleitung für viele hier interressant wäre.
    kommt es für mich gerade nicht in Frage.

    Danke für deine Mühe, deine schnellen Antworten
    und leichtverständlichen Erklärungen.

    Grüße Norbert

      • Guten Morgen. Helfer der Ahnungslosen.

        Ich bin deinem Link gefolgt. Wie so vielen anderen vorher. Leider mit ähnlichem Ergebniss.
        an irgend einer Stelle in den Tutorials weichen die Anzeigen von den meinen ab. und ich Lande wieder in einer Saggasse. …
        Nun kann ich den Controller , unter „sudo bluetoothctl“ schon sehen. doch wenn ich diesen
        mit „pair“ anwählen möchte ist dieser nicht verfügbar.
        Auch über das Bildschirmenü.
        Bluetooth symbol-> add Device.. kann ich Ihn sehen und auswählen. da verlangt er jedoch einen Code den ich nicht habe. (0000 ist es nicht )
        Ich habe gestern also wieder 3h hier gesesen, aber irgendwie klappt es nie.

        es Ist ein bissen wie verhext,…
        Grüße Norbert

  8. Grüße Christoph,

    ich habe jetzt den Controller tatsächlich mit dem PI verwunden (wenn auch nicht dauerhaft, ich muss die Verbindung nach jedem Neustart wiederherstellen)
    Ich kann mir das Ergebnis via „jstest /dev/input/js0“ anzeigen lassen. Jippi jei jey…
    Sixad muss ich auch jedesmal neu anwählen, scheint dann aber zu laufen.

    Wenn ich jetzt dein Skript starte, bekomme ich noch eine Fehlermeldung im Traceback „No module named wiringpi“ obgleich ich das schon mehrfach neu installiert habe.
    Hast du einen Tipp für mich?

    Wenn ich dir irgendwann auf den Sack gehe, sach mir bescheid oder ruf mich an 😉

    Gruß Norbert

    • Hey, kein Problem.
      Python 2 oder 3?
      Hast du wiringpi mit
      sudo pip install wiringpi2
      Installiert?

      Wiring pi ist auch nicht mehr notwendig, weil RPI.gpio auch PWM kann mittlerweile.

      In dem PS4 Programm in meinem Beitrag mache ich PWM per RPi.gpio

      Gruß
      Christoph

  9. Guten Abend,
    ja wiringpi läuft nun.
    aber ich habe es nicht unter „wiringPi2“ laufen sondern „wiringPi“
    ist das wichtig?
    ich habe dein skript in python 2 laufen.
    Weil du es ja scheinbar dafür geschrieben hast, und ich nicht zusätzlich fehler einbauen wollte.

    Mein neues Problem ist nun, dass sich scheinbar die RemotDesktopverbindung
    trennt, sowie ich das skript laufen lasse.

    Grüße Norbert

  10. Guten morgen.
    Nun endlich läuft es. Ich habe wiringPI nicht ordentlich zum laufen bekommen.
    Also wiringPi wieder rausgeworfen.
    Und dann das PWM-Signal über ein Aafruit PCA9685 umgeleitet.
    das funktionirt zimlich gut und das Signal kommt sauber und störrungsfrei.
    Ausserdem gibt es dort nun noch 14 weitere pwm ausgänge die ich für verschiedene Servo funktionnen verwenden möcht.

    Danke dir nochmal für die Grundlagen Christoph,
    Grüße Norbert

Kommentar verfassen