Pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter, inscrivez-vous gratuitement !

 

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 40
    Points : 16
    Points
    16

    Par défaut Récupération de touches d'un clavier matriciel

    Bonjour à tous,

    Je cherche actuellement à récupérer mes touches d'un clavier par le biais des GPIO

    J'ai une base sur laquelle je récupère mes touches les unes après les autres mais je souhaiterais les récupérer peu importe comment on appuie sur les touches.

    Voici le code qui me permet actuellement de récupérer les appuis:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #!/usr/bin/python3
     
    # -*- coding:utf-8 -*-
     
    import os
     
    import RPi.GPIO as GPIO
     
     
     
    #Paramétrage des GPIO en input et déclaration des variables
     
     
    GPIO.setmode(GPIO.BOARD)
     
    L1 = 12
     
    GPIO.setup(L1,GPIO.IN)
     
    L2 = 13
     
    GPIO.setup(L2,GPIO.IN)
     
    L3 = 15
     
    GPIO.setup(L3,GPIO.IN)
     
    L4 = 37
     
    GPIO.setup(L4,GPIO.IN)
     
    L5 = 16
     
    GPIO.setup(L5,GPIO.IN)
     
    L6 = 19
     
    GPIO.setup(L6,GPIO.IN)
     
    C1 = 18
     
    GPIO.setup(C1, GPIO.IN)
     
    C2 = 22
     
    GPIO.setup(C2,GPIO.IN)
     
    C3 = 32
     
    GPIO.setup(C3,GPIO.IN)
     
    C4 = 36
     
    GPIO.setup(C4,GPIO.IN)
     
     
    i = 0
     
     
     
    #Détection de l'appui sur une colonne et une ligne
     
     
    while i < 1:
     
    	if GPIO.wait_for_edge(L1, GPIO.FALLING) and GPIO.wait_for_edge(C1, GPIO.FALLING):
     
    		print("touche 9 appuyée")
     
    	if GPIO.wait_for_edge(L1, GPIO.FALLING) and GPIO.wait_for_edge(C2, GPIO.FALLING):
     
    		print("touche 8 appuyée")
     
    	if GPIO.wait_for_edge(L1, GPIO.FALLING) and GPIO.wait_for_edge(C3, GPIO.FALLING):
     
    		print("touche 7 appuyée")
     
    	i = i+1

    Le problème est que j'arrive à récupérer si j'appuie sur le 9, puis le 8 puis le 7 ...

    Je souhaiterais moi pouvoir appuyer sur le 8 ou le 7 en premier ...

    Le but étant à terme de récupérer dans un fichier (xml je pense) des séquences d'appui sur le clavier...

    Qu'est-ce qui cloche dans mon script ?

    En vous remerciant de votre aide,

    Bien cordialement,

    M.

  2. #2
    Rédacteur/Modérateur

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    9 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 9 956
    Points : 41 158
    Points
    41 158
    Billets dans le blog
    9

    Par défaut

    Bonsoir,

    Comme le nom de la méthode l'indique, GPIO.wait_for_edge() est bloquant, donc en attente d'un appui sur la touche testée...

    Essaie plutôt event_detected() :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GPIO.add_event_detect(channel, GPIO.RISING)  # add rising edge detection on a channel
    do_something()
    if GPIO.event_detected(channel):
        print('Button pressed')
    Voir la doc.

  3. #3
    Rédacteur/Modérateur

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    9 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 9 956
    Points : 41 158
    Points
    41 158
    Billets dans le blog
    9

    Par défaut

    C'est quoi comme clavier matriciel ? Un truc fait maison ?
    D'habitude on met les lignes en sorties et les colonnes en entrées On fixe l'état en sortie ligne par ligne, et on scanne les entrées en colonnes.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 40
    Points : 16
    Points
    16

    Par défaut

    Ben oui c'est un clavier de l'appareil sur lequel je travaille et que le but est d'éviter de péter le matériel (car le clavier est relié au reste du matériel) mais que je cherche à automatiser les séquences de test, faut que j'arrive à récupérer les différentes séquences....

    Et je peux déclarer plusieurs GPIO sans mes channels ? Car je dois détecter une ligne et une colonne, pour identifier la bonne touche

    Je teste ça déjà merci

  5. #5
    Rédacteur/Modérateur

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    9 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 9 956
    Points : 41 158
    Points
    41 158
    Billets dans le blog
    9

    Par défaut

    Ce que je veux dire, c'est qu'un clavier matriciel est un peu plus compliqué à gérer qu'une grille de bataille navale; genre ligne 1, colonne 3, touche machin pressée !
    Les lignes sont placées en sorties et les colonnes en entrées (avec pull-up) pour pouvoir être lues.

    à un instant t, on génère un niveau logique bas sur une ligne (une ligne à la fois) et on scanne les colonnes. Si le bouton de la colonne est pressée, l'entrée est abaissée au 0V.

    Maintenant, ton matériel est peut-être différent, on ne sait pas...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 40
    Points : 16
    Points
    16

    Par défaut

    Ha oui c'est plus compliqué mais j'ai réussi ... Enfin presque ...

    Donc dans une boucle, je lui dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While True:
                    If GPIO.event_detected(C1):
                          If GPIO.input(C1) == GPIO.input(L1):
                                print('Bouton 9 appuyé')
    Du coup il me détecte, mais me l'affiche 3 ou 4 fois ...
    Plus qu'à trouver comment faire en sorte de récupérer le print une seule fois ...

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/02/2016, 13h56
  2. Récupération de touche tapée au clavier
    Par 2235 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/01/2006, 12h29
  3. bouton Ok = Touche Entrée du clavier
    Par Samanta dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 23/08/2005, 17h10
  4. [MFC] faire réagir des touches + et - du clavier
    Par pitit777 dans le forum MFC
    Réponses: 4
    Dernier message: 06/06/2005, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo