Table des matières

Boîte secrète RFID

Youhouu !!! Enfin un coffre fort technologique !!!

Intro

Tout est parti d'une histoire de tire-bouchon que l'on voulait conserver sans se le faire piquer au boulot. Au lieu de le cacher au fond d'un placard, j'ai décidé de créer une boîte que seuls certains salariés pourraient ouvrir (mouahahaha).

Cette boîte fonctionne soit sur piles, pour être portable, soit branchée en USB, ce qui est sympa pour garder une sorte de log en serial :

Le principe : la boîte attend un tag RFID, s'il y en a un elle l'affiche en “Serial”, si il est répertorié la boîte s'ouvre, sinon, elle envoie un message de refus.


Conception

Deux boîtes ont été découpées, une petite pleine pour former le couvercle afin d’accueillir électronique, et une grande ouverte, pour les objets à cacher.

Elle mesure en tout, environ 300x200x200 mm.

Il y a deux charnières pour tenir le couvercle, ainsi que deux plus petites servant à accéder à l’intérieur du couvercle quand la boîte est ouverte.

On y trouve un écran de type 1602 bleu en I2C, ainsi qu'un buzzer pour les informations

C'est un servomoteur de type MG996R qui sert de loquet; quand elle est alimentée, la boîte est impossible à forcer.

Voici l’intérieur du couvercle au début du projet :

Et l’intérieur une fois la boîte installée :

(Plus de photos en bas)


Explication du code

Je ne vais pas partager tout le code car il est très long mais je vais vous en donner des morceaux :

Voici l'init :

         #include <SPI.h>
         #include <RFID.h>
         #include <Servo.h>
         #include <Wire.h> 
         #include <LiquidCrystal_I2C.h>
         const char LedRouge = 2;
         const char LedVerte = 3;
         char buzzer = 7;
         Servo servo;
         LiquidCrystal_I2C lcd(0x3F, 16, 2);
         RFID monModuleRFID(10,9);
         int UID[5]={};

Le setup…

         void setup()
         {
           Serial.begin(9600);
           servo.attach(5,771,1789);
           servo.write(65);
           SPI.begin(         );
           monModuleRFID.init();  
           pinMode(LedRouge, OUTPUT);
           pinMode(LedVerte, OUTPUT);
           digitalWrite(LedRouge, LOW);
           digitalWrite(LedVerte, LOW);
           lcd.begin();
           lcd.setCursor(16, 0);
           lcd.print("Declinez votre ");
           lcd.setCursor(16, 1);
           lcd.print("   identite");
           for (int positionCounter = 0; positionCounter < 15; positionCounter++) 
           {
           lcd.scrollDisplayLeft();
           delay(150);
           }
           delay(3000);      
           for (int positionCounter = 0; positionCounter < 15; positionCounter++)
           {
           lcd.scrollDisplayLeft();
           delay(150);
           }
           lcd.clear();
           lcd.noBacklight();
           lcd.display();
           Serial.println("La boite est allumee. Qui donc l'a ouverte ?");
           }

Voici maintenant l'idée de la boucle, qui n'est pas le code actuel mais qui donne un bon aperçu :

 int ANTOINE[5]={255,255,255,255,255}; 
 void loop(){
    if (monModuleRFID.isCard())                 
    {  
       if (monModuleRFID.readCardSerial())
       {        
       for(int i=0;i<=4;i++)
          {
          UID[i]=monModuleRFID.serNum[i];
          Serial.print(UID[i],DEC);
          Serial.print(". ");
          }
        }
        
        if (UID[0] == ANTOINE[0]
         && UID[1] == ANTOINE[1]
         && UID[2] == ANTOINE[2]
         && UID[3] == ANTOINE[3]
         && UID[4] == ANTOINE[4])
        {
            digitalWrite(LedVerte, HIGH);              
            servo.write(90);
            lcd.backlight();
            lcd.setCursor(16, 0);
            lcd.print("Bienvenue,");
            lcd.setCursor(16, 1);
            lcd.print("Antoine");
            Serial.println("Antoine a ouvert la boite");
            tone(buzzer, 880, 50);
            delay(150);
            tone(buzzer, 880, 50);
            delay(150);
            tone(buzzer, 880, 50);
            delay(150);
            for (int positionCounter = 0; positionCounter < 16; positionCounter++)
            {
            lcd.scrollDisplayLeft();
            delay(150);
            }
            delay(3000);      
            for (int positionCounter = 0; positionCounter < 16; positionCounter++) 
            {
            lcd.scrollDisplayLeft();
            delay(150);
            }
            servo.write(65);
            lcd.clear();
            lcd.noBacklight();
            digitalWrite(LedVerte, LOW);
            }

En gros, on cherche un tag RFID, s'il y en a un, on l'imprime en serial, et si il correspond à la masterkey enregistrée (UID[n] == ANTOINE[n]), on fait le nécessaire pour ouvrir la boîte : le servo ouvre la boîte, l'écran affiche “Bienvenue, (“nom de la personne”)” et fait défiler le texte, le buzzer indique l'ouverture, puis au bout de quelques secondes la boîte se referme et se met en veille, en attendant un autre tag.

Si le tag ne correspond à aucune masterkey enregistrée, voici les quelques lignes qui refusent l'accès à la boîte :

            {
            digitalWrite(LedRouge, HIGH);
            lcd.backlight();
            lcd.setCursor(1,0);
            lcd.print("!ACCES REFUSE!");
            Serial.println("Quelqu'un d'inconnu ou de malveillant a tente d'ouvrir la boite !!");
            tone(buzzer, 380, 100);
            delay(250);
            tone(buzzer, 380, 100);
            delay(250);
            tone(buzzer, 380, 100);
            delay(5000);
            digitalWrite(LedRouge, LOW);
            lcd.clear();
            lcd.noBacklight();
            }

Difficultés rencontrées

La principale difficulté a été rencontrée avec l'alimentation de la boîte. Sur pile 9V, elle fonctionne très bien, mais consomme quand même beaucoup d'énergie. Au bout de 48h la pile est vide et la boîte ne supporte pas un trop faible ampérage. Elle fonctionne cependant parfaitement sur secteur. Je réfléchis à lui offrir une batterie au lithium, mais elle n'a pas besoin d'être beaucoup bougée, donc je me contente pour l'instant de cette alimentation. Aucun bug au bout de 10 jours d'installation en tout cas.


Suites du projet

La boîte est améliorable par de nombreuses manières. Dans un premier temps, le code est loin d'être parfait et j'essaie de le rendre meilleur. Dans un second temps j'aimerais créer un vrai système de log indépendant de la liaison série, comprenant la date et l'heure du passage du badge. Enfin, j'aimerais remplacer le lecteur RFID par un lecteur RFID+NFC afin d'élargir le système d'ouverture.


Conclusion

J'ai les trois quarts de la radio à dos parce que très peu de personnes ont accès à la boîte, mouahahaha !

Et le tire-bouchon est en sécurité, c'était quand même le principal objectif de cette construction. Ouf !!!


Photos