R4 Minima e Pn532

Buongiorno a tutti, chiedo una cortesia riguardo al problema di utilizzo del codice che allego caricato su di un R4 Minima. Questo codice funziona su di un Arduino UNO. Infatti riesco a leggere le Tessere. Caricato su di una R4 ottengo solo la scritta "Didn't find PN53x board" Naturalmente ho collegato i terminali SCL-SDA specifici della scheda. Ho provato anche a collegarli sui terminali A4-A5, stesso risultato. Utilizzando le librerie PN532 della Adafruit è possibile selezionare solo gli ingressi di Reset e Irq ma non I2C, dopo aver abilitato la Arduino Minima. Chiedo gentilmente un aiuto riguardo a questa difficoltà. La R4 è la scheda che devo utilizzare. Grazie per l'attenzione.

#include <NfcAdapter.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <Wire.h>
//----------------------------------------------------
PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);
void setup() {
Serial.begin(115200);
nfc.begin();
}

void loop() {
if(nfc.tagPresent()){
  NfcTag tag = nfc.read();
  String id = tag.getUidString();
  Serial.print("id=");  Serial.print(id);  Serial.println("#");

  checkTag(id);
}
delay(2000);

}
void checkTag(String id){

}

A me sembra che stai facendo un miscuglio di librerie ...
... guardati SOLO gli esempi della Arduino_NFC (PN532_I2C fa parte di quel pacchetto) e prova se quelli funzionano ... poi vedi ciò che ti occorre eventualmente aggiungere.

Guglielmo

Grazie, sto provando un esempio di lettura. vediamo

Ho provato ma ottengo sempre questo errore "C:\Users\frman\OneDrive\Documents\Arduino\read_mifare\read_mifare.ino:26:1: error: 'PN532' does not name a type
PN532*board = new PN532_I2C(IRQ, RESET); riferito a questo codice :

**************************************************************************/
/*! 
    @file     read_mifare.pde
    @author   odopod thisispete
    @license 
    
    This file shows how to initialize either the SPI or I2C versions of the 
    pn532 development sheilds and read a mifare tag. 

*/
/**************************************************************************/


//compiler complains if you don't include this even if you turn off the I2C.h 
//@TODO: look into how to disable completely
#include <Wire.h>

//I2C:

#include <PN532_I2C.h>

#define IRQ   2
#define RESET 3

PN532*board = new PN532_I2C(IRQ, RESET);

//end I2C -->

//SPI:

//#include <PN532_SPI.h>
//
//#define SCK 13
//#define MOSI 11
//#define SS 10
//#define MISO 12
//
//PN532 * board = new PN532_SPI(SCK, MISO, MOSI, SS);

//end SPI -->

