Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PN532 by elechouse problemi di comunicazione

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] PN532 by elechouse problemi di comunicazione

Messaggioda Foto Utenteshock » 5 lug 2019, 16:39

Un saluto a tutti. Vi scrivo perché è da ben 3 settimane che sto sbattendo la testa sul modulo in oggetto senza avere risultati. Vi spiego in breve la mia configurazione partendo da un Wi-Fi Kit 32 by heltec https://heltec.org/project/wifi-kit-32/ ed un modulo per RFID PN532 by elechouse http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_93&products_id=2242 che utilizzano il protocollo I2C (non voglio usare SPI).

Ho iniziato provando ad interfacciare i due con le librerie PN532 di Adafruit senza alcun risultato, girando quindi un po' in rete e sul sito del produttore elechouse, scopro che ha fatto una sua versione della libreria Adafruit. Finalmente con questa riconosco il modulo ma..... ora iniziano i guai nel senso che intanto scopro che quando faccio un reset di "arduino" con apposito pulsante, il modulo PN532 rimane attivo quindi mi viene restituito un "Didn't find PN53x board", al che devo scollegare il PN532 resettare arduino, ricollegare il pn532 e resettare di nuovo arduino. A volte il modulo viene riconosciuto e mi appare "Waiting for an ISO14443A card" ma da li non va più avanti oppure dopo qualche minuto va in timeout e non ne esce più. Ho provato anche a mettere due resistenze di pull-up tra SDA-SCL e Vcc 3v ma niente.

Qualcuno ha esperienza in merito e può darmi qualche indicazione?

Grazie
Avatar utente
Foto Utenteshock
5 2
 
Messaggi: 16
Iscritto il: 12 gen 2017, 14:46

0
voti

[2] Re: PN532 by elechouse problemi di comunicazione

Messaggioda Foto UtenteMassimoB » 5 lug 2019, 23:42

Posta circuito e codice, ancora il dono della chiaroveggenza molti non lo hanno ancora
MCSA Windows Server 2012 R2
Cisco CCNA R&S - Cisco CCNA Security - Cisco CCNA Cyber Ops
CompTia A+ - CompTia Linux+ - CompTIA Systems Support Specialist CSSS
CompTia Pentest+
Avatar utente
Foto UtenteMassimoB
13,7k 6 12 13
Expert free
 
Messaggi: 3035
Iscritto il: 28 ott 2012, 9:56
Località: Milano

0
voti

[3] Re: PN532 by elechouse problemi di comunicazione

Messaggioda Foto Utenteshock » 7 lug 2019, 1:29

MassimoB ha scritto:Posta circuito e codice, ancora il dono della chiaroveggenza molti non lo hanno ancora


Allego schema elettrico e codice come richiesto.

Codice: Seleziona tutto
/**************************************************************************/
/*!
    This example will attempt to connect to an ISO14443A
    card or tag and retrieve some basic information about it
    that can be used to determine what type of card it is.   
   
    Note that you need the baud rate to be 115200 because we need to print
    out the data and read from the card at the same time!

    To enable debug message, define DEBUG in PN532/PN532_debug.h
   
*/
/**************************************************************************/
  #include <Wire.h>
  #include <PN532_I2C.h>
  #include <PN532.h>
  #include <NfcAdapter.h>
 
  PN532_I2C pn532i2c(Wire);
  PN532 nfc(pn532i2c);
 
void setup(void) {
  Serial.begin(115200);
  Serial.println("Hello!");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
 
  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
 
  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  nfc.setPassiveActivationRetries(0xFF);
 
  // configure board to read RFID tags
  nfc.SAMConfig();
   
  Serial.println("Waiting for an ISO14443A card");
}

void loop(void) {
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
 
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
 
  if (success) {
    Serial.println("Found a card!");
    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID Value: ");
    for (uint8_t i=0; i < uidLength; i++)
    {
      Serial.print(" 0x");Serial.print(uid[i], HEX);
    }
    Serial.println("");
    // Wait 1 second be[code][/code]fore continuing
    delay(1000);
  }
  else
  {
    // PN532 probably timed out waiting for a card
    Serial.println("Timed out waiting for a card");
  }
}


