Badge Cloneur

Outil de test de sécurité pour badges RFID/NFC avec lecteur RC522 13,56 MHz, écran OLED et stockage local des identifiants.

DocumentéDifficulté IntermédiaireDurée 1 week-endNiveau Bases en électronique et RFID
Badge Cloneur

Le projet

Ce projet est né d'un besoin d'auditer des badges RFID/NFC dans un cadre de test. L'objectif est de construire un outil de poche basé sur un RC522 capable de lire un badge, d'en sauvegarder l'identifiant et d'afficher l'historique des lectures sur un écran OLED.

Étapes de réalisation

  1. ConceptionChoix d'un lecteur RC522 13,56 MHz piloté par un ESP32, avec un câblage SPI simple et compact.
  2. PrototypageTests de lecture sur différents types de badges, mesure de la distance de lecture effective selon l'antenne utilisée.
  3. FirmwareDéveloppement en C++ : détection automatique du type de badge, stockage des identifiants en mémoire flash, menu de navigation à l'écran OLED.
  4. AssemblagePCB deux couches intégrant le RC522, l'ESP32 et les périphériques de commande, dans un boîtier imprimé en 3D.
RFIDESP32SécuritéNFCOLED

Spécifications

MicrocontrôleurESP32-WROOM-32
Lecteur 13,56 MHzRC522
AffichageOLED 128×64
Stockage50 badges (flash)
AlimentationUSB 5 V

Brochage GPIO

RC522
SCKGPIO 18
MOSIGPIO 23
MISOGPIO 19
CS (SDA)GPIO 5
RSTGPIO 27
IRQnon connecté
microSD
CSGPIO 4
OLED
SDAGPIO 21
SCLGPIO 22
LED RGB
RGPIO 33
VGPIO 32
BGPIO 14
Bouton (mode/save)
GPIOGPIO 26

Guide pratique

Matériel nécessaire

  • Microcontrôleur : ESP32-WROOM-32
  • Lecteur 13,56 MHz : RC522
  • Affichage : OLED 128×64
  • Stockage : 50 badges (flash)
  • RC522
  • microSD
  • OLED
  • LED RGB
  • Bouton (mode/save)

Alimentation

USB 5 V

Ne dépasse jamais la tension maximale d’un composant et vérifie la compatibilité des niveaux logiques avant de raccorder.

Bibliothèques

  • SPI.h : RC522 et autres périphériques SPI
  • MFRC522.h : Lecteur RFID RC522
  • SD.h : Carte microSD
  • Wire.h : Écran OLED, communication I²C
  • Adafruit_GFX.h : Écran OLED, fonctions graphiques
  • Adafruit_SSD1306.h : Écran OLED SSD1306
  • Preferences.h : Mémoire flash de l’ESP32

Préparation

  1. Installe l’environnement Arduino adapté à la carte.
  2. Installe les bibliothèques indiquées.
  3. Vérifie le brochage et l’alimentation avant la mise sous tension.
  4. Assemble puis teste périphérique par périphérique.
  5. Charge le firmware et vérifie le démarrage.

Tests de vérification

  1. Vérifie l’alimentation et l’absence de court-circuit.
  2. Vérifie que chaque périphérique est câblé.
  3. Démarre le microcontrôleur et surveille le moniteur série.
  4. Teste la fonction principale avant de refermer le boîtier.

Dépannage

ProblèmeCause possibleSolution
Le projet ne démarre pasAlimentation, câblage ou court-circuitCoupe l’alimentation et vérifie chaque connexion.
Un périphérique n’est pas détectéGPIO, alimentation ou bus mal câbléReprends le tableau de brochage et teste le périphérique seul.
Le firmware affiche une erreurBibliothèque manquante ou mauvaise versionInstalle les bibliothèques listées et vérifie la carte sélectionnée.

Fichiers

Firmware Arduino, à ouvrir dans l'IDE. Renseigne les paramètres en haut du fichier (Wi-Fi, identifiants) avant de le téléverser.

badgeclone.inoTélécharger
/*
 * BadgeClone — Kaihatsu Lab
 * Lecteur RFID RC522 13.56MHz
 * Sauvegarde UID sur carte microSD, affichage OLED, LED RGB de statut
 */

#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Preferences.h>

