Décoder une matrice switch éxistante

Bonjour à tous
je suis nouveau sur le forum. Je cherche à décoder une matrice switch existante (4 Rows et 16 Cols. bref recopier les états des Rows et des Colonnes.
le but est d'avoir au final un [data] dans laquelle j'aurai un:
ROW 1 == LOW && COL 1 == LOW cela donnera DATA == LOW

Dans mon cas il faut que des INPUTs, ce n'est pas l'arduino qui doit générer la matrice mais uniquement la lire (donc pas d'OUPUT).

a l'issue de l'obtention de cette variable [DATA ] rajouter une condition Supp [DATA] && x == 1 à remettre dans une autre variable en vue de passer dans un SWITCH CASE

Alors je pourrai faire des: (mais j'ai 64 switch)

if (ROW 1 == LOW  && COL 1 == LOW) {
 (par exemple mettre un led sur HIGH
}

else {
 // si necéssaire
}

là je n'ai aucune idée par quel bout m'y prendre, en espérant que mon explication soit complètement compréhensible.

en vous remerciant pas avance pour votre aide .

je n'ai trouvé aucun code me permettant de résoudre ce souci,
cdt
chris

Bonjour,

Sur ton schéma toutes les colonnes sont au +5V je ne vois pas comment ça peut fonctionner.
Pour décoder la matrice il faut absolument pouvoir piloter les cotonnes pour pouvoir en mettre une seule au +5V (ou au 0V).

Pour répondre à ta problématique tu peux faire (pour le décodage d'une seule touche appuyée)

  int touche = -1;
  for (byte col = 0; col < 16 && touche!=-1; col++) {
    if (digitalRead(col) == LOW) {
      for (byte row = 0; row < 16; row++) {
        if (digitalRead(col)==LOW)
        {
          touche=16*row+col;
          break;
        }
      }
    }
  }
  if (touche!=-1)
  {
    // faire le traitement
  }

Mais si ce n'est pas toi qui pilote les colonnes, il y aura toujours risque de désynchronisation entre la lecture des colonnes et la lecture des lignes.

hello
Le schéma qui j'ai mis est un schéma de principe, elles sont bien pilotées comme vous l'indiquez, pour tout dire, c est une matrice de switch d'un plateau de flipper qui fonctionne parfaitement bien. cette matrice Switch existante ne peut en aucun cas être perturbée.
je dois juste recopier l'état de ces 64 switchs. J'ai un PCB qui simule cette matrice switch avec pull-up et tout ce qui va bien.
je me vois mail me faire 64

if (ROW 1 == LOW && COL 1 == LOW) {
(par exemple mettre un led sur HIGH
}

cela fonctionne, mais le code est ultra long et ce me bouffe pas mal de mémoire dynamique.

J ai vu ce matin un article sur ARRAY From Digital reads of 16 inputs, cela semble aller dans le sens de ma recherche, en revanche combiner les 2 ROW et COL pour mettre cela dans un variable [Data] sort clairement de mes capacités à faire un code efficace sans X centaine de lignes.

chris

J'ai ajouté une proposition de programme à ma réponse précédente.

hello,

merci, je n'avais pas vu apparaitre votre code.. 1 touche à la fois, c est parfait, et une info que je n'avais pas signalée, mais c est parfait !
là c est une matrice 16 x 16, pour faire un 4 x 16 il me semble qu'il faille mettre 4 à

for (byte row = 0; row < 16; row++)

et row à la place de col

if (digitalRead(col)==LOW)

j'ai bien compris ?

merci monsieur kamill

Tu peux faire comme j'ai fait avec un premier for pour les cols et un second pour les rows ou faire l'inverse avec un premier for pour les rows et un second pour les cols. Ça revient sensiblement au même

vu merci, je vais faire la manip

je fais un feedback dès que j'ai fait le test.

merci

La librairie MatrixKeypad fait ça très bien

Tu peux l'installer depuis le gestionnaire de librairies de l'IDE.

bonjour
j'ai testé et cela ne fonctionne pas comme attendu, avec le "&& touche!=-1" rien ne démarre. Je ne comprends pas le rôle de ce && touche!=-1

lorsque Ret_1 == LOW et Raw_1 == LOW, il ne se passe rien, je m'attendais à voir une valeur dans touche qui change en fonction du matriçage Raw et Col
(j ai mis du Serial.print volontairement pour voir si il y a de la vie)

le code actuel

const int Ret_1 = 32;
const int Ret_2 = 33;
const int Ret_3 = 34;
const int Ret_4 = 35;
const int Ret_5 = 36;
const int Ret_6 = 37;
const int Ret_7 = 38;
const int Ret_8 = 39;
const int Ret_9 = 40;
const int Ret_10 = 41;
const int Ret_11 = 42;
const int Ret_12 = 43;
const int Ret_13 = 44;
const int Ret_14 = 45;
const int Ret_15 = 46;
const int Ret_16 = 47;

const int Raw_1 = 0;
const int Raw_2 = 1;
const int Raw_3 = 2;
const int Raw_4 = 3;



int touche = -1;
int i = 0;
byte raw = 0;
byte col = 0;


void setup()
{
  Serial.begin(9600);

  pinMode(Ret_1, INPUT_PULLUP);
  pinMode(Ret_2, INPUT_PULLUP);
  pinMode(Ret_3, INPUT_PULLUP);
  pinMode(Ret_4, INPUT_PULLUP);
  pinMode(Ret_5, INPUT_PULLUP);
  pinMode(Ret_6, INPUT_PULLUP);
  pinMode(Ret_7, INPUT_PULLUP);
  pinMode(Ret_8, INPUT_PULLUP);
  pinMode(Ret_9, INPUT_PULLUP);
  pinMode(Ret_10, INPUT_PULLUP);
  pinMode(Ret_11, INPUT_PULLUP);
  pinMode(Ret_12, INPUT_PULLUP);
  pinMode(Ret_13, INPUT_PULLUP);
  pinMode(Ret_14, INPUT_PULLUP);
  pinMode(Ret_15, INPUT_PULLUP);
  pinMode(Ret_16, INPUT_PULLUP);

  pinMode(Raw_1, INPUT_PULLUP);
  pinMode(Raw_2, INPUT_PULLUP);
  pinMode(Raw_3, INPUT_PULLUP);
  pinMode(Raw_4, INPUT_PULLUP);

  Serial.print(" \t INIT PASSE");

}

void loop()
{

  for (col = 0; col < 16 && touche != -1; col++)
    //  for (col = 0; col < 17 ; col++)
  {
    if (digitalRead(col == LOW))
    {
      //           Serial.print("Colonne: " );
      //           Serial.print(col);
      //           Serial.print("\t");

      for (raw = 0; raw < 4; raw++)
      {
        //              Serial.print("Raw: " );
        //              Serial.print(raw);
        //            Serial.print("\t");

        if (digitalRead(raw == LOW))
        {
          touche = 16 * raw + col;
          Serial.print("\t TOUCHE: " );
          Serial.println(touche);
          break;
        }
      }
    }
  }


  if (touche != -1)
  {
    Serial.print("\t : " );
    Serial.println(touche);
  }
}

chris

Tu penses que cette ligne fait quoi?

Pour te rafraîchir la mémoire
https://docs.arduino.cc/language-reference/en/functions/digital-io/digitalread/

la syntaxe étant fausse à mon avis pas grand chose

Hello,

Le programme que je t'avais proposé est un programme simplifié, il ne tenait pas compte du numéro réel des pins.
Voici un programme plus complet

const byte NBCOLS=16;
const byte NBRAWS=4;

const byte colPins[] = { 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 };
const byte rawPins[] = { 0, 1, 2, 3 };  // Attention 0 et 1 sont utilisés par Serial

void setup() {
  Serial.begin(9600);

  Serial.print(" \t INIT PASSE");
}

void loop() {
  int touche = -1;

  for (byte col = 0; col < NBCOLS && touche != -1; col++) {
    if (digitalRead(colPins[col]) == LOW) {
      //           Serial.print("Colonne: " );
      //           Serial.print(col);
      //           Serial.print("\t");

      for (byte raw = 0; raw < NBRAWS; raw++) {
        //              Serial.print("Raw: " );
        //              Serial.print(raw);
        //            Serial.print("\t");

        if (digitalRead(rawPins[raw]) == LOW) {
          touche = 16 * raw + col;
          //          Serial.print("\t TOUCHE: " );
          //          Serial.println(touche);
          break;
        }
      }
    }
  }


  if (touche != -1) {
    Serial.print("\t : ");
    Serial.println(touche);
  }
}

Attention les pins 0 et 1 sont utilisées pa la liaison série.

bonjour Kamill
Effectivement, cela fonctionne beaucoup mieux, merci.

j ai mis un "for" dans le setup afin de mettre toutes les pins en PULL UP

en revanche ce qui est en lien avec le "-1 " int touche = -1; et le if (touche != -1) empêche le démarrage du code, je ne pige pas son rôle, il y a forcement une raison qui m'échappe en tant que débutant.

autre petit point, une touche même ultra courte permettant d'obtenir le résultat me donne plusieurs fois le résultat. extrait du serial

|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|
|Colonne: 0|Raw: 0|| TOUCHE: 0|

je dois avoir qu une fois le résultat ex: |Colonne: 0|Raw: 0|| TOUCHE: 0| et sortir de la boucle jusqu'à la prochaine combinaison, le cas échéant j 'aurai un souci pour la suite.

const byte NBCOLS=16;
const byte NBRAWS=4;

const byte colPins[] = { 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 };
const byte rawPins[] = { 6, 7, 8, 9 };

int i = -1;
int j = -1;

void setup() {
  Serial.begin(9600);

    for(i = 32; i < 48 ; i++)
           {  
             pinMode(i, INPUT_PULLUP);
             Serial.print(" PIN Return n°: ");              
            Serial.print(i);                           
            Serial.println(" PIN Return INITIALISEE HIGH");   
          }

    for(j = 6; j < 10 ; j++)
           {  
            pinMode(i, INPUT_PULLUP);
            Serial.print(" PIN Raw n°: ");     
            Serial.print(j);                         
            Serial.println(" PIN Raw INITIALISEE HIGH");     
          }

  Serial.print(" \t INIT OK");
  
}

void loop() {
  int touche = -1;

  for (byte col = 0; col < NBCOLS && touche != -1; col++) {
    
    if (digitalRead(colPins[col]) == LOW) {
                 Serial.print("Colonne: " );
                 Serial.print(col);
                 Serial.print("\t");

      for (byte raw = 0; raw < NBRAWS; raw++) {
                      Serial.print("Raw: " );
                      Serial.print(raw);
                    Serial.print("\t");

        if (digitalRead(rawPins[raw]) == LOW) {
          touche = 16 * raw + col;
                    Serial.print("\t TOUCHE: " );
                    Serial.println(touche);
          break;
        }
      }
    }
  }


 if (touche != -1) {
Serial.print("\t : ");
Serial.println(touche);
//  }
}

si je ne commente pas tout ce qui est en relation avec -1, pas de démarre malgré le raw et col à LOW

dans tous les cas un trés grand merci pour le gros coup de main

chris

La syntaxe n'est pas fondamentalement fausse, mais ce que tu demandes n'a pas de sens.
Autant cela ne ferra pas ce que tu veux, mais cela fait quelque chose quand même.

L'important est surtout as tu compris ton erreur et ce que cela faisait ?

hello

je cherche à lire l'état de la pin et de la comparer immédiatement en tentant de mettre l'état final comparé dans "raw", je panais que cela le irait.

chris

Ok, mais du coup tu n'a pas compris pourquoi cela ne fait pas du tout ce que tu voulais ?
Ou tu as bien compris et changé ton code en conséquence ?

je viens de recharger le code initial qui ne fonctionne pas en mettant du serial print afin de comprendre

chris

Pourquoi mettre les entrées en INPUT_PULLUP alors que ce n'est pas toi qui pilote les lignes et colonnes?

Je ne vois pas trop ce que tu veux dire.

Hello

enter la matrice et l Arduino, il y a des buffers afin de préserver l'intégrité hard de la matrice existante, de ce fait sans pullup up, l'aduino lit des entrée assez flottantes, et cela m'indique n importe quoi dans le serial. j'ai essayé en "input", ca marche mal et parfois aléatoire.

il y avait un espace qui posait problème (pourquoi, je ne sais pas) ligne éffacée et re écrite; plus de souci

ca à l'air de bien tourner... merci, je teste et je reviens faire un feedback.

merci

chris