Shield NFC de Arduino para la lectura y escritura de llaveros y etiquetas

NFC es una tecnología de comunicación inalámbrica que a través de la inducción de un campo magnético permite la comunicación entre dos dispositivos.

Esta tecnología es una variante de la RFID que quizás nos suene mas no por su nombre si no por los usos que se le ha dado. Por ejemplo podemos encontrarla en tarjetas como método de pago para el transporte urbano, para las máquinas expendedoras de la oficina, en los chips implantados en los perros que almacenan los datos del can y su dueño, etc.

Pues bien, esta variante indica que la frecuencia de los dispositivos ha de ser de 13.56 Mhz y que su distancia máxima a cubrir será de 10 cm en el mejor de los casos, aunque esto último depende de las antenas de los dispositivos.

Últimamente con los smartphones de gama alta se está poniendo de moda ya que permiten darles bastantes usos. El principal de todos ellos era/es el de realizar pagos en tiendas físicas, sin embargo no es algo que haya proliferado aquí, aunque si en otros países, otros usos son el de programación de perfiles para el móvil, de modo que dependiendo de qué etiqueta/tag/llavero NFC leas el móvil se configure de determinada forma.

Ahora que ya tenemos una idea de que es y que usos se les puede dar vamos a lo que realmente nos ocupa, que es la revisión de una Shield NFC para Arduino cedida por dealextreme.com

Shield NFC para Arduino

La shield o placa de expansión, que en adelante la nombrare como la placa, a revisar está fabricada por ElecFreaks, el mismo fabricante que el Freaduino revisado hace un tiempo. Dealextreme vende muchos de sus productos, entre ellos esta placa que puede comprarse desde aquí: Shield NFC para Arduino.

La placa viene en una caja de cartón junto a los elementos imprescindibles para hacerla funcionar, en este caso la propia placa, un dispositivo NFC con forma de tarjeta de crédito y unos conectores hembra que necesitaremos soldar si queremos poder pinchar otras shields encima de esta.

La placa al tener una forma entandar, la de shield de expansión para Arduino, la hace compatible también con otras plataformas de desarrollo, ya sean los Arduinos oficiales, los compatibles como el Freaduino, los netDuino, etc. Esta es la apariencia que tiene en alguno de ellos:

 

Puede observarse como la placa una vez conectada queda expuesta hacia el exterior, eso aunque queda un poco anti estético es necesario por si conectamos otras shields encima ya que de lo contrario la antena NFC de la placa quedaría oculta e imposibilitaría su uso.

La placa NFC esta compuesta de toda la circuitería necesaria para funcionar, esto incluye el controlador PN532 capaz de soportar los protocolos ISP, I2C y UART Serial, la antena NFC que permite leer dispositivos hasta un máximo de 5 cm, dos leds que indican el estado, el cristal de cuarzo del controlador, condensadores, resistencias, etc.

Esta placa para funcionar hace uso del protocolo ISP, aunque teóricamente mediante unos “jumpers” que tiene puede cambiarse para usar el I2C o UART, y para realizar la conexión es tan sencillo como pinchar la placa sobre el Arduino. La he probado en un Arduino Duemilanove/Uno y en un moDuino basado en un Arduino Mega, en ambas ha funcionado correctamente.

Librería para usar la Shield NFC

Con la placa no se incluye ningún CD con las librerías necesarias para su uso en Arduino pero si que están tanto en la descripción del producto de dealextreme como en la página del fabricante.
Además como la placa se basa en el chip PN532, que es bastante común, nos encontramos que hay muchas librerías por internet, la gran mayoría están basadas en la de Adafruit y luego han sido modificadas para soportar un protocolo de comunicación concreto y para quitar o añadir funcionalidades.

Por ejemplo la librería del fabricante nos permite obtener el número identificativo único de cada dispositivo NFC (su ID), además de leer y escribir en la memoria EEPROM que suelen tener estos dispositivos. Pero no incluye la funcionalidad de comunicación entre dos shields NFC o entre la placa y un móvil. Otras librerías sí que incluyen algunas funcionalidades de esas, pero como digo su funcionamiento depende del protocolo de comunicación, así que si necesitamos algo “raro” será mejor que nos informemos antes de si es posible darle ese uso.

Para todos los ejemplos que se verán más adelante yo he usado la librería original, aunque la he modificado ya que tal y como viene tenia algunos detalles que no me gustaban nada:

  • De serie solo es compatible con el IDE viejo de Arduino, así que le añadí compatibilidad con la versión 1.x
  • No viene nada de documentación sobre cómo usar sus métodos o qué parámetros se les ha de pasar, por ello extraje la información de otras librerías e incluí toda la que pude.
  • La librería tiene un modo debugger que hace que se imprima por pantalla determinada información, había alguna información que aun teniendo desactivado ese modo se imprimía igual, así que arregle eso ya que puede darnos problemas si quisiéramos enviar datos por el Serial ya que el pc podría leer la basura metida por la librería.
  • He añadido dos métodos para poder leer y escribir la totalidad de la memoria EEPROM de forma consecutiva, esto permite escribir texto o estructuras de datos.
  • Y por último ordene el código que estaba muy mal formateado.

Enlace a la librería modificada por mí

Tarjetas, llaveros y otros dispositivos NFC

