Économisez les broches Arduino : clavier 4×3 sur 3 entrées analogiques
Composants et fournitures
| Composant | Quantité |
|---|---|
| Clavier matriciel 4×3 (12 touches) | 1 |
| Arduino UNO (ou Nano) | 1 |
| Résistance 330 Ω | 1 |
| Résistance 1 kΩ | 3 |
| Résistance 3 kΩ | 1 |
| Fer à souder | 1 |
Logiciel
- Arduino IDE
À propos du projet
Problème : clavier matriciel standard = 7 broches
Un clavier 4×3 nécessite normalement 4 lignes + 3 colonnes = 7 broches numériques. Sur Uno/Nano, c'est coûteux en I/O.
Solution : diviseur de tension sur 3 entrées analogiques
Chaque colonne devient un diviseur de tension. 4 résistances lignes (R1-R4) + 3 résistances colonnes (R5-R7 identiques). Résultat : 4 niveaux de tension distincts par colonne + 0V (aucune touche).
Calcul des résistances pour intervalles maximaux
Choix : R1 = 0Ω (fil), R2 = 330Ω, R3 = 1kΩ, R4 = 3kΩ ; R5=R6=R7 = 1kΩ.
Les 3 sorties analogiques donnent des intervalles larges et bien séparés (tolérance ±5% OK). Extensible : +1 entrée analogique + 1 résistance = clavier 4×4.
Câblage sur Arduino
Sorties colonnes → A0, A1, A2. R1 (ligne 1) = fil direct (0Ω). Broches modifiables tant qu'analogiques. Fonctionne aussi en 3.3V (ADC référencé sur VCC).
Prototype de test
Clavier construit avec touches de récupération, connecteur 5 broches vers Arduino.
Code Arduino
/* Analog4x3Keybf - Clavier 4x3 sur 3 entrées analogiques
G. Carrera - 19/11/2018 */
// Seuils ADC (±100) pour 4 touches par colonne
const int NADCmin[4] = {923, 669, 412, 156};
const int NADCmax[4] = {1123, 869, 612, 356};
const char key[12] = {'1','4','7','*', '2','5','8','0', '3','6','9','#'};
// Disposition : col 0 = 1,4,7,* | col 1 = 2,5,8,0 | col 2 = 3,6,9,#
int keyval[3];
int i, colp, val;
void setup() {
Serial.begin(9600);
}
void loop() {
char k = KeyPad();
if (k != 'N') {
Serial.print("Touche = ");
Serial.println(k);
delay(500); // anti-rebond simple
}
}
char KeyPad() {
KeyScan();
if (keyval[0] + keyval[1] + keyval[2] < 40) return 'N'; // rien pressé
delay(10); // anti-rebond
KeyScan(); // relecture confirmée
for (i = 0; i < 3; i++) {
if (keyval[i] > 40) { // colonne active
colp = i;
val = keyval[i];
for (int j = 0; j < 4; j++) {
if (val >= NADCmin[j] && val <= NADCmax[j]) {
return key[colp * 4 + j];
}
}
}
}
return 'N';
}
void KeyScan() {
keyval[0] = analogRead(A0); delay(1);
keyval[1] = analogRead(A1); delay(1);
keyval[2] = analogRead(A2); delay(1);
}
Schéma
Processus de fabrication
- Créer et programmer des animations sur matrices LED WS2812 8x8 et 16x16 avec Arduino et Excel
- Alerte Soif Plante Intelligente – Capteur DIY pour une Hydratation Optimale
- Horloge à Mots Italienne avec Arduino Nano, NeoPixel, LCD et RTC
- Compteur kWh Sigfox fiable avec Arduino MKR Fox 1200
- Moniteur de température Bluetooth avec Arduino Nano
- Serrure à gestes sans contact : Accès sécurisé avec APDS-9960 et Arduino
- Kit Compagnon Arduino Nano – Composants et Outils Essentiels pour l'Électronique DIY
- Circuit d'entrée analogique isolée pour Arduino : Protection contre les parasites industriels
- Test Précis de Temps de Réaction avec Arduino UNO