On a découvert plus ou moins par hasard le lecteur d'empreintes digitales GT-521F52 de ADH-Tech. Comme il est très abordable, moins d'une cinquantaine de francs, on a décidé d'en acheter un deux, histoire de voir ce qu'il était possible d'en tirer.
Présentation
Le GT-521F52 se présente sous la forme d'un PCB d'environ 36x21mm avec un gros parallélépipède en plein milieu: c'est le scanner d'empreinte proprement dit. On trouve un connecteur JST de chaque côté du PCB, celui de gauche sert à la connexion série, celui de droite sert à reprogrammer le module et offre une sortie logique qui passe à 1 lorsqu'on pose un doigt sur le capteur. Utile pour réveiller une électronique en sommeil.
Le lecteur d'empreintes GT-521F52, dessus / dessous
Ce lecteur est apparemment capable de stocker jusqu'à 3000 empreintes digitales, et il peut vous dire lorsque vous posez votre doigt de dessus si ce doigt correspond à une des empreintes stockées. Bien-sûr l'apprentissage des empreintes se fait via le même capteur.
Connexion et configuration
Il y a deux manières de connecter ce capteur
- Soit souder directement un câble USB sous le module, sur les empreintes prévues à cet effet. Ce qui devrait permettre de contrôler le module directement en USB, probablement au prix de l'installation d'un driver, la doc du fabriquant n'est pas très bavarde sur ce point.
- Soit piloter directement le module à travers son port série TTL, à l'aide par exemple d'un Yocto-Serial. Solution qu'on a bien évidement choisie.
Attention le lecteur fonctionne en 3.3V, pour éviter de l'endommager bêtement il est recommandé de configurer les tensions de fonctionnement du Yocto-Serial avant de connecter le capteur. Vous devez choisir:
- Power output voltage =3.3V
- Voltage level = TTL 3.3V
Et pendant que vous y êtes, vous pouvez définir les paramètres du port série:
- Type of protocol = Frame base binary protocol
- Baud rate and encoding = 9600 8N1
- Flow control = None
- Minimum frame interval Rx= 10ms, Tx= 10ms
- Min. interval between bytes sent = 0
Configuration du Yocto-Serial avant de le connecter au GT-521F52
Connexions électriques
Pour connecter le lecteur d'empreintes au Yocto-Serial, on a utilisé le câble recommandé qu'on a coupé en deux pour supprimer un des connecteurs. Par contre les couleurs des fils ne correspondent absolument pas à leur fonction. Il faut connecter:
Yocto-Serial | Couleur | GT-521F52 |
---|---|---|
RD | noir | Tx |
TD | rouge | Rx |
GND | bleu | GND |
pwr | jaune | Vin |
Connexion du GT-521F52 au Yocto-Serial
Pareil, mais en vrai
Utilisation
Le GT-521F52 se pilote en envoyant et en recevant des trames binaires de 12 octets. La doc est très complète, mais pas forcément très explicite. Il faut bien lire les petits caractères pour savoir dans quel ordre exact les commandes doivent être envoyées. Pour rendre l'utilisation du système plus conviviale on a écrit en Python une petite librairie qui permet de faire fonctionner les fonctions des bases du lecteur sans se casser la tête. Elle permet de
- Enregistrer une empreinte
- Effacer une ou toutes les empreintes
- Appeler un callback à chaque fois qu'une empreinte est lue
La gestion de la lecture et de la reconnaissance des empreintes tourne en arrière-plan, ainsi l'application principale peut faire ce qu'elle veut en attendant que quelqu'un pose son doigt sur le lecteur. Voici un exemple d'utilisation tout simple.
from GT521F52 import *
from yocto_api import *
from yocto_serialport import *
def eventCallback(eventType, id): #something happened
if eventType== GT521F52_fingerPrintScanner.EVENT_IDENTOK:
print("Sucessfull ID="+str(id))
if eventType== GT521F52_fingerPrintScanner.EVENT_IDENTFAILED:
print("Failed")
errmsg = YRefParam()
# Setup the API to use local USB devices
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("init error" + errmsg.value)
# assumes the GT521F52 is connected to the first serial port available
serial = YSerialPort.FirstSerialPort()
scanner = GT521F52_fingerPrintScanner(serial)
if not scanner.open(): print(scanner.lastErrorMsg)
YAPI.Sleep(100)
scanner.ledControl(True) # don't forget to turn the internal LED on!
scanner.set_eventCallback(eventCallback) # callback to call after any fingerprint scan
scanner.runInBackground() # fingerprint recognition will automatically run in background
while scanner.isBackgroundRunning():
print("\nHello, "+str(scanner.getEnrollCount())+" fingerprints are enrolled")
print("What would you like to do?")
print("1- Add new entry")
print("2- Clear All entries")
print("3- Global Thermonuclear War")
print("4- Quit")
print("")
c = input("your choice:")
if c=="1": scanner.startEnrollProcess(print)
if c=="2": scanner.deleteAll()
if c=="3": print("Wouldn't you prefer a good game of chess?")
if c=="4":
scanner.stopBackgroundRun()
while scanner.isBackgroundRunning(): time.sleep(2)
print("terminated")
Voici une rapide petite démo réalisée avec un Yocto-Buzzer.
Vous pouvez télécharger la libraire ainsi que le code d'exemple en cliquant ici .
Problèmes rencontrés
On n'a pas eu de mauvaise surprise en écrivant le code de gestion du GT-521F52, mais on a quand même rencontrés deux problèmes mineurs:
- Il faut impérativement allumer la LED interne du capteur avant de lui demander si il y a doigt posé dessous, sinon, non seulement ça ne marche pas, mais le capteur répond par un seul byte à zéro au lieu de cracher une erreur documentée.
- La reconnaissance d'une empreinte ne fonctionne pas forcement du premier coup, il faut mieux laisser faire plusieurs essais avant de crier au loup. En soi, ce n'est pas un problème: naturellement l'utilisateur va laisser son doigt sur le capteur jusqu'à ce qu'on
lui dise oui ou non.
Conclusion
Ce petit capteur GT-521F52 fonctionne remarquablement pour le scénario de base, à savoir reconnaître une empreinte. Il arrive même à reconnaître un doigt colorié au marqueur indélébile (quelqu'un a vu l'acétone?). En revanche s'agissant d'un lecteur purement optique, on doute qu'il soit capable de faire la différence entre un vrai doigt et une imitation en latex, et on ne parle même pas de faire la différence entre un doigt vivant et un doigt mort/coupé.
Maintenant il reste à lui trouver une application un peu fun. On en reparlera :-)