PN532 Breakout Board Adafruit - problème de lecture NFC

Bonjour à tous !

Je travaille sur un petit projet : une porte qui s'ouvre grâce à un badge NFC.

Pour cela j'utilise :

Mon code est ok au téléversement, et il fonctionne : la breakout board reconnait les puces NFC (je ne suis pas encore à l'étape de lecture d'une puce précise), et envoie le signal au relais comme demandé.

Mais à l'installation, j'alimente l'arduino avec un transfo... Et là ça ne fonctionne plus. :frowning:
J'ai tenté plusieurs transfo aux tensions et voltage différents sans succès. J'ai eu un petit moment de réussite en branchant un transfo de chargeur de portable au port USB B de l'Arduino, mais ça fonctionne une fois sur deux.

En résumé :

Projet de lecture de puce NFC :

Alimentation par laptop :

  • LED Arduino ok
  • LED relais OK
  • LED breakboard OK
  • le relais s'enclenche quand on passe une puce devant la breakboard

Alimentation par transfo :

  • LED Arduino ok
  • LED relais OK
  • LED breakboard OK
  • le relais ne s'enclenche pas quand on passe une puce devant la breakboard

Où j'en suis :
J'essaie de déterminer l'endroit où ça coince. Je pense que c'est :

  • soit la breakout board qui ne capte plus la puce
  • soit la breakout board qui capte la puce mais n'envoie pas le signal
  • soit le relais qui ne reçoit pas le signal
  • soit mon code qui a une couille quelque part...

Mon code :

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

#define PN532_IRQ   (8)
#define PN532_RESET (3)

Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
const int GACHE = 11; 

void setup(void) {
  pinMode(GACHE, OUTPUT);
  Serial.begin(115200);
  Serial.println("Bonjour !");
     

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("La carte PN53x n'a pas été trouvée");
    while (1); // halt
  }
  
  // Got ok data, print it out!
  Serial.print("Carte PN5 reconnue"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Version : "); 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("En attente d'un badge ISO14443A");
}

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("Badge RFID détecté !");
    digitalWrite (GACHE, HIGH);
    Serial.print("UID longueur: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID valeur: ");
    for (uint8_t i=0; i < uidLength; i++) 
    {
      Serial.print(" 0x");Serial.print(uid[i], HEX); 
    }
    Serial.println("");
	// Wait 1 second before continuing
	delay(1000);
  }
  else
  {
    // PN532 probably timed out waiting for a card
    Serial.println("Timed out waiting for a card");
  }
}

Dans tous les cas : est-ce que ce serait l'alimentation qui cause ce problème ? Et si oui, quelles seraient vos suggestions ?

Merci pour vos réponses !

Votre image pour qu'on puisse la voir:

postez votre code

avez vous testé avec un code tout simple de lecture de l'ID du badge ?

Bonjour,

Merci pour votre réponse ! Le code est dans mon premier post :slight_smile:

Je vais tester avec une lecture simple de l'ID du badge... Mais je devrai quand même lier ça à une LED ou quelque chose ; le problème se présente quand l'arduino est alimenté par transfo (donc je ne suis pas sur un PC et n'ai pas accès au moniteur pour un SerialPrint).

Hawleyomalley:
Bonjour,

Merci pour votre réponse ! Le code est dans mon premier post :slight_smile:

Je vais tester avec une lecture simple de l'ID du badge... Mais je devrai quand même lier ça à une LED ou quelque chose ; le problème se présente quand l'arduino est alimenté par transfo (donc je ne suis pas sur un PC et n'ai pas accès au moniteur pour un SerialPrint).

dsl pour le code - il est bien posté

--> oui utilisez la LED interne à votre arduino

concernant

#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

#define PN532_IRQ   (8)
#define PN532_RESET (3)

ce ne sont pas les pin standards pour le SPI - pourquoi ne pas utiliser le SPI hardware ?

Comme c'est la première fois que j'utilise des protocoles, j'ai demandé à un ami de m'expliquer les câblages, il a préféré établir ça en I2C d'emblée. Est-ce que le SPI est plus adapté ?

MISO, MOSI et compagnie c’est SPI, pas Wire / I2C

Comment est réglée la configuration de sel0 et sel1 ?

Le tuto dit que cette librairie est recommandée, pas l'ancienne Qui était seulement en I2C. Laquelle avez vous?

Le tuto explique comment configurer et utiliser SPI et il semble que ce soit du 3.3 V donc qu’il faille passer par un level shifter

Ils disent aussi

If you are using the breakout in I2C mode, you will also need to add two 1.5K pullups on the SCL/SDA lines, since the breakout and the Arduino don't include the pullups. Simply solder or add a 1.5K resistor between SCL and 3.3V, and SDA and 3.3V, and then connect the breakout as you normally would.

Bonjour,

Mes excuses pour cette réponse tardive ; j'ai fait des recherches pour vous répondre au mieux, mais c'est mon tout premier projet Arduino et certaines choses m'échappent encore !

Sel1 était sur OFF et Sel0 sur ON. Comme je suis en train de tester le tutoriel que vous m'avez lié (en SPI), j'ai changé le câblage et mis Sel0 sur OFF et Sel1 sur ON comme recommandé.

J'ai recommencé mon code en SPI en suivant le tutoriel (sans level shifter, en branchant la pin 3.3V de l'arduino à la 3.3v de la breakout board). Pour la librairie, j'utilise bien celle que vous avez liée (SPI and I2C library), et je suis les exemples proposés avec succès :slight_smile:

Petite vérification car un doute reste : pour ce qui est du level shifter, la pin 3.3V de l'arduino ne fournit pas directement de 3.3V ?

En tout cas merci pour votre réponse !