Bonjour,
J'essaie de réaliser une matrice de boutons poussoirs pour en faire un clavier. Le principe de fonctionnement : les boutons sont organisés en une matrice de 5 colonnes et 10 lignes. Chaque colonne est connectée, via une résistance 10k, à une sortie (pin A1 à A5 utilisées en digital) et chaque ligne est connectée à une entrée en pull up (pin 2 à 12). L'arduino envoie successivement un signal dans chaque colonne et, si un un signal est reçu en sortie, on peut en déduire la position du bouton pressé.
Pour éviter que les signaux prennent des chemins inattendus (le "ghosting"), j'ai ajouté à la suite de chaque bouton poussoir une diode. Elles sont orienté avec le + du côté des sorties (pin A1 à A5) et le - du côté des entrées.
Côté programmation, tous les outputs sont à LOW, sauf celui de la colonne que je teste. Quand un input est à HIGH, j'en conclus qu'on appuie sur un bouton. Je mets le code en dessous si vous voulez vous pencher dessus.
Et là ça coince : toutes mes entrées sont en permanence à HIGH, même quand le clavier est complètement débranché de l'arduino !
A force d'essais, je trouve une situation dans laquelle j'obtiens le résultat attendu : Je mets toutes les sorties à HIGH sauf celle que je teste. Quand une entrée est à LOW, j'en déduis qu'on appuie sur un bouton. Mais, pour que ça marche, je dois court-circuiter mes diodes.
Pour ce que j'en comprends, j'aurais dû inverser la polarité des diodes car les résistances de pull up font que le courant circule dans l'autre sens.
Avant de dessouder et ressouder mes 50 diodes, pouvez-vous confirmer que c'est le bon diagnostic ?
Merci si vous m'avez lu jusque là !
Le code :
// to listen keyboard with python :
// >>> import serial
// >>> ser = serial.Serial('/dev/ttyACM0')
// >>> while True:
// >>> print(ser.readline())
// >>>
const int first_col = A1;
const int last_col = A5;
const int first_line = 2;
const int last_line = 12;
const long unsigned int wait_time = 50;
long unsigned int last_time;
int current_col;
int current_button_id;
void setup() {
for(int pin=first_col; pin<=last_col; pin++) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // HIGH
}
for(int pin=first_line; pin<=last_line; pin++)
pinMode(pin, INPUT_PULLUP);
last_time = millis();
current_col = first_col;
Serial.begin(9600);
}
void refresh_cols() {
if(millis() > last_time + wait_time) {
last_time = millis();
if(current_button_id != 0)
Serial.println(current_button_id);
digitalWrite(current_col, LOW); // HIGH
if(++current_col > last_col)
current_col = first_col;
digitalWrite(current_col, HIGH); // LOW
}
}
void check_lines() {
current_button_id = 0;
for(int pin=first_line; pin<=last_line; pin++)
if(digitalRead(pin) == HIGH) // LOW
current_button_id = current_col*100 + pin;
}
void loop() {
check_lines();
refresh_cols();
}