2017-10-04 7 views
2

J'utilise un Raspberry Pi 3 pour contrôler un véhicule robotisé. J'ai réussi à relier mon contrôleur PS4 au RPi en utilisant ds4drv. J'ai le code suivant fonctionnant et émettant "Bouton pressé"/"Bouton libéré" quand un bouton est pressé/relâché sur le contrôleur PS4 using pygame. Je me demande comment identifier quel bouton est exactement pressé.Comment identifier quel bouton est appuyé sur le contrôleur PS4 en utilisant pygame

ps4_controller.py

import pygame 

pygame.init() 

j = pygame.joystick.Joystick(0) 
j.init() 

try: 
    while True: 
     events = pygame.event.get() 
     for event in events: 
      if event.type == pygame.JOYBUTTONDOWN: 
       print("Button Pressed") 
      elif event.type == pygame.JOYBUTTONUP: 
       print("Button Released") 

except KeyboardInterrupt: 
    print("EXITING NOW") 
    j.quit() 

Répondre

2

cernées un hack:

Les boutons PS4 sont numérotés comme suit:

0 = SQUARE

1 = X

2 = CIRCLE

4 = L1

5 = R1

6 = L2

7 = R2

8 = SHARE

9 = OPTIONS

10 = LEFT ANALOG PRESS

11 = RIGHT ANALOG PRESS

12 = PS4 ON BUTTON

13 = TOUCHPAD PRESS

de déterminer quel bouton est pressé je j.get_button(int), en passant dans le nombre entier de bouton correspondant.

Exemple:

import pygame 

pygame.init() 

j = pygame.joystick.Joystick(0) 
j.init() 

try: 
    while True: 
     events = pygame.event.get() 
     for event in events: 
      if event.type == pygame.JOYBUTTONDOWN: 
       print("Button Pressed") 
       if j.get_button(6): 
        # Control Left Motor using L2 
       elif j.get_button(7): 
        # Control Right Motor using R2 
      elif event.type == pygame.JOYBUTTONUP: 
       print("Button Released") 

except KeyboardInterrupt: 
    print("EXITING NOW") 
    j.quit() 
+0

Merci mon ami! C'était extrêmement utile! – rebbailey

1

Vous êtes vraiment proche! Avec quelques modifications, votre code devient ceci:

import pygame 

pygame.init() 
j = pygame.joystick.Joystick(0) 
j.init() 

try: 
    while True: 
     events = pygame.event.get() 
     for event in events: 
      if event.type == pygame.JOYAXISMOTION: 
       print(event.dict, event.joy, event.axis, event.value) 
      elif event.type == pygame.JOYBALLMOTION: 
       print(event.dict, event.joy, event.ball, event.rel) 
      elif event.type == pygame.JOYBUTTONDOWN: 
       print(event.dict, event.joy, event.button, 'pressed') 
      elif event.type == pygame.JOYBUTTONUP: 
       print(event.dict, event.joy, event.button, 'released') 
      elif event.type == pygame.JOYHATMOTION: 
       print(event.dict, event.joy, event.hat, event.value) 

except KeyboardInterrupt: 
    print("EXITING NOW") 
    j.quit() 

Certaines ressources que je trouve utile par écrit le haut inclus pygame's event documentation, l'utilisation de la fonction de python dir pour voir quelles sont les propriétés d'un objet python a, et documentation for pygame's parent C library, SDL si vous vouliez une explication plus profonde de ce que la propriété signifie réellement. J'ai inclus à la fois la version d'accès au dictionnaire (en utilisant event.dict) ainsi que la version d'accès à la propriété (en utilisant seulement event.whatever_the_property_name_is). Notez que event.button ne vous donne qu'un nombre; c'est à vous de créer manuellement une cartographie de ce que chaque numéro de bouton signifie sur votre contrôleur. J'espère que cela éclaircit!

+0

Nice, merci! – Ctpelnar1988

+1

@ Ctpelnar1988 Je suis content que vous l'ayez trouvé utile!Merci également de partager vos résultats de cartographie de bouton dans votre réponse, ceux-ci sont très utiles! – CodeSurgeon