Go Down

Topic: Clavier Matriciel (Read 6635 times) previous topic - next topic

Alexisnard

Dec 02, 2013, 07:21 pm Last Edit: Dec 02, 2013, 07:25 pm by Alexisnard Reason: 1
Bonjour à tous,

Je suis nouveau sur ce forum et je cherche de l'aide pour programmer un clavier matriciel, j'ai quelque bases en Arduino c'est pourquoi je fais appel à vous. Je dispose d'une carte arduino 2560 mega, d'un clavier matriel (4 lignes et 3 colonnes), de quelques LED et résistances.
Je sais programmer l'allumage d'une led, un bouton poussoir, mais le clavier pas du tout, je n'ai aucune idées comment faire même s'il s'agit que de 12 bps.
Le but serait ici en fait d'allumer une led correspondant à une touche du clavier.

Merci.

Alexis

B@tto

http://playground.arduino.cc/Main/KeypadTutorial
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Alexisnard

Merci beaucoup.

J'aurai tout de même quelque question sur le code.

Code: [Select]

/*  Keypadtest.pde
*
*  Demonstrate the simplest use of the  keypad library.
*
*  The first step is to connect your keypad to the
*  Arduino  using the pin numbers listed below in
*  rowPins[] and colPins[]. If you want to use different
*  pins then  you  can  change  the  numbers below to
*  match your setup.
*
*/
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define ledpin 13

void setup()
{
  pinMode(ledpin,OUTPUT);
  digitalWrite(ledpin, HIGH);
  Serial.begin(9600);
}

void loop()
{
  char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      case '*':
        digitalWrite(ledpin, LOW);
        break;
      case '#':
        digitalWrite(ledpin, HIGH);
        break;
      default:
        Serial.println(key);
    }
  }
}


Je n'ai pas bien compri l'histoire des delay() et les conséquences que cela donne dans le programme.
Ensuite je ne comprend presque pas toute la partie allant de la création du clavier à la fin.

Merci.

Alexis

Super_Cinci

Je ne vois pas de delay() dans ton code... mais essaie d'incrémenter une variable à chaque appui sur une touche, tu verras qu'un delay() serait bien pratique...  => debounce.

Alexisnard

Merci je viens de comprendre, par contre j'ai une erreur de ce type:

Code: [Select]
Arduino: 1.5.4 (Windows XP), Board: "Arduino Mega 2560 or Mega ADK"

sketch_dec03a:31: error: 'Keypad' does not name a type
sketch_dec03a.ino: In function 'void loop()':
sketch_dec03a:44: error: 'kpd' was not declared in this scope

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.


Comment faire pour y remedier?

Merci.
Alexis

fdufnews

La librairie est bien installée? et au bon endroit?

Alexisnard

Comment ça la librairie? J'ai copié le code et je l'ai mis dans l'IDE Arduino?

fdufnews


Alexisnard

Merci beaucoup effectivement avec la librairie ca marche beaucoup mieux.

Dans le cas où j'utiliserais le même clavier défini dans le code et que je voudrais que l'appui sur la touche 1 allume la led 1, l'appuie sur la touche 2 allume la led 2, comment je dois faire?
Je sais que je dois déjà redéfinir le clavier, mais comment ça se passe au niveau de la boucle loop?

Merci
Alexis

fdufnews


Merci beaucoup effectivement avec la librairie ca marche beaucoup mieux.

Dans le cas où j'utiliserais le même clavier défini dans le code et que je voudrais que l'appui sur la touche 1 allume la led 1, l'appuie sur la touche 2 allume la led 2, comment je dois faire?
Je sais que je dois déjà redéfinir le clavier, mais comment ça se passe au niveau de la boucle loop?

Merci
Alexis


Voir là http://playground.arduino.cc/Main/KeypadTutorial

La définition du clavier sert uniquement à définir l'organisation des touches du clavier et à associer un code à chaque touche.
Ensuite pour associer une action à une touche c'est ton programme qui le fait en testant la valeur retournée par la méthode getKey (voir dans l'exemple le switch.. case... à l'intérieur du loop).

Alexisnard

