Teclado Matricial de 5X5

Teclado matricial de 5X5 con PIC16F628A.

Dibujo
Fig. 1: Teclado matricial 5X5

Hace algunos años cuando empecé en el mundo de la robótica diseñé este teclado para controlar un brazo robótico como parte de un proyecto de la carrera de mecatrónica. Tomando como guía el teach pendant de unos robots industriales, diseñé un teclado matricial de 5X5 para la manipulación; para ahorrar puertos del microcontrolador principal manejé un PIC16F628A para procesar las teclas presionadas y mandar un dato en 5 bits para identificar cada botón, reitero que por las modificaciones y etapas del proyecto empecé a programar en Picbasic Pro por eso este teclado lo dejé con el programa original. Aunque el diseño estaba enfocado para controlar un robot, eso no significa que no pueda ser aplicado para cualquier proyecto electrónico.

La siguiente tabla muestra las funciones de cada botón enfocado a la programación de un brazo robótico:

J- y J+Incrementa o decrementa el valor de la posición de los ejes
G- y G+Incrementa o decrementa el valor de la posición del gripper
DEL
Borra posición
CGCierra gripper
OGAbre gripper
GCDGuarda el dato de gripper cerrado
GODGuarda el dato de gripper abierto
SPGCGuarda posición en la que cierra el gripper
SPGOGuarda posición en la que abre el gripper
INSInserta nueva posición
STEPIncremento paso a paso de dato de posición
CONTIncremento continuo de dato de posición
BWDIr a la posición anterior
FWDIr a la posición siguiente
SETGuarda posición
SHIFTCombinación para activar los botones marcados con el mismo color. P.ej.: Shift+Cont cambia a incremento continuo
RESETResetea el modo de operación

Para identificar cada dato enviado al presionar cada botón se muestra en la siguiente tabla los valores correspondientes en decimal y binario:

BOTÓNDATO EN DECIMALDATO EN BINARIO
J1- 100001
J1+200010
J2-300011
J2+400100
J3-500101
J3+600110
J4-700111
J4+801000
J5-901001
J5+1001010
J6-1101011
J6+1201100
BWD1301101
SET1401110
FWD1501111
G+1610000
G- 1710001
SHIFT+DEL1810010
RESET1910011
SHIFT+GOD2010100
SHIFT+GCD2110101
SHIFT+SPGC2210110
SHIFT+SPGO2310111
SHIFT+INS2411000
STEP2511001
SHIFT+CONT2611010
CG2711011
OG2811100
MAUAL2911101
AUTO3011110
START3111111

Todos estos datos eran enviados al controlador del robot para ser procesados y ejecutar la acción solicitada; a continuación adjunto el diseño del PCB aunque con algunos cambios respecto a la Fig. 1, porque anteriormente se diseñó el circuito con el software Circuit Wizard y el nuevo diseño se realizó con Eagle CadSoft V6.3.

TM 5X5
Fig. 2: PCB Teclado 5X5

El siguiente código en PicBasic Pro:

‘Teclado 25 teclas
‘MICRO: 16F628A
‘————————————-

‘—– CONFIGURO PUERTOS—–
CMCON = 7 ‘Configuro A como Digital I/O

‘Configuro el portA:
TRISA.0 = 0 ‘Salida (BIT A DATA OUT)
TRISA.1 = 1 ‘Entrada (Teclado Fila5)
TRISA.2 = 1 ‘Entrada (Teclado Fila4)
TRISA.3 = 1 ‘Entrada (Teclado Fila3)
TRISA.4 = 1 ‘Entrada (Teclado Fila2)
TRISA.5 = 1 ‘Entrada (Teclado Fila1)
TRISA.6 = 0 ‘Salida (BIT C DATA OUT)
TRISA.7 = 0 ‘Salida (BIT B DATA OUT)
‘Configuro el portB:
TRISB.0 = 0 ‘Salida (Teclado Columna1)
TRISB.1 = 0 ‘Salida (Teclado Columna2)
TRISB.2 = 0 ‘Salida (Teclado Columna3)
TRISB.3 = 0 ‘Salida (Teclado Columna4)
TRISB.4 = 0 ‘Salida (Teclado Columna5)
TRISB.5 = 0 ‘Salida (Buzzer)
TRISB.6 = 0 ‘Salida (BIT E DATA OUT)
TRISB.7 = 0 ‘Salida (BIT D DATA OUT)

