PS3 Controller mit Pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
MrFox88
User
Beiträge: 3
Registriert: Samstag 20. Februar 2021, 23:07

Hallo,
ich beschäftige mich seit kurzem mit dem Thema Python und Pygame, da ich einen kleine Hexapoden bauen möchte.
Dabei möchte ich einen PS3 Controller mit einem Raspberry Pi Zero verbinden und diesen als Steuerung nutzen.
Das verbinden und ein Script schreiben, in dem ich die Buttons abfragen kann gelingt schon mal.

Nun habe ich ein weiteres Script geschrieben und diesen erweitert, sodass ich die Buttons auswerten und simple weiterverarbeite.
Das Problem welches ich nun habe ist, dass sobald ich einen Button auf dem PS3 Controller die Servos trotzdem noch angesteuert werden.
Wenn man einen Button länger drückt, dann hängt sich das Programm sogar auf und nimmt keine Tastenänderung mehr an.
=> Die Vorlage habe ich von der folgenden Seite genommen: https://theraspberryblonde.wordpress.co ... th-pygame/ )

Die Erweiterung sieht wie folgt aus:

def getButton(number):
if Joystick.get_button(number):
print ('Knopf ID ist %s' %(number))
if number ==3:
kit.servo[0].angle = 180
sleep(0.1)


PS:
Ich hab das Forum und Google ziemlich lang durchforstet und hab kein Ergebnis gefunden welches mir weiterhilft.
Benutzen wird Python 3.7.3 und pygame 1.9.4

Vielleicht kann mir einer einen Tipp oder Lösungsansatz geben.

Vielen Dank schon mal
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den gesamten Code & in Code Tags (</>-Knopf im vollständigen Editor) setzen, damit er gelesen werden kann.
MrFox88
User
Beiträge: 3
Registriert: Samstag 20. Februar 2021, 23:07

Danke für die schnelle Antowort.
Werde ich gleich mal machen.

Code: Alles auswählen

