Ahorra Pines en Arduino: Conecta Teclado 4x3 con Solo 3 Conexiones Analógicas
Componentes y materiales
| Resistencia 330 Ω | 1 |
| Resistencia 1k Ω | 3 |
| Resistencia 3k Ω | 1 |
| Teclado matriz 4x3 (12 teclas) | 1 |
| Arduino UNO | 1 |
Herramientas necesarias
- Soldador
Aplicaciones
- Arduino IDE
Sobre el proyecto
Introducción
Objetivo: reducir drásticamente los pines necesarios para un teclado numérico. Un teclado 4x3 matriz estándar requiere 4+3 = 7 pines digitales. En Arduino UNO/Nano, los pines son escasos.
Mi solución: 3 entradas analógicas
El circuito propuesto usa solo 3 pines analógicos (A0, A1, A2) mediante una red de resistencias que genera niveles de voltaje únicos por tecla.
Por cada columna hay 4 valores de voltaje (una por tecla) + 0V (ninguna pulsada). En el esquema equivalente (b), R1e es una de R1-R4, R2e una de R5-R7.
Para maximizar los intervalos entre voltajes: igualamos R5=R6=R7=1kΩ, y R1=0Ω (cable directo) para que fila 1 dé 5V. Valores elegidos:
- R2 = 330 Ω
- R3 = 1k Ω
- R4 = 3k Ω
- R5, R6, R7 = 1k Ω
Los intervalos en las 3 salidas son los máximos posibles usando 6 resistencias estándar ±5%. Con una entrada analógica extra y otra resistencia, se extiende a teclado 4x4.
En el diagrama, R1 va a fila 2 porque fila 1 va cableada directo (referencias escaladas). Los pines analógicos pueden cambiarse según necesidad.
Si Arduino se alimenta a 3.3V, no cambia nada: el ADC usa Vcc como referencia por defecto.
Para probar sin teclado comercial, construí uno con teclas recicladas. Conector 5 pines a la derecha para cablear a Arduino.
Código - Analog4x3Keybf.ino
/* Analog4x3Keybf - Test teclado 4x3 con 3 salidas analógicas
* G. Carrera - 19/11/2018 */
// Límites ADC por fila (con margen ±100)
const int NADCm100[4] = {923, 669, 412, 156};
const int NADCp100[4] = {1123, 869, 612, 356};
const char key[13] = {'1','4','7','C','2','5','8','0','3','6','9','E'};
int keyval[3];
int i, colp, val;
void setup() {
Serial.begin(9600);
}
void loop() {
char k = KeyPad();
if (k != 'N') {
Serial.print("key = ");
Serial.println(k);
delay(500);
}
}
char KeyPad() {
KeyScan();
if (keyval[0] + keyval[1] + keyval[2] < 40) return 'N'; // ninguna tecla
delay(10); // anti-rebote
KeyScan();
for (i = 0; i < 3; i++) {
if (keyval[i] > 40) {
colp = i;
val = keyval[i];
for (int j = 0; j < 4; j++) {
if (val >= NADCm100[j] && val <= NADCp100[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);
}
Esquemático
Proceso de manufactura
- Construye y programa animaciones en matrices WS2812 RGB 8x8 y 16x16 con Arduino y Excel
- Alerta de Sed Inteligente para Plantas: Sensor DIY para Riego Óptimo
- Reloj de Palabras en Italiano con Arduino Nano, NeoPixel, LCD y RTC
- Medidor kWh Sigfox Fiable con Arduino MKR Fox 1200
- Monitor de temperatura con Bluetooth usando Arduino Nano
- Cerradura por Gestos Sin Contacto: Acceso Seguro con APDS-9960 y Arduino
- Kit Compañero Arduino Nano: Componentes y Herramientas Esenciales para Electrónica DIY
- Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes
- Circuito de entrada analógica aislada para Arduino
- Visualizador Espectro Audio RGB 32 Bandas - Matriz LED Arduino
- Test de Precisión de Tiempo de Reacción con Arduino UNO