lundi 17 avril 2017

Module RFID RC522 et Raspberry Pi (Python)


Cet article a été mis à jour le 30 décembre 2020, afin d'assurer la compatibilité avec Python 3.

Pour la quatrième fois depuis le début du mois, je vous propose de lire le numéro de série d'un tag RFID au moyen d'un module RC522.  Cette fois, c'est un Raspberry Pi qui aura l'honneur de piloter notre module RC522, grâce à un script rédigé en Python (les articles précédents mettaient plutôt en scène un Arduino, un MSP430 Launchpad et un STM32 Nucleo).

Si vous n'êtes pas déjà l'heureux propriétaire d'un module RC522, des commerçants chinois se feront un plaisir de vous en vendre un (accompagné d'un ou deux tags RFID) pour moins de 2 euros.


Activation de SPI sur le Rasbperry Pi

Le module RC522 utilise le protocole de communication SPI.  Vous devez donc vous assurer que le SPI est activé sur votre Raspberry Pi.  Pour ce faire, vous choisissez "Configuration du Raspberry Pi" dans le menu "Préférences"...


...et vous vous assurez que SPI est activé.



Installation de la bibliothèque pi-rc522

Nous utiliserons la bibliothèque pi-rc522 par ondryaso.  Pour ce faire, la façon la plus simple (à mon avis), est d'utiliser pip:

sudo pip3 install pi-rc522


Circuit (connexions)

Les connexions à effectuer sont:
  • Broche SDA du RC522 --- Broche #24 (GPIO 8) du Raspberry Pi
  • Broche SCK du RC522 --- Broche #23 (GPIO 11) du Raspberry Pi
  • Broche MOSI du RC522 --- Broche #19 (GPIO 10) du Raspberry Pi
  • Broche MISO du RC522 --- Broche #21 (GPIO 9) du Rasbperry Pi
  • Broche IRQ du RC522 --- Broche#18 (GPIO 24) du Raspberry Pi
  • Broche GND du RC522 --- Une des Broche GND du Raspberry Pi
  • Broche RST du RC522 --- Broche #22 (GPIO 25) du Raspberry Pi
  • Broche 3V3 du RC522 --- Broche 3V3 du Raspberry Pi
  • LED verte (et résistance) --- Broche #15 (GPIO 22) du Raspberry Pi
  • LED rouge (et résistance) --- Broche #16 (GPIO 23) du Rasbperry Pi



Script pour récupérer l'UID

Voici un premier script en Python qui affiche  dans le terminal l'UID (numéro de série) d'un tag RFID qu'on approche du module RC522.




Sur la capture d'écran ci-dessus, vous pouvez constater que l'UID de la carte que j'ai utilisée est constituée des valeurs 144, 207, 148, 117 et 190.  Ces nombres seront utilisés dans le prochain script.


Script qui accepte ou rejette l'UID

L'idée est d'accomplir une action seulement si l'utilisateur présente un tag RFID dont l'UID est approuvé.  Avec ce script en Python, la LED verte s'allume uniquement lorsqu'on approche un tag RFID portant le bon UID.  Si on approche un tag RFID portant un autre UID, c'est la LED rouge qui s'allume.

Avant d'utiliser le script, n'oubliez pas de remplacer le contenu de la variable "bonUID" par l'UID de votre carte.

Vous pourrez ensuite modifier ce script de base pour en faire quelque chose de plus utile ou plus spectaculaire (actionner une serrure, mettre à jour une base de donnée consignant l'heure d'entrée et sortie des employés, etc.).



Yves Pelletier   (TwitterFacebook)

13 commentaires:

  1. Bonjour,

    En python 2.7 cela fonctionne bien mais en python 3 il y a une erreur sur l'import du module "pirc522".
    Tu aurais une idée ?
    Estelle

    RépondreSupprimer
  2. Bonjour Estelle,
    je rencontre la même difficulté et je souhaite utiliser le python 3, aurais-tu trouver la solution ?
    Merci
    Martin C

    RépondreSupprimer
  3. Vous pouvez tester un:
    sudo pip3 install pi-rc522

    RépondreSupprimer
  4. Bonjour, chez moi ça fonctionne pas et il m'indique:
    /usr/local/lib/python2.7/dist-packages/pi_rc522-2.2.1-py2.7.egg/pirc522/rfid.py:78: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    quelqu’un a une idée ?

    RépondreSupprimer
  5. Je rectifie, j'ai fait un reset et ça fonctionne, merci pour le tuto.

    RépondreSupprimer
    Réponses
    1. Bonjour, pouvez vous me dire quel genre de reset vous avez effectué ? J'ai le même message d'erreur que vous et je suis coincée.
      Merci par avance !

      Supprimer
  6. Bonjour, tout fonctionne aussi avec Raspberry Zero, quelqu'un peut me dire comme je peux modifier le code pour lire plusieurs cartes ou tags pour rfid2.py ?
    Merci en avance.

    RépondreSupprimer
  7. X1 = [240,156,175,73,138] # Badge rond
    x2 = [17,254,36,217] # Badge bleu
    (error, data) = rdr.request()
    if not error:
    print("\nDetected: " + format(data, "02x"))

    (error, uid) = rdr.anticoll()
    if not error:
    print("Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
    for i in range(0,4):
    if uid[i] != x1[i]:
    refus = refus + 1
    if uid[i] != x2[i]:
    refus1 = refus1 + 1
    if ((refus == 0) and (refus1 != 0)):
    x1_OK = 1
    elif ((refus1 == 0) and (refus != 0)):
    x2_OK = 1
    elif ((refus1 != 0) and (refus != 0)):
    x1_OK = 0
    x2_OK = 0

    RépondreSupprimer
  8. Intéressant, moi qui envisageait de bidouiller la chatière à puce RFID pour logger (via ma solution domotique) quand le matou y passe... si je peux éviter de la charcuter (et perdre la garantie) avec ce type de module pas cher, ça me va!

    Néanmoins, avec une antenne qui parait petite, avez vous une idée de la portée? Celle de la chatière est intégrée en haut d'un tunnel d'entrée (ces puces remplaçant désormais le tatouage sont généralement placées sur le côté/haut du cou du chat) et, même si noyée dans le plastique je ne la voit pas, probable que la surface bobinée soit assez importante.

    Au pire, vu le coût dérisoire, je peux toujours tester et charcuter la chatière si cela ne fonctionne pas. Ce qui permettrait d'ailleurs d'avoir 2 infos car elle combine un PIR et la lecture RFID (pour que les chats du quartier ne puissent entrer). Sans doute pour n'alimenter le recepteur que quand c'est utile afin de préserver les piles (il y a qq années, ce n'était pas le cas et posait des pb de conso; sachant que l'alim externe pose pb, car elle pollue les fréquences RFID si à découpage, même bien filtrée).

    RépondreSupprimer
  9. Bonjour,

    j'ai suivis votre tuto, quand j'ai essayé d’exécuter le programme de lecture , j'ai eu cette erreur :

    self.spi.open(bus, device)
    FileNotFoundError: [Errno 2] No such file or directory


    Donc pouvez vous m'aider s'il vous plait ?

    Merci

    RépondreSupprimer