Table of Contents

RFID Attendance System

Introducere

Scopul proiectului este de a monitoriza scanarile unor RFID tags si stocarea unor log-uri in Cloud cu ajutorul unui modul de Ethernet. Ar putea fi integrat in sistemele de acces din blocuri sau cladiri de birouri cu scopul de a pastra datele in mod persistent si de a putea analiza diverse metrici calculate pe baza datelor cumulate. De asemenea, poate fi util in cazul companiilor care monitorizeaza in detaliu activitatea angajatilor in birou, intrucat pot vedea zonele care sunt accesate si timpul petrecut in acele zone. In cazul acestui proiect datele sunt puse in Google Drive via Google Sheets, intr-o forma tabelara, dar se pot stoca in multe variante - bazele de date reprezinta o alta modalitate de a persista datele.

Descriere generală

Schema bloc care cuprinde toate componentele software, cat si hardware poate fi vazuta mai jos.

Descriere module si interactiunea dintre acestea:
Sistemul are 3 componente hardware - RFID-RC522, Ethernet Shield 1 si Arduino UNO (cu microcontroller-ul integrat ATMega328P) - si 2 componente software - PushingBox si Google Drive. In cele ce urmeaza vom discuta despre fiecare in parte, cum interactioneaza intre ele si rolul lor in acest proiect.

RFID_RC522
Acest modul este un RFID reader generic, bazat pe MFRC522, un reader/writer integrat in IC pentru comunicarea contactless la frecventa de 13.56MHz. Transmitatorul intern al MFRC522 poate comunica doar cu carduri MIFARE (ISO/IEC 14443) si comunicarea cu microcontroller-ul este facuta prin Serial Peripheral Interface (SPI). Acesta trebuie alimentat intre 2.5V si 3.3V, conform datasheet-ului.

Ethernet Shield 1
Arduino Ethernet Shield V1 permite unei plăci Arduino să se conecteze la internet. Se bazează pe cipul ethernet Wiznet W5100. Wiznet W5100 oferă o stivă de rețea (IP) capabilă atât de TCP, cât și de UDP. Acesta suportă până la patru conexiuni socket simultane. Are conexiune standard RJ-45, cu un transformator de linie integrat și Power over Ethernet activat si comunica cu Arduino folosind bus-ul SPI. Din cauza ca avem 2 device-uri - slaves - care impart magistrala de SPI cu Arduino - master - sunt folositi 2 pini separati pentru Slave Select, deoarece numai unul poate fi activ la un moment dat.

Arduino UNO - ATMega328P
Reprezinta piesa centrala a sistemului avand rol de gestiune a celorlalte componente si prin acesta se vor primi si trimite comenzi catre celelalte module.

PushingBox - 3rd Party
Este un Cloud care poate trimite notificări pe baza apelurilor API. Dintr-o singură cerere, se pot trimite mai multe notificări, cum ar fi un Push, un Tweet, un Email, în timp real. Necesitatea acestui 3rd Party este datorata comunicarii pe care o impune API-ul Google Sheets, i.e. HTTPS. Deoarece stiva TCP/IP pe care ne-o pune la dispozitie W5100 nu permite si un layer suplimentar de SSL/TLS, peste cel de TCP, atunci calea cea mai usoara este de a folosi alt API pentru a putea urca datele in Google Drive via Google Sheets.

Google Drive
La fel ca PushingBox, este un serviciu in Cloud, care ne ofera o suita de alte servicii, cu ajutorul carora putem salva date in mod persistent in Cloud. In cazul acestui proiect s-a folosit Google Sheets pentru a pastra datele sub forma tabelara, iar pentru a interactiona cu PushingBox am folosit un alt serviciu, numit Google Apps Script. Acesta din urma este o platformă pe care se pot urca script-uri scrise in diverse limbaje, precum JavaScript, care pot interactiona cu suita de servicii oferita de Google Workspace, prin intermediul unor biblioteci. Acestea sunt rulate in Cloud.