Con la placa se incluye un dispositivo NFC con forma de tarjeta de crédito, de hecho su tamaño y grosor son idénticos así que podemos llevarlo en el hueco para tarjetas de la cartera/monedero. Esta incorpora en su interior un espacio de memoria EEPROM en el que podemos leer y escribir los datos que queramos, aunque para hacerlo hay que tomar unas precauciones que explico en el siguiente punto.

A parte de la tarjeta existen muchos otros dispositivos NFC, en ebay mismo venden llaveros NFC como los de la foto y que revise aquí, o algunos otros mas curiosos con apariencia de llavero o como pegatinas.

Tarjeta NFC (mifare) y llaveros NFC de ebay
Tarjeta NFC (mifare) y llaveros NFC de ebay

Precauciones a tener en cuenta

A la hora de leer el ID del dispositivo NFC no hay más que usar el método de lectura que nos devuelve su número identificativo. Sin embargo para leer o escribir la memoria EEPROM hay que tomar unas precauciones ya que no es nada sencillo de usar y de hacerlo incorrectamente podemos dejar inservible parte de la memoria o incluso su totalidad.

Los dispositivos NFC que permiten almacenar información en su memoria siguen determinados protocolos para el almacenamiento, su acceso y protección. En el caso de la tarjeta y de los llaveros este es Mifare, que indica cómo se he de trabajar con la memoria, en el enlace a la Wikipedia lo explican pero voy a intentarlo hacer yo aquí:

La memoria se divide en sectores, bloques y bytes. Los sectores son llamados en esta librería como Sector Trailer y los bloques como Data Block.

En este caso la memoria tiene 16 sectores, cada uno de ellos tiene 4 bloques y a su vez estos contienen 16 bytes de información.

De esos 4 bloques el primero de ellos contiene una clave de acceso para acceder a los tres bloques de datos de ese sector. Eso quiere decir que si queremos leer o escribir información por ejemplo del bloque 29 deberemos antes introducir la clave del bloque 27…

Y el problema viene en si modificamos alguno de los bloques que almacenan la clave de acceso, la cual por defecto tiene el valor: FF FF FF FF FF FF, aunque luego el bloque contiene: 0 0 0 0 0 0 FF 7 80 69 FF FF FF FF FF FF . La teoria dice que si modificamos la clave por otra luego bastara con acceder al bloque con la nueva clave, pero lo cierto es que hice la prueba y después de tres horas y de intentarlo todo no hubo forma de recuperar la memoria. La prueba la realice con el sector 31 y fue a partir de ahí desde donde la memoria se quedó inservible. En un último intento de desesperación hice otra prueba con otro sector y se quedó inservible igualmente. Al final el llavero solo se puede usar para obtener su ID que no se vio afectado.

Para hacernos una mejor idea de lo que he explicado, la librería incluye un ejemplo llamado readAllMemoryBlocks que al ejecutarlo nos imprime en el monitor serial del IDE todo el contenido del dispositivo NFC, obteniendo algo así:

Si nos fijamos en el contenido que se nos imprime veremos los sectores y bloques de memoria con sus 16 bytes por fila, además de un bloque especial llamado Manufacturer Block que contiene información sobre el dispositivo.

Siempre y cuando leamos y escribamos en los Data Block no tendremos problemas, sin embargo que la memoria este dividida en bloques y sectores hace que no sea nada fácil trabajar con ella, al menos de forma transparente. Porque guardar en alguno de los bloques un dato especifico, por ejemplo el número de veces que hemos pasado la tarjeta por el lector, es muy sencillo de hacer. Ahora si en vez de eso queremos guardar cadenas de texto, estructuras de datos, etc. entonces la cosa cambia.

Ejemplos de uso:

En esta sección he incluido unos cuantos ejemplos de cada. Los primeros son sencillos y solo hacen uso del ID del dispositivo para que después el Arduino haga una u otra cosa según se lo hayamos programado. Los segundos hacen uso de la memoria EEPROM y son bastante mas complejos aunque al ser ejemplos bastante didácticos creo que se entiende bien como se ha de usar la memoria

 

Mostrar la información del chip de la Shield

 

Mostrar el ID del dispositivo NFC leído

 

Mostrar mediante texto que dispositivo NFC se ha leído

 

Encender o apagar un led al leer determinado dispositivo NFC

 

Cambiar el color de un led RGB según la llave NFC leída

 

A partir de aquí comienzan los ejemplos de uso de la memoria EEPROM, todos ellos han sido probados y funcionan correctamente. En cualquier caso no me hago responsable de lo que pueda suceder con ellos y los dispositivos NFC.

 

Almacenar en la memoria cuantas veces se ha leído una llave

Almacenar en la memoria un texto de 447 bytes

 

Almacenar estructuras de datos con las variables que queramos

Este ejemplo se compone de dos ficheros o sub-ejemplos, el primero es solo de escritura y el segundo de lectura.
Lo que hace el ejemplo de escritura es escribir en la EEPROM una estructura de datos Union, que contiene en su interior una estructura de datos Struct y que a su vez contiene 3 variables de tipo byte que almacenan el valor de luminosidad de los colores rojo, verde y azul. De este modo solo hay que pasarle la estructura Union al método writeAllMemory para que la escriba entera con todas las variables que hayamos metido en su interior, es realmente cómodo!

Lo mismo sucede con el segundo ejemplo que en este caso su funcion es leer la configuración grabada en la EEPROM y encender el Led RGB en los colores/tonalidades que hayamos indicado.

Como siempre recomiendo leer las respectivas entradas de estructuras Union y Struct para entender como funcionan.

