Αν θέλατε ποτέ να προσθέσετε κουμπιά στα projects σας με Arduino — είτε για την εισαγωγή κωδικού, τον έλεγχο ενός ρομπότ ή την πλοήγηση σε ένα μενού — ένα πληκτρολόγιο μεμβράνης είναι ένα καλό σημείο εκκίνησης. Αυτά τα πληκτρολόγια είναι οικονομικά, ανθεκτικά και ακόμη και αδιάβροχα, καθιστώντας τα ιδανικά για πολλά projects DIY ηλεκτρονικής.
Τα πληκτρολόγια μεμβράνης διατίθενται σε διάφορα μεγέθη, αλλά τα πιο κοινά είναι τα 4×3 και 4×4. Η διάταξή τους είναι παρόμοια με αυτή ενός τηλεφωνικού πληκτρολογίου, που τα καθιστά οικεία και εύχρηστα.

Αν και διατίθενται σε διαφορετικά μεγέθη, όλα τα πληκτρολόγια μεμβράνης λειτουργούν με τον ίδιο τρόπο. Μόλις καταλάβετε πώς συνδέονται και επικοινωνούν με ένα Arduino, θα μπορείτε να τα χρησιμοποιήσετε με κάθε δημιουργικό και χρήσιμο τρόπο.
Τώρα, ας ξεκινήσουμε εξηγόντας πώς λειτουργούν αυτά τα πληκτρολόγια και ας δούμε πώς μπορείτε να τα συνδέσετε σε ένα Arduino!
Κατασκευή Πληκτρολογίου Μεμβράνης
Ένα πληκτρολόγιο μεμβράνης (membrane keypad) κατασκευάζεται από λεπτό, εύκαμπτο υλικό και συνήθως αποτελείται από έξι βασικά στρώματα. Τα στρώματα αυτά συνεργάζονται ώστε το πληκτρολόγιο να συμπεριφέρεται λειτουργικά. Ακολουθεί η περιγραφή κάθε στρώματος:

