Clavier matriciel de plus de 16 touches

Bonjour a tous ,

je suis en train de faire un banc de test pour des claviers d'automate de 23 touches (4 lignes 6 colones) pas le choix le clavier est concu ainci .

mon programe a pour but d'afficher sur un lcd la touche appuillé , a priorie pas si difficile que cela je configure donc mes broches de ligne(4) et colonnes (6)

l'affichage du lcd ok

seulement je n'arrive a faire fonctionner que 16 touche , les 2 derniere colonnes ne fonctionne pas

j'utilise la librairie (MyKeyPad ) mais j'ai l'impression que l'arduino n'ecrit que sur les 4 premieres colones (4bites) et jamais sur les 2 dernieres.

y aurrait il une astuce que je n'ai pas saisie ou est ce les limites de la librairie mykeypad qui ne sais ecrire sur plus de 4 bit ??

merci pour vos future reponces

Bonjour, Un shema + photo du cablage + code utilise et cela sera beaucoup plus facile de t'aider. Jacques

#include “MyKeyPad.h”
// Constructeur paramétré
MyKeyPad::MyKeyPad(int rowArray, int colArray){
// Copier le tableau des broches
for(int r = 0; r < 6; r++)
row[r] = rowArray[r];
for(int c = 0; c < 4; c++)
col

 = colArray[c];
  // Programmation des broches numériques
  for(int r = 0; r < 6; r++)
    pinMode(row[r], OUTPUT);
  for(int c = 0; c < 4; c++)
    pinMode(col[c], INPUT);
  // Définition initiale de debounceTime à 300 ms
  debounceTime = 300;
}

// Méthode pour régler le temps de rebond
void MyKeyPad::setDebounceTime(unsigned int time){
   debounceTime = time;
}

// Méthode pour déterminer la touche appuyée sur le clavier numérique
char MyKeyPad::readKey(){
  char key = KEY_NOT_PRESSED;
  for(int r = 0; r < 6; r++){
    digitalWrite(row[r], HIGH);
    for(int c = 0; c < 4; c++){
      if((digitalRead(col[c]) == HIGH)&&(millis() - lastValue) >= debounceTime){
        
        if((c==3)&&(r==5)) key = KEY_I;
        if((c==2)&&(r==5)) key = KEY_H;
        if((c==1)&&(r==5)) key = KEY_L;
        if((c==0)&&(r==5)) key = KEY_K;
        
        if((c==3)&&(r==4)) key = KEY_F;
        if((c==2)&&(r==4)) key = KEY_E;
        if((c==1)&&(r==4)) key = KEY_C;
        if((c==0)&&(r==4)) key = KEY_B;
        
        if((c==3)&&(r==3)) key = KEY_A;
        if((c==2)&&(r==3)) key = KEY_1;
        if((c==1)&&(r==3)) key = KEY_2;
        if((c==0)&&(r==3)) key = KEY_3;      
        
        if((c==3)&&(r==2)) key = KEY_D;
        if((c==2)&&(r==2)) key = KEY_4;
        if((c==1)&&(r==2)) key = KEY_5;
        if((c==0)&&(r==2)) key = KEY_6;
           
        if((c==3)&&(r==1)) key = KEY_G;
        if((c==2)&&(r==1)) key = KEY_7;
        if((c==1)&&(r==1)) key = KEY_8;
        if((c==0)&&(r==1)) key = KEY_9; 
        
        if((c==3)&&(r==0)) key = KEY_J;
        if((c==2)&&(r==0)) key = KEY_STAR; // *
        if((c==1)&&(r==0)) key = KEY_0;
        if((c==0)&&(r==0)) key = KEY_HASH; // #
       
        lastValue = millis();
      }
    }
  digitalWrite(row[r], LOW); // Restauration du niveau initial
  }
  return key;
}voila pour la code 

les broches utilisées sont les 2/3/4/5 pour les lignes et 8/9/10/11/12/13 pour les colonnes 

j'utilise un UNO

je reprecise que seulement 16 touches fonctionnent ,seul les touches connecté sur les 2 derniere colonnes ne fonctionnent pas .

d'ou re ma question , quelqu'un a t il deja parametré un clavier matriciel de + de 16 touche 
pour moi l'arduino n'ecris pas sur les 2 dernieres colone donc il ecrirait uniquement sur 4 bits ?

Kwick: j'utilise la librairie (MyKeyPad )

C'est quoi cette librairie. Je ne l'ai pas trouvée. Donnes un lien vers la librairie.

Slt , oui j'ai bien placée des resistance de push down sur les 4 colonnes et le cabla a etait verifié et reverifié R.A.S.

aux vu de vos reponces ,je crois bien que je suis le premier a essayer un clavier de plus de 16 touches.

arf tjs pour moi les c asse tete lol .

je rest donc sur mon premier sentiment qui me dit qu'avec cette librairie l'arduino n'ecris que sur 4 bit

pour verifier :

lorsque je place une diode entre les patte 13 et la masse a coté celle ci ne s'allume pas entre 12 et gnd pareil entre 11 et gnd ok elle s'allume

tous cela pdt que le prog tourne bien sur

pour moi c'est un pb de prog , mais je prefere demander ici a des specialistes :)

si qq'un vois une solution a mon pB !!?

par avance merci

les broches 8 9 10 11 12 13 sont bien configurées en sortie et 2 3 4 5 en entrées le pb n’est pas que ca ne marche pas mais ca ne marche qu’a moitier puisque rien n’est ecris sur les broche 12 13 donc les touches correspondante a ces broches ne foncionnent pas .
"
for(int r = 0; r < 6; r++)
pinMode(row[r], OUTPUT);
for(int c = 0; c < 4; c++)
pinMode(col

, INPUT);
                                                      "
je me suis peut etre trompé en ecrivant le poste, la je n'ai pas le montage ni le sketch chez moi 

j'esserais quand meme d'inverser tous ca demain mais je n'y crois pas trop merci quand mm pepe.

pepe:

fdufnews:

Kwick: j'utilise la librairie (MyKeyPad )

C'est quoi cette librairie. Je ne l'ai pas trouvée. Donnes un lien vers la librairie.

Il me semble que la partie intéressante de cette librairie a été donnée ci-dessus.

bonsoir je prend là , mais comme fdufnews je ne trouve pas (recherche rapide) de lib MyKeyPad

de la "keypad" oui , de la key... un peu aussi :grin: Mais une une simple reponse à la question initiale de fdufnews = lien vers la lib utilisée , serait déjà pas mal si de l'aide est vraiment souhaitée 8)

Bonjour , je ne me souvient plus sur quelle tuto j'ai trouvé cette librairie , mais comme elle semble vous interessé je vous la posterais dés que je serrais sur le bon PC .

a plus tard ;)

bonjour, je ne vous au pas oublier juste bcp d'intervention en ce moment , j'ai testé le port 12 et 13 av le blink r a s les sorties ne sont donc pas endomagées j'essaye avec une autre librairie keypad classic que je suis en train de modifier pour 24 touches je vous tiens au courrant des que ... et vous mettrais la lib "MyKeyPad" cité plus haut ;) bon week end ;)

slt a tous merci pepe pour l'info je regarderais plus attentivement dés que j'aurrais qq heures la j'avoue etre perdu et surbooké au taf , en ce qui concerne le sketch qui vous interresse "mykeypad", il est dispo ici : http://serialmakers.com/livres/le-grand-livre-arduino/ "montage 12" a bientot pour la suite ;) et merci pour votre aide , je vous tiens au jus de l'evolution de ce projet

;)

voici la suite du code que j’ai bricolé :
"
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(6, 7, A0, A1, A2, A3); // LCD CONFIG 6=RS 7=E A0-3=DATA

#include “MyKeyPad.h”
int rowArray = {8, 9, 10, 11, 12, 13}; // Initialiser le tableau avec les numéros de broche des lignes
int colArray = {2, 3, 4, 5}; // Initialiser le tableau avec les numéros de broche des colonnes
MyKeyPad myOwnKeyPad(rowArray, colArray); // Instanciation d’un objet

void setup(){

myOwnKeyPad.setDebounceTime(500); // Régler le temps du rebond à 500 ms

lcd.begin(16, 2);

delay( 10);
lcd.setCursor (2, 0);

lcd.print( “E.F.S. test” );
// Print a message to the LCD.
lcd.setCursor (0, 1) ;
lcd.print("clavier HM18/19 ");
delay(2000);
lcd.noDisplay();
delay(500);

lcd.display();
delay(500);
lcd.noDisplay();
delay(500);

lcd.display();
delay(500);
lcd.noDisplay();
delay(500);

lcd.display();
delay(1000);

lcd.clear();
delay(500);
lcd.setCursor (0, 0);

lcd.print(“touche :”);

}

