Simple question pour un keypad

Bonsoir,

Pour un projet j’ai acheté un keypad de 4 lignes, 4 colonnes. J’ai raccordé ça sur 8 broches de mon µC ( tel quel sans résistances ), j’affiche ce que je tappe sur un lcd.
Quoi que je tappe le lcd m’affiche 1 puis 2 toutes les secondes. J’envoie également sur le terminal arduino et je retrouve également ces “1” et “2” sur le terminal d’arduino ( que je tappe qqch ou rien ). Je pense qu’il doit y avoir une résistance de pull-up ou quelque chose du genre à activer. Je vous joins mon programme, le lcd n’est pas à mettre en cause.
Merci d’avance

#include <Keypad.h>
#include <LiquidCrystal.h>
// configuration clavier
const byte ROWS =4;
const byte COLS =4;
char keys[ROWS][COLS] =
{
  {'1','2','3','F'},
  {'4','5','6','E'},
  {'7','8','9','D'},
  {'A','0','B','C'},
};
byte rowPins[ROWS] = {13,12,11,10};
byte colPins[COLS] = {9,8,7,6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// configuration clavier
const int RS=14;
const int E=17;
const int D4=19;
const int D5=18;
const int D6=4;
const int D7=5;

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);


void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
}
void loop()
{
  char key = keypad.getKey();
  if(key != NO_KEY)
  {
    Serial.println(key);
    lcd.print(key);
    delay(1000);
  }
}

Petite note trouvé ici : http://arduino.cc/playground/Main/KeypadTutorial

•You will need pullup resistors, somewhere between 2k to 10k, on each of the row pins.

Ce qui est normal, il n'y a aucun pull-up ou pull-down nul part, donc tes pins sont flottants ...

Ok, je n’étais pas sûr mais je vais faire ça maintenant alors.
Merci,

@+

J'ai donc mis des résistances de pull up de 3,3K sur les row pins, j'avais toujours le même problème, j'ai vu un site où ils disaient qu'il fallait mettre des résistances sur les colonnes, donc j'en ai rajouté aux colonnes mais rien à faire j'ai toujours le même problème. Je cherche encore, vos suggestions sont les bienvenues.

A plus

Je n’ai toujours pas trouvé le problème, j’ai mis des résistances de pull up côté rows, puis rows et cols et finalement que cols, et j’ai toujours le même problème. Les chiffres 1 puis 4 s’affichent dans terminal. J’ai alors retiré ma carte pour ne laisser que l’arduino connecté à la carte, pour constater que le problème continuait, là 1 et 4 s’affichaient alors que rien d’autre que l’arduino n’était branché. En fait les pins 6à 9 de mon arduino ( duemilanove ) étaient en court-circuit. L’arduino n’est pas à remettre en cause étant donné qu’avec un autre programme, il n’y a pas de problème.

Alors où mon soft n’est pas bon, mais ça m’étonnerait puisqu’il vient du site arduino, ou il manque qqch dans mon schéma.

Est-ce que les résistances de pull up de 3,3 K c’est trop peu?
Faut-il des résistances entre le µC et le Keypad?

Et surtout, est-ce normal que les pins décrites plus haut soient en court-circuit?

#include <Keypad.h>

const byte ROWS =4;
const byte COLS =4;
char keys[ROWS][COLS] = {
  {'1','2','3','F'},
  {'4','5','6','E'},
  {'7','8','9','D'},
  {'A','0','B','C'}
};
byte rowPins[ROWS] = {13,12,11,10};
byte colPins[COLS] = {9,8,7,6}; 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  char key = keypad.getKey();
  if(key != NO_KEY)
  {
    Serial.println(key); 
    delay(250);   
  }
}

Salut, pour ceux que ça intéresse j'ai enfin résolu le problème de ce clavier. Voilà les choses à connaître: - mettre les lignes en entrée - mettre les colonnes en sortie - mettre des résistances de pull up en HARDWARE pour les lignes

  • mettre les lignes en entrée
  • mettre les colonnes en sortie

Tu veux dire en utilisant des pinMode ?

  • mettre les lignes en entrée
  • mettre les colonnes en sortie
  • mettre des résistances de pull up en HARDWARE pour les lignes

Surprenant !!
C’est fait dans la routine d’initialisation qui est appelée par le constructeur lorsque l’on créé un nouvel objet Keypad

Keypad::Keypad(char *userKeymap, byte *row, byte *col, byte rows, byte cols)
{
    rowPins = row;
    columnPins = col;
	
	size.rows = rows;
	size.columns = cols;
	
    begin(userKeymap);
	
	lastUpdate = 0;
	debounceTime = 50;
	holdTime = 1000;
	keypadEventListener = 0;
	currentKey = NO_KEY;
	state = IDLE;
	
	initializePins();
}

......

void Keypad::initializePins(){
	for (byte r=0; r<size.rows; r++){
        for (byte c=0; c<size.columns; c++){
			pinMode(columnPins[c],OUTPUT);
			digitalWrite(columnPins[c],HIGH);
        }
		//configure row pin modes and states
		pinMode(rowPins[r],INPUT);
		digitalWrite(rowPins[r],HIGH);
    }
}

En même temps il y a un truc qui me parait bizarre (je n’ai pas trop le temps d’approfondir maintenant) mais il me semble que les 2 boucles for () ne devraient pas être imbriquées.

En effet c’est très particulier. Je pensais vraiment que c’était simple de programmer un keypad mais il y a quand même quelques subtilités