1. Γραφική Επικάλυψη (Graphic Overlay) Πρόκειται για το επάνω στρώμα που βλέπετε και αγγίζετε. Συνήθως κατασκευάζεται από πολυεστέρα (polyester), καθώς ο πολυεστέρας έχει μεγαλύτερη διάρκεια ζωής και καλύτερη αντοχή στις επαναλαμβανόμενες κάμψεις σε σύγκριση με άλλα υλικά, όπως το πολυανθρακικό (polycarbonate).
2. Μεταλλικοί Θόλοι (Metal Domes) Ακριβώς κάτω από το επάνω στρώμα βρίσκονται μικροί μεταλλικοί ή πλαστικοί θόλοι, οι οποίοι προσφέρουν την χαρακτηριστική αίσθηση «κλικ» όταν πατιέται ένα πλήκτρο.
3. Επάνω Στρώμα Κυκλώματος (Top Circuit Layer) Το στρώμα αυτό περιλαμβάνει τις αγώγιμες ηλεκτρικές διαδρομές, οι οποίες δημιουργούνται πάνω σε φύλλο πολυεστέρα με τη χρήση αγώγιμου μελανιού εμπλουτισμένου με σωματίδια αργύρου (silver-filled conductive ink). Το κύκλωμα καταλήγει σε μια εύκαμπτη ουρά (flexible tail), μέσω της οποίας το πληκτρολόγιο συνδέεται με άλλες ηλεκτρονικές συσκευές.
4. Αποστατικό Στρώμα (Spacer) Το αποστατικό στρώμα διατηρεί χωριστά το επάνω και το κάτω στρώμα κυκλώματος. Έτσι, με αυτό τον τρόπο, το πλήκτρο παραμένει «ανενεργό» μέχρι να πατηθεί. Όταν πιέζεται ένα πλήκτρο, τα δύο στρώματα κυκλώματος έρχονται σε επαφή, επιτρέποντας τη διέλευση του ηλεκτρικού ρεύματος.
5. Κάτω Στρώμα Κυκλώματος (Bottom Circuit Layer) Όπως και το επάνω στρώμα κυκλώματος, έτσι και το κάτω περιλαμβάνει αγώγιμες ηλεκτρικές διαδρομές που δημιουργούνται με αγώγιμο μελάνι εμπλουτισμένο με άργυρο. Και αυτό το στρώμα καταλήγει σε μια εύκαμπτη ουρά για τη σύνδεση του πληκτρολογίου με ηλεκτρονικές συσκευές.
6. Οπίσθιο Αυτοκόλλητο Στρώμα (Rear Adhesive Layer) Το κατώτερο στρώμα διαθέτει αυτοκόλλητη επιφάνεια, επιτρέποντας την εύκολη στερέωση του πληκτρολογίου σχεδόν σε οποιαδήποτε επιφάνεια. Χάρη σε αυτό, τα πληκτρολόγια μεμβράνης είναι ιδιαίτερα ευέλικτα και εύκολα στην εγκατάσταση.
Εάν αφαιρούσατε το προστατευτικό χαρτί από την πίσω πλευρά ενός πληκτρολογίου μεμβράνης, θα μπορούσατε να δείτε όλα αυτά τα στρώματα να είναι τοποθετημένα το ένα πάνω στο άλλο, σχηματίζοντας το ολοκληρωμένο πληκτρολόγιο.
Ένα ιδιαίτερα ενδιαφέρον χαρακτηριστικό των πληκτρολογίων μεμβράνης είναι ο τρόπος με τον οποίο συνδέονται τα πλήκτρα. Όλες οι γραμμές (rows) και οι στήλες (columns) των πλήκτρων συνδέονται μεταξύ τους σχηματίζοντας ένα πλέγμα (grid). Αυτός ο έξυπνος σχεδιασμός μειώνει σημαντικά τον αριθμό των ακροδεκτών σύνδεσης που απαιτούνται. Για παράδειγμα, χωρίς αυτή τη διάταξη πλέγματος, ένα πληκτρολόγιο με 16 πλήκτρα θα χρειαζόταν 17 ακροδέκτες σύνδεσης (έναν για κάθε πλήκτρο και έναν για τη γείωση).
Αντίθετα, όταν τα πλήκτρα οργανώνονται σε γραμμές και στήλες, ένα πληκτρολόγιο 4×4 απαιτεί μόνο 8 ακροδέκτες σύνδεσης για τη λειτουργία όλων των πλήκτρων. Αυτή η έξυπνη τεχνική ελέγχου πολλών πλήκτρων με τη χρήση μικρότερου αριθμού ακροδεκτών ονομάζεται πολυπλεξία (Multiplexing).
Πώς λειτουργεί ένα πληκτρολόγιο μήτρας (Matrix Keypad);
Ένα πληκτρολόγιο μήτρας (matrix keypad) αποτελείται από πλήκτρα διατεταγμένα σε γραμμές (rows) και στήλες (columns). Κάθε πλήκτρο βρίσκεται ακριβώς στο σημείο όπου διασταυρώνεται μία γραμμή με μία στήλη. Το παρακάτω διάγραμμα δείχνει τον τρόπο με τον οποίο οι εσωτερικές συνδέσεις δημιουργούν ένα πληκτρολόγιο μήτρας 4×3.

Όταν πατηθεί ένα πλήκτρο, δημιουργείται ηλεκτρική σύνδεση μεταξύ μίας γραμμής και μίας στήλης, επιτρέποντας τη διέλευση ηλεκτρικού ρεύματος. Για παράδειγμα, όταν πατηθεί το πλήκτρο «4», συνδέεται η στήλη 1 με τη γραμμή 2. Εντοπίζοντας ποια γραμμή συνδέεται με ποια στήλη, μπορούμε να προσδιορίσουμε με ακρίβεια ποιο πλήκτρο έχει πατηθεί.
Διάταξη ακροδεκτών (Pinout) πληκτρολογίων μεμβράνης 4×3 και 4×4
Το πληκτρολόγιο μεμβράνης διαθέτει θηλυκό σύνδεσμο Dupont. Όταν κοιτάζετε το πληκτρολόγιο από την εμπρόσθια πλευρά, οι ακροδέκτες των γραμμών (rows) βρίσκονται στα αριστερά, ενώ οι ακροδέκτες των στηλών (columns) βρίσκονται στα δεξιά.
Η διάταξη των ακροδεκτών είναι η ακόλουθη:

