
Si vous avez déjà utilisé une caisse automatique de supermarché et vu vos articles s'afficher automatiquement sur l'écran lorsque vous les déposez sur un plateau , vous avez déjà vu la technologie RFID en action. Il ne s'agit ni de magie ni de télépathie technologique : c'est un système basé sur la radiofréquence qui permet d'identifier des objets sans contact direct, et vous pouvez le reproduire chez vous avec une simple carte Arduino et un lecteur bon marché comme le RC522.
Dans ce guide, vous apprendrez, étape par étape, à utiliser Arduino et un lecteur RFID RC522 pour lire et écrire des étiquettes, à comprendre précisément ce qu'est la RFID, les différents types de systèmes existants, l'alimentation des cartes passives, l'organisation de la mémoire d'une carte MIFARE Classic 1K et à réaliser des projets concrets tels qu'un système de contrôle d'accès ou une carte de transport rechargeable. Installez-vous confortablement, car nous allons explorer le sujet en profondeur, de manière claire et accessible.
Qu’est-ce que la technologie RFID et comment fonctionne-t-elle ?
L'identification par radiofréquence (RFID) est un système permettant de reconnaître des objets grâce à un identifiant unique transmis par radio. Cet identifiant, généralement appelé UID (Unique ID), correspond à l'identifiant de l'étiquette. Le système complet se compose de deux éléments principaux : l'étiquette RFID (ou transpondeur) et le lecteur RFID (émetteur-récepteur).
Les étiquettes RFID se présentent sous de nombreux formats : cartes plastiques semblables à des cartes de crédit, porte-clés, autocollants à apposer sur les produits pour prévenir le vol, et même puces implantées sous la peau des animaux à des fins d’identification. Elles possèdent toutes les mêmes composants internes : une antenne et une petite puce qui stocke les informations et communique avec le lecteur.
Il existe des étiquettes en lecture seule, dont l'UID est programmé en usine et ne peut être modifié, et des étiquettes en lecture/écriture, sur lesquelles un lecteur approprié, tel que le module RC522, peut à la fois lire et écrire des données . Ceci permet des applications telles que les cartes de transport rechargeables, les systèmes de contrôle d'accès avec soldes prépayés, les systèmes de gestion du temps et des présences, et bien plus encore.
D'autre part, nous avons le lecteur ou émetteur-récepteur RFID. Cet appareil reçoit des données et émet un champ électromagnétique de radiofréquence . Ce champ est essentiel pour comprendre l'alimentation des étiquettes passives et l'échange d'informations entre la carte et le lecteur.
Alimentation et principe de fonctionnement des étiquettes RFID
Une question revient souvent : si les étiquettes RFID apposées sur les produits de supermarché ou les cartes d’accès ne contiennent pas de piles, d’où proviennent-elles l’énergie nécessaire à leur fonctionnement ? La réponse est que nombre de ces étiquettes sont passives et fonctionnent par induction électromagnétique grâce au champ généré par le lecteur.
Lorsqu'on approche une étiquette passive d'un lecteur, son antenne entre dans le champ électromagnétique généré par le module (par exemple, à 13,56 MHz dans le cas du RC522). Ce champ induit un courant dans l'antenne de l'étiquette, courant qui alimente momentanément la puce interne . Une fois activée, la puce module le signal qu'elle renvoie au lecteur (phénomène appelé rétrodiffusion), encodant l'UID et, le cas échéant, d'autres données stockées en mémoire.
Contrairement aux technologies telles que l'infrarouge, une ligne de visée directe entre l'étiquette et le lecteur n'est pas nécessaire : la radiofréquence peut pénétrer certains matériaux, bien que son comportement dépende de la fréquence, de la présence de métal, d'eau, etc. Le lecteur capture le signal rétrodiffusé, l'interprète, puis envoie les données à un microcontrôleur (tel qu'Arduino, ESP8266 ou ESP32) ou à un ordinateur.
Types de systèmes RFID selon la fréquence
Le spectre des radiofréquences est très large et les ondes radio ne se comportent pas de la même manière à toutes les fréquences . C'est pourquoi différentes bandes sont utilisées en RFID selon l'application. Le lecteur et l'étiquette doivent être conçus pour fonctionner sur la même fréquence, tout comme une radio doit être réglée sur la bonne station.
De manière générale, on peut regrouper les systèmes RFID en trois grandes catégories selon la bande de fréquence qu'ils utilisent :
- Basse fréquence (BF): environ 125-134 kHz.
- Haute fréquence (HF): environ 13,56 MHz, ce qui inclut des technologies telles que MIFARE et NFC.
- Ultra haute fréquence (UHF): entre environ 433 MHz et 860-960 MHz.
Systèmes RFID basse fréquence (BF)
Les systèmes RFID basse fréquence possèdent une longueur d'onde relativement importante, ce qui leur permet de mieux pénétrer les matériaux fins et les objets à forte teneur en eau , comme les fruits ou les boissons. Ils fonctionnent également assez bien à proximité de métaux fins.
Cependant, cet avantage présente des limitations importantes : la portée typique n’est que de quelques centimètres et le débit de transmission des données est faible, ce qui réduit la capacité de mémoire et augmente le coût des étiquettes . Ces systèmes sont couramment utilisés pour le contrôle d’accès simple, les anciens systèmes de clés de proximité et le marquage des animaux.
Systèmes RFID et NFC haute fréquence (HF)
La bande de haute fréquence, à 13,56 MHz, est probablement la plus populaire au niveau des projets « maker » et de bricolage, car c'est là que se trouvent les cartes MIFARE et la technologie NFC (Near-Field Communication) , que de nombreux téléphones mobiles utilisent pour les paiements sans contact.
Les systèmes HF fonctionnent bien à proximité des métaux et en présence d'une quantité d'eau modérée à élevée, offrant généralement une portée de quelques centimètres à environ un mètre dans des conditions idéales. Les débits de données restent modestes, mais suffisants pour l'identification, l'accès et les applications de transfert de données de faible intensité. De nombreuses normes internationales sont basées sur la technologie HF, ce qui facilite l'interopérabilité des équipements et des cartes.
Systèmes RFID à ultra-haute fréquence (UHF)
À l'opposé, on trouve les systèmes UHF, capables d'atteindre des distances allant de quelques centimètres à plus de 20 mètres. Ils sont idéaux lorsqu'il est nécessaire de lire rapidement et à distance de nombreuses étiquettes , par exemple pour la gestion des stocks dans les entrepôts, le comptage des personnes lors d'événements ou le chronométrage des athlètes franchissant la ligne d'arrivée d'une course.
L'inconvénient est que, du fait de leur longueur d'onde plus courte, le signal s'atténue davantage et pénètre moins efficacement dans le métal et l'eau . Malgré cela, ils sont largement utilisés dans les systèmes de péage, le contrôle d'accès aux parkings et le suivi logistique à grande échelle.
Module RFID RC522 : caractéristiques et broches
Pour les projets Arduino, le lecteur RC522, basé sur la puce NXP MFRC522, est l'un des plus populaires. Ce module, très abordable et largement utilisé, fonctionne à haute fréquence (13,56 MHz) avec les cartes MIFARE et permet la lecture et l'écriture sur les étiquettes compatibles.
Il est généralement vendu en kit comprenant le lecteur, une carte de crédit et un porte-clés RFID. Ces cartes sont généralement des cartes MIFARE Classic 1K ou 4K, une norme très répandue dans les transports, le contrôle d'accès et les solutions économiques. Le RC522 génère un champ électromagnétique HF et, en pratique, sa portée utile est d'environ 3 à 5 cm, bien que théoriquement elle puisse être légèrement supérieure.
Concernant la communication avec le microcontrôleur, le RC522 est principalement intégré via SPI (Serial Peripheral Interface) et prend en charge des débits jusqu'à 10 Mbit/s. Il prend également en charge les interfaces I2C et UART, bien que la plupart des projets Arduino privilégient le protocole SPI en raison de sa vitesse supérieure et de sa simplicité d'utilisation.
Le module fonctionne électriquement avec une tension d'alimentation comprise entre 2,5 V et 3,3 V. La carte possède généralement une broche VCC clairement identifiée pour le raccordement à une alimentation de 3,3 V. Ne l'alimentez pas directement en 5 V , au risque de l'endommager. En revanche, les niveaux logiques tolèrent généralement une tension de 5 V ; il est donc possible de le connecter aux broches numériques d'une carte Arduino UNO sans convertisseur de niveau pour des tests de base. Toutefois, pour une application professionnelle, il est conseillé d'adapter les niveaux.
Broches du module RC522
Le RC522 standard comprend 8 broches de connexion au microcontrôleur :
- VCC: alimentation, entre 2,5 V et 3,3 V.
- RST: broche de réinitialisation ; permet d'éteindre et de redémarrer le module en réglant le niveau sur BAS/HAUT.
- GND: masse ou référence de la terre.
- IRQ: broche d'interruption qui peut alerter le microcontrôleur lorsqu'une étiquette entre dans le champ du lecteur.
- MISO / SCL / TX: broche multifonction ; telle que MISO dans SPI, telle que SCL dans I2C, ou telle que TX dans UART.
- MOSI: ligne de données de sortie du maître vers l'esclave dans SPI.
- SCK: Horloge de l'interface SPI.
- SS / SDA / RX: broche de sélection de l'esclave en SPI, SDA en I2C ou RX en UART.
Sur Arduino UNO et autres cartes basées sur ATmega328P, les broches SPI sont déjà définies par le matériel, donc le schéma de connexion typique pour l'utilisation de SPI est le suivant :
- VCC → 3,3 V provenant d'Arduino.
- GND → Arduino GND.
- SCK → broche 13 sur UNO/Nano.
- MOSI → broche 11 sur UNO/Nano.
- MISO → broche 12 sur UNO/Nano.
- SS (SDA) → broche 10 (ou celle que vous choisissez comme SS, mais vous devez la spécifier dans le code).
- RST → par exemple, la broche 9 d'Arduino.
- IRQ → Optionnel, peut être laissé non connecté si aucune interruption n'est utilisée.
Sur les cartes comme Arduino Mega, Leonardo ou Micro, les lignes SPI peuvent se trouver sur des broches différentes ou sur le connecteur ICSP ; il est donc important de consulter le tableau d’équivalence dans la documentation officielle avant de procéder au câblage.
Installation de la bibliothèque MFRC522 et lecture de base des étiquettes
Bien que le MFRC522 puisse être programmé manuellement, sa communication interne est assez complexe. C'est pourquoi il est courant d'utiliser la bibliothèque développée par Miguel Balboa , disponible sur GitHub et dans le gestionnaire de bibliothèques de l'IDE Arduino. Cette bibliothèque regroupe toutes les opérations nécessaires à l'initialisation du lecteur, la détection des cartes, l'authentification des secteurs et la lecture/écriture de blocs.
Pour l'installer depuis l'IDE Arduino, ouvrez simplement le Gestionnaire de bibliothèques, recherchez « MFRC522 » et sélectionnez la version maintenue par la communauté (Communauté GitHub) . Vous devrez également inclure la bibliothèque SPI, déjà fournie avec l'IDE.
Une fois installé, le flux typique dans un programme simple pour lire l'UID d'une étiquette est le suivant :
- Inclure les librairies SPI.hy MFRC522.h.
- Définissez les broches RST et SS que le lecteur utilisera.
- Créez un objet MFRC522 en lui passant ces broches.
- Dans la fonction setup(), initialisez Serial, SPI et le lecteur avec PCD_Init().
- Dans la boucle(), utilisez PICC_EstUneNouvelleCartePrésente() pour savoir s'il y a une carte à proximité et PICC_ReadCardSerial() pour lire vos données de base.
- Accédez à l'UID en utilisant mfrc522.uid.uidByte et à la taille avec mfrc522.uid.size.
- Mettez fin à la communication avec le label en appelant PICC_HaltA().
Ce type de programme est idéal pour obtenir l'UID de plusieurs cartes ou porte-clés et effectuer des tests rapides, par exemple pour un contrôle d'accès simple où seul l'UID lu est comparé à une liste d'UID autorisés.
Structure de la mémoire des cartes MIFARE Classic 1K
Les cartes fournies avec le RC522 sont généralement des MIFARE Classic 1K . Ces cartes offrent 1 Ko de mémoire organisée hiérarchiquement en secteurs et blocs, avec un système de clés et de permissions assez particulier qu'il convient de comprendre avant toute écriture.
La mémoire totale est divisée en 16 secteurs numérotés de 0 à 15. Chaque secteur contient 4 blocs, numérotés de 0 à 3. Chaque bloc stocke 16 octets de données , soit 16 positions numérotées de 0 à 15 ; chaque secteur offre donc 64 octets.
Au sein de ces quatre blocs par secteur, seuls trois sont destinés au stockage des données utilisateur : les blocs 0, 1 et 2 de chaque secteur (à l’exception du secteur 0, qui présente des caractéristiques particulières). Le dernier bloc de chaque secteur, le bloc 3, est appelé bloc de fin . Il contient les clés de chiffrement et les bits d’accès qui déterminent les opérations autorisées dans ce secteur.
Dans la bande-annonce, les 16 octets sont divisés comme suit :
- Clé A: 1 024 octets.
- Conditions d'accès: 3 octets qui définissent les autorisations de lecture/écriture, l'authentification et la visibilité des clés.
- Octet inutilisé (U): 1 octet non utilisé.
- Clé B: 1 024 octets.
Les cartes fournies en usine avec les modules ont généralement les clés A et B initialisées à FF FF FF FF FF FF , ce qui est extrêmement peu sûr, car toute personne connaissant la norme peut s'authentifier et modifier le contenu de la carte. Il est assez courant, dans les projets de bricolage, d'utiliser les mêmes clés pour tous les secteurs, bien que pour une sécurité optimale, il soit préférable de les diversifier.
De plus, le bloc 0 du secteur 0 est particulier : il contient l’identifiant unique de la carte (généralement 4 octets pour ces cartes MIFARE Classic) et les données du fabricant. Ce bloc est considéré comme étant en lecture seule ; toute tentative de modification peut corrompre la carte de manière irréversible.
Changez les clés A et B dans un secteur
Si vous souhaitez utiliser une carte MIFARE dans un projet Arduino et RC522 de manière pertinente, la première chose à faire est de modifier les clés par défaut . Cela empêche toute personne possédant un lecteur et la bibliothèque standard de manipuler votre carte sans autorisation.
L'idée de base pour la mise à jour des clés d'un secteur spécifique (par exemple, le secteur 15) est la suivante :
- Définissez les clés actuelles dans le code (les valeurs par défaut d'usine, si elles n'ont pas été modifiées).
- Définissez les nouveaux mots-clés clés A et B que vous souhaitez utiliser dans ce secteur.
- Calculez le numéro de bloc de remorque pour ce secteur, qui est secteur * 4 + 3 (pour le secteur 15, bloc 63).
- Authentifiez-vous d'abord avec la clé A actuelle en utilisant PCD_Authenticate() à propos du bloc de remorques.
- Lisez le bloc de bande-annonce avec MIFARE_Read() pour obtenir votre contenu.
- Modifiez les octets correspondant aux nouvelles clés dans un tampon.
- Authentifiez-vous à nouveau si nécessaire (par exemple, avec la clé B).
- Écrivez le bloc de remorque mis à jour avec MIFARE_Écrire().
Durant cette opération, il est crucial de ne pas retirer la carte du lecteur avant la fin du processus , car une interruption d'écriture dans le bloc de fin pourrait rendre le secteur inaccessible. Une fois les clés modifiées, vous devrez également mettre à jour le code Arduino pour utiliser ces nouvelles clés lors des prochaines opérations sur ce secteur.
Blocs de lecture et d'écriture : simulation d'une carte de transport
Une application très parlante de la lecture et de l'écriture avec MIFARE Classic consiste à simuler le fonctionnement d'une carte de transport public rechargeable . Le principe est simple : la carte enregistre un certain nombre de trajets dans un bloc spécifique, et le système permet de recharger la carte ou de l'utiliser (validation à la montée dans le bus ou le tramway).
À cette fin, le secteur 15 pourrait être réservé aux données utilisateur, par exemple, et l'un de ses blocs de données (par exemple, le bloc 60) pourrait servir à stocker le compteur de trajets. Le nombre de trajets disponibles est stocké dans l'octet 0 du bloc. Les octets restants du bloc pourraient être utilisés pour d'autres données ou simplement laissés à zéro.
Le flux de code typique pour la partie rechargement serait le suivant :
- Définir Clé A et Clé B les réglementations en vigueur qui protègent le secteur concerné (par exemple, celles que nous avons modifiées à l’étape précédente).
- Définissez le numéro de secteur, le bloc de données (60) et le bloc de fin (63).
- Déclarez un tableau de 16 octets (blockData) où le premier octet représentera le nombre de trajets.
- Chaque fois qu'une carte est approchée du lecteur, Lire le bloc 60 utilisation de MIFARE_Read() pour obtenir les trajets en cours.
- Ajoutez le nombre de trajets pour recharger (par exemple, 10) Ã la valeur lue.
- Mise à jour des données. Blocage avec le nouveau nombre de trajets.
- Authentifiez-vous avec la clé A auprès du bloc de remorque correspondant.
- Écrire le bloc 60 avec MIFARE_Écrire().
- Relisez pour vérifier que la valeur a bien été mise à jour.
Pour la partie relative à la consommation des trajets (validation dans le bus), le code est pratiquement identique, mais au lieu d'ajouter, on soustrait un au compteur. Avant la soustraction, on vérifie si la valeur lue est nulle : s'il ne reste plus de trajets, l'accès est refusé et l'utilisateur est invité à recharger la page . Si le compteur est supérieur à zéro, il est décrémenté, le bloc est réécrit et le nombre de trajets restants s'affiche à l'écran.
Dans les deux cas, il est important de gérer correctement les codes de retour des fonctions de la bibliothèque MFRC522 (par exemple, les erreurs d'authentification ou d'écriture) et d'arrêter systématiquement la communication chiffrée avec PCD_StopCrypto1() et la carte elle-même avec PICC_HaltA() à la fin de chaque cycle.
Contrôle d'accès simple basé sur l'UID
Un autre projet classique utilisant le RC522 et Arduino est un système de contrôle d'accès basique où l'entrée est autorisée ou refusée en fonction de l'UID de la carte présentée. Cette approche n'utilise pas la mémoire interne de la carte, mais uniquement son identifiant unique, et présente donc des limites en matière de sécurité ; elle constitue néanmoins un exemple rapide.
L'approche typique est la suivante :
- Lire l'UID de la carte à l'aide des fonctions de base de la bibliothèque (PICC_IsNewCardPresent, PICC_ReadCardSerial, etc.).
- Copiez les octets de l'UID lu dans un tableau temporaire (par exemple, ActualUID).
- Définissez dans le code plusieurs tableaux contenant les UID des cartes autorisées (par exemple, User1, User2).
- Créez une fonction de comparaison de tableaux d'octets qui renvoie vrai si les deux sont identiques.
- Comparez l'UID réel avec chaque UID autorisé et, en cas de correspondance, activez une sortie numérique, affichez un message « Accès accordé » ou activez une serrure électrique.
- Si aucune de ces correspondances n'est trouvée, affichez « Accès refusé » et maintenez le système fermé.
Dans un environnement réel, un tel système est vulnérable au clonage d'étiquettes, car de nombreux lecteurs bon marché permettent la copie ou l'émulation des UID. Pour renforcer la sécurité, il faudrait utiliser la mémoire interne de la carte, des clés personnalisées et, éventuellement, des mécanismes cryptographiques plus robustes que ceux de MIFARE Classic, dont la sécurité est actuellement largement remise en question. Malgré cela, il constitue un excellent exemple pédagogique pour l'apprentissage du processus de lecture de cartes et de son intégration avec des actionneurs physiques.
Grâce à ces connaissances, vous maîtrisez désormais les concepts essentiels de la RFID, comprenez le comportement des différentes bandes de fréquences, connaissez le fonctionnement interne d'une carte MIFARE Classic 1K, savez connecter et utiliser le module RC522 avec Arduino, et avez vu en détail comment lire et écrire des blocs pour créer des systèmes concrets tels que des cartes de contrôle d'accès ou de transport . L'étape suivante consiste à combiner la RFID avec d'autres modules (écrans LCD, relais, Wi-Fi, bases de données cloud) et à apprendre à contrôler des ampoules connectées pour concevoir des solutions plus complètes, encore plus proches des systèmes professionnels que l'on retrouve quotidiennement dans les magasins, les transports en commun et les terminaux de paiement sans contact.
