Partage
  • Partager sur Facebook
  • Partager sur Twitter

clavier numerique avec arduino

Sujet résolu
    19 novembre 2017 à 14:31:22

    Bonjour!

    Je vient de tester un programme simple d'affichage des caracteres en fonction d'appui sur une touche d'une matrice numerique 4x3. En fait lorsque j'appui sur une touches il m'affiches les 3 autres. Par exemple j'appui sur 2 il affiche 5,8,0. Je ne comprend pas de tout ou se trouve l'erreur dans mon code.

    byte ligne[4] = {24,18,22,23};    // pins lignes 
    byte colonne[3] = {19,21,20};     // pins colonnes 
    
    
    char touches[4][3] = {                  // matrice numerique 
                          '1','2','3', 
                          '4','5','6', 
                          '7','8','9', 
                          '*','0','#'
                         };
    
    
    void setup()
    {
      Serial.begin(9600);
    
      for(byte l=0; l<=3; l++)
        {
            pinMode(ligne[l], OUTPUT);
            digitalWrite(ligne[l], 0);
        }
    
              // pins colonnes en mode read
          for(byte c=0; c<=2; c++)           
           pinMode(colonne[c], INPUT_PULLUP); 
    }
    
    
    
    
    void loop()
    {
        for(byte l=0; l<=3; l++)              // mise a l'etat haut de lignes
        {
            digitalWrite(ligne[l], 1);
    
            for(byte c=0; c<=2; c++)         // boucle pins colonnes 
            {
    
                boolean etat = digitalRead(colonne[c]);  // on lit le 
    
                if(!etat)                          // si boutton appuie
                 Serial.println(touches[l][c]);    // affichage caractere correspondant
            }
            digitalWrite(ligne[l], 0);      // lignes eteinte
        }
    
      delay(100); //petite attente
    }
    

    Et la photo avec l'affectation des pins:



    -
    Edité par CiprianMalaes 19 novembre 2017 à 14:32:00

    • Partager sur Facebook
    • Partager sur Twitter
    La vie, c'est comme une une bicyclette, il faut avancer pour ne pas perdre l'équilibre.
      19 novembre 2017 à 22:37:26

      Je pense que tu t'es un peu mélangé les pinceaux dans tes états ;)

      Mais surtout, il y a un énorme risque de court circuit dans ton code actuel !!!

      En effet, tu mets toutes tes lignes en OUTPUT LOW et tu passes progressivement chacune des lignes en HIGH pour la lecture.

      Imagines qu'un utilisateur appuis simultanément sur les touches 1 et 4, alors ça va te faire un bon gros court circuit !

      Tes lignes devraient toujours être en INPUT avec un passe progressif en OUTPUT LOW (et non OUTPUT HIGH) lors de la lecture.

      Ce qui donne le code suivante :

      void setup()
      {
      	Serial.begin(9600);
      
      	for(byte l=0; l<=3; l++)
      		pinMode(ligne[l], INPUT_PULLUP);
      
      	for(byte c=0; c<=2; c++)          
      		pinMode(colonne[c], INPUT_PULLUP);
      }
      
      void loop()
      {
          for(byte l=0; l<=3; l++)
          {
      		pinMode(ligne[l], OUTPUT);
              digitalWrite(ligne[l], 0);
              for(byte c=0; c<=2; c++)
              {
                  boolean etat = digitalRead(colonne[c]);
                  if(!etat)
      				Serial.println(touches[l][c]);
              }
              digitalWrite(ligne[l], 1);
              pinMode(ligne[l], INPUT_PULLUP);
          }
      	delay(100);
      }

      Mais sinon, pourquoi ne pas utiliser la lib KeyPad ???

      -
      Edité par lorrio 19 novembre 2017 à 22:38:00

      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2017 à 23:18:05

        Enfait j'utilise arduino pour  travailler chez moi sur un projet dans le cadre de mon BTS et le code doit etre comprensible par le complilateur d'un autre logiciel. Donc je ne peux pas utilser ds fonctions comme keyPad. :)

        Mais sinon je ne vois pas l'erreur dans mon code. Pour moi c'est tres logique...je passe la premiere ligne en HIGH ensuite je lit les etats de colonnes. En ce qui concerne le court-circuit la matrice numerique elle est equipé avec des diodes car moi j'ai essaye l'appui de plusiers touches a la fois et pas de court court circuit.

        Ton code il fonctionne parfaitement mais par raport a mes connaisances basiques de programation je ne suis pas capable de le comprendre.:euh: 

        Peux-tu me detailer le fonctionement des 2 for? Merci!

        -
        Edité par CiprianMalaes 19 novembre 2017 à 23:35:49

        • Partager sur Facebook
        • Partager sur Twitter
        La vie, c'est comme une une bicyclette, il faut avancer pour ne pas perdre l'équilibre.
          20 novembre 2017 à 15:31:02

          J'ai repris exactement ton code avec uniquement 3 petits changements :

          - lignes 19 et 20 de ton code : au lieu de mettre les lignes en OUTPUT LOW (0) par défaut, je les mets en INPUT_PULLUP par défaut.

          - ligne 35 de ton code : au lieu de mettre la ligne à lire en OUTPUT HIGH (1), je la met en OUTPUT LOW (0).

          - ligne 45 de ton code : au lieux de remettre la ligne lu en OUTPUT LOW (0) par défaut, je la remet en INPUT_PULLUP par défaut.

          Au final, je n'ai fais que corriger une petite erreur sur l'état que doivent avoir lignes.

          Si tu comprends ton code, tu ne devrais donc avoir aucun mal à comprendre le miens ;)

          Sinon, je t'invite à revoir le principe de fonctionnement du multiplexage.

          -
          Edité par lorrio 20 novembre 2017 à 15:34:16

          • Partager sur Facebook
          • Partager sur Twitter
            20 novembre 2017 à 21:03:54

            Justement je bien compris mon code et aussi les boucles for j'utilise tres facile pour parcourir les matrices de leds mais la tien ca ma parrait complement le contraire. A la ligne 17  tu mets le pin en LOW, donc pas de courant, ensuite avec le deuxieme for tu lise l'etat des chaque colonne. Ca je ne pas de tout compris comment il peux y avoir des etats logique HIGH s'il n'y a pas du courant??:euh:  Et la ligne 24 , 25 aussi .. a qoui ca sert passer un ligne a l'etat haut a la fin de la boucle si en debut elle est LOW?
            • Partager sur Facebook
            • Partager sur Twitter
            La vie, c'est comme une une bicyclette, il faut avancer pour ne pas perdre l'équilibre.
              21 novembre 2017 à 8:21:32

              Là, je t'invite à revoir le principe de câblage d'un bouton.

              => http://eskimon.fr/96-arduino-204-un-simple-bouton

              Pour utiliser un bouton, on utilise une résistance de pull-up qui polarise l'état haut (c'est ce que tu as avec le mode INPUT_PULLUP).

              Quand à l'appui, celui-ci est détecté quand le bouton fait un contact avec le GND (c'est ce que tu as avec le mode OUTPUT LOW).

              C'est justement ce changement d'état de HIGH (que donnait la résistance de pullup) vers LOW (que donne le GND) qui permet de détecter l'appui.

              Si tu mets HIGH d'un coté (avec une PULLUP) et HIGH de l'autre coté (avec une OUTPUT), alors ton système est toujours à l'état HIGH (que le bouton soit enfoncé ou non), donc tu ne détectera rien du tout.

              -
              Edité par lorrio 21 novembre 2017 à 8:22:17

              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2017 à 18:07:03

                Ah, d'accord. En fait ce petit détail je ne connaissais pas. Merci beaucoup pour tes réponses! ;)
                • Partager sur Facebook
                • Partager sur Twitter
                La vie, c'est comme une une bicyclette, il faut avancer pour ne pas perdre l'équilibre.

                clavier numerique avec arduino

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown