{Radio Fréquence} – Contrôler les garages, les portails, et tout ce qui fonctionne en 433Mhz

 

Salut la compagnie,

 

 

Aujourd'hui, j'ai envie de vous partager un petit projet "bricolage", car ça fait un petit bout de temps que je n'en ai pas fait.
L'idée m'est venue car je souhaitais surprendre mon beau-père qui nous ouvre son portail électrique chaque fois que nous venons le voir.
Petite blague, histoire de voir sa réaction face à un portail qui s'ouvrirait et se fermerait tout seul.

Je me suis donc lancé dans un bricolage assez simpliste pour un bricoleur, mais qui vous demandera si vous n'êtes pas habitué, un peu d'organisation.

 

Rolling Code et pas rolling code

Lorsque vous utilisez la commande de votre garage, de votre portail, de votre voiture, ou encore de votre alarme un code est envoyé.

La plupart du temps, ce code est toujours le même pour chacun des boutons de votre télécommande (sauf pour les voitures) .
Cependant pour les voitures (et très probablement pour d'autres choses), il existe ce qu'on appelle un "rolling code" :
La télécommande d'ouverture de la voiture est synchronisée avec celle-ci une première fois.
Ainsi celle-ci va "apprendre" un certain nombre de codes.
100.000 codes par exemple, un chiffrement est alors mis en place sur ces codes, pour éviter que des petits malins n'essaient de brute-forcer : 1, 2, 3, .... 100, 101, 102, ... 1000, ....503935, 56789, ...
Lorsqu'un code est utilisé, il ne peut être réutilisé...

Donc dans le cas d'un "rolling code", ce sniffer est inefficace s'il est utilisé seul.
Généralement, les "voleurs" utilisent 2 boîtiers :
Un du même genre que celui que je vais vous présenter, et un "brouilleur".
Le brouilleur, va empêcher la voiture de recevoir un premier code qui sera intercepté par le premier boitier.
Pour sauver les apparences, le brouilleur se désactive dès que ce code est reçu.

 

 

Le matériel :

Alors, je tiens à dire que je ne suis pas sponsorisé, et que je vous fournis des liens à titre purement indicatif, pour que vous puissiez voir à quoi ressemblent les composants à acheter.

 

Le schéma de branchement

Ayez pitié de moi j'ai fait ça avec un logiciel de dessin, car je n'ai pas trouvé de plateforme qui recensait tous les composants dont j'avais besoin.
Ce n'est pas faute d'avoir essayé sur les plateformes :

  • https://www.tinkercad.com
  • https://www.circuito.io/
  • ... 

Voici donc le résultat :

 

 

Le bout de code

Il y aura 2 librairies à installer dans votre IDE Arduino :

  • Adafruit_SSD1306
  • RCSwitch

Je vous invite à jeter un oeil sur le net pour savoir comment les récupérer et les installer (ce n'est vraiment pas sorcier)

#include <Adafruit_SSD1306.h>
#include <RCSwitch.h>
#define OLED_Address 0x3C
static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);
Adafruit_SSD1306 oled(1);

RCSwitch receiver     = RCSwitch();
RCSwitch sender       = RCSwitch();
char **tabRecords = malloc(sizeof(char*) * 30);
char * datas          = "";
int Led               = 12;
int nbRecords         = 0;
int choicePin         = 1;
int choice            = 0;


void setup() {
  Serial.begin(9600);
  oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
  receiver.enableReceive(0); 
  sender.enableTransmit(7);
  pinMode(Led, OUTPUT);
  oled.clearDisplay();
  oled.setTextSize(0);
}


/*
*
*	Verifie que le code n'a pas deje ete enregistre
*
*/

bool isInTab(char *rec){
  for (int i = 0; i < nbRecords; i++){
      if (strcmp(tabRecords[i], rec) == 0){ 
          return true;
      }
  }
  return false;
}

/*
*
*
*	Converti une chaine de caractere binaire en
*	une valeur décimale
*
*/

unsigned long bin2dec(const char *bin)
{
  unsigned long result=0;
  for(;*bin;bin++)
  {
    if((*bin!='0')&&(*bin!='1'))
      return -1;
    result=result*2+(*bin-'0');
    if(result<=0) return -1;
  }
  return result;
}


/*
*
*	Code principale
*
*/
void loop() {
	
	/*
		Recuperation de la valeur du potentiometre
		Vu que j'ai des valeurs allant de 0 a 900 ...
		J'applique une petite formule pour n'avoir que des valeurs entre 0 et 30
		(ce qui implique que nous n'ayons que 30 enregistrements possibles de code)
	*/
    choice = (int)(ceil(analogRead(choicePin)*0.1 / 3));
	
    choice = choice >= nbRecords ? nbRecords-1 : choice;
    oled.clearDisplay();
	
	/*
	*
	*	J'affiche ici le code selectionne (s'il y en a un), et le nombre d'enregistrements
	*	interceptes
	*/
    oled.setTextColor(WHITE);
    oled.writeFillRect(0,10,128,5,BLACK);
    oled.setCursor(0,2);
    oled.println( choice < nbRecords ? "Code : " + String(bin2dec(tabRecords[choice])) : "Aucun code disponible");
    oled.setCursor(0,20);
    oled.print("Dyrk.org");
    oled.setCursor(90,20);
    oled.print(nbRecords > 0 ? choice+1 : 0);
    oled.print(" / ");
    oled.print(String(nbRecords));
    
    
    if (receiver.available() && ! isInTab(dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()))) {
      Serial.println(receiver.getReceivedValue());
      digitalWrite(Led, HIGH);
      tabRecords[nbRecords] =  malloc(sizeof(char)*30);
      strcpy (tabRecords[nbRecords],dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()));
      ++nbRecords;
      receiver.resetAvailable();
    }
	
	//Un signal est envoye en permanence, mais n'est reellement envoye que lorsque le bouton fait contact
    if (choice < nbRecords){
      sender.send(tabRecords[choice]);
    }
	
    oled.display();
}

 

 