#include <Mifare.h>
Mifare mifare;
//init keys for reading classic
uint8_t Mifare::useKey = KEY_A;
uint8_t Mifare::keyA[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
uint8_t Mifare::keyB[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
uint32_t Mifare::cardType = 0; //will get overwritten if it finds a different card

#include <NDEF.h>

#define PAYLOAD_SIZE 224
uint8_t payload[PAYLOAD_SIZE] = {};

void setup(void) {
  Serial.begin(115200);

  board->begin();

  uint32_t versiondata = board->getFirmwareVersion();
  if (! versiondata) {
    Serial.println("err");
    while (1); // halt
  }
  
  // Got ok data, print it out!
  Serial.print("5");Serial.println((versiondata>>24) & 0xFF, HEX); 
//  Serial.print("v: "); Serial.println((versiondata>>16) & 0xFF, DEC); 
//  Serial.println((versiondata>>8) & 0xFF, DEC);
//  Serial.print("Supports "); Serial.println(versiondata & 0xFF, HEX);
  


  if(mifare.SAMConfig()){
    Serial.println("ok");  
  }else{
    Serial.println("er");
  }
  
  
}



void loop(void) {
 uint8_t * uid = mifare.readTarget();
 if(uid){
   Serial.println(Mifare::cardType == MIFARE_CLASSIC ?"Classic" : "Ultralight");
    
    memset(payload, 0, PAYLOAD_SIZE);
    
      //read 
    
      mifare.readPayload(payload, PAYLOAD_SIZE);
  
      FOUND_MESSAGE m = NDEF().decode_message(payload);
      
      switch(m.type){
       case NDEF_TYPE_URI:
         Serial.print("URI: ");
         Serial.println((int)m.format);
         Serial.println((char*) m.payload); 
        break;
       case NDEF_TYPE_TEXT:
         Serial.print("TEXT: "); 
         Serial.println(m.format);
         Serial.println((char*)m.payload);
        break;
       case NDEF_TYPE_MIME:
         Serial.print("MIME: "); 
         Serial.println(m.format);
         Serial.println((char*)m.payload);
        break;
       default:
         Serial.println("unsupported");
        break; 
      }  
 }
 delay(5000);
}

PN32 * board è una variabile richiamata su Mifare .h

Ho provato con uno scanner e non trova nessuna scheda connessa. Posso pensare che è un problema di connessione I2C ma non so che fare! La scheda funziona sull'UNO!

Io vedo nel codice a te riportato:

mentre nell'esempio della libreria:

PN532 * board = new PN532_I2C(IRQ, RESET);

... perché hai modificato quella riga togliendo gli spazi?

Le altre librerie ci sono tutte?

Guglielmo

Scusa ma l'ho riportato poi per correttezza del programma. Ho provato a togliere gli spazzi sia ne codice che nella libreria, riportando il tutto all'origine. Comunque non cambia nulla.

Si le librerie le ho caricate tutte.

NO, gli spazi vanno lasciati ...

in mifare.h è definito:

extern PN532 * board;

e, nell'esempio:

PN532 * board = new PN532_I2C(IRQ, RESET);

... quindi NON ti devi mettere a toccare le cose.

Tutte le librerie del pacchetto le hai? O hai scaricato solo la PN532_I2C? Perché servono tutte ... :roll_eyes:

Guglielmo

Scusami, sto vedendo un post di luglio dove dice di mettere dei resistori da 4K7 sulle linee SDA e SCL. Provo ma ho dubbi, sono connesso solo con questa schedina a 5 cm scarsi di distanza. Provo!

Dove le hai messe? Perché, purtroppo, quella è una collazione di moduli, ma NON è una libreria in formato valido per Arduino (mancano alcuni files) e non credo che il library manager la riconosca ...

Guglielmo

Infatti ! Ho creato una cartella denominata Mifare e ciò messo tutti i files delle librerie richieste.

Messa poi nella cartella Librerie di arduino

Ho dimenticato! La libreria che mancava era solo la Mifare, che ha poi riconosciuto.

Sto provando a compilare per R4 MINIMA, ma ... ricevo errori ... ci sono cose che sono tipiche in ambiente AVR e NON vanno bene in ambiente ARM ... non so se quelle librerie sono utilizzabili su ARM ... devo vedere se trovo come risolvere :roll_eyes:

Guglielmo

Allora, sono riuscito a compilare l'esempio senza alcun errore per UNO R4 ... ma questo non significa che funzioni correttamente :grin:

Ti allego uno zip con la cartella del progetto con dentro i files modificati (essenzialmente NDEF.cpp che dava errore) ... prova ... compilare compila, andare chissà :roll_eyes:

read_mifare.zip (14.0 KB)

Fammi sapere ...

Guglielmo

Ti chiedo di tralasciare, ho messo le resistenze sui terminali SDA e SCL e ho caricato il programma Scanne I2c ed ha riconosciuto la scheda. Nel caricare il codice iniziale ha letto la tessera. Quindi tutto risolto. Ti ringrazio per la disponibilità

Vuoi che provi ugualmente i tuoi files ?

Cioè ... avevi un modulo SENZA le resistenze di pull-up? :open_mouth:

Bah, se hai risolto non so se ne vale la pena, se vuoi ... è giusto una compilazione ed un test ...

Guglielmo

Li ho provati e si caricano, purtroppo non leggono. Mi da "err". Ti ringrazio.