Y con los ejemplos se termina esta review. Si te ha resultado de interés agradecería que la compartieras por Twitter o cualquier otra red social o página, así podre seguir recibiendo artículos para revisar y podre explicar como se usan 🙂

94 thoughts on “Shield NFC de Arduino para la lectura y escritura de llaveros y etiquetas

  1. hola!

    tengo una pregunta….

    tenes alguna idea de por que cuando ponga la libreria que vos modificastes, me sale Hello!
    Didn’t find PN53x board” no se que es lo que estoy haciendo mal….yo tengo el arduino duemilanove atmega 328, y utilizo el shield NFC de adafruit

    1. Hola Carlos,

      La shield de Adafruit se conecta al Arduino con el protocolo I2C, y esta que reviso usa el protocolo ISP.

      En realidad el chip soporta I2C, ISP y UART Serial. Pero dependiendo de como este fabricada la shield pues la preparan para que funcione con uno u otro protocolo.

      Entonces la librería que has de usar debe de estar preparada para ese protocolo. La que yo he modificado es de ElecFreaks (que a su vez modifico de SeeedStudio y estos a su vez de Adafruit), por eso no te funciona, porque la librería no es capaz de conectarse al chip.

      Con esta librería te debería de funcionar.

      Saludos!

    2. muchas gracias por la explicación, ahora ya me funciono! :D…pero ahora tengo otro problema ( perdon por las molestias )…quiero hacer un projecto en donde el objetivo es escribir una URI desde mi arduino, usando el shiel de adafruit y quiero lograr que un telefono con NFC (android) interprete este cadena de texto como una URI ( utilizando el prefijo 0 X 01 como lo indica la libreria ) pero no logro hacer eso…el telefono me dice ” etiqueta vacia ” tenes alguna idea de como podria ser???

      muchas gracias y perdon por la molestia

    3. Hola,

      Escribiendo cualquier otro texto te lo muestra? o es que no consigue grabar nada en la memoria?

      Creo que desde el propio móvil también puedes escribir en la memoria de la etiqueta.

      En cualquier caso para que se abra automáticamente no sé si bastara con que el texto tenga formato de URI o si hara falta un programa que lea la etiqueta y se de cuenta de ello.

      Siento no poder ayudar mucho mas, esas cosas no las he podido probar :/

  2. yo puedo grabar un texto desde el celular, y shield NFC lo reconoce y me lo muestra. pero si lo hago de forma inversa, el celular no lo puede leer!….

    muchas gracias por todo y si por casualidad logro hacer eso, te lo comento! 😀

  3. Hola ..muy bueno tu aporte…soy principiante disculparas la ignorancia pero al compilar el programa me arroja un error me dice que no la he nombrado antes:

    PN532 nfc(SCK, MISO, MOSI, SS);

    readAllMemoryBlocks.pde: In function ‘void loop()’:
    readAllMemoryBlocks:38: error: ‘class PN532’ has no member named ‘readPassiveTargetID’
    readAllMemoryBlocks:48: error: ‘class PN532’ has no member named ‘authenticateBlock’
    readAllMemoryBlocks:53: error: ‘class PN532’ has no member named ‘readMemoryBlock’

    “no matching function for call to PN532(int,int…)

    Tengo el IDE 1.5.2 De antemano te agradezco.

    Saludos!!

    1. Listo! Observando otra libreria, me di cuenta que no estaba definiendo PN532…y tampoco estaba agregando la libreia SPI….si colocas esto:

      #include
      #include

      #define SCK 13
      #define MOSI 11
      #define SS 10
      #define MISO 12
      #define PN532_CS 10
      PN532 nfc(PN532_CS);

      void setup(){

      (Resto del código)

      }

      Funciona perfecto….espero le sirva a alguien….

      Saludos!!!!

    2. Ups lo siento los dos primeros reenglones no los escribi completos…este es el bueno:

      #include
      #include

      #define SCK 13
      #define MOSI 11
      #define SS 10
      #define MISO 12
      #define PN532_CS 10
      PN532 nfc(PN532_CS);

      void setup(){

      (Resto del código)

      }

  4. Hola estamos haciendo un proyecto con este shield, y necesito leer lo que he grabado anteriormente con el movil, en una tarjeta. Al probar el ejemplo de readallmemoryblock no me saca los datablock ni los sector trailer. ¿Es porque he grabado mal la tarjeta? ¿o por haberla grabado con el movil? espero tu respuesta me ha ayudado mucho este blog gracias. Un saludo

    1. Hola,

      Asegúrate que el protocolo de las tarjetas sea compatible con la shield y el móvil. Por ejemplo las de esta entrada solo funcionan bien con la shield, con el móvil dan error ya que no soporta el protocolo de datos.

      Saludos.

    2. Hola de nuevo, con el módulo vino adjunta una etiqueta NFC, la intente grabar con el móvil pero no era compatible con mi terminal como tu dices, pero entonces ¿esta etiqueta esta inservible?, esque con el módulo tampoco me funciona, solo puedo utilizar la id de cada tarjeta para activar cargas, y por eso estoy confundido porque al venir la etiqueta adjunta, esta debería ser compatible para la lectura de datos. Un saludo y gracias.

    3. Hola de nuevo, tras muchos intentos, he visto que los errores eran de librería, pero la orden
      if(!nfc.writeAllMemory(id,valor,sizeof(valor.b))) , sigue sin funcionarme

      El error indica que la orden writeAllMemory no se nombra en la librería, por tanto volví a descargarla y tampoco funcionaba. Ejecuté la librería en PIC C Compiler un compilador de código C. El nombre de la orden esta pero la orden no se ejecuta. Por ser la placa de otro fabricante ¿podría haber algún conflicto con librerias?

      Gracias por todo Un saludo.

    4. Hola,

      Para usar los métodos writeAllMemory y readAllMemory que uso yo es necesario que la librería los tenga, abre los ficheros y comprueba si los tiene o no. Si estas usando mi librería modificada si los tiene porque yo se los he añadido, si estas usando otra libraría pues tendrás que añadírselos tu.

      Realmente esos métodos lo único que hacen es usar los métodos que ya trae de serie, por lo que si estas usando una shield parecida pero no la misma (la mía usa el protocolo ISP para funcionar) solo tendrás que adaptarlo.

      Saludos.

  5. hola que tal tengo una duda como solucionas el problema en PN532 nfc(SCK, MISO, MOSI, SS); los siguientes errores writeMifareMemory.pde: In function ‘void setup()’:
    writeMifareMemory:24: error: ‘class PN532’ has no member named ‘getFirmwareVersion’
    writeMifareMemory:36: error: ‘class PN532’ has no member named ‘SAMConfig’
    writeMifareMemory.pde: In function ‘void loop()’:
    writeMifareMemory:43: error: ‘class PN532’ has no member named ‘readPassiveTargetID’
    writeMifareMemory:56: error: ‘class PN532’ has no member named ‘authenticateBlock’
    writeMifareMemory:62: error: ‘class PN532’ has no member named ‘writeMemoryBlock’
    writeMifareMemory:70: error: ‘class PN532’ has no member named ‘readMemoryBlock’
    megustaria saber puesto que estoy tranajando en un proyecto similar y soy principiante agradeceria mucho

    1. no es igual es una placa PN532 NFC/RFID controller breakout board – v1.3 y estoy usando la libreria que ustd modifico la placa con la que estoy trabajando trabaja con sp1 y 12c y el error me lo marca cuando verifico que el programa corra bien agradeceria tu ayuda

    2. listo problema resuelto nada mas es cuestión de cambiar “WProgram.h” por “Arduino.h” tanto en el PN532.h y PN532.cpp quedando de la siguiente manera:

      #if ARDUINO >= 100
      #include “Arduino.h”
      #else
      #include “WProgram.h”
      #endif

      así quedaría

      #if ARDUINO >= 100
      #include “Arduino.h”
      #else
      #include “Arduino.h”
      #endif

      problema resulto gracias por tu aporte y la gran ayuda de tu post me ha sido de mucha ayuda

    3. No tiene sentido ese cambio. Esa condición esta así para que en versiones del IDE mayores a la 1.0.0 se incluya la librería Arduino.h, en cambio en versiones anteriores se debe incluir la librería WProgram.h

      La librería ya estaba preparada para funcionar con todos los IDEs, ahora con ese cambio no te funcionara con los viejos. Y me extraña que se haya arreglado con eso ya que si usas un IDE moderno la condición siempre iba a incluir el include del Arduino.h…

      Pero bueno, si dices que ya te va pues perfecto, eso es lo importante.

      Saludos.

  6. acabo de usar el codigo para escribir para en la tarjeta el texto que pones, pero necesito el codigo solo para leer, los ejemplos que vienen no leen el texto, me puedes dar luz sobre esto, muchas gracias!

    1. El código hace las dos cosas, la primera vez que lee la tarjeta escribe el texto y todas las demás veces solo lo lee.

      Borra la primera parte del código si lo único que quieres hacer es leer y listo.

      Saludos.

  7. Es posible clonar una llave? Mi intención es leer toda la memoria de una llave que abre una puerta para copiarlo en otra con la intencion de abrir también dicha puerta. Es posible?

    Gran trabajo!

    1. Y las llaves que pretendes copiar usan NFC? Usan un protocolo de acceso a memoria compatible? Tienes las contraseñas de acceso a los bloques de memoria para poder leer o escribir los datos?

      Sin todo eso no podrás copiar nada.

      Saludos.

    1. La placa para funcionar usa el protocolo ISP. En el Leonardo se da el caso de que los pines 13, 12, 11 y 10 que deberían de dar soporte a ese protocolo no lo hacen, y la shield tampoco tiene el conector ICSP para conectarse de ese modo al Arduino…

      Sin embargo la librería te permite indicar que pines quieres usar, así que aun siendo que la placa no tiene un pinout como la Uno luego la shield funciona perfectamente en el Leonardo, de hecho lo acabo de probar para confirmartelo.

    2. Ah vale muchas gracias, entonces que pines del Leonardo debo asignar a SCK, MISO, MOSI, SS para darle soporte?

    3. Los que se corresponden con el Arduino Uno, el 13, 12, 11 y 10. De hecho los ejemplos de esta entrada los puedes ejecutar sin modificar ya que vienen configurados bien.

    4. Entonces entiendo que de un móvil no se puede leer el ID de un dispositivo que no sea el PN532_MIFARE_ISO14443A, no? por ejemplo el del móvilo el bonometro no se puede leer?

    5. ya, pero había probado a reconocer mediante el móvil con nfc un bonometro y como si que lo reconocía pensaba que mediante el arduino podría leerlo igual

    6. estoy todavía impacientemente esperando a que me llegue la shield 😉 espero que me llegue esta semana porque tengo muchos proyectos en mente. Así que cuando pruebe eso lo cmentaré

    1. Si, lo vi pero no respondí porque no he usado mas ese modo para programar las placas. Sigo prefiriendo el Notepad++ y pegar a mano el código en el IDE de Arduino.

      En su día me funciono bien, solo puedo recomendarte que borres todas las configuraciones y pruebes de nuevo, algo debe de estar mal.

      Prueba si no este otro IDE, también esta bien: http://arduinodev.com/codeblocks

  8. hola tengo un modulo basado en el pn532 y el problema que tengo es que no puedo entrar en la memoria de unas tarjetas compradas por ebay

    las tarjetas de ebay son: Mifare 1k S50 IC
    Executive Standard: ISO14443A

    con las tarjetas y el llavero que venia el modulo todo funciona perfecto

    suponiendo que la contraseña es la estándar cual podría ser el problema?

    gracias

    1. Hola Andres,

      Supongo que el ID si que habrás podido leerlo, no?

      Posiblemente como dices el problema pueda ser la clave, pídele al vendedor que te facilite el datasheet, ahí te debería de aparecer la contraseña.

      Si no lo tiene busca mas información sobre esas tarjetas, a ver si en alguna que ponga una clave funciona con las tuyas.

      Si tampoco encuentras nada puedes intentar probar todas las claves. Te creas un bucle en el que escribas en un bloque y luego leas el numero, por ejemplo puedes grabar el numero de iteración y luego lo lees. Si coincide detienes el programa y lo imprimes por pantalla.
      Todo esto suponiendo que los 6 dígitos que componen la clave sean iguales ya que de lo contrario el Arduino se puede tirar la vida probando combinaciones.

      Saludos!

  9. hola
    muchas gracias por responder

    si, puedo leer e Id de las tarjetas
    ya le mande un mensaje al vendedor preguntándole sobre la clave.

    encontre estos 2 data_sheet:

    en el segundo data dicen que la contraseña es FF FF FF FF FF FF

    SI No es mucha molestia podrias explicarme detalladamente
    como crear el bucle para obtener la clave.
    esta es mi primera interacción que tengo con arduino

    saludos

  10. hola el vendedor me dice que utilice la aplicación TagWriter by NXP y en herramientas seleccione la opción limpiar y que con eso queda la tarjeta con configuración de fabrica

    pero no a dado resultado

    ejecute el programa para encontrar la clave pero tampoco obtuve un buen resultado,
    alguna otra opción?

    gracias por tu ayuda saludos

    1. YA solucione el problema puse KEY_B” y si la encontro.

      la pregunta es:
      que parte de la programación tengo que cambiar para poder escribir en la tarjeta?
      probe el ejemplo de escribir un texto largo y salio el mesaje de error de escritura

      saludos

  11. Hola,
    gracias por la Info de esta pagina, Consulta, necesito transferir un archivo pequeño desde mi shield NFC v2 de Seeed Studio a algún smartphone que tenga nfc, el problema es que no se como empezar…
    lo que tengo actualmente es:

    Arduino UNO R3
    Shield NFC v2 de Seed Studio
    Smartphone Motorola Rzr D3 (este es solo para hacer pruebas)

    me seria de utilidad y te lo agradecería por siempre si es que me pudieses ayudar.

    1. Hola,

      Lo primero que necesitaras es una etiqueta NFC que sea compatible con el móvil, de las de este articulo ninguna es compatible con mi Nexus5, así que no he podido probar todas esas cosas que comentas.

      Una vez tengas una entonces tendrás que mirar de grabar los datos con el móvil y leerlos con la shield, debería de ser mas fácil que hacerlo al revés, aunque claro también dependerá de cómo se guarden los datos. Pero como digo lo principal es tener una etiqueta compatible con ambos dispositivos, luego ya harás las pruebas..

      Saludos.

  12. Hola Alberto,

    estaba informandome sobre el uso del nfc y arduino cuando di con tu blog, por eso decidí comprarme la placa de elecfreaks. Está bastante bien explicado y me fue muy útil.
    Pero hay una cosa que no es del todo cierta. Los sector trailer son los últimos bloques de cada sector, no los primeros. Por ejemplo, si quieres acceder al bloque 4 tienes que usar la clave del bloque 7.

    Además, los métodos que has hecho son muy útiles para empezar, pero no son universales ya que al cambiar alguna clave dejan de leer.

    El lunes próximo lunes, 9 de junio publicaré un tutorial sobre la seguridad del NFC. Estará disponible en el siguiente enlace:
    http://geekytheory.com/nfc-arduino-parte-3/
    En ese mismo tutorial explico como cambiar las claves, usando las mismas librerías, y sin perder el acceso.

    Un saludo!

  13. Hola que tal mira he estado usando los 2 metodos que agregaste a la libreria, pero dejame decirte que hay un problema con la escritura, esto debido a que si colocas una palabra de 5 caracteres esta la escribe con basura y cuando la leo la información la recibo con basura, ya solucione ese problema pero lo dejo como comentario nadamas.

    Saludos.
    PD. Ando preparando las modificaciones que le he hecho a la libreria para hacerla un poco mas universal.

    1. Hola,

      Tendrás algún problema en el código. El mio funciona perfectamente. Recuerda que no lees palabras, si no bytes/caracteres que almacenas en un array de tamaño N, si lees basura es porque estas leyendo demás.

      nfc-5letras

      Saludos.

  14. Hola,
    Yo de nuevo.
    Ya he logrado la escritura de texto (transferencia ida y vuelta del tag), pero aun no doy con el codigo de traspasar archivos pequeños entre la shiel arduino y los smartphones que he utilizado.
    Me podrias dar alguna referencia de como transferir archivos desde la Shield NFC v2 de Seed Studio, es decir utilizar mi pc como repositorio del archivo y realizar la transferncia por la arduino + la nfc shield al smartphone.

    Agradeciendo desde ya
    Francisco Peralta

    Arduino UNO R3
    Shield NFC v2 de Seed Studio
    Smartphone Motorola Rzr D3 (este es solo para hacer pruebas)

  15. He leido todos los comentarios y no he visto a nadie consultando mi duda, asiq ahí va:
    Un telefono con NFC, puede funcionar de forma pasiva? quiero decir…
    Que la shield me lea el ID, los datos de una eprom virual o lo que sea, del movil, y xq no, que escriba.
    cómo lo ves?
    lo que quiero que la shield haga es identificar telefonos, sin más

    1. La shield al acercar el móvil (Nexus5) lee un ID, pero es un número aleatorio que cambia con cada lectura por lo que no tienen ninguna utilidad.
      Imagino que sera necesario realizar una comunicación entre shield y móvil para que pueda autenticarse de algún modo.

  16. Hola a todo, una consulta.
    alguien sabe cuantas vecesss se puede escribir en el TAG NFC ??? me imagino que como todo tiene un limite.

    saludos.

    1. Hola,

      Si que tiene limite pero depende de las especificaciones de la llave, deberías de mirarlo en el datasheet. Lo he mirado yo en uno y dice que permite hasta 100.000 ciclos de escritura, pero como digo dependerá de la llave usada.

      Saludos

      Edit:

      – 1 kB, organized in 16 sectors of 4 blocks (one block consists of 16 byte)
      – User definable access conditions for each memory block
      – Data retention time of 10 years
      – Write endurance 100.000 cycles

  17. Saludos, has hecho un gran trabajo.
    Tengo una duda al momento de la escritura en las tarjetas.
    En tu código de escribir un largo texto en la memoria ocupas un vector byte y lo almacenas con texto.
    Como es posible almacenar el valor de una variable en el vector.
    Algo parecido a esto:
    String valor= "hola mundo";
    byte[] texto = valor;

    Gracias.

  18. Hola, lo que estoy intentado hacer es recibir un mensaje por comunicación serial, y almacenarlo en una variable, de manera que el contenido de dicha variable es la que deseo escribir en la tarjeta. El método que has implementado requiere como parámetro el vector en byte. Gracias.

    1. Char y byte son lo mismo, crea un array de bytes de tamaño X y ves llenandolo con lo que leas por el serial, después escribes en el tag todo de golpe (hasta el número de componente que leíste, el resto tiene basura), si lees 10 escribes 10, aunque de tu array sobren huecos de memoria porque es de tamaño 128 por ejemplo.

  19. Saludos, esta muy interesante tu aporte, yo estoy empezando con la tecnología NFC, al leerte me despejo varias dudas aparte de ver que puede no ser complicado manejar los módulos, te platico un poco lo que quiero hacer, tengo un programa en arduino el cual recibe información de un sensor digital, el cual me pasa cuantas veces ha dado vuelta una llanta y ese dato después lo convierto en distancia, teniendo XXXXXXXX distancia recorrida y esa distancia después descompongo en unidades, decenas, centenas,…, teniendo números del 0-9, originalmente esos datos lo guardo en la EEPROM de arduino, pero por cuestiones de actualización y novedad, necesito mandarlos a una etiqueta NFC para después ser leída por aparte, el punto es que voy a experimentar un poco con los códigos y ver que logro hacer, de nuevo muchas gracias por el aporte.

    1. Hola,

      No lo sé, no encontré documentación más extensa para añadir en la librería que modifique, pero intuyo que tendrá que ver con al forma de acceder a la memoria. Siendo que se puede elegir entre dos valores imagino que habrá dos formas o dos tipos de llaves distintas que requieran trabajar de forma distinta.

      Yo lo he dejado siempre como en los ejemplos y no me ha dado problema.

      Saludos.

  20. Buenas! Veo que hace tiempo desde el último comentario, pero ojala me pudieras contestar a esto..

    Tengo el shield de adafruit, y me funciona perfectamente con su libreria, tanto en I2C como en SPI, la cuestión es que necesito modificar el bit rate de 106kbps a 424kbps, o incluso a 848, y no veo por ningun lado que pueda hacerlo..
    en el manual de usuario del PN532 (http://www.nxp.com/documents/user_manual/141520.pdf) en la página 107 por ejemplo sí que dice que se puede modificar a esos valores, pero no se por donde tirar, ya que no tengo esas funciones o porque no descubro donde debería introducir tal comando…
    he preguntado en un par de foros, como en el de adafruit, y no han sabido contestarme.
    Entiendo que debo entrar al registro del propio chip PN532, pero no descubro cómo puedo hacerlo..

    muchas gracias de antemano!

    1. Hola,

      Si te fijas en la librería hay ciertas constantes que se corresponden con los “comandos” que se envían al PN532, investiga cómo se envían esos comandos y create un método que envié el de cambiar el baudrate.

      #define PN532_FIRMWAREVERSION 0x02
      #define PN532_GETGENERALSTATUS 0x04
      #define PN532_SAMCONFIGURATION 0x14
      #define PN532_INLISTPASSIVETARGET 0x4A
      #define PN532_INDATAEXCHANGE 0x40
      #define PN532_MIFARE_READ 0x30
      #define PN532_MIFARE_WRITE 0xA0

      Saludos.

    2. Ok!
      La verdad es que no controlo mucho de programación orientada a objetos, pero ya veo por donde pueden ir los tiros..
      Muchas gracias por la info!

    3. Buenas otra vez! Ya conseguí hacer aquello! Muchas gracias!
      Ahora estoy trasteando un poco para ir aprendiendo un poco más sobre NFC. Tengo un tag de tipo B y veo en la documentacion que, para que me conteste, debo enviar ciertos comandos (REQB por ejemplo).
      En un principio le estoy enviando el comando por I2C, pero no veo que me responda el ATQB.. le envío 0x05, 0x00, 0x01 (comando REQB, AFI 0 y N>1), ademas del CRC_B (con el polinomio x^16 + x^12 + x^5 + 1, esto lo he encontrado en stackOverflow, ya que no tengo la ISO…) , no se si me faltaría algo.. entiendo que no, pero al no recibir el ATQB por I2C… no se.. algo se me escapa.. ojala me puedas ayudar como antes!
      Muchas gracias de antemano!

    4. Ok. Gracias de todas formas.. lo he tenido un poco aparcado pero voy a ir viendo poco a poco a ver si puedo sacar algo mas, creo que se pueden hacer cosas muy interesantes con esto.
      un saludo!

  21. Buenos días, ante todo enhorabuena por este gran trabajo. Mi pregunta tiene relación con algunas respuestas que has dado, pero no soy capaz de que me lea nada. Igual que al compañero Carlos en el Monitor Serial me sale ‘Hi!
    No se ha encontrado ninguna placa con chip PN53x

    Te adjunto un foto: http://postimg.org/image/h4u3zsrbb/

    He copiado tus librerías personalizadas y nada. Gracias de antemano

    1. En principio parece la misma shield que la miá, no? Has revisado que las soldaduras están bien hechas, también que los jumpers smd que indica en protocolo están unidos igual?

      Debería de irte :/

      Saludos.

    2. Buenas!
      La verdad es que si es igual, debería de funcionar, como dice Giltesa, si están todas las soldaduras bien hechas..
      Eso sí, veo que usas un Arduino Mega, a lo mejor, la electrónica que queda debajo de la antena del Shield podría afectar a la frecuencia? puede que genere demasiado ruido.. a mi ya me ha pasado en alguna ocasión… o ese cable que aparece en la imagen cubriendo los pines… en un principio, lo ideal es que no haya componentes debajo ni cables que puedan interferir en el campo…
      Saludos,

  22. Hola de nuevo, he seguido vuestras recomendaciones y parece que he dado un paso más, gracias!!. Pero en las secciones ‘Mostrar el ID del dispositivo NFC leído’ y ‘Mostrar la información del chip de la Shield’, el cuadro de Monitor Serie no aparece ninguna información. Incluso abrí la tapa del tags por si tuviera un efecto amplificador. Link de la foto: http://postimg.org/image/iuitcokq9/

    Gracias.

  23. buenas
    perdona si esto no va aqui, pero llevo semanas volviendome loco
    yo tengo un RFID RC522 que compre online y lleva un llavero y una tarjeta, estas las lee perfecto, he comprado de dos fabricantes llaveros los primeros son como los que gastas, por lo que de duzco que no son compatibles, y tambien he comprado unos de FERMAX que exteriormente eran como el que yo tengo y tampoco lo lee, ahora estoy esperando otros, la verdad es que me desespera comprar estas cosas online y que luego no funcionen.

    en fin, gracias por desahogarme,

    donde puedo comprar la tarjeta NFC que tu tienes (el mismo modelo, etc…..) y sus llaveros para mi proyecto, a mi con le leea el ID me es suficiente

    otra duda, tu la tienes pinchada en un arduino, yo tengo arduino uno pero la quiero colocar dentro de una caja que da al exterior de la puerta y en el interior del local el arduino uno, es posible?.

    y sobre todo si me pudeiras orientar con el RFID RC522 te lo agradeceria muchisimo

  24. hola GILTESA gracias por tu aporte ¿tienes una libreria para adaptar el programa “Almacenar en la memoria cuantas veces se ha leído una llave” a un arduino uno con una rfid RC522?

  25. Saludos Giltesa! ante todo gracias por tu aporte, de verdad no he conseguido nada mas completo en cuanto a trabajar con RFID como lo que has publicado!, por mi parte estoy trabajando con un modulo RC522, en cuanto a la parte de lectura no he tenido problemas, pero no he podido escribir con éxito en la el tarjeta, sera posible adaptar tu librería para usarla como librería con un modulo RC522 y de ser posible podrias orientarme un poco? creo que la diferencia no es mucha, porque hasta usas los mismos pines de comunicación! de antemano gracias!

    1. Hola Luis,

      Aunque el protocolo de comunicación sea el mismo las instrucciones para la comunicación pueden no serlas, también pueden cambiar las direcciones de memoria del chip o de las etiquetas RFID. Es mejor que busques una librería específica para el RC522.

      Saludos.

  26. Hola Giltesa
    Primero que nada, tus proyectos son muy buenos, me encontre con tu pagina por que ando buscando una solucion a unos problemas con el modulo PN532. He estado intentando hacer P2P entre dos modulos, pero aun no lo he logrado, la pregunta es, es realmente posible hacer P2P entre dos modulos PN532?, Tienes alguna idea de como hacerlo?, He intentado varias librerias en arduino y en raspberry, pero aun no lo consigo. Espero me puedas ayudar.
    Saludos.

    1. Hola Jhordan,

      No tengo dos shields NFC ni he probado a conectar la que tengo con otro dispositivo NFC activo para intentar realizar una comunicación.
      Hay alguna librería que cuenta con métodos para pasar datos de un dispositivo a otra, la de esta entrada no.

      Saludos.

  27. Hola, buenas noches, tengo una pregunta, tengo un shield NFC, pero quiero leer varios chips NFC, imagina que cada uno tiene un valor almacenado, y quiero que a medida que los apile se vayan sumando esos valores, es posible hacer eso? si es asi, como lo puedo hacer?

    Saludos.

    1. Hola Raimundo,

      Prueba a apilarlos y a comprobar si la shield es capaz de leer varios ID de los tags al mismo tiempo, si es capaz de eso entonces mediante programación se debería de poder leer la memoria de varios para sumar su contenido.

      Saludos.

  28. Saludos!
    Gracias por el aporte.
    A mí me funciona todo correctamente, solo que tengo una taG que solo me lee la ID, no me muestra los bloques.
    ¿Cómo puedo hacer para ver y escribir en los bloques?
    Creo que tiene las Keys A y B ocultas
    ¿Cómo podría encontrarlas?

    Gracias

  29. Disculpa por revivir algo tan viejo pero no logro encontrar le ejemplo para leer todos los bloques de datos de la etiqueta, me podrias decir en donde se encuentra?

  30. gracias ya los he econtrado y ya todo esta trabajando de manera perfecta, solo tengo un problema compre 2 tipos de tarjetas, una ya esta funcionando y estoy practicando con la EEPROM escribiendo informacion y leeyendola, bueno ahora tengo estas otras etiquetas NTAG203 pero no logro leer la informacion de ellas, solo ID, eh llegado a la conclusion de que son las KEY las he buscado por todos lados, y no las encuentro inclusive en los datasheet, lo unico que me parece peculair, no sabras tu algo hacerca de estas etiquetas?. solo con mi celular puedo leerlas y asignarles funciones pero nada mas, intente borrar una y ponerla de fabrica pero solo se estropeado, use tambien el programa que diste para poder saber las keys pero nada, ni con KEY A o KEY B, saludos y gracias por la atencion.

    1. Hola Luis,

      ¿Pero esas tarjetas que no te van tienen un estándar de acceso a la memoria eeprom compatible con la shield? Hay varios estándars y si no es compatible no vas a poder acceder a la memoria.

      Saludos.

  31. Muy buen video tengo una pregunta estay desarrollando un proyecto en el cual necesito autorizar mis tag dos veces, y poder volver a cargarlos algo similar a como funciona el transporte publico donde tu pides que te carguen tantos pasajes y después tienes que ir a la estacion a que te las cargen con el nuevo valor que tu pidas.

    Mi pregunta es si esto es posible con arduino y este modulo agrades tu respuesta.

  32. Giltesa como estas?… tu entiendes mucho mas que yo de esto, estoy desarrollando un mini proyecto (tesis) seria como un pago de pasajes en colectivos, pero tengo una duda, yo se que es posible guardar datos en la tarjetas mifare pero es posible con un lector nfc ir actualizandolas como ir descontando por pasajes?… yo no encontre un ejemplo cercano, así que me decidí al final por una tarjeta que guarde el id, y el resto de las operaciones las haga el sistema… pero si sabes una mejor forma me gustaría que me lo comentaras por favor… gracias!!

    1. Hola Victor,

      Si tuviera que hacer algo así yo lo que haría seria que las llaves o tarjetas guardaran un token de autenticación que se renovase cada vez que la tarjeta es usada para comprar un pasaje.
      Esos tokens los genera el servidor y los asocia al ID único de cada llave, por lo que para poder pagar necesitas usar una llave concreta y el token que tiene asignado para el siguiente pago. El servidor también se encargaría de gestionar el saldo que tiene tu tarjeta y de generarte los nuevos tokens cada vez que se realice un pago.

      Problemas de hacerlo asi… pues que necesitas que el lector tenga conexión a internet para conectarse al servidor. Ventajas… pues que nadie puede intentar hackearte las llaves y añadir saldo para comprar/viajar gratis.

      Si lo quieres hacer del modo fácil puedes guardar el saldo en las propias llaves, mira los ejemplos en los que guardo datos, en vez de guardar colores como hago yo solo tienes que guardar el saldo o el número de viajes restantes.

      Saludos.

  33. Me quedo con la forma más fácil (por ahora), tengo pensado hacerlo lo más simple posible para presentarlo y luego ir haciéndolo más complejo más adelante… Voy probando con tus ejemplos muchas gracias por contestar…

  34. Hola Giltesa,

    Queria preguntarte que como podría extraer la información de un llavero NFC, ya que cuando consigo leerlo con tu código, lo unido que me da es un ID, pero no me muestra los bloques.
    Sabes que debería de hacer para poder tener dichas lecturas de los bloques?

    Gracias.

    1. Hola,

      Tienes que usar el ejemplo readAllMemoryBlocks para ver el contenido de la llave, pero solo funcionara si la clave de acceso a los bloques es la que tiene el código de ese ejemplo uint8_t keys[]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; si usas otra clave tendrás que indicarla para poder acceder a los datos.

      Saludos.

Escriba aquí su comentario