D' accord mais à quoi servent les fonctions serial begin, switch jeu, et serialPrintLn key ?
J'imagine que case"x" permet de dire si c'est cette touche alors vu que l'on a défini dans les variables le clavier?
Merci.

Alexis

fdufnews


D' accord mais à quoi servent les fonctions serial begin, switch jeu, et serialPrintLn key ?
J'imagine que case"x" permet de dire si c'est cette touche alors vu que l'on a défini dans les variables le clavier?
Merci.

Alexis


Je pense qu'il faudrait quand même commencer par les bases
http://arduino.cc/en/Reference/HomePage
http://arduino.cc/en/Reference/Serial

Alexisnard

Le programme marche parfaitement bien, mais comment faire pour avoir que que l'apparition sur le moniteur de la touche pressée? comme ca?:

Code: [Select]
/*  Keypadtest.pde
*
*  Demonstrate the simplest use of the  keypad library.
*
*  The first step is to connect your keypad to the
*  Arduino  using the pin numbers listed below in
*  rowPins[] and colPins[]. If you want to use different
*  pins then  you  can  change  the  numbers below to
*  match your setup.
*
*/
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define ledpin 13

void setup()
{
  pinMode(ledpin,OUTPUT);
  digitalWrite(ledpin, HIGH);
  Serial.begin(9600);
}

void loop()
{
  char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
        default:
        Serial.println(key);
    }
  }
}



Fotso

Slt et merci pour cet article bien détaillé je dispose d'un clavier 4×4 et j'aimerai augmentez le lettres de ce clavier un peu comme pour téléphone je ne sais pas si c'est possible si oui comment s'y prendre merci bien.

dfgh

#14
Aug 04, 2017, 12:05 pm Last Edit: Aug 13, 2017, 12:04 am by dfgh
hello
une idée ( peut être farfelue ) edit : effectivement, après test, ça ne fonctionne pas
à tester après avoir étudié le code du dessus que j'ai modifié.

tiens nous au courant

Code: [Select]
/* 
*test pour voir si on peut changer l'affectation des touches
*4 interrupteurs raccordés à GND et sur les entrées 2,3,4,5
*/
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys_1[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
char keys_2[ROWS][COLS] = {
  {'A','B','C'},
  {'D','E','F'},
  {'G','H','I'},
  {'J','K','L'}
};
char keys_3[ROWS][COLS] = {
  {'M','N','O'},
  {'P','Q','R'},
  {'S','T','U'},
  {'V','W','X'}
};
char keys_4[ROWS][COLS] = {
  {'Y','Z','_'},
  {'-','&','~'},
  {'(',')','['},
  {'{','}',']'}
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys_1), rowPins, colPins, ROWS, COLS );

#define ledpin 13
const byte matrice_1=2;//4 interrupteurs et pas des poussoirs
const byte matrice_2=3;
const byte matrice_3=4;
const byte matrice_4=5;
void setup()
{
  pinMode(matrice_1,INPUT_PULLUP);
  pinMode(matrice_2,INPUT_PULLUP);
  pinMode(matrice_3,INPUT_PULLUP);
  pinMode(matrice_4,INPUT_PULLUP);
  pinMode(ledpin,OUTPUT);
  digitalWrite(ledpin, HIGH);
  Serial.begin(9600);
}

void loop()
{ if (digitalRead(matrice_1)==LOW){Keypad kpd = Keypad( makeKeymap(keys_1), rowPins, colPins, ROWS, COLS );}
  if (digitalRead(matrice_2)==LOW){Keypad kpd = Keypad( makeKeymap(keys_2), rowPins, colPins, ROWS, COLS );}
  if (digitalRead(matrice_3)==LOW){Keypad kpd = Keypad( makeKeymap(keys_3), rowPins, colPins, ROWS, COLS );}
  if (digitalRead(matrice_4)==LOW){Keypad kpd = Keypad( makeKeymap(keys_4), rowPins, colPins, ROWS, COLS );}
  char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      case '*':
        digitalWrite(ledpin, LOW);
        break;
      case '#':
        digitalWrite(ledpin, HIGH);
        break;
      default:
        Serial.println(key);
    }
  }
}

Go Up