#define RC522_SCK   18
#define RC522_MOSI  23
#define RC522_MISO  19
#define RC522_CS    5
#define RC522_RST   27
#define SD_CS       4
#define OLED_SDA    21
#define OLED_SCL    22
#define SCREEN_W    128
#define SCREEN_H    64
#define LED_R       33
#define LED_G       32
#define LED_B       14
#define BTN_MODE    26

MFRC522 rfid(RC522_CS, RC522_RST);
Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1);
Preferences prefs;

unsigned long btnPressStart = 0;
bool btnHeld = false;
const unsigned long LONG_PRESS_MS = 800;
String lastUID = "";
int savedCount = 0;

void setLED(bool r, bool g, bool b) {
  digitalWrite(LED_R, r ? HIGH : LOW);
  digitalWrite(LED_G, g ? HIGH : LOW);
  digitalWrite(LED_B, b ? HIGH : LOW);
}
void selectRC522() { digitalWrite(SD_CS, HIGH); digitalWrite(RC522_CS, LOW); }
void selectSD() { digitalWrite(RC522_CS, HIGH); digitalWrite(SD_CS, LOW); }
void deselectAll() { digitalWrite(RC522_CS, HIGH); digitalWrite(SD_CS, HIGH); }

void updateDisplay(String status) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Mode: 13.56 MHz");
  display.println("----------------");
  display.println(status);
  display.print("Slots: "); display.println(savedCount);
  display.display();
}

void saveUIDToSD(String uid) {
  selectSD();
  File f = SD.open("/uid_log.csv", FILE_APPEND);
  if (f) { f.println(uid); f.close(); savedCount++; }
  deselectAll();
}

void readRC522() {
  selectRC522();
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    String uid = "";
    for (byte i = 0; i < rfid.uid.size; i++) {
      if (rfid.uid.uidByte[i] < 0x10) uid += "0";
      uid += String(rfid.uid.uidByte[i], HEX);
    }
    uid.toUpperCase();
    lastUID = uid;
    setLED(false, true, false);
    updateDisplay("UID: " + uid);
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
  }
  deselectAll();
}

void handleButton() {
  bool pressed = (digitalRead(BTN_MODE) == LOW);
  if (pressed && !btnHeld) { btnHeld = true; btnPressStart = millis(); }
  else if (!pressed && btnHeld) {
    btnHeld = false;
    unsigned long held = millis() - btnPressStart;
    if (held >= LONG_PRESS_MS) {
      if (lastUID.length() > 0) {
        setLED(false, false, true);
        saveUIDToSD(lastUID);
        prefs.putString(("slot" + String(savedCount)).c_str(), lastUID);
        updateDisplay("Sauvegarde: " + lastUID);
        delay(400);
      }
    } else {
      updateDisplay("RC522 actif");
    }
    delay(150); setLED(false, false, false);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(RC522_CS, OUTPUT); pinMode(SD_CS, OUTPUT); deselectAll();
  pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT);
  setLED(false, false, false);
  pinMode(BTN_MODE, INPUT_PULLUP);
  SPI.begin(RC522_SCK, RC522_MISO, RC522_MOSI, RC522_CS);
  selectRC522(); rfid.PCD_Init(); deselectAll();
  selectSD();
  if (!SD.begin(SD_CS)) Serial.println("Erreur: carte SD non detectee");
  deselectAll();
  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println("Erreur: OLED non detecte");
  prefs.begin("badgeclone", false);
  savedCount = prefs.getInt("count", 0);
  updateDisplay("Pret");
}

void loop() {
  handleButton();
  readRC522();
}

Composants

Les guides des composants utilisés dans ce projet : câblage, code réutilisable et outils dans le navigateur.

Acheter

La boutique n'est pas encore ouverte. Les prix et dates seront annoncés par email.

Badge Cloneur — carte nue

Carte PCB nue du projet Badge Cloneur. Composants non fournis.

50 × 35 mm · 2 couches · 1.6 mm · ENIG (Immersion Or)

Bientôt

Badge Cloneur — kit

Lecteur de badges RFID/NFC 13,56 MHz (RC522) avec écran OLED et stockage local des identifiants. PCB + composants nécessaires inclus.

Bientôt

Projet suivant : Mètre Numérique — Télémètre / Surveillance

Recevoir les prochaines sorties

Un email quand un projet, un guide, un PCB ou un kit est publié. Pas de spam, désinscription à tout moment.

Être prévenu

Recevez un email quand une nouveauté est publiée.