Programación NFC

Hola buenas,

Estoy intentando aprender a usar módulos NFCs para distintos proyectos. He conseguido conectar la placa pn532 al arduino y leer el id de las tarjetas correctamente con la librería correspondiente.

Ahora estoy tratando de escribir y leer en la memoria de cada tarjeta pero me da errores.

He seguido los ejemplos de este tutorial: http://forum.arduino.cc/index.php?topic=179972.0

Y me aparece "clave es incorrecta o error de lectura"

No entiendo muy bien cómo funciona la lectura y escritura de las mismas ¿Alguien me lo puede explicar? Gracias anticipadas

Empiezas mal presentando tu problema.
Qué codigo estas corriendo?
Alguno de los ejemplos citados, funciona?

Ya he dicho que he seguido los ejemplos del tutorial de este link: http://forum.arduino.cc/index.php?topic=179972.0 y que lo que me funciona es la lectura del ID de las tarjetas NFCs, pero que en la lectura y escritura de las mismas no consigo resultados.

Por eso pedía una explicación de cómo se lee y se escribe en las tarjetas, para resolver mi problema.

Si quieres copio algún ejemplo que me funciona, cómo el de cambiar color LED RGB en función de la tarjeta.

/**
* Author:     Alberto Gil Tesa
* WebSite:    http://giltesa.com
* License:    CC BY-NC-SA 3.0
*
* Description:
*   ARDUINO SHIELD NFC PN532 ISP
*
*   Ejemplo de uso de la shield NFC con chip PN532.
*   Lee llaveros NFC y enciende un Led RGB en el
*   mismo color que el llavero.
*/


#include <PN532.h>

// Shield NFC:
#define SCK         13
#define MOSI        11
#define SS          10
#define MISO        12

// Pines LED RGB:
#define LED_AZUL    2
#define LED_VERDE   3
#define LED_ROJO    4

// IDs llaveros NFC:
#define LIMA        4256651814
#define AZUL        2906087206
#define ROJO        1564564006
#define AMARILLO    4249704998
#define BLANCO      2864817847
#define GRIS_OFF    1833064998


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


void setup()
{
  Serial.begin(9600);
  nfc.begin();
  nfc.SAMConfig();

  pinMode( LED_AZUL  , OUTPUT );
  pinMode( LED_VERDE , OUTPUT );
  pinMode( LED_ROJO  , OUTPUT );
}


void loop()
{
  uint32_t id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

  if( id > 0 )
  {
     switch(id)
     {
        //                      ROJO , VERDE , AZUL
        case LIMA     : ledRGB(    0 ,   255 ,   0 ); break;
        case AZUL     : ledRGB(    0 ,     0 , 255 ); break;
        case ROJO     : ledRGB(  204 ,     0 ,   0 ); break;
        case AMARILLO : ledRGB(  160 ,   255 ,   0 ); break;
        case BLANCO   : ledRGB(  255 ,   255 , 255 ); break;
        case GRIS_OFF : ledRGB(    0 ,     0 ,   0 ); break;
     }
  }
}


void ledRGB( byte rojo, byte verde, byte azul )
{
  analogWrite( LED_ROJO  , rojo  );
  analogWrite( LED_VERDE , verde );
  analogWrite( LED_AZUL  , azul  );
}

Y otro que NO me funciona, el cual se basa en lo citado anteriormente, escribir en la memoria:

/**
* Author:     Alberto Gil Tesa
* WebSite:    http://giltesa.com
* License:    CC BY-NC-SA 3.0
*
* Description:
*   ARDUINO SHIELD NFC PN532 ISP
*
*   Ejemplo de uso de la shield NFC con chip PN532:
*   Contabiliza el numero de veces que se lee la llave.
*   Con cada lectura se suma 1 al contador de la EEPROM de
*   la llave y se imprime el resultado por el monitor serial.
*/


#include <PN532.h>

// Shield NFC:
#define SCK        13
#define MOSI       11
#define SS         10
#define MISO       12


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


void setup()
{
  Serial.begin(9600);
  nfc.begin();
  nfc.SAMConfig();
}


void loop()
{
  // Contador es un array de bytes de tamaño 1, es necesario crear la variable de este modo ya que el metodo que escribe la informacion espera recibir un puntero hacia el dato.
  byte contador[1];

  // Es la clave de acceso necesaria para acceder a cada sector de la memoria:
  byte keys[]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};


  uint32_t id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

  // Si se obtuvo un ID...
  if( id > 0 )
  {
     // Antes de hacer uso de la memoria es necesario autenticarse con la clave de acceso, para ello se le pasa como parametro:
     // - El tipo de tarjeta, pudiendo elegir entre 1 o 2.
     // - El ID de dispositivo NFC al que queremos acceder a su memoria.
     // - La direccion de memoria del bloque en el que queremos autenticarnos, no se le indica el bloque que contiene la clave, si no al que se quiere acceder. El solo se apaña para encontrar la clave correspondiente al bloque.
     // - El tipo de clave, se puede elegir entre KEY_A o KEY_B.
     // - La clave de arriba.
     if( nfc.authenticateBlock(1, id ,0x08, KEY_A, keys) )
     {
        // Una vez autenticados se lee en el bloque 0x08, 1 byte de memoria.
        if( nfc.readMemoryBlock(1, 0x08, contador) )
        {
           // Cada 255 lecturas de la tarjeta se resetea el contador:
           if( contador[0] >= 255)
              contador[0] = 0;

           // Se suma 1 al contador cada vez que se hace una lectura con la Shield:
           contador[0] += 1;

           Serial.print("Contador= "); Serial.println(contador[0]);

           // Se escribe el nuevo valor del contador en el bloque 0x08:
           nfc.writeMemoryBlock(1, 0x08, contador);
        }
     }
     else
     {
        Serial.println("Clave incorrecta o error de lectura");
     }

  }

}

Gracias de todas formas por responder :wink:

Buenas.

Habiendo mirado un poco por encima el post al que te refieres, maricotorillas, giltesa dice que ha debido de modificar la librería, no he podido mirar demasiado, con lo que no se si el código al que te refieres tú es ya el modificado o no..

Mi pregunta es otra, respecto a este mismo tema, en el que no encuentro respuesta y si está en algún lado no lo encuentro, desde luego..

He visto en el manual de usuario del PN532 que se puede modificar el bit rate de transmisión para leer/escribir, que por defecto es de 106 kbps para tarjetas Mifare hasta 848 kbps. Según entiendo, debo enviar el comando D4 58 30 según dice en la página 107.. probablemente me estaré confundiendo, ya que no me funciona, o no envío bien el comando. Lo hago vía I2C de esta manera:

  Wire.beginTransmission(0x48); // supuestamente 0x48 es la direccion del PN532 para escribir en el mismo
  Wire.write(0xD4);        // primer byte del input
  Wire.write(0x58);        // segundo byte del input
  Wire.write(0x30);        // ultimo byte donde se dice la velocidad y el tipo de tarjeta (Mifare o FeliCa)
  Wire.endTransmission();    // stop transmitting

pues eso.. que no hay manera...

muchas gracias de antemano y saludos!

manual de usuario del PN532 --> http://www.nxp.com/documents/user_manual/141520.pdf

Esa es mi duda también… no sé cómo se lee y escribe en las tarjetas MiFare, todavía no he conseguido cómo hacerlo.

¿Alguien sabe cómo leer y escribir en tarjetas NFC?

Vale, ya lo he conseguido, con el ejemplo y las librerías de giltesa, pero mis tarjetas tienen 'KEYS_B' en vez de 'KEYS_A' que hay en su código (en la parte de autentificación: nfc.authenticateBlock(1, id, 0x08,KEY_B,keys)

yo también lo he conseguido!
tenía que entrar en adafruit_PN532.h y .cpp e introducir nuevos metodos según las necesidades… y eso sirve para todos los tipos de tarjetas, ya sean tipo A, B, 14443-3 o -4,etc…