Hardware con 2 lectores RFID-NFC

Una de las actualizaciones pendientes que tenía para el hardware de los clientes era poder tener dos lectores RFID. Esto es importante para tener un lector por el lado de la entrada de la puerta y otro por el lado de la salida.

Después de un par de peleas con la libería de Arduino para el lector RC522 y su forma de funcionar, he conseguido modificar el código para que acepte dos lectores RFID-NFC. También me ha costado más de lo normal por la poca documantación referente a hacerlo con el ESP8266 en lugar de con un Arduino convencional. Commit con el código funcional.

Les dejo el esquema que finalmente ha funcionado:

carontepass-two-rc522_bb

PINOUT:

WEMOS D1 MINI BOARD CONECT TO PIN
PIN FUCTION ESP-8266 PIN RC522 RELAY
3.3V POWER 3.3V 3.3V
5V POWER 5V VCC
GND GND GND GND GND
D13 SCK GPIO-14 SCK
D12 MISO GPIO-12 MISO
D11 MOSI GPIO-13 MOSI
D8 SS (SDA) GPIO-15 SDA  – 1
D3 IO GPIO-0 RESET – 1
D8 SS (SDA) GPIO-15 SDA – 2
D0 IO GPIO-16 RESET – 2
D4 IO GPIO-2 IN1

 

Banco de Pruebas:

IMG_20160329_010017

Anuncios

Esquema de Hardware

A continuación podrán encontrar todo lo necesario para el montaje de la parte de hardware de los clientes (las puertas):

Esquema de montaje:

carontepass-rc522

PINOUT:

WEMOS D1 MINI BOARD CONECT TO PIN
PIN FUCTION ESP-8266 PIN RC522 RELAY
3.3V POWER 3.3V 3.3V
5V POWER 5V VCC
GND GND GND GND GND
D13 SCK GPIO-14 SCK
D12 MISO GPIO-12 MISO
D11 MOSI GPIO-13 MOSI
D8 SS (SDA) GPIO-15 SDA
D3 IO GPIO-0 RESET
D0 IO GPIO-16 IN1

 


 

Esquema Wemos D1 Mini:

mini

Technical specs

Microcontroller ESP-8266EX
Operating Voltage 3.3V
Digital I/O Pins 11
Analog Input Pins 1(Max input: 3.2V)
Clock Speed 80MHz/160MHz
Flash 4M bytes
Length 34.2mm
Width 25.6mm
Weight 10g

WeMos D1 mini

Pin

Pin Function ESP-8266 Pin
TX TXD TXD
RX RXD RXD
A0 Analog input, max 3.3V input A0
D0 IO GPIO16
D1 IO, SCL GPIO5
D2 IO, SDA GPIO4
D3 IO, 10k Pull-up GPIO0
D4 IO, 10k Pull-up, BUILTIN_LED GPIO2
D5 IO, SCK GPIO14
D6 IO, MISO GPIO12
D7 IO, MOSI GPIO13
D8 IO, 10k Pull-down, SS GPIO15
G Ground GND
5V 5V
3V3 3.3V 3.3V
RST Reset RST

All IO have interrupt/pwm/I2C/one-wire supported(except D0)

Programming

The D1 mini has a micro USB for auto programming.
Also you can programming it using OTA.

Warnings

All IO is work at 3.3V.

Acceso por API (funcionamiento)

Al plantear el proyecto pensé muchas formás de hacerlo, pero pensando en la escalabilidad me quedé con la opción de que los clientes (las puertas) fueran lo más “tontas/simples” posibles.

Para conseguir esto necesitaba una parte del servidor potente, por lo que me decanté por Django y… ¿Cómo tener N puertas? ¿Cómo hacer las puertas lo más baratas-simples posibles?

Lo fácil hubiera sido poner un ordenador tipo Raspberry Pi por puerta, pero eso no era lo que quería (aunque fuera lo más fácil).

La mejor opción que encontré fue hacer una API, en la que pudiera utilizar diferentes tecnologías en los clientes pero que para funcionar solo necesitara una conexión a internet para hacer las consultas.


¿Cómo funciona ahora?

Se hace una petición web a la siguiente url definida en el proyecto de Django:

tudominio/api/1/device/code

Explicación:

  1. El cliente (una puerta) lee del lector NFC y coge el tag.
  2. Ese tag lo pone en “code” y hace la petición anterior.
  3. El servidor parsea esa url, recibe el “code” y lo busca en la tabla de “devices” donde están almacenados los IDs de todos los tag.
  4. El tag está asociado un usaurio por lo que ya se tiene la identidicación.

 

Veamos un ejemplo:

django-admin-device

 

Hay un usuario con el Tag “123456” del tipo NFC. Al pasar este NFC el lector obtiene el Tag, crea la url y hace la petición web:

tudominio/api/1/device/123456

Para obtener la respuesta nos tendremos que autentificar:

django-api-auth

Si se tiene acceso a la API devuleve lo siguiente del Django REST framework:

django-api-response

Responde a la petición en formato JSON, que deberemos parsear en el cliente para obtener los datos que nos interese.

Por ejemplo para activar el relé de abrir la puerta deberá fijarse en el campo “result”. Si el usuario cumple con los requisitos de acceso el resultado será “True” y el relé se activará.

Ahora mismo la seguridad no es la máxima posible desde mi punto de vista, por lo que estoy estudiando como implementar HTTPS.

 


Otras formas de acceso

El proyecto deja abierto la posibilidad para añadir distintas formas de acceso.