Componentele prezentate mai sus interactioneaza conform diagramei anterioare in urmatoarea maniera:

  1. Tag-ul este citit de reader-ul RFID si sunt trimise metadate prin SPI microcontroller-ului ATMega328P.
  2. Acesta din urma verifica validitatea ID-ului asociat tag-ului (se cunosc in prealabil toate card-urile eliberate pentru sistemul nostru, la fel cum intr-un bloc cu interfon se cunosc toate cartelele care au acces)
  3. Daca tag-ul este valid atunci se trimite prin intermediul controller-ului de Ethernet (comunica cu ATMega328P prin SPI), care actioneaza ca un Client, un request HTTP catre PushingBox. In acest request HTTP se mai pun si 2 query parameters care reprezinta datele pe care le vom pune in tabel (allowed si id-ul cardului).
  4. PushingBox pune la dispozitie o interfata web pe care se pot configura web-hooks si diverse alte scenarii. In cazul proiectului s-a creat un hook catre script-ul care a fost deployed in Cloud (acesta din urma are asociat un URL). Acest hook primeste un ID, numit in cadrul PushingBox devid, prin care il putem identifica si apela cu URL-ul de baza pus la dispozitie in API-ul lor.
  5. Cand PushingBox va primi request-ul, va identifica hook-ul cu devid si va face la randul sau un request HTTPS, pentru a putea fi acceptat de serviciile Google.
  6. In cele din urma, App Script va primi request-ul de la PushingBox si va rula un script scris in JavaScript care va interactiona cu Google Sheets si va putea adauga o noua linie in tabela activa.

Hardware Design

Lista de piese:

  1. Ethernet controller - WIZnet 5100
  2. Microcontroller - ATMega328P
  3. Reader/Writer IC: MFRC522

Schema electrica:

Software Design

#include <SPI.h>
#include <MFRC522.h>
#include <Ethernet.h>

Firmware-ul:
Pentru a putea comunica extern, placa are nevoie de o adresa IP. Aceasta este asignata automat prin DHCP, in codul:

if ( ! Ethernet.begin(mac) )

, insa am folosit si o adresa IP statica in caz ca nu se poate negocia cu DHCP. De asemenea, orice device are nevoie si de o adresa MAC, insa doar Shield-urile mai noi vin insotite de un MAC predefinit. Asadar, se poate defini in cod o adresa MAC arbitrara.

Se initializeaza si Seriala cu baud 9600, SPI-ul si RFID-ul.

Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();

Pentru asteptarea unui card in proximitate, vom apela in loop:

if( ! mfrc522.PICC_IsNewCardPresent() )
    return;
    
if( ! mfrc522.PICC_ReadCardSerial() )
    return;

Doua define-uri foarte importante sunt cele de mai jos:

#define SS_PIN  4
#define RST_PIN 9

, fiindca ele definesc port-urile pe care le va folosi RFID-ul, in special SS_PIN. Acest pin este in mod obisnuit 10, insa din cauza ca avem 2 slaves care comunica prin SPI cu microcontroller-ul, va trebui sa avem un pin diferit pentru Slave Select. De aceea, Shield-ul va folosi pin-ul 10, iar reader-ul va folosi pin-ul 4.

In codul care urmeaza se fac verificari asupra id-ului citit, iar daca acesta este valid se va apeca functia care face requestul HTTP cu valoarea 1, insemnand Access Granted, iar 0 pentru Forbidden.

Rezultate Obţinute

Concluzii

A fost un proiect foarte practic, care poate fi integrat in multe contexte si multe industrii. Pot fi aduse multe imbunatatiri si features.
Un demo al proiectului poate fi vazut la:
https://drive.google.com/drive/folders/1VHvZFZ2ZIqa5S0xpfgaWkEoQl2FtF4mu?usp=sharing.

Download

Bibliografie/Resurse

Resurse hardware:

Resurse software:

Documentatia in format PDF: