[RC522] multi RFID

Hello à tous !

Aujourd’hui, petite problématique avec des antennes RFID RC522.

Etant toujours un peu novice en Arduino et en électronique, je cherche à construire une petite unité de jeu ou les joueurs doivent rentrer 10 bâtons dans un meuble de type ratelier. Evidemment, chaque bâton doit être inséré dans le bon trou du ratelier (un tag RFID est intégré sous chaque bâton).

J’ai donc un Arduino MEGA 2560 rev3, et 10 antennes RC522 branchées sur celui-ci (branchements en PJ).

Mon problème est que j’ai l’impression que l’Arduino ne délivre pas assez d’Ampérage pour alimenter toutes ces antennes, car certains modules RC522 ne reconnaissent pas les tags présentés (et cela de manière aléatoire à chaque mise sous tension).

J’ai du coup installé une alimentation extérieure 3.3V 3A pour palier à cela et n’alimenter que les antennes. BOUM, c’est encore pire. Une seule antenne arrive à lire les tags, de manière aléatoire également à chaque mise sous tension.

J’ai changé l’alim, changé l’Arduino, vérifié tous les branchements 3 fois, passé tous les circuits au voltmètre, essayé avec un autre programme… rien n’y fait.

Je pense que ce type de branchement n’est pas possible avec autant d’antennes, mais il y a certainement une solution à ce problème non ?

Merci d’avance pour votre aide !

L'image :

Tu peux trouver des projets similaires sur internet :

Hello Lesept !

Merci pour ta réponse :slight_smile:

En effet, je me suis basé sur le projet d'Annaane! pour mon programme et le câblage.

Je ne comprends pas trop pourquoi l'alimentation externe ne marcherait pas ? 3.3V, 3A (donc normalement suffisant pour les 10 antennes). J'ai même essayé de ne laisser que 3 antennes branchées, et cela ne fonctionne toujours pas avec l'alimentation externe :frowning:

Mais par contre, quand je passe de 4 à 6 antennes, uniquement alimentées par l'Arduino, cela fonctionne sans problème. Je suis perdu.

Tu veux dire :

  • 4 antennes alimentées par Arduino : ok
  • 6 antennes alimentées par Arduino : ok
  • 3 antennes alimentées par l'alim externe : ko
    Exact ?

Comment est alimenté l'Arduino ?

et le GND de l'alimentation 3.3V externe est bien sur le GND de l'arduino ?

lesept:
Tu veux dire :

  • 4 antennes alimentées par Arduino : ok
  • 6 antennes alimentées par Arduino : ok
  • 3 antennes alimentées par l'alim externe : ko
    Exact ?

Comment est alimenté l'Arduino ?

Exact ! L'Arduino est alimenté en 9V 1A.

higgins91:
et le GND de l'alimentation 3.3V externe est bien sur le GND de l'arduino ?

Oui tout à fait :wink:

Et lorsque l’Arduino est alimenté par l’USB, ça donne quoi ?

Sinon, ici, il y a un code pour 3 lecteurs, qui peut être facilement étendu à plus :

include <SPI.h>
include <MFRC522.h>
//Signal pins of readers A, B and C. RST_PIN does not need to be connected, only defined

define A_PIN 9
define B_PIN 8
define C_PIN 7
define RST_PIN 2
int ledA = 6; 
int ledB = 5; 
int ledC = 4;

MFRC522 A(A_PIN, RST_PIN);
MFRC522 B(B_PIN, RST_PIN);
MFRC522 C(C_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  while (!Serial);
  SPI.begin();
  A.PCD_Init();
  B.PCD_Init();
  C.PCD_Init();

  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  digitalWrite(ledA, LOW);
  digitalWrite(ledB, LOW);
  digitalWrite(ledC, LOW);
}

//Function that checks the status of a single reader. If there is a wrong tag -> serialPrint tag number
void check_reader(MFRC522 reader, int id) {
  if ( ! reader.PICC_IsNewCardPresent() || ! reader.PICC_ReadCardSerial()) return;
  unsigned int hex_num;
  hex_num  = reader.uid.uidByte[0] << 24;
  hex_num += reader.uid.uidByte[1] << 16;
  hex_num += reader.uid.uidByte[2] << 8;
  hex_num += reader.uid.uidByte[3];
  if ((id == 1 && hex_num == 14293) || (id == 2 && hex_num == 14549) || (id == 3 && hex_num == 15433)) {
    switch (id) {
      case 1: Serial.println("Correct!"); blinke(ledA); break;
      case 2: Serial.println("Correct!"); blinke(ledB); break;
      case 3: Serial.println("Correct!"); blinke(ledC);
    }
  } else Serial.prinln(hex_num);
  delay(100);
}

void loop() {
  check_reader(A, 1);
  check_reader(B, 2);
  check_reader(C, 3);
}

void blinke(int blinker) {
  digitalWrite(blinker, HIGH);
  delay(100);
  digitalWrite(blinker, LOW);
  delay(100);
  digitalWrite(blinker, HIGH);
  delay(100);
  digitalWrite(blinker, LOW);
  delay(100);
  digitalWrite(blinker, HIGH);
}

Il te faut 3 leds, mais si tu n’en as pas tu peux simplement ôter les instructions style
blinke(ledA); dans le case.

Les nombres dans le if (14293, 14549, 15433) correspondent aux identifiants des tags. Il te faudra peut-être les changer (le code affiche les valeurs lues, tu peux les mettre dans le code une fois les tags passés devant le lecteur)