Ox00
February 28, 2020, 5:36pm
1
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é.
Ox00
February 28, 2020, 6:53pm
3
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 ?
Ox00
February 29, 2020, 11:16am
5
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 ?
Ox00
February 29, 2020, 3:22pm
7
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 =).
/**************************************************************************/
/*!
@file readMifare.pde
@author Adafruit Industries
@license BSD (see license.txt)
This example will wait for any ISO14443A card or tag, and
depending on the size of the UID will attempt to read from it.
If the card has a 4-byte UID it is probably a Mifare
Classic card, and the following steps are taken:
- Authenticate block 4 (the first block of Sector 1) using
the default KEYA of 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF
- If authentication succeeds, we can then read any of the
4 blocks in that sector (though only block 4 is read here)
If the card has a 7-byte UID it is probably a Mifare
Ultralight card, and the 4 byte pages can be read directly.
Page 4 is read by default since this is the first 'general-
This file has been truncated. show original
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 ...
Ox00
February 29, 2020, 6:46pm
13
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 :
/**************************************************************************/
/*!
@file readMifareClassic.pde
@author Adafruit Industries
@license BSD (see license.txt)
This example will wait for any ISO14443A card or tag, and
depending on the size of the UID will attempt to read from it.
If the card has a 4-byte UID it is probably a Mifare
Classic card, and the following steps are taken:
Reads the 4 byte (32 bit) ID of a MiFare Classic card.
Since the classic cards have only 32 bit identifiers you can stick
them in a single variable and use that to compare card ID's as a
number. This doesn't work for ultralight cards that have longer 7
byte IDs!
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!
This file has been truncated. show original
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 ...
}
Ox00
March 1, 2020, 10:12am
15
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.
Ox00
March 1, 2020, 11:36am
17
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");
}
}
Ox00
March 1, 2020, 12:39pm
19
Ah oui effectivement merci de ton aide.
(il y a de forte chance que je revienne en redemander ^^)
Ox00
March 2, 2020, 3:59pm
20
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");
}