Fonctionnement

Le fonctionnement est assez rudimentaire :
Chaque code reçu est automatiquement enregistré.
L'appareil peut enregistrer 30 codes uniques !
Ensuite, avec le potentiomètre, vous pouvez sélectionner le code que vous souhaitez envoyer.
Lorsque vous avez sélectionné un code, il vous suffit d'appuyer sur le bouton pour que celui-ci soit envoyé !

La vidéo

Bien que minimaliste, cette vidéo vous montrera l'assemblage final, que j'ai mis dans un boitier plastique. C'est assez rustique (je ne suis vraiment pas doué pour les finitions esthétiques).
Mais ça fait le job !

Bon visionnage, et pensez à vous abonner !

 

 

Conclusion

Il s'agit là d'un bricolage ludique à faire chez soi pour s'amuser, ou pour faire une blague à des amis / famille.
Je ne souhaite en aucun cas que vous ne l'utilisiez avec de mauvaises intentions, il s'agit réellement d'un outil qui pourrait s'avérer dangereux.
Je vous invite pour tous vos équipements à vous renseigner un peu plus sur la sécurité des codes émis par radio-fréquence. À l'heure actuelle, le mieux reste ce qui est fait dans le domaine de l'automobile avec le "rolling code" ... je ne dis pas que c'est "LA SOLUTION", mais que c'est ce qui est fait de mieux ...

 

 

 

{Edit}

 

Suite à plusieurs demandes de personnes m'ont dit avoir eu des difficultés à compiler, je vous joins
des infos complémentaires.

 

 

Liens :
https://github.com/sui77/rc-switch
https://github.com/adafruit/Adafruit_SSD1306

Partagez ce contenu

