Proyecto Electronico .com
Diseños con leds, alarmas, compuertas lógicas, antenas y proyectos de electrónica en general
ZFM-206SA ZFM-201SA conectado a raspberry pi o pc serial.
Llamo módulo ZFM20 a cualquiera de la serie, aunque puede ser ZFM-201SA o ZFM-206SA
Esta es la experiencia utilizando el módulo de la serie ZFM20, debido a la necesidad de un compañero de conectar dicho módulo a su Raspberry Pi utilizando el lenguaje Python, como no tenía una conecté el ZFM20 a mi computadora personal (PC)
No soy experto en programación, pero conozco algo de lenguajes como C y ensamblador, esta fué mi primera experiencia con Python.
El módulo ZFM20 funciona mejor con 5 Voltios, para alimentarlo utilizo un transformador de 9 voltios AC y un regulador 7805, además aprovecho para tomar un voltaje negativo necesario para el puerto RS-232 de la PC.
Para adaptar el módulo con la computadora construí un adaptador de TTL a RS232 simple, con dos transistores y me funcionó perfectamente:
El modulo de identificación de huellas dactilares ZFM20 utiliza comunicación serial asincrónica, semiduplex.
La velocidad de comunicación por defecto es de 57600bps, siendo ajustable de 9600 a 115200bps, aunque al principio es algo dificil, y podemos hacer nuestras pruebas a 57600bps.
El formato de la trama es de 10 bits, 1 bit de inicio, 8 bits de datos y un bit de parada (no bit de verificación).
En Linux (Ubuntu) cuando el puerto está correctamente configurado :
baudrate=57600, bytesize=8,# parity="N", stopbits=1
El paquete de instrucciones es una cadena de 12 o más bytes.
Es enviado en el siguiente orden:
Header | Address | Package identifier | Package length | Package contents | Checksum |
---|---|---|---|---|---|
2 bytes | 4 bytes | 1 byte | 2 bytes | Variable | 2 bytes |
Para verificar que hay comunicación utilizamos la instrucción llamada handshake (0x17)
Donde Instruction code y Control code conforman Package contents
Y asumimos que Address utiliza el valor por defecto 0xFFFFFFFF.
2 bytes | 4 bytes | 1 byte | 2 bytes | 1 byte | 1 byte | 2 bytes |
Header | Address | Package identifier | Package length | Instruction code | Control code | Checksum |
0xEF01 | 0xFFFFFFFF | 0x01 | 0x0004 | 0x17 | 0x00 | 0x001C |
La respuesta correcta de comunicación sera esta:
2 bytes | 4 bytes | 1 byte | 2 bytes | 1 byte | 2 bytes |
Header | Address | Package identifier | Package length | Confirmation code | Checksum |
0xEF01 | 0xFFFFFFFF | 0x07 | 0x0003 | 0x00 | 0x000A |
Confirmation code es 0x00 cuando la comunicación es correcta,
y es 0x01 cuando hubo error en el paquete o 0x1D cuando hay error del puerto.
Puede devolver 0x21 cuando se ha utilizado la instrucción SetPwd (0x12) y no se ha verificado el password (VfyPwd 0x13).
Aunque por lo general si el error es por Address erroneo o puerto no accesible lo que ocurre es que no obtenemos respuesta alguna.
Vamos a probar con el módulo de Python pySerial. http://pyserial.sourceforge.net/
Utilizando Ubuntu 12.04 y Python 2.7.3
#!/usr/bin/python
#
import serial
ser = serial.Serial('/dev/ttyS0', 57600, timeout=2)
print ser # Despliega datos del puerto serial
ser.write(chr(0xEF)) # header_highbits
ser.write(chr(0x01)) # header_lowbits
ser.write(chr(0xFF)) # byte addr 1 H
ser.write(chr(0xFF)) # byte addr 2
ser.write(chr(0xFF)) # byte addr 3
ser.write(chr(0xFF)) # byte addr 4 L
ser.write(chr(0x01)) # Package identifier
ser.write(chr(0)) # length_highbits
ser.write(chr(0x04)) # length_lowbits
ser.write(chr(0x17)) # Instruction code
ser.write(chr(0)) # Control code
ser.write(chr(0)) # checksum_highbits
ser.write(chr(0x001C)) # checksum_lowbits
print "\nRespuesta de ZFM20xx\n"
cadena = ser.read(12) # leer 12 bytes (espera=timeout)
for i in range(12):
print(hex(ord(cadena[i]))),
ser.close() # cierra puerto serial
raw_input("\n Presione Enter para salir")
>>from zfm20 import *
>>ser.isOpen()
>>handshake(0xFFFFFFFF)
>>getRandomCode(0xFFFFFFFF)
>>VfyPwd(0xFFFFFFFF,0)
>>cerrar_puerto()
>>exit()
#!/usr/bin/python
from zfm20 import *
def capturar_huella(address = 0xFFFFFFFF,buffer_id= 2):
print "\n Intentando leer Huella: "
err = genImg(address)
if err == 0:
error = img2Tz(0xFFFFFFFF,buffer_id) # img2Tz(address,buffer_id)
if err == 0:
print "img2Tz conversion correcta"
return 0
else:
print "\n img2Tz Error de conversion " + (hex(err))
return -1
else:
print "genImg error" + hex(err)
return -1
### fin capturar_huella() ###
def guardar_nueva_huella(address = 0xFFFFFFFF,pagina = 0x0003):
leer_sino = raw_input("\n\n Leer huella 1-? s/n ")
if leer_sino == "s":
capturar_huella(0xFFFFFFFF,2) # address=0xFFFFFFFF,buffer_id=1 o 2)
else:
print "pasar, salir"
return -1
leer_sino = raw_input("\n\n Leer huella de nuevo ? s/n ")
if leer_sino == "s":
capturar_huella(0xFFFFFFFF,1) # address=0xFFFFFFFF,buffer_id=1 o 2)
err,score = match(0xFFFFFFFF)
if err == 0:
print " Huellas SI coinciden"
print " matching score: "+(hex(score))
err = regModel(0xFFFFFFFF) # generate a template
if err == 0:
store(0xFFFFFFFF,1,pagina) # store(address,buffer_id,page_id)
else:
print "\n error guardando - store: " + (hex(err))
return -1
elif err == 8:
print " Huellas NO coinciden"
else:
print "\n match Error " + (hex(err))
return -1
else:
print "salir"
return -1
### fin guardar_nueva_huella() ###
def comparar_huella(address = 0xFFFFFFFF,buffer_id=2,start_page=0,few_pages = 0x0):
raw_input("\n\n Presione Enter para leer huella: ")
err = capturar_huella(address,buffer_id)
if err == 0:
err,pageId,score = search(address,buffer_id,start_page,few_pages)
if err == 0:
print "Huella coincide con pagina:" + str(hex(pageId))
print "Matching Score:" + str(hex(score))
elif err == 9: print "Huella no encontrada"
else:
print "Error de comparacion: " + str(hex(err))
return -1
return err
else:
print "Error de captura o conversion"
return -1
### fin comparar_huella() ###
No olvidemos cerrar con la función cerrar_puerto()La mayoría de los datos obtenidos de estos manuales:
ZFM user manualV15.pdf
https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library/tree/master/documentation
Esto fué modificado por el compañero con solo las funciones que utiliza y creó un objeto.
Lo subo cuando esté más depurado.
...
TI2-CAW
proyectos de electronica