Comment fonctionne la RFID et comment fabriquer une serrure de porte RFID basée sur Arduino
Dans ce didacticiel, nous apprendrons ce qu'est la RFID, son fonctionnement et comment fabriquer une serrure de porte RFID basée sur Arduino. Vous pouvez regarder la vidéo suivante ou lire le didacticiel écrit ci-dessous pour plus de détails.
RFID signifie Radio Frequency IDentification et c'est une technologie sans contact qui est largement utilisée dans de nombreux secteurs pour des tâches telles que le suivi du personnel, le contrôle d'accès, la gestion de la chaîne d'approvisionnement, le suivi des livres dans les bibliothèques, les systèmes de péage, etc.[/column]
Un système RFID se compose de deux composants principaux, un transpondeur ou une étiquette qui se trouve sur l'objet que l'on veut identifier, et un émetteur-récepteur ou un lecteur.
Le lecteur RFID se compose d'un module radiofréquence, d'une unité de contrôle et d'une bobine d'antenne qui génère un champ électromagnétique à haute fréquence. D'autre part, l'étiquette est généralement un composant passif, composé uniquement d'une antenne et d'une puce électronique. Ainsi, lorsqu'elle s'approche du champ électromagnétique de l'émetteur-récepteur, en raison de l'induction, une tension est générée dans sa bobine d'antenne et cela la tension sert d'alimentation pour la micropuce.
Désormais, lorsque l'étiquette est alimentée, elle peut extraire le message transmis du lecteur et, pour renvoyer le message au lecteur, elle utilise une technique appelée manipulation de charge. L'activation et la désactivation d'une charge au niveau de l'antenne de l'étiquette affectera la consommation d'énergie de l'antenne du lecteur, qui peut être mesurée en tant que chute de tension. Ces changements de tension seront capturés sous forme de uns et de zéros et c'est ainsi que les données sont transférées de l'étiquette au lecteur.
Il existe également un autre moyen de transfert de données entre le lecteur et l'étiquette, appelé couplage rétrodiffusé. Dans ce cas, le tag utilise une partie de la puissance reçue pour générer un autre champ électromagnétique qui sera capté par l'antenne du lecteur.
C'est donc le principe de fonctionnement de base et voyons maintenant comment nous pouvons utiliser la RFID avec Arduino et construire notre propre serrure de porte RFID. Nous utiliserons des étiquettes basées sur le protocole MIFARE et le lecteur RFID MFRC522, qui ne coûte que quelques dollars.
Ces balises ont 1 Ko de mémoire et ont une puce qui peut faire des opérations arithmétiques. Leur fréquence de fonctionnement est de 13,56 MHz et la distance de fonctionnement peut atteindre 10 cm selon la géométrie de l'antenne. Si nous amenons l'une de ces balises devant une source lumineuse, nous pouvons remarquer l'antenne et la puce dont nous avons parlé précédemment.
Quant au module lecteur RFID, il utilise le protocole SPI pour communiquer avec la carte Arduino et voici comment nous devons les connecter. Veuillez noter que nous devons connecter le VCC du module à 3,3 V et que pour les autres broches, nous n'avons pas à nous inquiéter car elles tolèrent 5 V.
Une fois le module connecté, nous devons télécharger la bibliothèque MFRC522 depuis GitHub. La bibliothèque est livrée avec plusieurs bons exemples à partir desquels nous pouvons apprendre à utiliser le module.
Nous pouvons d'abord télécharger l'exemple "DumpInfo" et tester si notre système fonctionne correctement. Maintenant, si nous exécutons le moniteur série et amenons l'étiquette près du module, le lecteur commencera à lire l'étiquette et toutes les informations de l'étiquette seront affichées sur le moniteur série.
On remarque ici le numéro UID de la balise ainsi que les 1 Ko de mémoire qui est en fait divisé en 16 secteurs, chaque secteur en 4 blocs et chaque bloc peut stocker 2 octets de données. Pour ce tutoriel, nous n'utiliserons aucune mémoire de la balise, nous utiliserons simplement le numéro UID de la balise.
Avant de passer en revue le code de notre projet de serrure de porte RFID, examinons les composants et les schémas de circuit de ce projet.
En plus du module RFID, nous utiliserons un capteur de proximité pour vérifier si la porte est fermée ou ouverte, un servomoteur pour le mécanisme de verrouillage et un affichage de caractères.
Vous pouvez obtenir les composants nécessaires pour ce didacticiel Arduino à partir des liens ci-dessous :
Le projet a le flux de travail suivant :nous devons d'abord définir une balise principale, puis le système passe en mode normal. Si nous scannons une balise inconnue, l'accès sera refusé, mais si nous scannons le maître, nous entrerons dans un mode programme à partir duquel nous pourrons ajouter et autoriser la balise inconnue. Alors maintenant, si nous scannons à nouveau l'étiquette, l'accès sera accordé afin que nous puissions ouvrir la porte.
La porte se verrouille automatiquement après que nous fermons la porte. Si nous voulons supprimer une balise du système, il suffit de repasser en mode programme, de scanner la balise connue et elle sera supprimée.
Examinons maintenant le code. Nous devons donc d'abord inclure les bibliothèques pour le module RFID, l'affichage et le servomoteur, définir certaines variables nécessaires au programme ci-dessous ainsi que créer les instances des bibliothèques.
Dans la section de configuration, nous initialisons d'abord les modules et définissons la valeur initiale du servomoteur dans une position de verrouillage. Ensuite, nous imprimons le message initial à l'écran et avec la boucle "while" suivante, nous attendons qu'une étiquette principale soit scannée. La fonction personnalisée getID() obtient l'UID de la balise et nous la plaçons au premier emplacement du tableau myTags[0].
Jetons un coup d'œil à la fonction personnalisée getID(). Tout d'abord, il vérifie s'il y a un nouveau tag placé près du lecteur et si c'est le cas, nous continuerons avec la boucle "for" qui obtiendra l'UID du tag. Les balises que nous utilisons ont un numéro UID de 4 octets, c'est pourquoi nous devons faire 4 itérations avec cette boucle, et en utilisant la fonction concat(), nous ajoutons les 4 octets dans une seule variable String. Nous mettons également tous les caractères de la chaîne en majuscules et à la fin nous arrêtons la lecture.
Avant d'entrer dans la boucle principale, à la fin de la section de configuration, nous appelons également la fonction personnalisée printNormalModeMessage() qui imprime le message "Contrôle d'accès" à l'écran.
Dans la boucle principale, nous commençons par lire la valeur du capteur de proximité, qui nous indique si la porte est fermée ou non.
Donc, si la porte est fermée, en utilisant les mêmes lignes que celles décrites dans la fonction personnalisée getID(), nous scannerons et obtiendrons l'UID de la nouvelle balise. Nous pouvons remarquer ici que le code n'ira pas plus loin tant que nous n'aurons pas scanné une balise à cause des lignes "return" dans les instructions "if".
Une fois que nous avons scanné l'étiquette, nous vérifions si cette étiquette est le maître que nous avons précédemment enregistré, et si c'est vrai, nous entrerons en mode programme. Dans ce mode, si nous analysons une balise déjà autorisée, elle sera supprimée du système, ou si la balise est inconnue, elle sera ajoutée au système comme autorisée.
En dehors du mode programme, avec la boucle "for" suivante, nous vérifions si la balise scannée est égale à l'une des balises enregistrées et nous déverrouillons la porte ou gardons l'accès refusé. À la fin de l'instruction "else", nous attendons que la porte soit fermée, puis nous verrouillons la porte et imprimons à nouveau le message de mode normal.
Voilà donc à peu près tout et voici le code complet du projet :
J'espère que vous avez apprécié ce tutoriel et n'hésitez pas à poser toute question dans la section des commentaires ci-dessous.Aperçu
Comment fonctionne la RFID
RFID et Arduino
Projet de contrôle d'accès de serrure de porte Arduino RFID
Code source
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
Code language: Arduino (arduino)void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor
myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
Code language: Arduino (arduino)uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return 0;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return 1;
}
Code language: Arduino (arduino)void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}
Code language: Arduino (arduino)int proximitySensor = analogRead(A0);
Code language: Arduino (arduino)// Checks whether the scanned tag is the master tag
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if ( successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
Code language: Arduino (arduino)// Checks whether the scanned tag is authorized
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Unlocks the door
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// If door is open...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Locks the door
printNormalModeMessage();
}
Code language: Arduino (arduino)/*
* Arduino Door Lock Access Control Project
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor
myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
void loop() {
int proximitySensor = analogRead(A0);
// If door is closed...
if (proximitySensor > 200) {
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return;
}
tagID = "";
// The MIFARE PICCs that we use have 4 byte UID
for ( uint8_t i = 0; i < 4; i++) { //
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
correctTag = false;
// Checks whether the scanned tag is the master tag
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if ( successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
successRead = false;
// Checks whether the scanned tag is authorized
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Unlocks the door
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// If door is open...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Locks the door
printNormalModeMessage();
}
}
uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return 0;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return 1;
}
void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}
Code language: Arduino (arduino)
Processus de fabrication
- Verrou RFID Arduino avec RC522 - Protocole MIFARE 13,56 Mhz
- Tutoriel sur le verrouillage RFID Arduino
- Comment créer un bouton de clavier personnalisable personnalisable
- Serrure de porte basée sur un mot de passe
- Automates cellulaires basés sur Arduino et OLED
- eDOT - Horloge de précision et station météo basée sur Arduino
- Système de présence basé sur Arduino et la feuille de calcul Google
- Comment faire de la musique avec un Arduino
- Comment faire une boussole en utilisant Arduino et Processing IDE