Utiliser un lecteur d’empreinte digitale avec le Raspberry Pi.

Photo d'un lecteur R307 connecté à un Raspberry Pi Zéro

Jusque là réservés à Hollywood et aux entreprises les plus sécurisées, ces dernières années les lecteurs d’empreinte ont débarqué dans notre vie quotidienne via nos smartphones, et l’intérêt porté par l’industrie à ces capteurs les rend aujourd’hui accessibles à tout un chacun.

Dans ce tutoriel nous allons voir comment nous pouvons utiliser un lecteur d’empreinte digitale, ici le modèle R307 de l’entreprise GROW, avec le Raspberry Pi.

Le but sera donc de connecter le lecteur d’empreinte R307 au Raspberry Pi afin de pouvoir vérifier l’identité d’une personne via son empreinte digitale, et de déclencher un programme en cas de reconnaissance de l’empreinte, ceci afin de vous permettre, par exemple, de créer un système d’authentification, ou de porte sécurisée !

Le matériel nécessaire pour utiliser un lecteur d’empreinte digitale avec le Raspberry Pi.

Avant de passer à la suite, faisons la liste du matériel qui vous sera nécessaire pour créer votre lecteur d’empreinte digitale à base de Raspberry Pi. Vous aurez donc besoin du matériel suivant :

À noter qu’il s’agit ici uniquement du matériel pour la partie lecteur d’empreinte, si vous souhaitez par exemple utiliser ce lecteur pour créer un système de porte connectée, alors vous aurez besoin du matériel adapté pour cette autre partie, comme un relais 12V, un verrou électronique, une alimentation électrique 12v.

Pourquoi avoir choisi un lecteur d’empreinte digitale optique et plus spécialement le modèle R307 ?

Cet article fait directement suite à deux articles théoriques sur la lecture d’empreinte digitale. Le premier article s’intéressant à comment fonctionne un lecteur d’empreinte, et le second à comment fonctionne l’analyse et la reconnaissance d’empreintes digitales. Si le sujet vous intéresse et que vous souhaitez comprendre au mieux le fonctionnement d’un lecteur d’empreinte, nous vous conseillons de commencer par lire ces deux articles.

Avec les différentes technologies disponibles, pourquoi avons-nous choisis d’utiliser un lecteur d’empreinte optique, et pourquoi spécialement le R307 de GROW ?

Photo d'un lecteur d'empreinte R307
Le lecteur d’empreintes R307 est un lecteur optique simple à utiliser.

Si nous avons choisis un lecteur d’empreinte optique, c’est parce que ce type de lecteur nous semble convenir à un plus large éventail de situations.

Ce type de capteur, de par sa conception, ne nécessite pas de contact direct entre le doigt et le capteur électronique. Il est donc globalement possible d’isoler totalement la partie électronique de l’environnement, et de ne laisser exposé que la plaque de verre, laquelle ne craint aucune intempérie et pourra facilement être nettoyée en cas de pluie, éclaboussures, etc, voir pourquoi pas remplacée en cas de dommages plus importants.

Ce type de capteur est également moins sensible aux problèmes d’empreintes « sales », et notamment aux problèmes d’humidité (doigt mouillé en cas de pluie, transpiration en cas de températures élevées comme en ce moment, etc.).

Quand au choix du module R307 plutôt qu’un autre, ce sont les facteurs suivants qui ont motivé notre choix : le module est trouvable très facilement et pour un prix abordable ; le module est bien documenté par le fabricant (vous trouverez la documentation ici) ; il est directement compatible avec le Raspberry Pi ; le R307 supporte le stockage des empreintes digitales et leur vérification en interne, idéal pour une utilisation simplifiée ; il supporte aussi la récupération des empreintes brutes, idéal pour une utilisation avancée ; il existe une bibliothèque Python open-source pour interagir avec le module.

Comment connecter le lecteur d’empreinte digitale R307 au Raspberry Pi.

Quand vous touchez au port GPIO du Raspberry Pi, pensez toujours à débrancher le Raspberry avant toute manipulation, un court circuit est vite arrivé !

La première étape de ce tutoriel va être de connecter notre lecteur d’empreintes digitales au Raspberry Pi, et pour cela nous allons commencer par consulter la documentation fournie par le constructeur, le « datasheet », et particulièrement ce que l’on appelle le « pinout », c’est-à-dire la position et l’ordre des différents connecteurs.

Diagramme du circuit comparé à une photo du circuit réel.
À gauche le schéma fournis par le constructeur, à droite une image du circuit à l’arrière du lecteur.

En lisant un peu la documentation et en observant ce schéma, on se rend rapidement compte de deux choses. Premièrement que le lecteur communique via une connexion de type « serial », comme l’indique notamment la présence d’un port TXD (Transmit Data) et RXD (Receive Data). Deuxièmement que le module peut être alimenté soit en 5V, soit en 3.3V.

Le Raspberry Pi dispose à la fois de ports 3.3V et 5V, dans notre cas nous allons faire le choix d’alimenter le lecteur en 5V.

Nous allons donc brancher le module de la façon suivante :

