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.

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
- ConceptionChoix d'un lecteur RC522 13,56 MHz piloté par un ESP32, avec un câblage SPI simple et compact.
- PrototypageTests de lecture sur différents types de badges, mesure de la distance de lecture effective selon l'antenne utilisée.
- FirmwareDéveloppement en C++ : détection automatique du type de badge, stockage des identifiants en mémoire flash, menu de navigation à l'écran OLED.
- AssemblagePCB deux couches intégrant le RC522, l'ESP32 et les périphériques de commande, dans un boîtier imprimé en 3D.
Spécifications
| Microcontrôleur | ESP32-WROOM-32 |
|---|---|
| Lecteur 13,56 MHz | RC522 |
| Affichage | OLED 128×64 |
| Stockage | 50 badges (flash) |
| Alimentation | USB 5 V |
Brochage GPIO
| SCK | GPIO 18 |
| MOSI | GPIO 23 |
| MISO | GPIO 19 |
| CS (SDA) | GPIO 5 |
| RST | GPIO 27 |
| IRQ | non connecté |
| CS | GPIO 4 |
| SDA | GPIO 21 |
| SCL | GPIO 22 |
| R | GPIO 33 |
| V | GPIO 32 |
| B | GPIO 14 |
| GPIO | GPIO 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 SPIMFRC522.h: Lecteur RFID RC522SD.h: Carte microSDWire.h: Écran OLED, communication I²CAdafruit_GFX.h: Écran OLED, fonctions graphiquesAdafruit_SSD1306.h: Écran OLED SSD1306Preferences.h: Mémoire flash de l’ESP32
Préparation
- Installe l’environnement Arduino adapté à la carte.
- Installe les bibliothèques indiquées.
- Vérifie le brochage et l’alimentation avant la mise sous tension.
- Assemble puis teste périphérique par périphérique.
- Charge le firmware et vérifie le démarrage.
Tests de vérification
- Vérifie l’alimentation et l’absence de court-circuit.
- Vérifie que chaque périphérique est câblé.
- Démarre le microcontrôleur et surveille le moniteur série.
- Teste la fonction principale avant de refermer le boîtier.
Dépannage
| Problème | Cause possible | Solution |
|---|---|---|
| Le projet ne démarre pas | Alimentation, câblage ou court-circuit | Coupe 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 erreur | Bibliothèque manquante ou mauvaise version | Installe 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 — 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.
OLED Studio
Écran OLED SSD1306
Écran OLED monochrome 128×64, en I²C ou SPI. Éditeur de pixels, conversion image → C et yeux animés.
Utilisé dans : Badge Cloneur, Mètre Numérique, Mini Arcade
Ouvrir le guide →RFID Lab
Lecteur RFID RC522
Lecteur RFID/NFC 13,56 MHz en SPI : badge virtuel, formateur d'UID et générateur de code d'accès.
Utilisé dans : Badge Cloneur
Ouvrir le guide →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)
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.
Projet suivant : Mètre Numérique — Télémètre / Surveillance