Construire un Lecteur de Carte RFID Connecté au Réseau avec Arduino, Ethernet ENC28J60 et MFRC522
Composants et fournitures
| Lecteur RFID Mifare MFRC522 | × | 1 |
| Arduino UNO (ou Nano, tout Arduino convient) | × | 1 |
| Module Ethernet ENC28J60 | × | 1 |
| Fils de connexion (génériques) | × | 1 |
| Plaque d'essai (breadboard) | × | 1 |
| Ordinateur (connecté à Internet) | × | 1 |
Outils nécessaires
- Ciseaux (ou pinces à dénuder)
Applications et services en ligne
- PyCharm (pour le serveur Python)
- Arduino IDE
À propos de ce projet
Avez-vous déjà pensé à ajouter un système de sécurité ou de surveillance par badges/cartes RFID chez vous ou au bureau ? Si vous êtes ici, je parie que vous avez déjà regardé les prix : de 200 à 2000 $, C'EST TROP CHER ! Un ami et moi avons décidé de créer un système coûtant moins de 100 $ et capable de faire bien plus qu'ouvrir une porte. Voici ce que nous avons conçu : un lecteur de badges RFID connecté à Internet. Pour 20 $ de plus, il peut ouvrir des portes. Ce système a été conçu pour suivre des élèves dans notre lycée et nous espérons que l'école l'approuvera.
Vous pourriez penser que cela prend beaucoup de temps... Pourtant, cela m'a pris seulement environ 6 heures (à cause de problèmes d'alimentation), mais cela pourrait vous prendre environ 30 minutes pour configurer comme l'exemple ci-dessus. Tout le code et les images sont ci-dessous.
Avant de commencer (Indispensable)
Avant de pouvoir scanner des cartes et les envoyer à notre serveur Telnet/TCP, nous avons besoin de certaines bibliothèques :
- Télécharger UIPEthernet : GitHub UIPEthernet
- Télécharger MFRC522 : GitHub MFRC522
Placez les deux bibliothèques dans Program Files(x86)/Arduino/Libraries/ et redémarrez Arduino IDE.
Matériel
- Arduino Nano (vous pouvez adapter le code à votre carte)
- MFRC522 avec cartes MIFARE
- Fils de connexion (Mâle-Mâle, Mâle-Femelle)
- Module/shield Ethernet ENC28J60
- LED RVB
- Convertisseur AC-DC 3V ou 5V > 700 mA
Câblage
- Fixez l'Arduino sur la breadboard (si Nano ou Micro)
- Cherchez en ligne le pinout de votre carte pour trouver la configuration SPI (modifiez les valeurs ci-dessous)
- Connectez Arduino pin 10 (SS) au module Ethernet SS ou CS
- Connectez Arduino pin 12 (MISO) au RFID MISO et Ethernet SO
- Connectez Arduino pin 11 (MOSI) au RFID MOSI et Ethernet SI
- Connectez Arduino pin 13 (SCK) au RFID SCK et Ethernet SCK
- Connectez Arduino pin 9 au RFID RST
- Connectez Arduino pin 8 au RFID SSN
- Connectez Arduino pin 5 à la LED verte, 4 à la bleue, 3 à la rouge
- Connectez votre convertisseur AC-DC aux rails + et - de la breadboard
- Mettez la masse de l'Arduino sur le convertisseur AC-DC
- Connectez VCC et GND sur le RFID et l'Ethernet au convertisseur AC-DC (ATTENTION : CES DISPOSITIFS SONT EN 3V UNIQUEMENT !!! Ne fournissez PAS 5V. Si problème, utilisez des résistances pour abaisser la tension à 3V)
- Connectez la broche VCC de la LED à l'Arduino 3V ou au convertisseur 3V
- Connectez le câble Ethernet au module et assurez-vous qu'il est sur le même réseau que votre ordinateur
- Branchez le câble USB de l'ordinateur à l'Arduino
- Connectez l'ordinateur au même réseau
Modifier le code selon vos besoins
- Le code est bien commenté, vous pouvez modifier certaines parties, mais une chose est sûre : le module Ethernet
- L'adresse MAC peut rester la même (sauf si vous prévoyez d'en construire plusieurs)
- Si vous utilisez un réseau 192.168.x.x, vous pouvez garder l'IP
- Le DNS peut rester, à changer uniquement pour 8.8.4.4
- Exécutez
ipconfigpour trouver votre passerelle (par défaut 192.168.1.1) (le code utilise actuellement 192.168.1.5) - Exécutez l'invite de commande et tapez
ipconfigpour trouver l'adresse IP de votre ordinateur
- Descendez jusqu'à SEND TO SERVER et entrez l'IP de votre ordinateur ou, si vous avez fait du port forwarding sur votre routeur, votre IP publique
- ASSUREZ-VOUS D'AVOIR PYTHON ET DE LANCER LE SERVEUR (Rappelez-vous que c'est juste un exemple de code pour notre présentation à l'école, le serveur Python était déjà prêt et peu modifié. Vous pouvez utiliser n'importe quel serveur Telnet/TCP)
Autre partie du code à modifier probablement :
Exécution du code
- Branchez l'alimentation AC-DC sur le secteur
- Assurez-vous que l'Arduino est connecté à l'ordinateur
- Vérifiez que les deux appareils sont sur le même réseau
- Téléversez votre code Arduino modifié (ou celui fourni s'il fonctionne pour vous - presque aucune chance qu'il n'ait pas besoin de modification)
- Démarrez votre script serveur Python, C++ ou tout serveur Telnet/TCP sur votre réseau
- Redémarrez l'Arduino pour être sûr
- Attendez que la lumière devienne bleue et essayez de scanner une carte. Si votre serveur a reçu l'ID de la carte, vous êtes prêt !
- Signification des couleurs : Violet/rouge clignotant = démarrage
- Rouge = erreur (carte à angle bizarre et/ou serveur n'a pas répondu à temps)
- Vert = succès (le serveur a répondu "go", vous pouvez scanner la carte suivante)
- Bleu = attente/chargement (en attente d'une carte ou d'une réponse)
- Si l'Arduino laggue et met plus de 30 secondes pour afficher du rouge : le module Ethernet n'a pas pu se connecter au serveur. Causes possibles : alimentation insuffisante, serveur non lancé, appareils pas sur le même réseau.
- Astuces pour corriger :
- Désactiver le pare-feu Windows
- Autoriser le port 23 entrant/sortant dans les paramètres avancés du pare-feu
- Faire du port forwarding sur le routeur vers votre ordinateur port 23
- Si sans fil, connectez l'Arduino directement au routeur et l'ordinateur au même
- Achetez un adaptateur AC-DC plus robuste
- Vérifiez que l'adresse IP ou l'adresse de connexion est correcte
- Sinon, contactez-moi à smerkousdavid@gmail.com en cas de problème
- C'EST BON, VOUS POUVEZ COMMENCER !!!
Note : Il n'y a pas de code pour le système de verrouillage de porte, car je n'en ai pas. Vous devrez ajouter du code si vous voulez utiliser cela non seulement comme système de suivi mais aussi comme système de contrôle d'accès par porte.
Code
Code Arduino
/*
* ----------------------------------
* MFRC522 Arduino
* Lecteur/PCD Nano v3
* Signal Pin Pin
* ----------------------------------
* RST/Reset RST D9
* SPI SS NSS D10
* SPI MOSI MOSI D11
* SPI MISO MISO D12
* SPI SCK SCK D13
*/
// PREMIÈRE BIBLIOTHÈQUE À INSTALLER : UIPEthernet, DEUXIÈME : MFRC522 (TOUTES DEUX SUR GITHUB)
#include <UIPEthernet.h>
#include <SPI.h> // Pour la sélection de la clé
#include <MFRC522.h> // Bibliothèque RFID
#define RST_PIN 9 // Configurable, voir pinout typique ci-dessus - Pour Arduino Nano - Pour RFID
#define SS_PIN 8 // NOUS UTILISONS 8 POUR RFID CAR LE MODULE ETHERNET UTILISE 10
byte sector = 0;
byte blockAddr = 0;
//////// Accéder à certains secteurs/blocs de la carte, le bloc trailer est le dernier bloc
byte trailerBlock = 1;
int red = 3;
int blue = 4; // Broches pour LED RVB
int green = 5;
EthernetClient client; // INSTANCE ETHERNET
MFRC522 mfrc522(SS_PIN, RST_PIN); // Création instance MFRC522
MFRC522::MIFARE_Key key; // Instance clé
signed long timeout; // TIMEOUT POUR NE PAS BLOQUER INDÉFINIMENT
void setup() {
// UI BEGIN
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
Reset(); // Démarrage LEDs éteintes
Serial.begin(9600);
// UI END
// INITIALISATION MODULE ETHERNET
SPI.begin(); // Init bus SPI
uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; // MAC = 000102030405
IPAddress mip(192,168,1,160); // IP = 192.168.1.160
IPAddress mdns(8,8,8,8); // DNS = 8.8.8.8
IPAddress mgate(192,168,1,5); // GATEWAY = 192.168.1.5
IPAddress msubnet(255,255,255,0); // SUBNET = 255.255.255.0
Ethernet.begin(mac, mip, mdns, mgate, msubnet); // CONNEXION AVEC CI-DESSUS
Serial.println("Connexion réussie");
// FIN ETHERNET
for(int t = 255; t > 0; t--) {
analogWrite(red, t); // Animation mais laissez au moins une seconde entre SPI Ethernet et RFID
delay(10);
}
// INITIALISATION RFID
mfrc522.PCD_Init(); // Init carte MFRC522
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF; // Clé FFFFFFFFFFFFh (défaut usine)
}
Serial.println(F("Scannez une carte"));
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
timeout = 0;
delay(2000);
Reset();
}
void loop() {
// Recherche de nouvelles cartes
if (!mfrc522.PICC_IsNewCardPresent()) {
digitalWrite(blue, LOW);
return;
}
// Sélection d'une carte
if (!mfrc522.PICC_ReadCardSerial()) return;
digitalWrite(blue, HIGH); // Indique à l'utilisateur que la carte a été lue
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
// Vérification compatibilité carte Mifare
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Error();
return;
}
byte status;
byte buffer[18];
byte size = sizeof(buffer);
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
Error();
return;
}
// Lecture des données du bloc
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
Error();
}
// Arrêt PICC
mfrc522.PICC_HaltA();
// Arrêt chiffrement sur PCD
mfrc522.PCD_StopCrypto1();
// APRÈS LECTURE CARTE - ENVOI AU SERVEUR
if (client.connect(IPAddress(192,168,1,100), 23)) {
timeout = millis() + 1000;
Serial.println("Client connecté");
const String ID = dump_byte_array(buffer, size);
client.println(ID);
Serial.println("envoyé :" + ID);
delay(10);
while(client.available() == 0) {
if (timeout - millis() < 0) goto close;
}
int size;
while((size = client.available()) > 0) {
uint8_t* msg = (uint8_t*)malloc(size);
size = client.read(msg, size);
Serial.write(msg, size);
if(size == sizeof("g") - 1) {
Pass();
} else {
Error();
}
free(msg);
}
close:
client.stop();
} else {
Serial.println("Impossible de se connecter au serveur");
Error();
}
// FIN ENVOI AU SERVEUR
Reset(); // REBOUCLE AVEC AUCUNE LED ALLUMÉE
}
// TRANSFORME LE TABLEAU BUFFER EN CHAÎNE UNIQUE MAJUSCULE = NOTRE ID DE SECTEUR ET BLOC
String dump_byte_array(byte *buffer, byte bufferSize) {
String out = "";
for (byte i = 0; i < bufferSize; i++) {
out += String(buffer[i] < 0x10 ? " 0" : " ") + String(buffer[i], HEX);
}
out.toUpperCase();
out.replace(" ", "");
return out;
}
// MÉTHODES LED
void Error() {
digitalWrite(red, LOW);
delay(700);
digitalWrite(red, HIGH);
}
void Pass() {
digitalWrite(green, LOW);
delay(700);
digitalWrite(green, HIGH);
}
void Reset() {
digitalWrite(red, HIGH);
digitalWrite(blue, HIGH);
digitalWrite(green, HIGH);
}
Code serveur d'exemple (Python)
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
# self.request est le socket TCP connecté au client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
"""
SQL STUFF HERE
if(self.data == SQL NAME or something) {
self.request.sendall("g")//send good
//INSERT TIME AND LOCATION INTO SQL HERE
} else {
self.request.sendall("bb")//send bad
//DO NOTHING just send to arduino bad data
}
"""
self.request.sendall("g")
if __name__ == "__main__":
HOST, PORT = "", 23
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
Code mis à jour sur GitHub
Code le plus récent : GitHub InternetRFIDTags
Schémas
Le circuit est simple, j'ai fait une photo avec le câblage.
Processus de fabrication
- L'industrie de la carte de vœux : histoire, production et tendances futures
- Carte de crédit : histoire, conception, fabrication et tendances futures
- Construire une serrure RFID sécurisée avec Arduino et RC522 (MIFARE 13,56 MHz)
- Créer un verrou RFID sécurisé avec Arduino – Guide étape par étape
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Lecteur de disquettes Amiga basé sur Arduino : Récupération de données open-source et abordable