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.

PIC Modules 1.0 – Nota 2
Vista del lado cobre de la placa.

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.

PIC Modules 1.0 – Nota 2
Circuito impreso.
PIC Modules 1.0 – Nota 2
Esquema eléctrico del módulo.

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
PIC Modules 1.0 – Nota 2
Código que genera cada tecla del módulo.

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.

PIC Modules 1.0 – Nota 2
PinOut del conector del teclado.
PIC Modules 1.0 – Nota 2
Cables de conexión entre placas.
PIC Modules 1.0 – Nota 2
PIC Modules 1.0 – Nota 2