PIC Modules 1.0 – Nota 2

Ariel Palazzesi . Vista 17763 veces
PIC Modules 1.0 – Nota 2
En la segunda entrega de esta serie de artículos, veremos como construir nuestro primer modulo: un teclado de 15 teclas, con su propio microcontrolador, que se unirá mediante un cable plano de 10 vías a cualquiera de nuestras placas centrales.

  • Generalmente, cuando necesitamos un teclado para nuestros proyectos recurrimos a una de dos alternativas: o utilizamos un pin del microcontrolador por tecla, o bien creamos una matriz de teclas de nxm.
    La primera alternativa tiene la clara desventaja de requerir un muy elevado número de pines I/O, que generalmente es un recurso escaso. El segundo caso, el de la matriz, es más eficiente en el uso de pines, sirva como ejemplo el caso de un teclado de 4x4 teclas que se puede leer con solo 8 pines.
    Pero existe una alternativa más, y consiste en crear un teclado “inteligente”, con su propia lógica de control, y que nos entregue directamente un código correspondiente a la tecla pulsada.
    Este código puede ser del tipo serial (vía RS-232, por ejemplo) o bien paralelo, donde se utilizan mas cantidad de conductores.
    En este articulo veremos como 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 indicara 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.
    Vista del lado cobre de la placa. Vista del lado cobre de la placa.
    Como se puede ver en el esquema, simplemente 15 pulsadores, unas pocas resistencias, un transistor para manejar el buzzer y un microcontrolador basta para conformar este modulo.
    Debido a que el control de los tiempos con una muy alta precisión no es necesario en este proyecto, hemos ahorrado el cristal y sus condensadores accesorios, y empleado el oscilador interno del microcontrolador, funcionando a 4 MHz.
    Como siempre, comenzaremos realizando el circuito impreso con la técnica explicada en NeoTeo, para luego realizar las perforaciones necesarias. Puede darse el caso de que los pines de los pulsadores sean algo mas gruesos que los de los demás componentes, así que deberemos utilizar una broca adecuada, generalmente de 1.2 mm de diámetro.
    Montaremos primero los puentes, seguiremos por los resistores y zócalo para el microcontrolador, y por ultimo las teclas, buzzer y LED.
    No esta 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 si cualquier par de módulos de los que veremos en estos artículos. De hecho, conviene tener varios de ellos a mano, y este es un buen momento de armarlos a todos. En la foto se ve claramente como montar las fichas sobre el cable, de manera que sea simétrico y se puede conectar el modulo central o el periférico en cualquiera de sus extremos.
    • Circuito impreso. Circuito impreso.
    • Esquema eléctrico del módulo. Esquema eléctrico del módulo.
    Este conector, como dijimos compatible con el modulo central del articulo anterior, dispones de cuatro pines de datos, que llamaremos “A”, “B”, “C”, y “D”.
    Al presionar una tecla, el software genera un código de acuerdo a la tabla de la pagina siguiente, y pone en “0” o en “1” estos pines, indicando que tecla se presiono.
    La combinación “0000” se utiliza para indicar que no se ha presionado ninguna tecla, por lo que dicho pulsador puede no incluirse en el proyecto, o bien utilizarla como on-off del buzzer o alguna función similar.
    Por defecto, el buzzer toca una nota diferente por tecla, lo que puede resultar util como “realimentación auditiva” de que efectivamente se produjo el contacto de la tecla.

    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ódigo que genera cada tecla del módulo. Código que genera cada tecla del módulo.
    La rutina TONOKEY del programa de la pagina 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 es de la forma OUTDATAxxx, en las que además de elegir la frecuencia en cuestión, se carga cada una de 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 como armar un enlace por radiofrecuencia, placa de reles, modulo expansor de entradas y salidas, y muchos mas, todos compatibles entre si.
    Este es el modulo mas “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 modulo es del 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 necesita de algún menú en pantalla o de ingreso de datos por parte del usuario.



    • PinOut del conector del teclado. PinOut del conector del teclado.
    • Cables de conexión entre placas. Cables de conexión entre placas.

¿Y tú, qué opinas?

  • #1 leonardo lantigua
    leonardo lantigua domingo, 24 de diciembre de 2006, 00:00

    Responder >> Attention Minus Plus Votos: -1 de 1
  • #2 <a href="../../foro/member.php?u=3036" target="_self">Alfred0601</a>
    Alfred0601 miércoles, 21 de mayo de 2008, 21:13

    excelente circuito, muchas gracias, es de gran utilidad

    Responder >> Attention Minus Plus Votos: 0 de 0
  • #3 hola
    hola domingo, 14 de septiembre de 2008, 16:51

    hola mi nombre es jefry soy de peru... ustedes son muy ingeniosos en lo que hacen yo tengo conocimientos en programacion especificamente en
    visual Basic.net pero lo que a mi me facina es la electronica, y no se si ustedes saben como puedo unir estos conociminetos
    no si conoran una pagina o algun lugar donde pueda hacer lo q quiero mi correo es leonardo7k@hotmail.com para cuaalquier comentario

    Responder >> Attention Minus Plus Votos: 0 de 0
  • Cargando...Cargando...

  • nuevo comentario
    Nombre

    Campo obligatorio

    Email

    Escriba una dirección de correo electrónico con el formato sunombre@ejemplo.com.

    Campo obligatorio

 
Ir arriba