En la segunda entrega de esta serie de artículos vamos a construir nuestro primer módulo: un teclado de 15 teclas con su propio microcontrolador, que se conectará mediante un cable plano de 10 vías a cualquiera de nuestras placas centrales. Cuando un proyecto necesita un teclado, lo habitual es usar un pin del microcontrolador por tecla o montar una matriz de nxm. La primera opción exige un número muy elevado de pines de E/S, un recurso generalmente escaso; la segunda, la matriz, es más eficiente en el uso de pines: un teclado de 4x4 teclas se puede leer con solo 8 pines. Pero existe una alternativa más, y es la que desarrollamos aquí: crear un teclado “inteligente”, con su propia lógica de control, que entregue directamente un código correspondiente a la tecla pulsada. Ese código puede ser serial (por ejemplo, vía RS-232) o paralelo, aunque el paralelo utiliza más conductores. En este artículo veremos cómo construir un teclado de 15 teclas con un PIC 16F627A como elemento central, un zumbador para oír un pitido cada vez que pulsamos una tecla y un LED que indicará que el teclado se encuentra alimentado. La salida de este teclado será un código de 4 bits que representa la tecla presionada, o bien “0000” si no se ha presionado ninguna.
Construcción del módulo
Como puede verse en el esquema, bastan 15 pulsadores, unas pocas resistencias, un transistor para manejar el buzzer y un microcontrolador para conformar el módulo. Como aquí no es necesario controlar los tiempos con una precisión muy alta, hemos ahorrado el cristal y sus condensadores accesorios y hemos empleado el oscilador interno del microcontrolador, que funciona a 4 MHz.
Como siempre, comenzamos realizando el circuito impreso con la técnica explicada en NeoTeo y luego hacemos las perforaciones necesarias. Puede ocurrir que los pines de los pulsadores sean algo más gruesos que los de los demás componentes, así que conviene utilizar una broca adecuada, generalmente de 1.2 mm de diámetro. Montaremos primero los puentes, seguiremos con las resistencias y el zócalo para el microcontrolador y, por último, las teclas, el buzzer y el LED. No está de más repasar las soldaduras por si se ha producido algún cortocircuito en el montaje.
Una vez comprobado esto, procedemos a construir el cable plano, que servirá para unir entre sí cualquier par de módulos de los que veremos en estos artículos. De hecho, conviene tener varios a mano, y este es un buen momento para armarlos todos. En la foto se ve claramente cómo montar las fichas sobre el cable, de manera que quede simétrico y se pueda conectar el módulo central o el periférico en cualquiera de sus extremos.
El conector de expansión
Este conector, compatible como dijimos con el módulo central del artículo anterior, dispone de cuatro pines de datos, que llamaremos “A”, “B”, “C” y “D”. Al presionar una tecla, el software genera un código de acuerdo con la tabla que se muestra más adelante y pone en “0” o en “1” estos pines, indicando qué tecla se presionó. La combinación “0000” se utiliza para indicar que no se ha presionado ninguna tecla, por lo que ese pulsador puede no incluirse en el proyecto, o bien utilizarse como conmutador on-off del buzzer o alguna función similar. Por defecto, el buzzer toca una nota diferente por tecla, lo que puede resultar útil como “realimentación auditiva” de que efectivamente se produjo el contacto de la tecla.
El programa del PIC
Este es el listado del programa:
'Versión 1.0 teclado 16 teclas + Buzz
'MICRO: 16F627A o 16F628A, Oscilador intRC
'-------------------------------------
'----- CONFIGURO PUERTOS-----
PORTA = 0
CMCON = 7 'Configuro A como Digital I/O
'Configuro el portA:
TRISA.0 = 1 'Entrada (Teclado)
TRISA.1 = 1 'Entrada (Teclado)
TRISA.2 = 1 'Entrada (Teclado)
TRISA.3 = 1 'Entrada (Teclado)
TRISA.4 = 0 'Salida
TRISA.5 = 0 'Salida
TRISA.6 = 0 'Salida
TRISA.7 = 0 'Salida (buzz)
'Configuro el portB:
TRISB.0 = 0 'Salida (Teclado)
TRISB.1 = 0 'Salida (Teclado)
TRISB.2 = 0 'Salida (Teclado)
TRISB.3 = 0 'Salida (Teclado)
TRISB.4 = 0 'Salida (BIT A DATA OUT)
TRISB.5 = 0 'Salida (BIT B DATA OUT)
TRISB.6 = 0 'Salida (BIT C DATA OUT)
TRISB.7 = 0 'Salida (BIT D DATA OUT)
'------VARIABLES------------------
'Defino constantes:
Symbol fila1 = PORTB.0
Symbol fila2 = PORTB.1
Symbol fila3 = PORTB.2
Symbol fila4 = PORTB.3
Symbol out_a = PORTB.4
Symbol out_b = PORTB.5
Symbol out_c = PORTB.6
Symbol out_d = PORTB.7
Symbol colu1 = PORTA.0
Symbol colu2 = PORTA.1
Symbol colu3 = PORTA.2
Symbol colu4 = PORTA.3
Symbol buzz = PORTA.7 'Buzzer
'Variables
Dim i As Byte
Dim t1 As Byte 'Numero de milisegundos que se mantiene el dato en DATAOUT
Dim freq As Word 'Frecuencia/2
'Dim x As Bit
'----COMIENZA EL PROGRAMA EN SI-----
'Inicializo las variables:
fila1 = 0
fila2 = 0
fila3 = 0
fila4 = 0
buzz = 0 'Apagado
t1 = 50 'duracion tono teclas
freq = 3000 'Frecuencia/2
PORTB = 0
'PORTA = 0
Gosub outdata0000
'Suena un tono
Gosub tonokey
loop: 'Bucle principal del programa
'Recorro la matriz del teclado, poniendo de a una las
'filas en 1, y viendo si las columnas están en 1. Si
'es así, es que hay una tecla presionada.
'FILA 1
fila1 = 1
If colu1 = 1 Then Gosub outdata7
If colu2 = 1 Then Gosub outdata8
If colu3 = 1 Then Gosub outdata9
fila1 = 0
'fila 2
fila2 = 1
If colu1 = 1 Then Gosub outdata4
If colu2 = 1 Then Gosub outdata5
If colu3 = 1 Then Gosub outdata6
If colu4 = 1 Then Gosub outdatap3
fila2 = 0
'fila 3
fila3 = 1
If colu1 = 1 Then Gosub outdata1
If colu2 = 1 Then Gosub outdata2
If colu3 = 1 Then Gosub outdata3
If colu4 = 1 Then Gosub outdatap2
fila3 = 0
'fila 4
fila4 = 1
If colu1 = 1 Then Gosub outdataaste
If colu2 = 1 Then Gosub outdata0
If colu3 = 1 Then Gosub outdatanume
If colu4 = 1 Then Gosub outdatap1
fila4 = 0
Goto loop 'Repite eternamente
End
tonokey: 'Tono al presionar las teclas.
For i = 1 To t1
buzz = 1
WaitUs freq
buzz = 0
WaitUs freq
Next i
WaitMs 100
Gosub outdata0000
Return
outdata0000: 'Pone en 0000 la salida OUTDATA
out_a = 0
out_b = 0
out_c = 0
out_d = 0
Return
outdatap1:
out_a = 1
out_b = 1
out_c = 0
out_d = 1
freq = 500
Gosub tonokey
Return
outdatap2:
out_a = 1
out_b = 1
out_c = 1
out_d = 0
Gosub tonokey
Return
outdatap3:
out_a = 1
out_b = 1
out_c = 1
out_d = 1
freq = 800
Gosub tonokey
Return
outdata0:
out_a = 0
out_b = 0
out_c = 0
out_d = 1
freq = 1138
Gosub tonokey
Return
outdata3:
out_a = 0
out_b = 1
out_c = 0
out_d = 0
freq = 953
Gosub tonokey
Return
outdata2:
out_a = 0
out_b = 0
out_c = 1
out_d = 1
freq = 1016
Gosub tonokey
Return
outdata1:
out_a = 0
out_b = 0
out_c = 1
out_d = 0
freq = 1087
Gosub tonokey
Return
outdata6:
out_a = 0
out_b = 1
out_c = 1
out_d = 1
freq = 989
Gosub tonokey
Return
outdata5:
out_a = 0
out_b = 1
out_c = 1
out_d = 0
freq = 1003
Gosub tonokey
Return
outdata4:
out_a = 0
out_b = 1
out_c = 0
out_d = 1
freq = 1123
Gosub tonokey
Return
outdata9:
out_a = 1
out_b = 0
out_c = 1
out_d = 0
freq = 1030
Gosub tonokey
Return
outdata8:
out_a = 1
out_b = 0
out_c = 0
out_d = 1
freq = 1094
Gosub tonokey
Return
outdata7:
out_a = 1
out_b = 0
out_c = 0
out_d = 0
freq = 1164
Gosub tonokey
Return
outdatanume:
out_a = 1
out_b = 1
out_c = 0
out_d = 0
freq = 1075
Gosub tonokey
Return
outdataaste:
out_a = 1
out_b = 0
out_c = 1
out_d = 1
freq = 1209
Gosub tonokey
Return
Cómo funciona el código
La rutina TONOKEY del programa anterior es la encargada de hacer sonar el buzzer con la frecuencia correspondiente a cada tecla, que se carga en la variable FREQ en cada una de las rutinas cuyo nombre tiene la forma OUTDATAxxx. En esas rutinas, además de elegir la frecuencia, se cargan las variables A, B, C y D con los valores adecuados para que el microcontrolador los publique en los pines del puerto de expansión. Esto se realiza con los códigos de la siguiente tabla.
ABCD Tecla
0000 - No se presiono ninguna tecla -
0001 0
0010 1
0011 2
0100 3
0101 4
0110 5
0111 6
1000 7
1001 8
1010 9
1011 *
1100 #
1101 A
1110 B
1111 C
La figura muestra el nombre de cada pin del conector. Hemos construido nuestro primer accesorio para nuestro sistema de módulos. En notas siguientes veremos cómo armar un enlace por radiofrecuencia, una placa de relés, un módulo expansor de entradas y salidas y muchos más, todos compatibles entre sí. Este es el módulo más “inteligente” de todos los que tenemos pensado publicar, ya que los demás no poseen un microcontrolador propio. Este caso excepcional se justifica solamente por el ahorro de pines de E/S que proporciona la “inteligencia” de la placa periférica. El compañero ideal para este módulo es el display LCD, ya que con una placa central y los módulos LCD y teclado se pueden realizar proyectos que requieran interacción con el usuario, tales como alarmas, temporizadores, cronómetros y cualquier otro que necesite algún menú en pantalla o ingreso de datos por parte del usuario.