Una de ellas puede ser por Telegram, al tener el Chatid único de cada usuario podría buscar por él al utilizar el comando “/open” del Bot de Telegram. Me gusta porque es una forma segura y elegante de entrar a un espacio con cualquier dispositivo que disponga de la aplicación y sin necesidad de ningún llevar ningún hardware extra tipo tarjeta NFC/RFID, etc…

Una de Back-end

Hoy quiero mostrarles el “motor” del proyecto, el apartado de administración del Django.

En él se puede gestionar todo lo referente a gestión de usuarios (datos personales), los pagos de los usuarios, los Tags con los que pueden acceder al espacio, la tabla con los chatid de Telegram, sistema de mensajes y los registros de acceso (logs).

También permite la creación de grupos y darle permisos especiales a usuarios, pero esto para más adelante, para que el ser miembro de un grupo permita acceder a un espacio restringido al resto.

La base de datos tiene la siguiente estructura:

my_models3.png

 

Por ello al iniciar sesión el Django Admin vemos…

django-admin

A continuación vamos a ver cada apartado por separado para tener más detalle del funcionamiento del sistema.

Devices: Dispositivos con los que se puede acceder. Puede haber de varios tipos y varios por persona.

django-admin-device

Sistema de Logs: Permite ver un registro con fechas de entradas y salidas de los usuarios. También permite ver de manera simple que usuarios están dentro de espacio en ese momento.

django-admin-log

Messages: Apartado para gestionar mensajes. Estos pueden ser de diversos tipos.

Al entrar o salir un usuario busca un mensaje de ese tipo (input o ouput) y se lo envía por Telegram, es una buena forma de sorprender con al usuario cada vez que pasa su tag para entrar o salir.

También escribe a un grupo de Telegram al entrar el primero o salir el último diciendo si el sitio está cerrado o abierto.

django-admin-messages

Pagos: Como se trata de espacios con mucha afluencia de gente, normalmente se tienen socios que disponen de cuotas mensuales. Ésta es una forma de controlar sal entrar si el usuario está al corriente de sus pagos.

 

django-admin-payments

Telegram: Ésta tabla sirve para almacenar los chatid que proporcionan los usuarios en caso de que quieran recibir los mensajes personalizados.

En un futuro también servirá para dar acceso físico al espacio al solo escribirle “/open” al bot de Telergam.

 

django-admin-telegrams

Usuarios: Información personal de los usaurios. Nicks, nombre, apellidos, email, contraseña, etc…

django-admin-users

Proyecto en Hackaday.io

Documentar:

Al principio no le prestas atención, pero a medida que el proyecto avanza (junto con tus conocimientos) ves la importancia de esto.

 

Cuando vuelves con un proyecto que tienes parado de hace un tiempo lo que pasa es… ¿Esto como era? ¿Este código lo hice yo =O? ¿Por qué no puse esa info en ningún lado? etc…

Para este proyecto (y los siguientes) no he querido que esto fuera así y desde el primer momento he ido apuntando las cosas importantes al igual que los commits los he ido publicando con la información más concreta posible.

Dentro de ésta parte de documentación, me gustaría que el proyecto fuera lo más accesible posible para que todo el mundo pueda ser participe de él de una forma u otra.

Por ello, he publicado el proyecto en la plataforma Hackaday.io. Es una de las web en la que suelo ver proyectos interesantes, también está Instructables pero creo que ésta es para cuando tenga una información más amplia y por así decirlo “paso a paso”.

https://hackaday.io/project/10498-carontepass-open-access-control

La sorpresa ha sido que a las pocas horas ya había una persona a la que le gustaba el proyecto, una “desconocida” que quizás de otra forma no hubiera conocido el proyecto. Nada más por eso ya ha valido la pena el tiempo de documentación inicial.

Thanks you “davedarko” (Berlin, Germany, Europe, Earth) =D

hackaday-project

English:

At first you do not pay attention, but as the project progresses (along with your knowledge) you see the importance of this.

When you come back with a project that have stopped some time what happens is … Is this how it was? Is this code did I = O? Why not put that info anywhere? etc…

For this project (and the following) I did not want this to be so and from the first time I have been pointing important as the committers have been published with the most specific information possible things.

Within this part of documentation, I would like the project to be as accessible as possible so that everyone can be part of it in one way or another.

Therefore, I published the project in the Hackaday.io platform. It is one of the web where I usually see interesting projects, is also Instructables but I think it is is for when you have a broader, so to speak “step by step” information.

The surprise was that after a few hours and was a person who liked the project, an “unknown” that might otherwise have not known the project. Nothing so already worth the time of initial documentation.

Thanks you “davedarko” (Berlin, Germany, Europe, Earth) =D

Fase de Batalla

Ayer instalé de forma permanente y a modo de ver como trabaja en el día a día el sistema en el Makerspace Kreitek.

Para que fuera lo más fiel posible a un despliegue real he instalado en el lado del servidor (Raspberry Pi 2) la última versión del código en Github y a continuación he instalado Nginx, Gunicorn (sustituye al runserver del Django) y el Supervisor (encargado de los demonios).

También he tenido que modificar el código de Arduino del cliente ESP8266 porque al quitar el Debug = True de Django me daba otros resultados en la respuesta a la petición web de la api, por lo que tuve que parsear de nuevo el JSON.

De esta nueva versión ya instalada no solo me gusta que sea lo más barata y pequeña posible, sino que consume mucho menos con respecto a lo anterior.
Es muy importante para que se note lo menos posible en la factura de la luz en los hackerspaces, makerspaces, etc…

 

Antes:

Raspberry Pi B+ con RC522 y Relé.

CarontePass Raspberry

Ahora:

ESP8266 con RC522 y Relé.

caronteEsp8266

Electric Door