Aggiungo una cosa strana, ho provato ad eseguire un codice di verifica delle periferiche I2C collegate ad arduino che viene fornito dal produttore della scheda ed invece di restituirmi "I2C device found at address 0x48" me li restituisce tutti da 0x00 a 0xFF. Di seguito il codice utilizzato per questo test.
Codice: Seleziona tutto
/* Heltec Automation I2C scanner example (also it's a basic example how to use I2C1)
*
* ESP32 have two I2C (I2C0 and I2C1) bus
*
* OLED is connected to I2C0, so if scan with Wire (I2C0), the return address should be 0x3C.
*
* If you need scan other device address in I2C1...
*      - Comment all Wire.***() codes;
*       - Uncomment all Wire1.***() codes;
*
* I2C scan example and I2C1
*
* HelTec AutoMation, Chengdu, China
* 成都惠利特自动化科技有限公司
* www.heltec.org
*
* this project also realess in GitHub:
* https://github.com/HelTecAutomation/Heltec_ESP32
* */

#include "Arduino.h"
#include "heltec.h"

void setup()
{
   Heltec.begin(true, false, true);
   //Wire.begin(SDA_OLED, SCL_OLED); //Scan OLED's I2C address via I2C0
   Wire1.begin(SDA, SCL);        //If there have other device on I2C1, scan the device address via I2C1
}

void loop()
{
   byte error, address;
   int nDevices;

   Serial.println("Scanning...");

   nDevices = 0;
   for(address = 1; address < 127; address++ )
   {
      //Wire.beginTransmission(address);
      //error = Wire.endTransmission();

      Wire1.beginTransmission(address);
      error = Wire1.endTransmission();

      if (error == 0)
      {
         Serial.print("I2C device found at address 0x");
         if (address<16)
         Serial.print("0");
         Serial.print(address,HEX);
         Serial.println("  !");

         nDevices++;
      }
      else if (error==4)
      {
         Serial.print("Unknown error at address 0x");
         if (address<16)
            Serial.print("0");
         Serial.println(address,HEX);
      }
   }
   if (nDevices == 0)
   Serial.println("No I2C devices found\n");
   else
   Serial.println("done\n");

   delay(5000);
}
Allegati
circuito.png
Avatar utente
Foto Utenteshock
5 2
 
Messaggi: 16
Iscritto il: 12 gen 2017, 14:46

0
voti

[4] Re: PN532 by elechouse problemi di comunicazione

Messaggioda Foto Utenteluxinterior » 7 lug 2019, 12:14

Andare a leggere codice sul forum è peggio che andare di notte
Alcune cose veloci:
oscilloscopio o analizzatore su linee I2C e vedi cosa passa realmente
Senza sapere leggere o scrivere se la periferica I2C reagisce devi vedere il nono bit (ACK) a zero. Infatti in quella fase è la periferica che ricevuto un byte abbassa la linea dati. Se non succede controlla l'indirizzo ricorda che dev'esser shfitato di 1 perché il bit 0 del primo byte è il tipo di operazione rd/wr.
nel link che hai messo nel primo messaggio Il produttore della tua schedina segnala cloni cinesi fake forse il tuo è di quelli.
Avatar utente
Foto Utenteluxinterior
2.412 2 4 8
Expert EY
Expert EY
 
Messaggi: 1432
Iscritto il: 6 gen 2016, 17:48

0
voti

[5] Re: PN532 by elechouse problemi di comunicazione

Messaggioda Foto Utenteshock » 24 lug 2019, 12:43

luxinterior ha scritto:Andare a leggere codice sul forum è peggio che andare di notte
Alcune cose veloci:
oscilloscopio o analizzatore su linee I2C e vedi cosa passa realmente
Senza sapere leggere o scrivere se la periferica I2C reagisce devi vedere il nono bit (ACK) a zero. Infatti in quella fase è la periferica che ricevuto un byte abbassa la linea dati. Se non succede controlla l'indirizzo ricorda che dev'esser shfitato di 1 perché il bit 0 del primo byte è il tipo di operazione rd/wr.
nel link che hai messo nel primo messaggio Il produttore della tua schedina segnala cloni cinesi fake forse il tuo è di quelli.


Grazie per la risposta e scusa il ritardo ma ho avuto poco tempo. Ho risolto il problema anche se non come avrei voluto. Sostanzialmente ho dovuto aggiungere altre 2 connessioni, una al pin IRQ ed una al pin RST (nella foto è il foro più a destra sotto al pn532), in questo modo ogni volta che premo il pulsante di reset viene resettato anche il pn532. Ho inoltre rifatto le saldature ai piedini dell'arduino perché mi sono accorto che c'erano problema nella comunicazione i2c.
Avatar utente
Foto Utenteshock
5 2
 
Messaggi: 16
Iscritto il: 12 gen 2017, 14:46


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti