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
PS3 Controller mit Pygame
Danke für die schnelle Antowort.
Werde ich gleich mal machen.
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)
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
- __blackjack__
- User
- Beiträge: 13270
- 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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
@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.
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()
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:
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)