Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

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.

Aperçu

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]

Comment fonctionne la RFID


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.

RFID et Arduino

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.

Projet de contrôle d'accès de serrure de porte Arduino RFID

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 :

  • Module RFID MFRC522 …………………….
  • Servomoteur ……………………………………..
  • Écran LCD ………………………………………
  • Carte Arduino ………………………………………….
  • Breadboard et Jump Wires …………….. 
  • Capteur de proximité CNY70 ……………………

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.

Code source

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.

#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 motorCode language: Arduino (arduino)

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].

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)

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.

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)

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.

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

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.

int proximitySensor = analogRead(A0);Code language: Arduino (arduino)

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.

// 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)

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.

// 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)

Voilà donc à peu près tout et voici le code complet du projet :

/*
* 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)

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.


Processus de fabrication

  1. Verrou RFID Arduino avec RC522 - Protocole MIFARE 13,56 Mhz
  2. Tutoriel sur le verrouillage RFID Arduino
  3. Comment créer un bouton de clavier personnalisable personnalisable
  4. Serrure de porte basée sur un mot de passe
  5. Automates cellulaires basés sur Arduino et OLED
  6. eDOT - Horloge de précision et station météo basée sur Arduino
  7. Système de présence basé sur Arduino et la feuille de calcul Google
  8. Comment faire de la musique avec un Arduino
  9. Comment faire une boussole en utilisant Arduino et Processing IDE