Lecteur R307Raspberry Pi (numérotation physique)
Pin 1 – 5VPin 2 – 5V
Pin 2 – GNDPin 6 – GND
Pin 3 – TXDPin 10 – UART0 RXD
Pin 4 – RXDPin 8 – UART0 TXD
Pin 5 – TOUCHNon connecté
Pin 6 – 3.3VNon connecté
Tableau de connexion entre les ports du lecteur R307 et ceux du Raspberry Pi.

Dans la pratique faire le branchement peut être un peu plus compliqué que prévu. En effet, le module utilise un connecteur micro JST avec un pas beaucoup plus petit que les connecteurs 1.27mm que nous utilisons d’habitude. Par défaut le module est souvent fourni par les vendeurs avec un connecteur JST femelle d’un côté et des câbles sans connecteur de l’autre côté. Vous allez donc devoir ajouter des ports GPIO pour pouvoir connecter le module à votre Raspberry.

L’idéal est d’utiliser une pince à sertir pour les connecteur JST et GPIO, ce qui permet alors d’ajouter proprement un connecteur au pas 1.27mm au bout des fils du connecteur de base.

Si vous ne possédez pas ce type de matériel, pas de panique, vous pouvez toujours couper un câble Dupont femelle, et utiliser un fer à souder pour le raccorder au câble de base. Si vous en avez, n’hésitez pas à ajouter un bout de gaine thermorétractable pour protéger la soudure des contacts électriques involontaires. À défaut, un bout de scotch est déjà une première protection.

Schéma de branchement du Pi Zero au lecteur d'empreintes R307
La couleur des fils correspond chez moi à ceux fournis avec le module, il est possible que cela varie selon les fournisseurs.

Installer les librairies Python pour le lecteur d’empreinte R307 et configurer le Raspberry Pi.

Maintenant que nous avons branché le lecteur d’empreinte, et avant de passer au code pour utiliser le lecteur d’empreinte, nous allons devoir installer les librairies Python utilisées pour contrôler le lecteur d’empreinte digitale, ainsi que configurer le Raspberry Pi pour activer le port série.

Nous allons donc commencer par mettre à jour la liste des dépôts et nous assurer que Python3 et PIP3 soient installés sur le Raspberry Pi. Pour cela, lancez simplement la commande ci-dessous et attendez la fin :

sudo apt update -y && sudo apt install -y python3 python3-pip

Installer la librairie PyFingerprint pour contrôler le lecteur R307

Pour contrôler le lecteur d’empreinte digitale, nous allons utiliser une librairie développée par Bastian Raschke (merci à lui). Et comme Python est un langage merveilleux, il nous suffit pour cela d’utiliser PIP, le gestionnaire de paquets de Python, en lançant la commande ci-dessous :

sudo pip3 install pyfingerprint

Activer le port série du Raspberry Pi

Dernière étape avant de passer au code, nous devons activer le port série du Raspberry Pi afin de pouvoir communiquer avec le lecteur d’empreinte. En effet, par défaut le port série est désactivé, et sur les modèles les plus récents il est potentiellement employé pour la communication bluetooth.

Pour commencer nous allons ajouter l’utilisateur actuel à la liste des utilisateurs ayant le droit d’utiliser le port série. Pour cela, lancez la commande ci-dessous :

sudo usermod -a -G dialout $(whoami)

Ensuite, nous pouvons activer le port série, pour cela je vous renvoie à notre tutoriel pour activer le port série du Raspberry Pi.

Si vous ne l’avez pas fait, redémarrer le Raspberry Pi pour vous assurer que toutes les modifications ont été prises en compte.

Nous allons maintenant pouvoir passer à la dernière étape, le code !

Le code pour enregistrer, vérifier et extraire une empreinte digitale avec le R307.

Pour la dernière étape de ce tutoriel, nous allons réaliser quatre programmes qui vous permettrons d’enregistrer une nouvelle empreinte dans la mémoire du lecteur, de supprimer une empreinte de la mémoire du lecteur, de lire une empreinte digitale et de vérifier si elle correspond à une empreinte stockée dans le lecteur, et enfin de prendre et de télécharger la photo d’une empreinte.

Photo du lecteur avec les LEDs activées.
Quand le lecteur cherche à lire une empreinte les LEDs bleues s’allument.

Ces quatre programmes sont relativement simples, mais suffisamment fonctionnels pour pouvoir être utilisés tels quels, notamment grâce à l’appel automatique vers des scripts externes. Vous pouvez bien évidemment les modifier pour les adapter à vos besoins.

Nous n’allons pas nous attarder sur le code lui même, d’abord parce que ce serait très long, ensuite parce qu’il nous semble assez simple et assez largement commenté pour être compris par toute personne sachant un minimum développer en Python. Si vous ne connaissez pas Python et que vous souhaitez apprendre les bases rapidement, je vous invite à consulter notre cours pour apprendre les bases de Python.

L’ensemble du code est disponible ici sur notre GitHub, pour l’installer il vous suffit donc de le télécharger et de le décompresser. Vous pouvez le faire manuellement, ou bien directement via la ligne de commande ci-dessous :