Σάρωση πληκτρολογίου (Keypad Scanning)
Για να ανιχνεύσει ο μικροελεγκτής ποιο πλήκτρο έχει πατηθεί, χρησιμοποιείται μια τεχνική που ονομάζεται «σάρωση» (scanning). Η διαδικασία λειτουργεί ως εξής:
- Αρχικά, ο μικροελεγκτής θέτει τις γραμμές (rows) και τις στήλες (columns) ως εισόδους (inputs) με ενεργοποιημένες τις pullup αντιστάσεις. Οι αντιστάσεις αυτές εξασφαλίζουν ότι οι στήλες, υπό κανονικές συνθήκες, διαβάζονται ως HIGH.
- Ο μικροελεγκτής θέτει κάθε φορά μια γραμμή (row) σε κατάσταση εξόδου και στη συνέχεια στέλνει ένα σήμα LOW σε αυτή τη γραμμή, διατηρώντας όλες τις υπόλοιπες γραμμές σε κατάσταση εισόδου.
- Έπειτα ελέγχει κάθε στήλη για να διαπιστώσει εάν κάποια από αυτές έχει επίσης μεταβεί σε κατάσταση LOW.
- Εάν μία στήλη βρίσκεται σε κατάσταση LOW, αυτό σημαίνει ότι έχει πατηθεί το πλήκτρο που βρίσκεται στο σημείο διασταύρωσής αυτής της στήλης και της γραμμής που έχουμε ήδη θέσει σε LOW.
- Για παράδειγμα, εάν ο μικροελεγκτής στείλει σήμα LOW στη δεύτερη γραμμή (θέτοντας τις υπόλοιπες γραμμές σε INPUT) και διαπιστώσει ότι και η δεύτερη στήλη έχει μεταβεί σε κατάσταση LOW, γνωρίζει ότι έχει πατηθεί το πλήκτρο «5», το οποίο βρίσκεται στο σημείο διασταύρωσης της γραμμής 2 και της στήλης 2.
- Μόλις ανιχνευθεί το πάτημα ενός πλήκτρου, ο μικροελεγκτής προσδιορίζει ακριβώς ποιος χαρακτήρας αντιστοιχεί στο πλήκτρο που πατήθηκε, αναζητώντας τον σε έναν ειδικό πίνακα που ονομάζεται πίνακας αντιστοίχισης πλήκτρων (keymap array). Ο πίνακας αυτός καθορίζει ποιος χαρακτήρας (όπως «4», «A», «#» κ.λπ.) αντιστοιχεί σε κάθε συνδυασμό γραμμής και στήλης.
Η διαδικασία σάρωσης πραγματοποιείται πολύ γρήγορα και επαναλαμβάνεται διαδοχικά για κάθε γραμμή. Με αυτόν τον τρόπο, ο μικροελεγκτής μπορεί να ανιχνεύσει σχεδόν αμέσως κάθε πάτημα πλήκτρου.
Παράδειγμα διασύνδεσης πληκτρολογίου μεμβράνης 4×4 με το Arduino
Τώρα που κατανοήσατε πώς λειτουργεί το πληκτρολόγιο μεμβράνης, ήρθε η ώρα να το συνδέσετε σε μια πλακέτα Arduino. Σε αυτό το παράδειγμα θα χρησιμοποιήσουμε την αναπτυξιακή πλακέτα Arduino με το Nano R4 που έχουμε παρουσιάσει σε άλλο άρθρο.
Η διασύνδεση του πληκτρολογίου μεμβράνης με αυτήν την αναπτυξιακή πλακέτα είναι εύκολή, απλά κουμπώνοντας τον κονέκτορα του πληκτρολογίου μεμβράνης στην κάτω οριζόντια πινοσειρά της αναπτυξιακής πλακέτας. Η διασύνδεση ορίζεται με τον ακόλουθο πίνακα:
| Πιν μεμβράνης | I/O Arduino Nano | Πιν μεμβράνης | I/O Arduino Nano |
| R1 | 0 | C1 | 10 |
| R2 | 1 | C2 | 11 |
| R3 | 8 | C3 | 12 |
| R4 | 9 | C4 | 13 |
Μετά τη διασύνδεση του πληκτρολογίου, ανεβάστε και τρέξτε το ακόλουθο παράδειγμα κώδικα στο Arduino Nano R4. Μην ξεχάστε να δηλώσεται στο περιβάλλον Arduino IDE τον μικροελεγκτή και την πόρτα USB που είναι συνδεμένος.
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define ROWS 4 //four rows
#define COLS 4 //four columns
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t rowPins[ROWS] = { 0, 1, 8, 9 };
uint8_t colPins[COLS] = { 10, 11, 12, 13 };
char keyChar(char key[][COLS], uint8_t row_pins[], uint8_t col_pins[], uint8_t num_rows, uint8_t num_cols){
uint8_t i,j,row,col;
for(i=0; i<num_rows; i++) pinMode(row_pins[i], INPUT_PULLUP);
for(j=0; j<num_cols; j++) pinMode(col_pins[j], INPUT_PULLUP);
for(row=0; row<num_rows; row++) {
pinMode(row_pins[row], OUTPUT);
digitalWrite(row_pins[row], LOW);
for(col=0; col<num_cols; col++)
if(digitalRead(col_pins[col])==0) return (key[row][col]);
pinMode(row_pins[row], INPUT_PULLUP);
delay(15);
}
return ('F');
}
void setup() {
lcd.begin(20, 4);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("key: ");
char keypressed, i;
for(i=0; i<15; i++) {
keypressed = keyChar(keys, rowPins, colPins, ROWS, COLS);
if(keypressed != 'F')
lcd.print(keypressed);
while(keypressed == keyChar(keys, rowPins, colPins, ROWS, COLS)) delay(100);
}
}
Επεξήγηση του κώδικα
Στην αρχή του sketch συμπεριλαμβάνουμε την κατάλληλη βιβλιοθήκη του lcd display και δημιουργούμε το αντίστοιχο αντικείμενο έτσι ώστε να μπορούμε να προβάλουμε δεδομένα χαρακτήρων στην οθόνη.
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Στη συνέχεια δηλώνουμε με ντιρεκτίβες define τον αριθμό των γραμμών και των στηλών του πληκτρολογίου. Έπειτα δηλώνουμε τον πίνακα αντιστοίχισης πλήκτρων ο οποίος καθορίζει ποιος χαρακτήρας (όπως «4», «A», «#» κ.λπ.) αντιστοιχεί σε κάθε συνδυασμό γραμμής και στήλης. Ακολουθούν οι πίνακες rowPins[ROWS] και colPins[COLS] που αντιστοιχίζουν τις γραμμές και στήλες αντίστοιχα με τα πινς εισόδου – εξόδου του Arduino.
#define ROWS 4 //four rows
#define COLS 4 //four columns
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t rowPins[ROWS] = { 0, 1, 8, 9 };
uint8_t colPins[COLS] = { 10, 11, 12, 13 };
Η συνάρτηση keyChar επιστρέφει τον χαρακτήρα που αντιστοιχεί στο πλήκτρο που είναι πατημένο την στιγμή της κλήσης της. Αν δεν είναι πατημένο κανένα πλήκτρο επιστρέφει τον χαρακτήρα ‘F’. Αυτή η συνάρτηση λειτουργεί ως εξής: Θετει όλα τα I/O πινς που είναι συνδεμένα στο πληκτρολόγιο σαν είσοδoι με ενεργοποιημέτες τις pullup αντιστάσεις. Στη συνέχεια θέτει κάθε φορά μια γραμμή σαν έξοδος σε κατάσταση LOW. Έπειτα διαβάζονται οι στήλες μια προς μια. Αν μια στήλη προκύψει LOW αυτό σημαίνει ότι έχει πατηθεί το πλήκτρο στην διασταύρωση αυτής της στήλης και της μιας γραμμής που έχουμε θέσει σαν OUTPUT με τιμή LOW.
char keyChar(char key[][COLS], uint8_t row_pins[], uint8_t col_pins[], uint8_t num_rows, uint8_t num_cols){
uint8_t i,j,row,col;
for(i=0; i<num_rows; i++) pinMode(row_pins[i], INPUT_PULLUP);
for(j=0; j<num_cols; j++) pinMode(col_pins[j], INPUT_PULLUP);
for(row=0; row<num_rows; row++) {
pinMode(row_pins[row], OUTPUT);
digitalWrite(row_pins[row], LOW);
for(col=0; col<num_cols; col++)
if(digitalRead(col_pins[col])==0) return (key[row][col]);
pinMode(row_pins[row], INPUT_PULLUP);
delay(15);
}
return ('F');
}
Στην συνάρτηση setup αρχικοποιούμε το lcd display. Στον βρόγχο loop διαβάζουμε κάθε φορά το πλήκτρο και όταν ο επιστραφόμενος χαρακτήρας είναι διαφορετικός από τον χαρακτήρα ‘F’ αυτός προβάλεται στην οθόνη. Όταν μια γραμμή γεμίσει από χαρακτήρες πληκτρολογίου, καθαρίζεται αυτόματα.
void setup() {
lcd.begin(20, 4);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("key: ");
char keypressed, i;
for(i=0; i<15; i++) {
keypressed = keyChar(keys, rowPins, colPins, ROWS, COLS);
if(keypressed != 'F')
lcd.print(keypressed);
while(keypressed == keyChar(keys, rowPins, colPins, ROWS, COLS)) delay(100);
}
}