IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

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

Raspberry Pi Discussion :

Mise en œuvre d'un clavier matriciel 4x4


Sujet :

Raspberry Pi

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Par défaut Mise en œuvre d'un clavier matriciel 4x4
    Bonjour à tous,

    Avez-vous déjà mis en oeuvre ce type de projet ?

    J'ai suivi ce tuto pour mettre en oeuvre une sécurité à code.

    https://raspberrypi-tutorials.fr/con...-pi-code-lock/

    J'ai donc acheté une :
    -raspberry pi W V1.1
    -matrice 4x4
    -nape de fils

    Lien d'achat pour la matrice 4x4.
    https://www.amazon.fr/AZDelivery-Mat...689215&sr=8-16

    Après avoir installé l'OS, j'ai choisi 8 pins disponible du connecteur J8 du raspberry pi W V1.1.

    Voici le schématique.
    https://datasheets.raspberrypi.com/r...schematics.pdf

    Dans le code pour l'identification des chiffres/lettres, j'ai donc modifié.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ROW = [31, 33, 35, 37] // ce sont les N° de PIN pas N° de GPIO
    COLUMN = [32, 38, 36, 40] // ce sont les N° de PIN pas N° de GPIO

    Ensuite, j'ai executé le code principale mais je n'obtiens pas le résultat attendu en python3.

    Le code ci-dessous est en python2.7 ou python3 ?

    Auriez-vous des pistes ou déjà essayé ce tuto ?

    Merci d'avance.


    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
    import time
    import RPi.GPIO as GPIO
    from keypad import keypad
     
    GPIO.setwarnings(False)
     
    if __name__ == '__main__':
        # Initialize
        kp = keypad(columnCount = 4)
     
        # waiting for a keypress
        digit = None
        while digit == None:
            digit = kp.getKey()
        # Print result
        print digit
        time.sleep(0.5)
     
        ###### 4 Digit wait ######
        seq = []
        for i in range(4):
            digit = None
            while digit == None:
                digit = kp.getKey()
            seq.append(digit)
            time.sleep(0.4)
     
        # Check digit code
        print(seq)
        if seq == [1, 2, 3, '#']:
            print "Code accepted"

  2. #2
    Responsable Arduino et Systèmes Embarqués


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 085
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    le tuto que tu mentionnes est un peu ancien, mais il devrait pouvoir fonctionner sur un Pi récent...

    Citation Envoyé par joffrey575 Voir le message
    Ensuite, j'ai executé le code principale mais je n'obtiens pas le résultat attendu en python3.

    Le code ci-dessous est en python2.7 ou python3 ?

    Rien qu'avec cette ligne-là avec un print sans les parenthèses autour de la chaîne de caractères, on voit que c'est du Python 2 :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
            print "Code accepted"

    Mais en Python3 (il faut passer en Python 3 maintenant), ce code devrait donner une erreur de syntaxe, non ?

  3. #3
    Responsable Arduino et Systèmes Embarqués


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 085
    Billets dans le blog
    47
    Par défaut
    Quand on regarde un peu la bibliothèque qui gère le clavier : https://raw.githubusercontent.com/ra...ad/RPi_GPIO.py

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    elif columnCount is 4:
    renvoie un warning en Python3 et propose : elif columnCount == 4.

    Il faut donc commencer par passer en revue tous les warnings/erreurs dans la console...

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Par défaut
    Finalement je suis partie sur ce projet.

    Il prend en compte une matrice 4x4.

    https://peppe8o.com/connect-raspberr...r-codes-input/
    https://peppe8o.com/download/python/4x4MatrixKeypad.py

    Maintenant je voulais récupérer le token renvoyé d'une commande linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    os.system('rm cookies.txt')
    arch = subprocess.check_output("curl -XPOST -c cookies.txt -d ...........")
    print (arch)
    Voici la sortie du print.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"access_token":"eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ","access_token_expires":7200,"refresh_token":"eyJ0eXiJ9.eyVkz__N9kliGO4Q","refresh_token_expires":86400,"credentials":"auth=d}
    Je voulais récupérer le résultat d'un split via le caractère ".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    token_tmp = arch.split('"')
    L'erreur retournée est la suivante, mais comment déclarer un objet type bytes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: a bytes-like object is required, not 'str'
    Ensuite, l'idée est juste de récupérer l'access token.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    token_auth = token_tmp[2]
    print (token_tmp[2])
    Merci pour vos retours.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par joffrey575 Voir le message
    L'erreur retournée est la suivante, mais comment déclarer un objet type bytes ?
    Il va falloir apprendre à gérer les dictionnaires en Python

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Par défaut
    Le token maintenant isolé, j'aimerais ajouter le token en question dans une chaine de caractère.

    Le tout à envoyer dans une commande linux.

    Est-ce que le code suivant partant d'une string (str) serait correct ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    path_begin = 'curl -XPOST http://domain/api/monitors/5.json?token='
    path_token = token_auth
    path_argu = ' -d '
    path_end = 'Monitor[Function]=Modect&Monitor[Enabled]=1'
    path_total = path_begin + path_token + path_argu + path_end
    print (path_total)
    
    os.system(path_total)

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 374
    Par défaut
    Mon but est dans cette partie d'extraire le token de cette réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"access_token":"eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ","access_token_expires":7200,"refresh_token":"eyJ0eXiJ9.eyVkz__N9kliGO4Q","refresh_token_expires":86400,"credentials":"auth=d}
    Sans sortir du programme car subprocess.check_output() faisait ceci sur retour d'erreur avec l'except en fin de programme.

    Du coup, j'utilise comme on me l'a conseillé "subprocess.run()" mais le dictionnaire n'a plus l'air bon ! (voir sortie).

    Mon code :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            response = subprocess.run(['curl', '-XPOST -c cookies.txt -d \"user=user&pass=password&stateful=1\" https://mondomain.org/api/host/login.json"'], capture_output=True, text = True);
     
            d = dict([[element.strip('"') for element in key_value.split(':',':')] for key_value in response.stdout.strip('{}').split(',')])
     
            token = d['access_token']

    L'erreur renvoyée :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            d = dict([[element.strip('"') for element in key_value.split(':')] for key_value in response.stdout.strip('{}').split(',')])
    ValueError: dictionary update sequence element #0 has length 1; 2 is required

    On m'a conseillé d'utiliser en lieu et place de subprocess la lib urllib pour faire une requete HTTP.

    J'ai essayé ce code :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            data = '-c cookies.txt -d "user=user&pass=mypassword&stateful=1'
            data = data.encode('ascii')
            q = Request('http://mondomain.org/api/host/login.json', data=data)
     
            a = urlopen(q).read()
            print(a)

    Pour obtenir :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    urllib.error.HTTPError: HTTP Error 401: Unauthorized

    Si vous avez des idées, je suis preneur.

    Merci et bon week-end !

Discussions similaires

  1. utilisation clavier matriciel et IR pour Jukebox
    Par tilowil dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 31/10/2018, 15h38
  2. Récupération de touches d'un clavier matriciel
    Par molochlebanni dans le forum Raspberry Pi
    Réponses: 5
    Dernier message: 05/07/2018, 10h54
  3. Clavier matriciel via bus I2C
    Par chibi95 dans le forum Général Java
    Réponses: 0
    Dernier message: 13/05/2009, 11h07
  4. optimisation de multplication matricielle 4x4
    Par kiroukou dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 08/02/2005, 09h48

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