wget https://github.com/RaspbianFrance/raspberry-pi-fingerprint-r307/archive/refs/heads/main.zip -O ~/fingerprint.zip && unzip ~/fingerprint.zip -d ~/fingerprint && rm ~/fingerprint.zip && cd ~/fingerprint

Enregistrer une nouvelle empreinte digitale dans la mémoire du lecteur.

Comme nous l’avons dit au début de cet article, le R307 possède une mémoire interne qui lui permet de stocker une empreinte digitale (en fait un template de l’empreinte, voir notre article sur le traitement des empreintes digitales).

Si cette solution n’est pas forcément la plus adaptée dans le cadre d’un grand nombre d’utilisateurs, c’est en revanche une solution très simple à mettre en place et très adaptée pour une utilisation à plus petite échelle.

Pour enregistrer une nouvelle empreinte, il vous suffit de lancer le script enroll.py, il vous sera alors demandé de placer votre doigt sur le lecteur d’empreinte, ceci deux fois de suite pour assurer une bonne qualité de l’image enregistrée.

Supprimer une empreinte de la mémoire interne du lecteur.

La mémoire interne du R307 permet le stockage de 1000 empreintes, à priori vous devriez donc avoir de quoi voir venir. Néanmoins, vous pouvez avoir besoin de supprimer des empreintes digitales du module, par exemple pour révoquer l’accès d’une personne.

Pour cela, vous pouvez lancer le script delete.py, qui vous demandera le numéro de l’empreinte à supprimer.

Rechercher et vérifier si une empreinte digitale correspond à une empreinte sauvegardée.

C’est probablement la fonctionnalité qui vous intéresse le plus, lire une empreinte et vérifier si elle correspond à une empreinte déjà enregistrée dans le système. Comme nous l’expliquons dans notre article sur le traitement, l’analyse et de la recherche d’empreintes digitales, sachez qu’une empreinte digitale n’est jamais reconnue de façon parfaite, comme l’est par exemple un mot de passe, mais plutôt avec un score de correspondance plus ou moins haut.

Correspondance de point clé d'une empreinte.
La reconnaissance d’une empreinte n’est pas juste une comparaison parfaite, mais bien une détection de similitudes.

Pour cela, vous pouvez lancer le script verify.py. Contrairement aux autres scripts qui se lancent une seule fois, ce script continuera de tourner dans une boucle infinie jusqu’à ce que vous l’arrêtiez manuellement en faisant Ctrl + C.

À chaque tour de boucle, le script vous demandera de placer un doigt sur le lecteur, et attendra jusqu’à détecter une empreinte. Une fois que le script aura capturé une empreinte, il va chercher parmi toutes les empreintes déjà enregistrées dans le lecteur si l’une d’elle correspond à la nouvelle empreinte.

Si aucune empreinte ne correspond, que l’empreinte est trop sale, etc., le programme déclenchera alors le script on_match_failed.sh situé dans le même dossier que le programme de base.

À l’inverse, si une empreinte correspondante est trouvée, le programme déclenchera alors le script on_match_success.sh et lui passera deux paramètres :

  • Le premier paramètre sera la position dans la mémoire interne de l’empreinte correspondante.
  • Le second paramètre sera le score de confiance dans l’empreinte. Plus ce score est élevé, plus la confiance est forte.

Il vous suffit donc de modifier les script bash pour déclencher l’événement de votre choix selon qu’une empreinte a été reconnue ou non !

Télécharger la photo brute d’une empreinte

Si vous envisagez de créer un système dans lequel des photos brutes d’empreintes sont échangées et stockées, je vous encourage fortement à lire notre article sur le traitement des empreintes digitales, et particulièrement le chapitre traitant des risques liés au stockage de ce type de données. Une empreinte brute qui fuite, ce n’est pas comme un mot de passe, ça ne peut pas se changer !

Un des intérêts du R307 c’est qu’il permet de récupérer la photo brute d’une empreinte, telle que capturée par le lecteur.

Capture d'écran YouTube d'une empreinte.
Un bon exemple de chose à ne pas faire, poster une photo brute de son index sur Youtube…

Si cela a peu d’intérêt pour les usages les plus simples, cela permet en revanche de créer des systèmes plus complexes dans lesquels il est possible de centraliser les images pour les faire analyser par un autre logiciel que celui du lecteur, ou encore pour créer un système de synchronisation permettant de gérer une flotte complète de lecteurs.

Pour lire une empreinte digitale et sauvegarder sa photo, vous pouvez utiliser le script download_image.py en lui passant en paramètre le nom du fichier dans lequel sauvegarder l’empreinte. Le fichier généré sera une image au format BMP.

Conclusion

Vous savez désormais comment utiliser un lecteur d’empreinte digitale avec votre Raspberry Pi.

Il ne vous reste plus qu’à intégrer ce lecteur à vos projets. Pour cela il vous suffit de modifier les scripts on_match_success.sh et on_match_failed.sh pour déclencher les actions de votre choix, ou bien vous inspirer de ce code de base pour créer un système plus complexe !

Lire l'article complet : Utiliser un lecteur d’empreinte digitale avec le Raspberry Pi.

Vus : 149
Publié par RaspbianFrance : 123