void loop(){

char myKey = myOwnKeyPad.readKey(); // Lecture de la touche appuyée

lcd.setCursor(9, 1);
if (myKey !=KEY_NOT_PRESSED);

if (myKey ==KEY_1)
lcd.print ("VOL+ “);
if (myKey ==KEY_2)
lcd.print (” 8 “);
if (myKey ==KEY_3)
lcd.print (” 3 ");
if (myKey ==KEY_4)
lcd.print ("VOL- “);
if (myKey ==KEY_5)
lcd.print (” 9 “);
if (myKey ==KEY_6)
lcd.print (” 4 “);
if (myKey ==KEY_7)
lcd.print (“QC PROG”);
if (myKey ==KEY_8)
lcd.print (” 0 “);
if (myKey ==KEY_9)
lcd.print (” 5 ");
if (myKey ==KEY_0)
lcd.print (“DONOR W”);
if (myKey ==KEY_STAR)
lcd.print ("PRINT ");
if (myKey ==KEY_HASH)
lcd.print ("MENU “);
if (myKey ==KEY_J)
lcd.print (“CLAMP -”);
if (myKey ==KEY_G)
lcd.print (“CLAMP +”);
if (myKey ==KEY_D)
lcd.print (” START “);
if (myKey ==KEY_A)
lcd.print (” PAUSE “);
if (myKey ==KEY_F)
lcd.print (” TARE ");

}
en effet je crois avoir confondu lignes et colonnes ^^

mykeypad.h

#ifndef MYKEYPAD_H
#define MYKEYPAD_H
#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#define KEY_NOT_PRESSED ‘_’ // Nécessaire si aucune touche n’est appuyée
#define KEY_1 ‘1’
#define KEY_2 ‘2’
#define KEY_3 ‘3’
#define KEY_4 ‘4’
#define KEY_5 ‘5’
#define KEY_6 ‘6’
#define KEY_7 ‘7’
#define KEY_8 ‘8’
#define KEY_9 ‘9’
#define KEY_0 ‘0’
#define KEY_STAR ‘R’
#define KEY_HASH ‘V’
#define KEY_A ‘A’
#define KEY_B ‘B’
#define KEY_C ‘C’
#define KEY_D ‘D’
#define KEY_E ‘E’
#define KEY_F ‘F’
#define KEY_G ‘G’
#define KEY_H ‘H’
#define KEY_I ‘I’
#define KEY_J ‘J’
#define KEY_K ‘K’
#define KEY_L ‘L’

class MyKeyPad{
public:
MyKeyPad(int rowArray, int colArray); // Constructeur paramétré
void setDebounceTime(unsigned int debounceTime); // Réglage du temps de rebond
char readKey(); // Détermine la touche appuyée sur le clavier numérique
private:
unsigned int debounceTime; // Variable locale pour temps de rebond
long lastValue; // Dernière valeur de la fonction millis
int row[4]; // Tableau pour les lignes
int col[6]; // Tableau pour les colonnes
};
#endif

Si tu avais donné la librairie tout de suite ce serait déjà réglé.

class MyKeyPad{
  public:
    MyKeyPad(int rowArray[], int colArray[]);        // Constructeur paramétré
    void setDebounceTime(unsigned int debounceTime); // Réglage du temps de rebond
    char readKey();                                  // Détermine la touche appuyée sur le clavier numérique
  private:
    unsigned int debounceTime; // Variable locale pour temps de rebond
    long lastValue; // Dernière valeur de la fonction millis
    int row[4];     // Tableau pour les lignes
    int col[3];     // Tableau pour les colonnes
};
#endif

Dans la librairie, les tableau col et row ont des tailles fixées à 3 et 4 et dans le reste de la librairie les bornes des boucles sont aussi constantes avec les mêmes valeurs. Il suffirait de changer les valeurs dans la librairie pour l'adapter à ta taille de clavier.

Maintenant il y a aussi cette librairie qui pourrait t’intéresser http://playground.arduino.cc/Code/Keypad
avec un tutorial ici http://playground.arduino.cc/Main/KeypadTutorial

merci fdufnews,

mais regarde plus haut , j'avais bien modifié le code dans se sens "class MyKeyPad{ public: MyKeyPad(int rowArray[], int colArray[]); // Constructeur paramétré void setDebounceTime(unsigned int debounceTime); // Réglage du temps de rebond char readKey(); // Détermine la touche appuyée sur le clavier numérique private: unsigned int debounceTime; // Variable locale pour temps de rebond long lastValue; // Dernière valeur de la fonction millis int row[4]; // Tableau pour les lignes int col[6]; // Tableau pour les colonnes };

endif

"

Kwick:
merci fdufnews,

mais regarde plus haut , j’avais bien modifié le code dans se sens

bonjour
il faut aussi dans le MyKeyPad.cpp
modifier toutes les valeurs en dur de scan
exemple sur la 1ere iteration

#include "MyKeyPad.h"
// Constructeur paramétré
MyKeyPad::MyKeyPad(int rowArray[], int colArray[]){
  // Copier le tableau des broches
  for(int r = 0; r < 4; r++) 
    row[r] = rowArray[r];
  for(int c = 0; c < 3; c++)  // <------- remplacer 3 par  6 
    col[c] = colArray[c];

Bonjour Artouste,

oui c'est bien se que j'avais fait , le code modifiée est sur la premiere page de ce post . c'est bien pour cela que je bloque . il faut absolument que je trouve du tps pour regarder tous ca de plus pres, car je ne comprend pas pourquoi cela ne fonctionne pas . j'eserais de modifier une autre librairie au cas ou .

merci pour vos reponces, si je ne trouve pas de solution, je me demande si je ne pourrais pas crée un deuxieme objet clavier pour completer la partie de mon clavier qui me manque , mais ca vas tournée en bidouille !!! ^^

Bon je viens de m’y remetre tant pis pour les depannage en cour ^^
en effet un grand merci PEPE en effet j’avais bien confondu ligne et colonnes
a present cela fonctionne

dsl de vous avoir derrangé pour une si petite betise

en tous cas cela fait du bien de se remetre a la prog
fesais 7 ans que je n’avais pas touché a un proc ni a la prog
et la platforme ARDUINO est plutot sympat je risque de vous embeter plus souvent a present :slight_smile:

encore une fois merci a tous pour votre aide