import pygame, sys
from time import sleep
# setup the pygame window
pygame.init()
window = pygame.display.set_mode((200, 200), 0, 32)
# how many joysticks connected to computer?
joystick_count = pygame.joystick.get_count()
print "There is " + str(joystick_count) + " joystick/s"
if joystick_count == 0:
# if no joysticks, quit program safely
print ("Error, I did not find any joysticks")
pygame.quit()
sys.exit()
else:
# initialise joystick
joystick = pygame.joystick.Joystick(0)
joystick.init()
axes = joystick.get_numaxes()
buttons = joystick.get_numbuttons()
hats = joystick.get_numhats()
print "There is " + str(axes) + " axes"
print "There is " + str(buttons) + " button/s"
print "There is " + str(hats) + " hat/s"
def getAxis(number):
# when nothing is moved on an axis, the VALUE IS NOT EXACTLY ZERO
# so this is used not "if joystick value not zero"
if joystick.get_axis(number) < –0.1 or joystick.get_axis(number) > 0.1:
# value between 1.0 and -1.0
print "Axis value is %s" %(joystick.get_axis(number))
print "Axis ID is %s" %(number)
def getButton(number):
if Joystick.get_button(number):
print ('Knopf ID ist %s' %(number))
if number ==3:
kit.servo[0].angle = 180
sleep(0.1
def getHat(number):
if joystick.get_hat(number) != (0,0):
# returns tuple with values either 1, 0 or -1
print "Hat value is %s, %s" %(joystick.get_hat(number)[0],joystick.get_hat(number)[1])
print "Hat ID is %s" %(number)
while True:
for event in pygame.event.get():
# loop through events, if window shut down, quit program
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if axes != 0:
for i in range(axes):
getAxis(i)
if buttons != 0:
for i in range(buttons):
getButton(i)
if hats != 0:
for i in range(hats):
getHat(i)
sleep(0.5)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn das so der Code ist, dann ist es kein Wunder, das der nicht tut. Einrückungen sind in Python wichtig. Das steht in jedem Grundlagen Tutorial. Bitte mal eines durcharbeiten. Zb auf Python.org.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wenn ich den Code von ersterem Link kopiere sieht er zumindest schon mal so aus:

Code: Alles auswählen

import pygame, sys
from time import sleep

# setup the pygame window
pygame.init()
window = pygame.display.set_mode((200, 200), 0, 32)

# how many joysticks connected to computer?
joystick_count = pygame.joystick.get_count()
print "There is " + str(joystick_count) + " joystick/s"

if joystick_count == 0:
    # if no joysticks, quit program safely
    print ("Error, I did not find any joysticks")
    pygame.quit()
    sys.exit()
else:
    # initialise joystick
    joystick = pygame.joystick.Joystick(0)
    joystick.init()

axes = joystick.get_numaxes()
buttons = joystick.get_numbuttons()
hats = joystick.get_numhats()

print "There is " + str(axes) + " axes"
print "There is " + str(buttons) + " button/s"
print "There is " + str(hats) + " hat/s"

def getAxis(number):
    # when nothing is moved on an axis, the VALUE IS NOT EXACTLY ZERO
    # so this is used not "if joystick value not zero"
    if joystick.get_axis(number) < –0.1 or joystick.get_axis(number) > 0.1:
      # value between 1.0 and -1.0
      print "Axis value is %s" %(joystick.get_axis(number))
      print "Axis ID is %s" %(number)
 
def getButton(number):
    # returns 1 or 0 – pressed or not
    if joystick.get_button(number):
      # just prints id of button
      print "Button ID is %s" %(number)

def getHat(number):
    if joystick.get_hat(number) != (0,0):
      # returns tuple with values either 1, 0 or -1
      print "Hat value is %s, %s" %(joystick.get_hat(number)[0],joystick.get_hat(number)[1])
      print "Hat ID is %s" %(number)

while True:
    for event in pygame.event.get():
      # loop through events, if window shut down, quit program
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()
    if axes != 0:
      for i in range(axes):
        getAxis(i)
    if buttons != 0:
      for i in range(buttons):
        getButton(i)
    if hats != 0:
      for i in range(hats):
        getHat(i)
    sleep(0.5)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Code passt nicht zu der Aussage das Python 3 verwendet wird, weil das syntaktisch kein Python 3 ist. ``print`` wird hier als Anweisung verwendet. Also bräuchten wir mal den *tatsächlichen* Quelltext.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@MrFox88: Der Code ist Python2. Läuft also unter Python3 gar nicht.
Einrückungen sind in Python wichtig. Ohne weiß der Compiler sonst gar nicht, was zu einer Funktion oder einem if gehört.
Groß-Kleinschreibung ist wichtig. `Joystick` ist nicht gleich `joystick`.
Dann gibt es noch einige Konventionen, die der Code mißachtet: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2. Funktionsnamen schreibt man wie Variablen komplett klein.
Wenn Funktionen get... heißen, erwartet man normalerweise, dass die Funktion etwas holt, und nicht etwas ausgibt.
Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Benutze keine globalen Variablen.

Code: Alles auswählen

import pygame
from time import sleep

def show_axis(joystick, number):
    # when nothing is moved on an axis, the VALUE IS NOT EXACTLY ZERO
    # so this is used not "if joystick value not zero"
    axis = joystick.get_axis(number)
    if abs(axis) > 0.1:
        # value between 1.0 and -1.0
        print(f"Axis value is {axis}")
        print(f"Axis ID is {number}")

 
def show_button(joystick, number):
    # returns 1 or 0 – pressed or not
    if joystick.get_button(number):
        # just prints id of button
        print(f"Button ID is {number}")


def show_hat(joystick, number):
    hat = joystick.get_hat(number)
    if hat != (0,0):
        # returns tuple with values either 1, 0 or -1
        print(f"Hat value is {hat[0]}, {hat[1]}")
        print(f"Hat ID is {number}")


def main():
    # setup the pygame window
    pygame.init()
    try:
        window = pygame.display.set_mode((200, 200), 0, 32)

        # how many joysticks connected to computer?
        joystick_count = pygame.joystick.get_count()
        print(f"There is {joystick_count} joystick/s")

        if joystick_count == 0:
            # if no joysticks, quit program safely
            print("Error, I did not find any joysticks")
            return

        # initialise joystick
        joystick = pygame.joystick.Joystick(0)
        joystick.init()

        axes = joystick.get_numaxes()
        buttons = joystick.get_numbuttons()
        hats = joystick.get_numhats()

        print(f"There is {axes} axes")
        print(f"There is {buttons} button/s")
        print(f"There is {hats} hat/s")

        while True:
            for event in pygame.event.get():
                # loop through events, if window shut down, quit program
                if event.type == pygame.QUIT:
                  break
            for number in range(axes):
                show_axis(joystick, number)
            for number in range(buttons):
                show_button(joystick, number)
            for number in range(hats):
                show_hat(joystick, number)
            sleep(0.5)
    finally:
        pygame.quit()

if __name__ == "__main__":
    main()
MrFox88
User
Beiträge: 3
Registriert: Samstag 20. Februar 2021, 23:07

Ok, Schande über mein Haupt.
Ich hatte nicht viel Zeit, als ich den letzten Beitrag verfasst hatte... man sollte halt nie irgendwelche Sachen mal schnell machen.

Unten steht jetzt das richtige Script mit allen Einrückungen, die ich verwendet hatte.
Dass get Funktionen Anweisungen holen hab ich verstanden, allerdings wollte ich jetzt das eigentliche Script einfügen.

Danke Sirius3, dass sie mir eine überarbeitete Version des Scripts geschickt haben.
Allerdings werden bei diesem die letzten Werte der Schultertasten immer wiederholt ausgegeben, bis man das script beendet.

Hier nun das ursprüngliche Script von mir:

Code: Alles auswählen

import pygame, sys
from time import sleep
from adafruit_servokit import ServoKit

#servokit laden
kit = ServoKit(channels=16)

pygame.joystick.init()

kit.servo[0].angle = 180
sleep(0.1)
kit.servo[0].angle = 90
sleep(0.1)

#setup the pygame window
pygame.init()
window = pygame.display.set_mode((100,100),0,32)

#how many joysticks connected to computer?
joystick_count = pygame.joystick.get_count()
print ('Es sind ' + str(joystick_count) + ' Joysticks verbunden.')

if joystick_count == 0:
    #if n o joystick, quit program safly
    print ('Achtung, es wurde kein Joystick gefunden')
    pygame.quit()
    sys.exit()
else:
    #init joystick
    joystick = pygame.joystick.Joystick(0)
    joystick.init()
        
axes = joystick.get_numaxes()
buttons = joystick.get_numbuttons()
hats = joystick.get_numhats()

print ('Es gibt ' + str(axes) + ' Achsen')
print ('Es gibt ' + str(buttons) + ' Knöpfe')
print ('Es gibt ' + str(hats) + ' Schultertasten')

def getAxis(number):
    if joystick.get_axis(number) < -0.1 or joystick.get_axis(number) > 0.1:
        print ('Achswert ist zw %s' %(joystick.get_axis(number)))
        print ('Achsnummer ist %s' %(number))

def getButton(number):
    if joystick.get_button(number):
        print ('Knopf ID ist %s' %(number))
        if number == 3:
            kit.servo[0].angle = 180
            sleep(0.1)
            kit.servo[0].angle = 90
            sleep(0.1)
    
+-6
def getHat(number):
    if joystick.get_hat(number) != (0,0):
        print ('Schultertastenwert ist %s, %s' %(joystick.get_hat(number) [0], joystick.get_hat(number)[1]))
        print (' Schultertasten ID ist %s' %(number))
        
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        
        if axes != 0:
            for i in range(axes):
                getAxis(i)
                
        if buttons != 0:
            for i in range(buttons):
                getButton(i)
                    
        if hats != 0:
            for i in range(hats):
                getHat(i)
        

    sleep(0.0025)
Antworten