[Arduino] déverouillage / Vérouillage par RFID

Bonjour à tous.

Actuellement en terminale STI2D, je me suis fait attribué comme projet la création d'un système de verouillage/dévérouillage sur une poubelle.
Pour mener à bien ce projet j'ai à disposition : une carte Arduino Uno , un shield RFID ainsi que des cartes mifare ( PN532) en I2C.

N'ayant pas tres fort en arduino je me suis vu obligé "d'improviser" avec Internet sur le début de mon projet mais maintenant cela se complique et j'aurais besoin de votre aide.

En ce qui concerne le code , je n'ai pas réellement d'idée excepté le fait que lorsque le shield détecte la bonne carte Mifare cela déverouille ou verrouille la poubelle. Cependant j'ai le code de la lecture de la carte.

J'ai déja cherché sur Internet sans succès , les tutoriels ne m'aidant pas non plus, je me retrouve coincé car je n'ai pas la moindre idée du programme à faire. Si une personne pouvait m'aiguiller j'en serais ravi. Si vous avez des questions je reste à votre écoute pour de plus amples informations si je peux y répondre.

Merci d'avance.

Bonjour

j'ai taper :carte mifare arduino tuto sur google

et j'ai parcouru 2 ou 3 tuto super bien expliqué.

Bonjour

je suis deja tombé sur ces tuto mais ils sont sur une autre carte (la RC552) et je ne saurai pas convertir le code sur la mienne qui est la PN532

Avez vous essayer la librairie d'adafruit ?

Oui je l'ai utilisé pour lire le badge

Et bien, il suffit de faire une condition avec la numéro de la carte qui actionne le déverrouillage de la poubelle.

Par quelle moyen est déverrouiller la poubelle ?

justement je chercher comment faire cette condition avec le numéro de la carte qui déverrouille la poubelle.

la poubelle se déverrouille avec un tag RFID et un lecteur RFID.

if ( numerodelacarte = numerodelacarteenregistré)
{

actionOuvrirlapoubelle; // je sais pas comment vous n'avez pas indiqué l'actionneur , moteur? servomoteur ?
}

else {

}
if ( numerodelacarte = numerodelacarteenregistré)

Attention : on ne compare pas un uid de carte comme ça (surtout avec un opérateur =).

Si l'on regarde cet exemple :

uid est un tableau de bytes (uint8_t).

Donc en supposant que tu veuilles comparer l'uid de la carte avec un uid connu :

Utilise plutôt memcmp(uid, uid_connu, uidLength);

Oui je l'ai utilisé pour lire le badge

Qu'as-tu lu comme N° de carte ? Avec quel code ?

hbachetti:
Utilise plutôt memcmp(uid, uid_connu, uidLength);

Si elle retourne 0 c'est que la carte utilisé correspond à la carte enregistré ?

Oui. Cela veut dire ZERO différence.

On peut aussi comparer avec un opérateur == en convertissant l'UID en unsigned long, seulement si l'UID est sur 4 octets (le cas le plus courant).

Mais cela implique une transformation. Tu peux par exemple lire la carte et afficher l'UID comme ceci :

Serial.println(*(uint32_t *)uid, HEX);

Si ton UID est 59 39 9C 55 tu afficheras 559C3959.

C'est à l'envers parce que un ATMEGA328 est comme un INTEL (little endian).

Ensuite tu peux comparer avec :

    if (memcmp(uid, "\x59\x39\x9C\x55", 4) == 0) {
      Serial.println(F("59 39 9C 55 OK"));
    }
// OU
    if (*(uint32_t *)uid == 0x559C3959) {
      Serial.println(F("59 39 9C 55 OK"));
    }

Mais bon, tu avoueras que le bénéfice est mince ...

hbachetti:
Qu'as-tu lu comme N° de carte ? Avec quel code ?

0xB8 0x31 0x22 0x00 0xCB 0xC3 0xF5 0xA4 0xA0 0x1A 0x23 0x00