PORTB = 0
PORTA = 0
‘Nombro puertos:
Symbol fila5 = PORTA.1
Symbol fila4 = PORTA.2
Symbol fila3 = PORTA.3
Symbol fila2 = PORTA.4
Symbol fila1 = PORTA.5
Symbol colu1 = PORTB.0
Symbol colu2 = PORTB.1
Symbol colu3 = PORTB.2
Symbol colu4 = PORTB.3
Symbol colu5 = PORTB.4
Symbol out_a = PORTA.0
Symbol out_b = PORTA.7
Symbol out_c = PORTA.6
Symbol out_d = PORTB.7
symbol out_e = PORTB.6
symbol buzzer = PORTB.5
‘Defino variables
i VAR BYTE
t1 var byte
freq VAR word

‘—-COMIENZA EL PROGRAMA—–
‘Inicializo puertos de columna:
colu1 = 0
colu2 = 0
colu3 = 0
colu4 = 0
colu5 = 0
buzzER = 0 ‘Apagado
t1 = 50 ‘duracion tono teclas
freq = 3000 ‘Frecuencia/2
Gosub outdata0 ‘Pongo en cero el dato

‘Suena un tono
Gosub tonokey

INICIO: ‘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.
GOSUB TECLA
GOTO INICIO
TECLA:
‘columnamixta1E
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 0
If fila1 = 1 AND fila5=1 Then Gosub outdata18:RETURN ‘Borrar posiciòn
‘columnamixta5C
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 1
If fila1 = 1 AND fila3=1 Then Gosub outdata20:RETURN ‘Gripper open done
‘columnamixta5D
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 1
If fila1 = 1 AND fila4=1 Then Gosub outdata21:RETURN ‘Gripper close done
‘columnamixta4E
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 1:colu5 = 0
If fila1 = 1 AND fila5=1 Then Gosub outdata22:RETURN ‘GPGC
‘columnamixta5E
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 1
If fila1 = 1 AND fila5=1 Then Gosub outdata23:RETURN ‘GPGO
‘columnamixta3E
colu1 = 1:colu2 = 0:colu3 = 1:colu4 = 0:colu5 = 0
If fila1 = 1 AND fila5=1 Then Gosub outdata24:RETURN ‘Insertar Posiciòn
‘columnamixta5B
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 1
If fila1 = 1 AND fila2=1 Then Gosub outdata26:RETURN ‘Cont
‘columna 1
colu1 = 1:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 0
If fila2 = 1 Then Gosub outdata1:RETURN  ‘Eje1-
If fila3 = 1 Then Gosub outdata3:RETURN  ‘Eje2-
If fila4 = 1 Then Gosub outdata5:RETURN  ‘Eje3-
If fila5 = 1 Then Gosub outdata13:RETURN ‘Backward
‘columna 2
colu1 = 0:colu2 = 1:colu3 = 0:colu4 = 0:colu5 = 0
If fila1 = 1 Then Gosub outdata19:RETURN ‘Reset
If fila2 = 1 Then Gosub outdata2:RETURN  ‘Eje1+
If fila3 = 1 Then Gosub outdata4:RETURN  ‘Eje2+
If fila4 = 1 Then Gosub outdata6:RETURN  ‘Eje3+
If fila5 = 1 Then Gosub outdata14:RETURN ‘Set
‘columna 3
colu1 = 0:colu2 = 0:colu3 = 1:colu4 = 0:colu5 = 0
If fila1 = 1 Then Gosub outdata29:RETURN ‘Modo Teach
If fila2 = 1 Then Gosub outdata7:RETURN  ‘Eje4-
If fila3 = 1 Then Gosub outdata9:RETURN  ‘Eje5-
If fila4 = 1 Then Gosub outdata11:RETURN ‘Eje6-
If fila5 = 1 Then Gosub outdata15:RETURN ‘Forward
‘columna 4
colu1 = 0:colu2 = 0:colu3 = 0:colu4 = 1:colu5 = 0
If fila1 = 1 Then Gosub outdata30:RETURN ‘Modo Auto
If fila2 = 1 Then Gosub outdata8:RETURN  ‘Eje4+
If fila3 = 1 Then Gosub outdata10:RETURN ‘Eje5+
If fila4 = 1 Then Gosub outdata12:RETURN ‘Eje6+
If fila5 = 1 Then Gosub outdata27:RETURN ‘Close Gripper
‘columna 5
colu1 = 0:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 1
If fila1 = 1 Then Gosub outdata31:RETURN ‘Cycle Start
If fila2 = 1 Then Gosub outdata25:RETURN ‘Step
If fila3 = 1 Then Gosub outdata16:RETURN ‘Gripper+
If fila4 = 1 Then Gosub outdata17:RETURN ‘Gripper-
If fila5 = 1 Then Gosub outdata28:RETURN ‘Open Gripper
colu1 = 0:colu2 = 0:colu3 = 0:colu4 = 0:colu5 = 0
pause 50
Gosub outdata0
Goto INICIO ‘Repite eternamente
End
tonokey: ‘Tono al presionar las teclas.
For i = 1 To t1
buzzer = 1
PAUSEUs freq
buzzer = 0
PAUSEUs freq
Next i
PAUSE 50
Gosub outdata0
Return
‘Pone en 0000 la salida OUTDATA
outdata0:
out_a = 0
out_b = 0
out_c = 0
out_d = 0
out_E = 0
Return

outdata1:
out_a = 1
out_b = 0
out_c = 0
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata2:
out_a = 0
out_b = 1
out_c = 0
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata3:
out_a = 1
out_b = 1
out_c = 0
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata4:
out_a = 0
out_b = 0
out_c = 1
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata5:
out_a = 1
out_b = 0
out_c = 1
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata6:
out_a = 0
out_b = 1
out_c = 1
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata7:
out_a = 1
out_b = 1
out_c = 1
out_d = 0
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata8:
out_a = 0
out_b = 0
out_c = 0
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata9:
out_a = 1
out_b = 0
out_c = 0
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata10:
out_a = 0
out_b = 1
out_c = 0
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata11:
out_a = 1
out_b = 1
out_c = 0
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata12:
out_a = 0
out_b = 0
out_c = 1
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata13:
out_a = 1
out_b = 0
out_c = 1
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata14:
out_a = 0
out_b = 1
out_c = 1
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata15:
out_a = 1
out_b = 1
out_c = 1
out_d = 1
out_E = 0
‘Suena un tono
Gosub tonokey
Return

outdata16:
out_a = 0
out_b = 0
out_c = 0
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata17:
out_a = 1
out_b = 0
out_c = 0
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata18:
out_a = 0
out_b = 1
out_c = 0
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata19:
out_a = 1
out_b = 1
out_c = 0
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata20:
out_a = 0
out_b = 0
out_c = 1
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata21:
out_a = 1
out_b = 0
out_c = 1
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata22:
out_a = 0
out_b = 1
out_c = 1
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata23:
out_a = 1
out_b = 1
out_c = 1
out_d = 0
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata24:
out_a = 0
out_b = 0
out_c = 0
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata25:
out_a = 1
out_b = 0
out_c = 0
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata26:
out_a = 0
out_b = 1
out_c = 0
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata27:
out_a = 1
out_b = 1
out_c = 0
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata28:
out_a = 0
out_b = 0
out_c = 1
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata29:
out_a = 1
out_b = 0
out_c = 1
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata30:
out_a = 0
out_b = 1
out_c = 1
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

outdata31:
out_a = 1
out_b = 1
out_c = 1
out_d = 1
out_E = 1
‘Suena un tono
Gosub tonokey
Return

Nota importante:

  • El microcontrolador está usando el oscilador interno para usar los puertos RA6 y RA7.
  • Está desactivado el MCLR para usar el pin RA5 como entrada
  • Todos estos cambios se hizo desde el archivo fuente del compilador PBP (16F628A.INC)
  • Dentro del archivo se modificaron estos datos: (__config _XT_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF) por el siguiente (__config _INTOSC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF)

Simulación en ISIS Proteus:

Deja un comentario