18 comments

  • bonjour,

    pour le dessin, tout y est dans http://fritzing.org/download/

     

  • JePrefereResterAnnonyme

    Salut, par tout hasard on ne peux pas utiliser la clé TV de l’IMSI Catcher pour récupérer le binaire ?

    • Normalement si ;)
      Une antenne TNT couvre un bon nombre de fréquence donc ça doit pouvoir le faire.
      Cela dit, je n’ai pas essayé de coupler un Arduino à une antenne TNT, donc je n’irais pas m’avancer jusqu’à dire que si tu
      souhaites passer par un Arduino c’est faisable.

  • Salut à tous !

    Les antennes TNT sont calibré sur les fréquence de la TNT soit 471 Mhz et 694 Mhz.

    Je pense qu’il est préférable de faire avec un bout de fils d’environ 15cm.

    ou bien acheter une antenne fouet 433 Mhz mais pour la bricole je pense le bout de fils fera le taff avec la puissance d’émission des télécommande on vas taper à 20-30m champ libre sans problème.

    pour info le 433Mhz (en automatisme) et voué à disparaitre qui est remplacé par que 868Mhz (en automatisme) qui sera voué à disparaitre…..

    Super petit montage en tous cas toujours agréable de te lire

    Arduino +1 !!!!

    :)

    Bonne journée à vous

  • Merci pour ce tuto :)

    Avec un hackrf One, on peut très facilement ouvrir une voiture qui fonctionne avec une clé en 433 Mhz ..

  • Impossible de compiler le code sans erreurs…

    apparement il faut aussi installer Adafruit, mais malgré cela ca passe pas :(

    peux tu donner les versions que tu utilise ?

  • Bonjour,

    J’ai trouvé votre site internet vraiment par hasard.

    Il est de très grande qualité, je vous remercie.

    Je suis retraité depuis quelques mois , je m’intéresse à Arduino (j’essaie de comprendre …)

    J’ai un portail électrique, je vais donc tenter de faire votre test !

    Pouvez-vous svp me donner la valeur du potentiomètre.

    Je vais commander ensuite le marériel.

    Je vous remercie pour tout ce travail!

  • Bonjour,

    ayant les composants sous la main je voulais essayer mais je n’arrive pas à compiler votre code. Serait-il possible de l’avoir par mail directement ?

     

    En vous remerciant.

    • Coucou Flv,

      Désolé je n’ai pas vraiment compris ta demande ?
      Le code est déjà là.
      L’envoyer par mail signifierait simplement vous renvoyer ce que tu as déjà.

      Bonne journée et bon Weekend ;)

      Dyrk

      • Bonsoir,

        arf, j’ai pourtant quelques erreurs à la compilation et j’avoue ne pas m’y connaître assez dans le domaine pour y remédier, je ne fais que des choses simplistes avec mon Arduino Mega.

         

        Voici ce que j’ai :

        C:\Users\10\Documents\Arduino\433_grab\433_grab.ino:14:27: warning: invalid conversion from 'void*' to 'char**' [-fpermissive]
        
         char **tabRecords = malloc(sizeof(char*) * 30);
        
                                   ^
        
        C:\Users\10\Documents\Arduino\433_grab\433_grab.ino:15:25: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
        
         char * datas          = "";
        
                                 ^
        
        C:\Users\10\Documents\Arduino\433_grab\433_grab.ino: In function 'void loop()':
        
        C:\Users\10\Documents\Arduino\433_grab\433_grab.ino:84:38: warning: invalid conversion from 'void*' to 'char*' [-fpermissive]
        
               tabRecords[nbRecords] =  malloc(sizeof(char)*30);
        
                                              ^
        
        C:\Users\10\AppData\Local\Temp\ccpH8Xak.ltrans1.ltrans.o: In function `main':
        
        <artificial>:(.text.startup+0x752): undefined reference to `dec2binWzerofill(unsigned long, unsigned int)'
        
        <artificial>:(.text.startup+0x7f2): undefined reference to `dec2binWzerofill(unsigned long, unsigned int)'
        
        collect2.exe: error: ld returned 1 exit status
        
        exit status 1
        Erreur de compilation pour la carte Arduino/Genuino Mega or Mega 2560

         

        Si possible de m’aider avec cela je suis preneur, autrement j’essayerais de me documenter et de creuser d’avantage.

         

        En vous remerciant.

      • Bonjour,

        J’ai beau essayer de retourner le code dans tous les sens impossible de trouver des solutions au  :

         

        warning: invalid conversion from ‘void*’ to ‘char**’ [-fpermissive]

        char **tabRecords = malloc(sizeof(char*) * 30);

        warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

        char * datas = «  »;

        warning: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]

        tabRecords[nbRecords] = malloc(sizeof(char)*30);

         

        • bonjour est ce que quelqun a réussi a compiler sens cette erreur

           

          warning: invalid conversion from ‘void*’ to ‘char**’ [-fpermissive]

          char **tabRecords = malloc(sizeof(char*) * 30);

          ~~~~~~^~~~~~~~~~~~~~~~~~~~

          warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

          char * datas = «  »;

          ^~

          ‘char* dec2binWzerofill(long unsigned int, unsigned int)’ used but never defined

          static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);

          ^~~~~~~~~~~~~~~~

          je suis a fond dans ce projet mais je bloc j’ai besoin d’aide. Mérci

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *