Pygame et gpio avec Raspberry pi

a marqué ce sujet comme résolu.

Bonjour à tous

Je suis en train de fabriquer une sorte d’interface entre une souris et une radiocommande pour contrôler une voiture radiocommandée. L’idée est de passer par un raspberry pi pour commander 2 relais qui seront relier aux broches du potentiomètre de direction de la radiocommande.

Je précise que j’ai un handicap qui limite beaucoup mes mouvements. J’ai une souris adaptée (comme un joystick) pour l’ordinateur et le téléphone.

J’ai utilisé pygame pour faire un script pour pouvoir récupérer la position relative de la souris et interagir avec les relais via les gpio.

Le script fonctionne correctement mais pas complètement comme je souhaite.

Lorsque je vais à gauche avec la souris le relais de gauche s’allume et le relais de droite s’éteint. Lorsque je vais à droite le relais de droite s’allume et le relais de gauche s’éteint.

Par contre lorsque je lâche la souris les relais restent dans la dernière position connue. Je souhaiterais que ça réagisse comme un joystick.

J’espère que je n’ai rien oublié et l’un d’entre vous pourra m’aider dans mon projet.

Merci d’avance.

Franju

import pygame
import RPi.GPIO as GPIO
 
pygame.init()
 
ecran = pygame.display.set_mode((300, 300))
 
GPIO.setmode(GPIO.BCM)
LEFT = 21
GPIO.setup(LEFT,GPIO.OUT)
GPIO.output(LEFT, GPIO.HIGH)
 
RIGHT = 20
GPIO.setup(RIGHT,GPIO.OUT)
GPIO.output(RIGHT, GPIO.HIGH)
 
continuer = True
 
while continuer:
 
    for event in pygame.event.get():
        if event.type == pygame.MOUSEMOTION:
            if event.rel[0] < 0 :
                print("to the left")
                GPIO.output(LEFT,GPIO.LOW)
            else:
                GPIO.output(LEFT,GPIO.HIGH)
 
            if event.rel[0] > 0 :
                print("to the right")
                GPIO.output(RIGHT,GPIO.LOW)
            else:
                GPIO.output(RIGHT,GPIO.HIGH)
 
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                GPIO.output(RIGHT,GPIO.HIGH)
                GPIO.output(LEFT,GPIO.HIGH)
                GPIO.cleanup()
                continuer = False
 
pygame.quit() 
+0 -0

Salut,

Tout d’abord, je n’ai que peu d’expérience avec pygame et GPIO, mais je pense avoir des pistes pour résoudre ton problème.

L’évènement MOUSEMOTION n’est engendré par pygame que quand la souris bouge : notamment, quand elle ne bouge pas, rien ne se passe. Dans ton cas, soit ta souris bouge vers la droite, soit vers la gauche, mais ton code ne met jamais les sorties LEFT et RIGHT à DOWN simultanément.

Pour moi, je pense qu’une approche qui pourrait marcher (et qui ne m’a pas l’air d’être du bricolage, j’espère que d’autres pourront confirmer), c’est de créer un évènement périodique qui revient toutes les 100ms par exemple, et lorsque celui ci arrive dans ta boucle, tu utilises mouse.get_rel() pour savoir si la souris a bougé entre temps. Si elle a bougé suffisamment (à toi de choisir le seuil adapté) à droite ou à gauche, tu utilises GPIO pour déplacer à gauche ou à droite, sinon tu reset pour qu’il n’y ait pas de mouvement.

En gros ça donne (cf ce post pour plus de détails): (je n’ai pas testé le code mais dans l’esprit c’est ça)

regular_event = pygame.USEREVENT + 1 #Tu crées un évènement personnalisé avec un code unique et autorisé par pygame
pygame.time.set_timer(regular_event, 100) #Tu dis à pygame de queue cet évènement toutes les 100ms
while continuer:
    for event in pygame.event.get():
        if event.type == regular_event:
            rel = pygame.mouse.get_rel() # Tu récupères le mouvement relatif de la souris par rapport au dernier appel, cf. la doc
            #Et après tu choisis ce que tu veux faire

J’espère avoir répondu à ta question, n’hésite pas si tu veux plus de détails,

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte