Teclado matricial de 5X5 con PIC16F628A.
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 |
CG | Cierra gripper |
OG | Abre gripper |
GCD | Guarda el dato de gripper cerrado |
GOD | Guarda el dato de gripper abierto |
SPGC | Guarda posición en la que cierra el gripper |
SPGO | Guarda posición en la que abre el gripper |
INS | Inserta nueva posición |
STEP | Incremento paso a paso de dato de posición |
CONT | Incremento continuo de dato de posición |
BWD | Ir a la posición anterior |
FWD | Ir a la posición siguiente |
SET | Guarda posición |
SHIFT | Combinación para activar los botones marcados con el mismo color. P.ej.: Shift+Cont cambia a incremento continuo |
RESET | Resetea 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ÓN | DATO EN DECIMAL | DATO EN BINARIO |
J1- | 1 | 00001 |
J1+ | 2 | 00010 |
J2- | 3 | 00011 |
J2+ | 4 | 00100 |
J3- | 5 | 00101 |
J3+ | 6 | 00110 |
J4- | 7 | 00111 |
J4+ | 8 | 01000 |
J5- | 9 | 01001 |
J5+ | 10 | 01010 |
J6- | 11 | 01011 |
J6+ | 12 | 01100 |
BWD | 13 | 01101 |
SET | 14 | 01110 |
FWD | 15 | 01111 |
G+ | 16 | 10000 |
G- | 17 | 10001 |
SHIFT+DEL | 18 | 10010 |
RESET | 19 | 10011 |
SHIFT+GOD | 20 | 10100 |
SHIFT+GCD | 21 | 10101 |
SHIFT+SPGC | 22 | 10110 |
SHIFT+SPGO | 23 | 10111 |
SHIFT+INS | 24 | 11000 |
STEP | 25 | 11001 |
SHIFT+CONT | 26 | 11010 |
CG | 27 | 11011 |
OG | 28 | 11100 |
MAUAL | 29 | 11101 |
AUTO | 30 | 11110 |
START | 31 | 11111 |
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.
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: