Control de acceso con tarjeta chip (smartcard)

Este proyecto trata de un circuito diseñado para utilizar una tarjeta chip (smartcard) como llave.

Estas tarjetas son muy fáciles de encontrar en muchas aplicaciones, como por ejemplo las tarjetas de prepago para las cabinas de teléfono. Al tratarse del control de un relé, su aplicación queda muy abierta pudiendo usarse tanto en una electro-cerradura como sustitución de la llave de arranque de un coche, que es el ejemplo concreto que veremos a continuación.

(Proyecto enviado por Selmar, gracias José Luis)


Antes de meterse directamente en el proyecto en sí es necesario el conocimiento del funcionamiento de las tarjetas, os pongo una breve descripción del funcionamiento, aunque existen varios tipos de tarjetas y la forma de tratarla es un poco distinta, a groso modo es casi lo mismo, luego en cada caso se explicarán las diferencias.

Diseño de la tarjeta

Disposición de los pines de la tarjeta, en este caso corresponden a una tarjeta de 6 contactos

Distancia de los contactos de la norma ISO7816


Funcionamiento

Reset: Al disparar RST a 1, el contador de direcciones es puesto a cero; cuando la línea CLK es puesta a 1 y mientras la línea de control de RST está en alto, debe caer el CLK antes de que caiga RST, lo cual nos iniciará el contador de direcciones y la lectura de datos.

Nótese que el contador de direcciones no puede ser resetado mientras esté en el rango de 0 a 1. El contador de direcciones es incrementado en 1 por cada pulso de señal de CLK con el flanco ascendente de la señal CLK mientras la línea de control permanece en cero.

Los datos tomados en cada lectura binaria salen por el pin I/O en cada flanco descendente del CLK. Es imposible decrementar el contador de direcciones, por lo tanto, para manipular un binario anterior, el contador debe dar un ciclo completo para regresar a la posición o dar un RST de inicialización para inicializar la tarjeta y reiniciar el conteo.

Mapa de memoria

Proyecto

Una vez entendido el funcionamiento general de las tarjetas pasamos a la descripción particular de este circuito.

Es simple, al introducir una tarjeta en el zócalo el circuito compara o lee el número de serie de esta y autoriza o no el acceso dependiendo si es la tarjeta correcta o no, existen dos versiones del circuito incompatibles entre ellas, la versión para tarjetas de 8 contactos y la versión para tarjetas de 6 contactos. Los Bytes que nos interesan se pueden extraer por la patilla I/O de la tarjeta.

Tras alimentar el PIC se genera un reset y comienza la ejecución del programa interno del pic, después de configurar los puertos entra en un bucle condicional en el que no para de escanear la RA0 (Insert) para detectar la inserción de una tarjeta, dicha detección se realiza mediante un interruptor que tiene el zócalo de la tarjeta y que es normalmente cerrado. Cuando insertamos una tarjeta este interruptor que está continuamente dando un 0 Lógico en el RA0 (insert) se abre y mediante la R2 (pull-up) se genera un 1 Lógico en la RA0 (insert), por lo que el programa sale del Bucle y pasa a leer el estado del RA1 (programación).

El paso por aquí es fugaz y el programa lee el estado del puerto realizando una condición, en esta patilla siempre hay un 1 Lógico gracias a R3 (pull-up) si pulsamos el pulsador PROGRAMACIÓN este crea un 0 Lógico en RA1 (programación), pues bien dependiendo del estado de este puerto al insertar la tarjeta, el circuito leerá el número de serie de la tarjeta o lo comparara con la eprom del PIC, supongamos que no ha sido pulsado y se ha detectado un 1 Lógico, pues el programa continua corriendo y lo primero que hace es poner a 1 Lógico el puerto RB0 (reset) y lanzar un pulso de reloj por el puerto RB1 (reloj) para que con todo ello se genere un reset en la tarjeta y el contador de direcciones de esta se sitúe en la posición 0, luego vuelve a 0 Lógico de nuevo la RB0 (reset), una vez inicializada la tarjeta tenemos que leer el número de serie de esta, como el numero se encuentra en la posición 40 para tarjetas de 8 contactos y 32 para la de 6 contactos.

Lanzamos los pulsos de reloj para que el contador de direcciones de la tarjeta apunte al primer BIT del número de serie de nuestra tarjeta, a partir de aquí por cada pulso de reloj que generemos leeremos en el puerto RA0 (datos) el número de serie que son tres bytes ósea 24 bits.

Una vez que se han leído todos los bits y guardado en variables del la memoria del pic, se comparan con los tres primeros bytes de la eprom del pic, si los datos son iguales se generara un pulso en el puerto RB7 (autorizado) que activara un relé que puede estar atacando a una electrocerradura o lo que queramos. Pero si no son iguales osea la tarjeta no está autorizada se generara un pulso en el puerto RB6 (noautorizado) y nos iluminara un led para indicárnoslo.

Después de realizar este proceso el programa vuelve a entrar en el bucle de la lectura del puerto RA0 (insert), para detectar la inserción de otra tarjeta. Para la programación de la tarjeta el funcionamiento es casi igual, solo varia en que cuando insertemos la tarjeta el pulsador PROGRAMACIÓN tiene que estar pulsado y debemos de soltarlo inmediatamente, una vez que ha leído el puerto RA1 (programación) y detecta que queremos programar realiza un reset a la tarjeta apunta al primer BIT del número de serie, lee el número de serie, lo guarda en tres variables y se graba en las tres primeras posiciones de la memoria EPROM. Una vez realizo esto vuelve al bucle de detección de inserción de tarjeta.

Descargas

Puedes encontrar en la zona de descargas todas la documentación del proyecto:

– esquemático

– diseño de la PCB

– código fuente en ASM

– simulación en Proteus

– todo clasificado en dos grupos: tarjetas de 6 pines y tarjetas de 8 pines

Descarga el proyecto completo aquí.

 

Un saludo y espero que lo disfrutéis.

Share