NFC532
NFC532
INFORMACIÓN
El módulo PN532 RFID/NFC es un dispositivo electrónico que permite leer y escribir en tags,
comunicarse con teléfonos que soportan NFC e incluso actuar como un tag RFID/NFC. Si lo que
deseas es evaluar el PN532, o realizar investigación y desarrollo en el campo de NFC o RFID,
esta tarjeta es ideal para dicha aplicación; esa u otras aplicaciones en RFID/NFC pueden ser con
Arduino o Raspberry Pi. Posee 3 interfaces de comunicación para utilizar con otros
µcontroladores.
Cabe mencionar que es muy flexible y permite comunicación con µcontroladores a través del
UART a 3,3 V, el I2C o el SPI, solo debe configurarse correctamente el DIP-SWITCH de acuerdo
a la interfaz de comunicación que desee utilizarse. El chip está bien soportado por libnfc (una
librería para desarrollar aplicaciones con NFC). Otra opción es conectar directamente un cable
USB-Serial al UART de esta tarjeta para comenzar a trabajar con el PN532 en tu PC.
ESPECIFICACIONES Y CARACTERÍSTICAS
Tipo: Kit Módulo NFC RFID
Incluye: Módulo PN532, Tarjeta RFID Mifare 1k S50 blanca y TAG RFID Mifare 1k tipo llavero
Voltaje de funcionamiento: 3,3 V a 5 V
Frecuencia de operación: 13,56 MHz
Interfaz de comunicación: SPI, I2C, High-speed UART (HSU)
Transferencia de datos: Max. 10 Mbit/s
Compatible con el estándar: RFID ISO/IEC 14443-A y NFC: ISO/IEC 18092
Tipos de tarjetas compatibles: Mifare 1 k S50, S70 Mifare1, Mifare Ultralight, Mifare Pro,
Mifare DESFire, Mifare Classic.
Dimensiones: 41x43 mm
TUTORIALES
Datasheet
Adafruit-PN532 – Librería
Elechouse-PN532 – Librería
UNIT_PN532 – Librería
Pinout
Fritzing PN532
INFORMACIÓN ADICIONAL
¿Módulo RFID PN532 cómo funciona?
El PN532 incluye un procesador 80C51 con 40 kB ROM y 1 KB RAM, junto con los elementos
necesarios para hacer funcionar correctamente la comunicación NFC.
Soporta 6 modos de operación:
ISO/IEC 14443A/MIFARE
Lector/Grabador, Card MIFARE Classic 1 k y MIFARE Classic 4 k Card
Lector/Grabador ISO/IEC 14443B
FeliCa Lector/Grabador y Card emulación
ECMA 340 Peer-to-Peer ISO/IEC 18092
La distancia típica de actuación es de 50 mm para lectura y escritura, y 100 mm para emulación.
La velocidad de lectura es de hasta 212 kbits/s y la de escritura de hasta 424 kbits/s. Estos valores
dependen, entre otros, de la antena integrada en el módulo.
El PN532 opera a 3,3 V pero admite tensiones de alimentación de 2,7 V a 5,4 V. Las líneas de
comunicación I2C/UART funcionan de 3,3 V a 24 V TTL. Sin embargo, la interface SPI funciona
a 3,3 V, pero incorpora resistencias de 100 Ω en serie para que también pueda conectarse a 5 V.
El consumo es de 100 mA en modo Stand-By y 120 mA durante la lectura y escritura.
Adicionalmente dispone de dos modos de baja energía: un modo Soft-Power-Down de un
consumo de 22 µA, y un modo Hard-Power-Down con un consumo de 1µA.
De igual manera puede usarse con ordenadores y µordenadores como Raspberry Pi con la librería
libnfc.
ENLACES EXTERNOS
Arduino con PN532 NFC RFID
Lector y escritor RFID / NFC con PN532
******************************************************************************
RFID NFC532-V2
SKU: MDU1040
Resumen de Datos:
Tensión de funcionamiento: 2,5 V a 3,3 V.
Corriente de funcionamiento/espera: 13 a 26 mA/10 a 13 mA.
Frecuencia de funcionamiento: 13,56 MHz.
Soporta comunicación de mayor velocidad de transferencia ISO/IEC 14443A hasta 848
kBd.
Velocidad de bus SPI hasta 10 Mbit/s.
Interfaz bus I2C hasta 400 kBd en modo rápido, hasta 3400 kBd en modo de alta
velocidad.
UART serie RS232 de hasta 1.228,8 kBd, con niveles de tensión dependientes de la
tensión del pin de los pines.
Compatible con tarjetas MIFARE e ISO 14443A.
Distancia operativa típica en modo Lectura/Escritura de hasta 50 mm dependiendo del
tamaño y sintonización de la antena.
Esta es la información que puedes leer de la tarjeta, incluyendo el UID de la tarjeta que está
resaltado en rojo.
La información se almacena en la memoria que está dividida en segmentos y bloques como
puedes ver en la imagen anterior.
Tienes 1024 bytes de almacenamiento de datos divididos en 16 sectores y cada sector está
protegido por dos claves diferentes, A y B.
Anota tu tarjeta UID porque la necesitarás más adelante. En este caso, Tarjeta UID: B0 AC 7E
7A.
Carga el siguiente código en la placa Arduino:
====================================================================
/*
* All the resources for this project:
* Modified by Handson Technology
* [Link]
* Created by Handsontec Tech team
*/
#include <SPI.h> // Comunicación vía SPI, tomar la librería
#include <MFRC522.h> // Acceder a la librería del MFRC522
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crear la instancia MFRC522.
void setup(){
[Link](9600); // Inicia la comunicación serial con PC/LapTop.
[Link](); // Inicia el bus SPI.
mfrc522.PCD_Init(); // Inicia el MFRC522.
[Link]("Aproxime su tarjeta al lector...");
[Link]();
}
void loop(){
// Ver por nuevas tarjetas
if (!mfrc522.PICC_IsNewCardPresent())
{return;}
// Select one of the cards
if (!mfrc522.PICC_ReadCardSerial())
{return;}
// Muestre la UID en el monitor serial.
[Link]("UID del tag :");
String content= "";
byte letter;
for (byte i = 0; i < [Link]; i++){
[Link]([Link][i] < 0x10 ? " 0" : " ");
[Link]([Link][i], HEX);
[Link](String([Link][i] < 0x10 ? " 0" : " "));
[Link](String([Link][i], HEX));
}
[Link]();
[Link]("Mensaje : ");
[Link]();
if ([Link](1) == "B0 AC 7E 7A") // Ponga acá las UIDs de tarjetas que tendrán acceso
{[Link]("Acceso Autorizado");
[Link]();
delay(3000);
}
else {
[Link](" Acceso negado");
delay(3000);
}
}
En el fragmento de código anterior debe cambiarse el if ([Link](1) == «REPLACE
WITH YOUR UID») y escribir la tarjeta UID que has escrito anteriormente… ó cambiar el if
([Link](1) == “REPLACE WITH YOUR UID”) y escriba la UID de la etiqueta
que escribió previamente.
Demostración:
Ahora, sube el código a tu Arduino y abre
el monitor serie. Verás la pantalla como la
de la derecha:
derecha:
Con esto hemos completado las pruebas iniciales y la configuración del módulo lector RFID
RC522, esperamos que este tutorial haya sido útil.
Este paquete de desarrollo RFID incluye:
1x Módulo Lector RFID RC522
1x Tarjeta RFID tamaño tarjeta de crédito (tipo M1 S50 IC Card)
1x Llavero RFID (tipo M1 S50 Key tag)
1x conector de cabecera recto de 8 patillas
1x conector de cabecera en ángulo recto de 8 patillas
Recurso Web:
[Link]
Curso Uso del lector RFID MF522 con el Arduino.
MF1 S50 ISO/IEC14443A Tarjeta RFID sin contacto
Llavero RFID sin contacto MF1 S50 ISO/IEC14443A
/*****************************************************************************/
Módulo V3 NFC (RFID-PN532)
[Link]
srsltid=AfmBOor00WvW975AEefSTnE965B26yuss8GLhnV-wgc3jxezoE2WVz9Y
void setup() {
[Link](115200); // Inicio de puerto Serial a 115200 baudios
[Link](); // Comienza la comunicación del PN532
void loop() {
boolean LeeTarjeta; // Variable para almacenar la detección de una tarjeta
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0}; // Búfer para almacenar la UID devuelta
uint8_t LongitudUID; // Variable para almacenar la longitud de la UID de la tarjeta
// Si no se detecta tarjeta:
else
{
[Link]("Se agotó el tiempo de espera de una tarjeta");
}
}
Este es el código de prueba para la tarjeta PN532, con este código podremos obtener la
información y el UID que se encuentra en la tarjeta, como se puede observar a continuación:
Dispositivos: encontramos a continuación los links de las dos placas que se utilizaron,
para que puedan adquirirse al igual que los “links” a las tarjetas RFID.
Kit Pn532 Nfc Lectura y Escritura V3
ESP32 DEVKIT V1 30 Pines
Tarjeta RFID 13.56 Mhz MFS50
Llavero Tag RFID 13.56 MHz NFC
De Kit Pn532 Nfc Lectura y Escritura V3 tenemos:
INFORMACIÓN
El módulo Pn532 RFID/NFC es un dispositivo electrónico que permite leer y escribir en tags,
comunicarse con teléfonos que soportan NFC e incluso actuar como un tag RFID/NFC. Si sólo se
desea evaluar el PN532, o realizar investigación y desarrollo en el campo de NFC o RFID, esta
tarjeta es ideal para dicha aplicación.
Es ideal para desarrollar rápidamente aplicaciones en RFID/NFC con Arduino o Raspberry Pi.
Posee 3 interfaces de comunicación para utilizar con otros microcontroladores.
Cabe mencionar que es muy flexible y permite comunicación con microcontroladores a través de
UART a 3,3V, I2C o SPI, solo debe configurarse correctamente el DIP-SWITCH de acuerdo a la
interfaz de comunicación que desee utilizarse. El chip está bien soportado por libnfc (una librería
para desarrollar aplicaciones con NFC). Otra opción es conectar directamente un cable USB-
Serial al UART de esta tarjeta para comenzar a trabajar con el PN532 en tu PC.
ESPECIFICACIONES Y CARACTERÍSTICAS
Tipo: Kit Módulo NFC RFID
Incluye: Módulo PN532, Tarjeta RFID Mifare 1k S50 blanca y TAG RFID Mifare 1k tipo llavero
Voltaje de funcionamiento: 3,3 V a 5 V
Frecuencia de operación: 13,56 MHz
Interfaz de comunicación: SPI, I2C, High-speed UART (HSU)
Transferencia de datos: Max. 10 Mbit/s
Compatible con el estándar: RFID ISO/IEC 14443-A y NFC: ISO/IEC 18092
Tipos de tarjetas compatibles: Mifare 1K S50, S70 Mifare1, Mifare Ultralight, Mifare Pro,
Mifare DESFire, Mifare Classic.
Dimensiones: 41x43 mm
******************************************************************************
De ESP32 DEVKIT V1 30 Pines tenemos:
INFORMACIÓN
ESP32 DEVKIT V1 es un microcontrolador de bajo costo y consumo de energía, cuenta con
tecnología Wi-Fi y Bluetooth de modo dual integrado que permite controlar todo tipo de
sensores, módulos y actuadores; es el sucesor del microcontrolador ESP8266.
ESP32 DEVKIT V1 permite generar proyectos de Internet de las cosas “IoT” de forma eficiente
y económica, ya que integra internamente una gran cantidad de periféricos incluyendo: sensores
táctiles capacitivos, sensor de efecto Hall, amplificadores de bajo ruido, interfaz para tarjeta SD,
Ethernet, SPI de alta velocidad, UART, I 2S e I2C. Tiene un CPU de dos núcleos de hasta 240
Mhz que se pueden controlar independientemente.
ESPECIFICACIONES Y CARACTERÍSTICAS
ESP32 DEVKIT V1 MicroUSB
ESP32 DEVKIT V1 USB-C
Serie: ESP32 DEVKIT V1
Puerto: USB-C
Chip USB-Serial: CH340C
Numero de Núcleos: 2
Voltaje de Alimentación (USB): 5 VDC
Voltaje de Entradas/Salidas: 3,3 VDC
Consumo de 5 μA en modo de suspensión.
Pines:
o Físicos: 30
o Digitales GPIO: 24 (Algunos pines solo
como entrada)
Conversor Analógico Digital: Dos ADC de 12 bits tipo SAR, soporta mediciones en hasta
18 canales, algunos pines soportan un amplificador con ganancia programable.
Antena en PCB
Tipo: Módulo Wifi + Bluetooth
o Wifi: 802.11 b/g/n/e/i (802.11n @ 2,4 GHz hasta 150 Mbit/s)
o Bluetooth: 4.2 BR/EDR BLE Modo de control dual
CPU principal: Tensilica Xtensa 32-bit LX6
Memoria: 448 KByte ROM, 520 KByte SRAM, 6 KByte SRAM en RTC y QSPI admite
múltiples chips flash /SRAM
Procesador secundario: Permite hacer operaciones básica en modo de ultra bajo consumo
Desempeño: Hasta 600 DMIPS
Frecuencia de Reloj: hasta 240 Mhz
Seguridad: IEEE 802.11, incluyendo WFA, WPA/WPA2 y WAPI
Criptografía acelerada por hardware: AES, SHA-2, RSA, criptografía de curva elíptica
(ECC), generador de números aleatorios (RNG)
Cómo programar ESP32 DEVKIT V1:
Ya instalado el controlador puede programarse en diferentes entornos de programación a elegir:
Arduino IDE (en lenguaje C++),
Esp-idf (Espressif IoT Development Framework) desarrollado por el fabricante del chip,
Simba Embedded Programming Platform (en lenguaje Python)
MicroPython
Javascript (Espruino, Duktape, Mongoose JS)
Y otros…
Es muy utilizado con Arduino IDE ya que cuenta con gran variedad de ejemplos, información y
otros recursos, que te ayudaran a comenzar a utilizar esta placa. Para utilizar con Arduino IDE
deberás realizar los siguientes pasos:
1. Abrir Arduino IDE. Si no lo has instalado descárgalo directamente de la página de Arduino,
instalar la versión ejecutable no instalar la versión portable.
2. Copiar el siguiente URL: [Link]
3. Dirigirse a la pestaña de Arduino llamada “Archivo”.
4. Dar clic en “Preferencias”.
5. Dirígete al Gestor de URLs Adicionales de Tarjetas:
6. En la casilla pegar la URL. Si hay otra URL colocar una coma al final, dar un espacio y pegar la
URL.
7. Dar clic en Ok.
8. Ir a la pestaña de Arduino llamada “Herramientas”
9. Dar clic en “Placa:” y después a “Gestor de tarjetas…”
10. Saldrá una ventana, buscar las placas “esp32 by Espressif Systems” e instalarlas.
Para comprobar la instalación de las tarjetas ESP32 en Arduino IDE y cargar códigos a la placa
realiza lo siguiente:
1. Ir a la pestaña de Arduino llamada “Herramientas”
2. Dar clic en “Placa:”
3. Seleccionar ESP32 Arduino y buscar la placa “DOIT ESP32 DEVKIT V1”
4. También puedes elegir las placas: NodeMCU-32S, Adafruit ESP32 Feather ó ESP32 Dev
Module
5. Después conectar la placa al PC.
6. Ir nuevamente a “Herramientas” y seleccionar el puerto COM que le asigno la PC a la placa.
7. Carga el siguiente código para comprobar que todo salió bien. El código es un blink en el Led
que incorpora la placa que está asignado al pin 2 del ESP32.
8.
void setup() {
[Link](115200);
[Link]("Iniciando módulo NFC...");
[Link]();
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532. Verifica las conexiones.");
while (1); // Detiene el programa
}
void loop() {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
if (success) {
[Link]("Etiqueta detectada!");
[Link]("UID: ");
for (uint8_t i = 0; i < uidLength; i++) { // Imprime la identificación de la etiq.
[Link](" 0x"); [Link](uid[i], HEX);
}
[Link]();
delay(1000); // Espera 1 segundo antes de leer otra etiqueta
}
}
void setup() {
[Link](115200); // Activar la comunicación Arduino-PC (o LapTop)
[Link]("Iniciando módulo NFC...");
[Link]();
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532. Verifica las conexiones.");
while (1); // Detiene el programa
}
// Se encontró el Módulo PN532 (V3?):
[Link]("Chip encontrado: PN5");
[Link]((versiondata >> 24) & 0xFF, HEX);
[Link]("Firmware versión: ");
[Link]((versiondata >> 16) & 0xFF, DEC);
[Link]('.');
[Link]((versiondata >> 8) & 0xFF, DEC);
void loop() {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
Modificar el primer programa para escribir datos en una etiqueta NFC; puede usarse la librería
Adafruit PN532 para escribir en etiquetas compatibles, como las MIFARE Classic o NTAG.
Veamos cómo hacerlo:
#include <Wire.h>
#include <Adafruit_PN532.h>
void setup() {
[Link](115200); // Conexión Arduino y LapTop o PC
[Link]("Iniciando módulo NFC...");
void loop() {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
// Autentica el bloque (necesario para MIFARE Classic) x—x UID con 16 Sectores, 4 Bloques/Sector y 16 bytes/Bloque
uint8_t blockNumber = 4; // Bloque donde se escribirá (evita bloques reservados)
uint8_t key[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // Clave por defecto
if (!nfc.mifareclassic_AuthenticateBlock(uid, uidLength, blockNumber, 1, key)) {
[Link]("Error de autenticación.");
return false;
}
// Escribe en el bloque
if (!nfc.mifareclassic_WriteDataBlock(blockNumber, data)) { // Si no hay error: escribe “data”
[Link]("Error al escribir en el bloque.");
return false;
}
return true;
}
Para leer una etiqueta NFC después de escribir, puedes agregar una función que lea el bloque
donde se escribieron los datos y verifique que la información se haya guardado correctamente. A
continuación, te muestro cómo modificar el código anterior para incluir esta funcionalidad:
#include <Wire.h>
#include <Adafruit_PN532.h>
void setup() {
[Link](115200);
[Link]("Iniciando módulo NFC...");
[Link]();
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532. Verifica las conexiones.");
while (1); // Detiene el programa
}
void loop() {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
if (success) {
[Link]("Etiqueta detectada!");
[Link]("UID: ");
for (uint8_t i = 0; i < uidLength; i++) { // Imprime la identificación de la etiqueta
[Link](" 0x"); [Link](uid[i], HEX);
}
[Link]();
// Lee el bloque
if (!nfc.mifareclassic_ReadDataBlock(blockNumber, data)) {
[Link]("Error al leer el bloque.");
return;
}
******************************************************************************
Conectar un Arduino Nano a un módulo NFC V3 y leer/escribir datos es un proceso factible
que sigue una serie de pasos (Ver el archivo DeepSeek_Gemini.doc):
A) Materiales necesarios:
1. Arduino Nano
2. Módulo NFC V3 (por ejemplo, el PN532)
3. Cables de conexión (jumpers)
4. Tarjeta NFC o etiqueta NFC (para pruebas)
B) Conexiones entre el Arduino Nano y el módulo NFC V3:
El módulo NFC V3 (PN532) puede comunicarse con el Arduino Nano mediante I2C, SPI o
UART. Aquí veremos la conexión más común usando I2C:
C) Módulo NFC V3 (PN532) Arduino Nano
VCC 3,3 V o 5 V (dependiendo del módulo)
GND GND
SDA A4 (SDA)
SCL A5 (SCL)
Nota: Algunos módulos NFC V3 funcionan a 3,3 V, así que verifica el voltaje de operación del
módulo antes de conectarlo.
D) Instalación de la librería necesaria:
Para facilitar la comunicación con el módulo NFC, puede usarse la librería Adafruit PN532.
Instálala desde el Gestor de Librerías del IDE de Arduino:
1. Abre el IDE de Arduino.
2. Ve a Herramientas Gestor de Librerías.
3. Busca Adafruit PN532 e instálala.
E) Código para leer y escribir datos en la NFC:
A continuación, tenemos un ejemplo básico para leer y escribir datos en una tarjeta NFC:
#include <Wire.h>
#include <Adafruit_PN532.h>
#define PN532_IRQ (2)
#define PN532_RESET (3) // No conectado si no se usa
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
void setup() {
[Link](115200);
[Link]("Iniciando módulo NFC...");
[Link]();
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532");
while (1); // Detener el programa
}
[Link]("Chip encontrado PN5"); [Link]((versiondata >> 24) & 0xFF, HEX); //
Imprime tipo de PN5xx
[Link]("Firmware versión: "); [Link]((versiondata >> 16) & 0xFF, DEC); //
Imprime su Versión
[Link]('.'); [Link]((versiondata >> 8) & 0xFF, DEC);
[Link](); // Configurar el módulo para leer tarjetas
[Link]("Esperando una tarjeta NFC...");
}
void loop() {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
// Esperar a que se acerque una etiqueta NFC para leerla
success = [Link](PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
[Link]("Tarjeta detectada!");
// Mostrar el UID de la tarjeta
[Link]("UID Length: "); [Link](uidLength, DEC); [Link](" bytes");
[Link]("UID Value: ");
for (uint8_t i = 0; i < uidLength; i++) {
[Link](" 0x"); [Link](uid[i], HEX);
}
[Link]();
// Escribir datos en la tarjeta NFC ********
uint8_t data[] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello" en hexadecimal
uint8_t blockNumber = 4; // Bloque donde se escribirá (elige un bloque que
no esté protegido)
success = nfc.mifareclassic_WriteDataBlock(blockNumber, data);
if (success) {
[Link]("Datos escritos correctamente!");
} else {
[Link]("Error al escribir datos.");
}
// Leer datos de un Bloque NFC ********
uint8_t readData[16];
success = nfc.mifareclassic_ReadDataBlock(blockNumber, readData);
if (success) {
[Link]("Datos leídos: ");
for (uint8_t i = 0; i < 16; i++) {
[Link](" 0x"); [Link](readData[i], HEX);
}
[Link]();
} else {
[Link]("Error al leer datos.");
}
delay(2000); // Esperar 2 segundos antes de repetir
}
}
Detalles importantes:
Clave de autenticación:
o En este código, se usa la clave predeterminada KEY_DEFAULT = {0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF}.
o Si tu etiqueta usa una clave diferente, debes cambiarla en la función
nfc.mifareclassic_AuthenticateBlock().
Sectores y bloques:
o Las etiquetas Mifare Classic tienen 16 sectores, cada uno con 4 bloques.
o El bloque 0 de cada sector contiene la clave de acceso y los permisos.
o Solo se pueden escribir datos en los bloques de datos (bloques 1, 2 y 3 de cada
sector).
Compatibilidad:
o Este código está diseñado para etiquetas Mifare Classic 1K (las más comunes). Si
usas otro tipo de etiqueta, asegúrate de que sea compatible con el módulo PN532.
Prueba:
1. Carga el código en tu Arduino Nano.
2. Abre el Monitor Serie para ver los mensajes.
3. Acerca una etiqueta NFC al módulo y verifica que los datos se escriban correctamente.
Conexiones:
NFC Module V3:
o SDA -> A4 (Arduino Nano).
o SCL -> A5 (Arduino Nano).
o VCC -> 3.3V o 5V (dependiendo de la versión del módulo).
o GND -> GND.
Borrar: [Link]
Si el programa anterior no se arregla: Borrar también…!
******************************************************************************
El error 'keyDefault' was not declared in this scope indica que el compilador no reconoce la
constante keyDefault, o la constante KEY_DEFAULT = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF}. Esto puede deberse a que la versión de la librería Adafruit_PN532 que se utiliza no
define keyDefault, o bien, no la estás incluyendo correctamente.
Vamos a resolver este problema paso a paso:
1. Verifica la versión de la librería Adafruit_PN532
La constante keyDefault está definida en versiones recientes de la librería Adafruit_PN532. Si
estás utilizando una versión antigua, es posible que no esté disponible.
¿Cómo verificar la versión de la librería?
1. Abre el IDE de Arduino.
2. Ve a Sketch Incluir Librería Gestionar Bibliotecas.
3. Busca Adafruit PN532 y verifica la versión instalada.
4. Si la versión es antigua, actualízala a la más reciente.
2. Define keyDefault manualmente
Si la librería no puede actualizarse o si keyDefault no está definida en tu versión, puedes
declararla manualmente en tu código. Aquí se muestra cómo hacerlo:
const uint8_t keyDefault[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
Luego, puedes usarla en la función mifareclassic_AuthenticateBlock sin problemas.
3. Código corregido con keyDefault definida manualmente
Aquí te dejo el código completo con keyDefault definida manualmente:
#include <Wire.h>
#include <Adafruit_PN532.h>
// Define la clave de autenticación predeterminada
const uint8_t keyDefault[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
// Configuración del módulo NFC
#define PN532_IRQ (2)
#define PN532_RESET (3) // No es necesario si no estás usando el pin de reset
// Crea una instancia del objeto PN532
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
void setup() {
[Link](9600);
[Link]("Iniciando módulo NFC...");
// Inicializa el módulo NFC
[Link]();
// Verifica la conexión con el módulo NFC
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532. Verifica las conexiones.");
while (1); // Detiene el programa si no se encuentra el módulo
}
// Configura el módulo para leer etiquetas
[Link]();
[Link]("Módulo NFC listo.");
}
void loop() {
[Link]("Acerca una etiqueta NFC para escribir...");
// Espera a que se acerque una etiqueta NFC
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
// Intenta leer el UID de la etiqueta
bool success = [Link](PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
[Link]("Etiqueta NFC detectada.");
// Muestra el UID de la etiqueta
[Link]("UID: ");
for (uint8_t i = 0; i < uidLength; i++) {
[Link](uid[i], HEX);
[Link](" ");
}
[Link]();
// Escribe datos en un sector permitido (por ejemplo, sector 1, bloque 4)
uint8_t sector = 1;
uint8_t block = 4;
uint8_t data[16] = { 'H', 'o', 'l', 'a', ' ', 'N', 'F', 'C', '!', 0, 0, 0, 0, 0, 0, 0 };
// Autentica el bloque antes de escribir
success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, block, 1, keyDefault);
if (success) {
// Escribe los datos en el bloque
success = nfc.mifareclassic_WriteDataBlock(block, data);
if (success) {
[Link]("Datos escritos correctamente.");
} else {
[Link]("Error al escribir en el bloque.");
}
} else {
[Link]("Error de autenticación.");
}
} else {
[Link]("No se detectó ninguna etiqueta NFC.");
}
delay(2000); // Espera 2 segundos antes de repetir
}
4. Alternativa: Usar un array anónimo
Si prefieres no definir keyDefault, puedes pasar la clave directamente como un array anónimo en
la función mifareclassic_AuthenticateBlock:
success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, block, 1, (uint8_t[]){ 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF });
5. ¿Por qué no funciona keyDefault en mi versión de la librería?
Es posible que la versión de la librería Adafruit_PN532 que estás utilizando no incluya la
definición de keyDefault. Esto puede deberse a:
Una versión antigua de la librería.
Una modificación en la librería que eliminó keyDefault.
En cualquier caso, definir keyDefault manualmente es una solución rápida y efectiva.
Resumen:
Define keyDefault manualmente si no está disponible en tu versión de la librería.
Actualiza la librería Adafruit_PN532 si es posible.
Usa un array anónimo como alternativa
******************************************************************************
Se tiene un Arduino Nano conectado, vía I2C, a una NFC MODULE V3 para leer tarjetas PN532
de 1k Classic; también está conectado a un PC para recibir órdenes de un Operador. La
comunicación y control de las tarjetas se realiza con la librería Adafruit. La idea es hacer un
programa que: 1) Lea la UID de una tarjeta y la muestre, 2) Escriba, en la tarjeta, en el Sector y
Bloque indicados por el Operador exceptuando en el Sector de identificación, 3) Permita, ó no, el
acceso de la tarjeta leída si está autorizada; si permite el acceso debe activar el pin 4 que
manejará un LED verde y un relé, si no la tarjeta no está autorizada debe encender un LED rojo
en el pin 8.
¿Cómo modificarías el programa anterior para que cumpla con esos requerimientos antes
descritos?
Para cumplir con los requerimientos que anteriores, se modifica el programa anterior para que:
1. Lea la UID de una tarjeta y la muestre.
2. Escriba en la tarjeta en el Sector y Bloque indicados por el Operador (exceptuando el
Sector de identificación).
3. Permita o no el acceso dependiendo de si la tarjeta está autorizada, activando un LED
verde y un relé en el pin 4 si está autorizada, o un LED rojo en el pin 8 si no lo está.
Aquí está el programa modificado:
Código Modificado (Versión V2):
#include <Wire.h> // Librería para comunicación I2C
#include <Adafruit_PN532.h> // Librería Adafruit para el PN532
// Pines para el módulo PN532 (IRQ y RESET no son necesarios en I2C)
#define PN532_IRQ (2)
#define PN532_RESET (3) // No conectado por hardware
// Inicializar el módulo NFC
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
const uint8_t keyDefault[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // Clave por Defecto
// Lista de UIDs autorizados (modificable)
const uint8_t authorizedUIDs[][7] = {
{0x00, 0x00, 0x00, 0x94, 0xBF, 0x58, 0xAF}, // UID de Metro SUVE
{0x00, 0X00, 0X00, 0x74, 0xF3, 0x32, 0x5F}, // UID de Azul Claro
{0x00, 0x00, 0x00, 0xD1, 0x70, 0x67, 0x4C} // UID de Tarjeta
};
const int numAuthorizedUIDs = 3; // Número de UIDs autorizados
// Pines para indicadores de acceso
const uint8_t ledVerde = 4; // LED verde para acceso permitido en D4 (y relé)
const uint8_t ledRojo = 8; // LED rojo para acceso denegado en D8
void setup() {
[Link](9600);
[Link]("Iniciando sistema NFC...");
// Inicializar el módulo NFC
[Link]();
uint32_t versiondata = [Link]();
if (!versiondata) {
[Link]("No se encontró el módulo PN532. Verifica la conexión.");
while (1); // Detener el programa si no se encuentra el módulo
}
[Link]("Chip PN532 encontrado. Versión: ");
[Link](versiondata, HEX);
// Configurar el módulo NFC
[Link]();
// Configurar pines de los LEDs
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
}
void loop() {
[Link]("\nEsperando una tarjeta NFC...");
// Esperar a que una tarjeta NFC esté presente
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer para almacenar el UID
uint8_t uidLength; // Longitud del UID
if ([Link](PN532_MIFARE_ISO14443A, uid, &uidLength)) {
[Link]("Tarjeta NFC detectada.");
// Mostrar menú de opciones
mostrarMenu();
// Leer la opción seleccionada por el usuario
int opcion = leerOpcion();
switch (opcion) {
case 1:
leerTarjeta(uid, uidLength); // Leer UID de la tarjeta
break;
case 2:
escribirTarjeta(uid, uidLength); // Escribir en la tarjeta
break;
case 3:
verificarAcceso(uid, uidLength); // Verificar acceso
break;
case 4:
[Link]("Finalizando programa...");
while (1); // Detener el programa
break;
default:
[Link]("Opción no válida.");
break;
}
}
}
// Función para mostrar el menú de opciones
void mostrarMenu() {
[Link]("\nSelecciona una opción:");
[Link]("1. Leer UID de la tarjeta.");
[Link]("2. Escribir datos en la tarjeta.");
[Link]("3. Verificar acceso.");
[Link]("4. Finalizar programa.");
[Link]("Ingresa el número de la opción deseada:");
}
// Función para leer la opción seleccionada por el usuario
int leerOpcion() {
while (![Link]()); // Esperar a que el usuario ingrese una opción
int opcion = [Link]();
while (opcion < 1 || opcion > 4) {
[Link]("Opción no válida. Intenta de nuevo.");
while (![Link]());
opcion = [Link]();
}
[Link]("Opción seleccionada: ");
[Link](opcion);
return opcion;
}
// Función para leer la UID de la tarjeta NFC
void leerTarjeta(uint8_t *uid, uint8_t uidLength) {
[Link]("Leyendo UID de la tarjeta...");
// Mostrar el UID de la tarjeta
[Link]("UID de la tarjeta: ");
for (uint8_t i = 0; i < uidLength; i++) {
[Link](uid[i], HEX);
[Link](" ");
}
[Link]();
}
// Función para escribir datos en la tarjeta NFC
void escribirTarjeta(uint8_t *uid, uint8_t uidLength) {
[Link]("Escribiendo datos en la tarjeta...");
// Solicitar al operador el sector y bloque
[Link]("Ingresa el número de sector (0-15):");
while (![Link]());
uint8_t sector = [Link]();
[Link]("Sector seleccionado: ");
[Link](sector);
[Link]("Ingresa el número de bloque (0-3):");
while (![Link]());
uint8_t block = [Link]();
[Link]("Bloque seleccionado: ");
[Link](block);
// Verificar que no se intente escribir en el sector de identificación (sector 0)
if (sector == 0) {
[Link]("Error: No se puede escribir en el sector de identificación.");
return;
}
// Solicitar los datos a escribir
[Link]("Ingresa los datos a escribir (16 bytes en formato hexadecimal, separados por
espacios):");
while (![Link]());
uint8_t data[16];
for (uint8_t i = 0; i < 16; i++) {
data[i] = (uint8_t)strtol([Link](' ').c_str(), NULL, 16);
}
// Autenticar el bloque antes de escribir
bool success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, block, 1, keyDefault);
if (success) {
// Escribir los datos en el bloque
success = nfc.mifareclassic_WriteDataBlock(block, data);
if (success) {
[Link]("Datos escritos correctamente.");
} else {
[Link]("Error al escribir en el bloque.");
}
} else {
[Link]("Error de autenticación.");
}
}
// Función para verificar el acceso
void verificarAcceso(uint8_t *uid, uint8_t uidLength) {
[Link]("Verificando acceso...");
// Comparar el UID de la tarjeta con la lista de UIDs autorizados
bool accesoPermitido = false;
for (int i = 0; i < numAuthorizedUIDs; i++) {
if (memcmp(uid, authorizedUIDs[i], uidLength) == 0) {
accesoPermitido = true;
break;
}
}
// Mostrar resultado y controlar los LEDs
if (accesoPermitido) {
[Link]("Acceso permitido.");
digitalWrite(ledVerde, HIGH); // Activar LED verde y relé
digitalWrite(ledRojo, LOW);
} else {
[Link]("Acceso denegado.");
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, HIGH); // Activar LED rojo
}
delay(3000); // Espera 3 segundos antes de apagar los LEDs
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
}
Explicación de las modificaciones
1. Lectura de la UID:
o La función leerTarjeta muestra el UID de la tarjeta detectada.
2. Escritura en la tarjeta:
o La función escribirTarjeta solicita al operador el sector y bloque donde se
escribirán los datos.
o Se verifica que no se intente escribir en el sector de identificación (sector 0).
o Se solicitan los datos a escribir en formato hexadecimal.
3. Verificación de acceso:
o La función verificarAcceso compara el UID de la tarjeta con la lista de UIDs
autorizados.
o Si la tarjeta está autorizada, se activa el pin 4 (LED verde y relé).
o Si no está autorizada, se activa el pin 8 (LED rojo).
4. Manejo de entradas del operador:
o Se validan las entradas del operador para evitar errores (por ejemplo, no permitir
escribir en el sector 0).
Pruebas y consideraciones
Asegúrate de que las conexiones del LED verde, LED rojo y relé estén correctamente
realizadas.
Verifica que las tarjetas NFC sean compatibles con el módulo PN532.
Si encuentras algún problema, utiliza mensajes de depuración ([Link]) para
identificar el origen del error.
Sistema Seguro de Tarjetas NFC para Datos Médicos en Venezuela (Resistente a Sanciones
y Ataques)
Objetivo
Crear un sistema seguro y descentralizado que permita:
1. Identificar pacientes en cualquier centro de salud.
2. Almacenar datos médicos críticos en la tarjeta NFC (funcionalidad offline).
3. Actualizar diagnósticos de forma segura (solo por personal autorizado).
4. Resistir ciberataques, sanciones externas y fallas de infraestructura.
Escenarios de Uso
1. Sin conexión a internet:
a) Ejemplo: Paciente con diabetes llega inconsciente a un rural. El médico lee su
NFC y ve: "Diabetes tipo 2, alergia a metformina, último tratamiento: insulina
NPH".
b) Acción: Evitar metformina y ajustar dosis de insulina.
2. Ataque a servidores (ej. julio/2024):
a) La tarjeta sigue proporcionando datos vitales.
b) Nuevos diagnósticos se registran localmente y se sincronizan luego.
Conclusión
Este sistema garantiza:
1. Acceso rápido a datos críticos (aún sin internet).
2. Protección contra ciberataques y sanciones.
3. Privacidad del paciente (cifrado + consentimiento).
4. Resistencia geopolítica (infraestructura 100% soberana).
Nota final: Incluir un mecanismo de consentimiento dinámico (ej. el paciente puede ocultar
ciertos datos en la NFC si lo desea).