0xDB 0xCD 0xF6 0x95 Voici 4 N° de carte que j'ai pu lire avec ce code :

en le modifiant un petit peu pour qu'il soit en I2C et non en SPI

Tes uid sont sur sur 4 octets.

Avec le code exemple Adafruit la transformation en unsigned long (uint32_t) est déjà faite (cardId) :

    if (uidLength == 4)
    {
      // We probably have a Mifare Classic card ... 
      uint32_t cardid = uid[0];
      cardid <<= 8;
      cardid |= uid[1];
      cardid <<= 8;
      cardid |= uid[2];  
      cardid <<= 8;
      cardid |= uid[3]; 
      Serial.print("Seems to be a Mifare Classic card #");
      Serial.println(cardid);

      if (cardid == 0xB8312200) {
        Serial.println(F("carte reconnue"));
      }
      else if (cardid == 0xCBC3F5A4) {
        Serial.println(F("carte reconnue"));
      }

       // et ainsi de suite ...
    }

Ah oui Mercii et une fois fait cela, comment faire en sorte que si une carte inconnu vienne cela nous dise

carte non reconnue ?

      if (cardid == 0xB8312200) {
        Serial.println(F("carte reconnue"));
      }
      else if (cardid == 0xCBC3F5A4) {
        Serial.println(F("carte reconnue"));
      }
      // ... autres cartes ICI
      else {
        Serial.println(F("carte non reconnue"));
      }

C'est une solution simple.
On peut imaginer mettre les N° de carte connus dans un tableau :

uint32_t knownCards[] = {0xB8312200, 0xCBC3F5A4, 0xA01A2300, 0xDBCDF695};
int nCards = (sizeof(knownCards) / sizeof(knownCards[0]));

bool checkCardUID(uint32_t uid)
{
  for (int n = 0 ; n < nCards ; n++) {
    if (uid == knownCards[n]) {
      return true;
    }
  }
  return false;
}

// ... dans loop() :

  if (checkCardUID(cardid) == true) {
    Serial.println("carte reconnue");
  }
  else {
    Serial.println("carte NON reconnue");
  }

Plus élégant et plus facilement évolutif.

Dans le premier code tout va bien mais dans le second voila les erreurs affiché :

sketch_feb28a:111:3: error: expected unqualified-id before 'if'

if (checkCardUID(cardid) == true) {

^~

sketch_feb28a:114:3: error: expected unqualified-id before 'else'

else {

^~~~

sketch_feb28a:118:5: error: expected declaration before '}' token

}

^

exit status 1
expected unqualified-id before 'if'

Tu as certainement mal inséré les lignes

Dans l'exemple les lignes doivent être insérées comme ceci :

      Serial.print("Seems to be a Mifare Classic card #");
      Serial.println(cardid);
      if (checkCardUID(cardid) == true) {
        Serial.println("carte reconnue");
      }
      else {
        Serial.println("carte NON reconnue");
      }
    }

Ah oui effectivement merci de ton aide.

(il y a de forte chance que je revienne en redemander ^^)

Re-bonjour, Aujourd'hui j'ai appris que je devrai faire en sorte que chaque poubelle est un identifiant (pour

pas que tout les badge puisse accéder a toutes les poubelles).

Pour faire cela je doit modifier ce code la ?

uint32_t knownCards[] = {0xB8312200, 0xCBC3F5A4, 0xA01A2300, 0xDBCDF695};
int nCards = (sizeof(knownCards) / sizeof(knownCards[0]));

bool checkCardUID(uint32_t uid)
{
  for (int n = 0 ; n < nCards ; n++) {
    if (uid == knownCards[n]) {
      return true;
    }
  }
  return false;
}

// ... dans loop() :

  if (checkCardUID(cardid) == true) {
    Serial.println("carte reconnue");
  }
  else {
    Serial.println("carte NON reconnue");
  }