Bonjour tout le monde!
Je me permets de me présenter: je suis maître du jeu dans un escape game. Je souhaite créer une énigme nécessitant 4 lecteurs RFID.
J'utilise une Arduino Uno, des pont wire (je n'ai pas la traduction, désolé), et des modules RFID RC522. Je connecte le tout à une breadboard. Les RC522 sont soudés.
J'ai déjà créé des mécanismes reposant sur le même montage, parfois avec succès. Et parfois, pour une raison totalement mystique, cela ne fonctionne pas. Par exemple, le lecteur 1 et 2 peuvent fonctionner, mais pas le 3 et le 4. Je reset ma carte; et soudain il n'y a plus que le lecteur 1 et 4 qui fonctionnent. Le problème est déclinable à l'infini, et je ne parviens pas à fiabiliser à 100% la connexion des lecteurs.
J'ai cru voir que certaines personnes utilisaient des RJ45 pour fiabiliser leurs montages. Est-ce efficace? Avez-vous d'autres "méthodes" pour câbler les RC522 sans problème? Je vous remercie par avance de vos réponses; car je vais devenir totalement taré à force de chercher seul.
Bonjour nubianeko2
Pourrais-tu mettre ton programme en ligne ainsi que le schéma de câblage ou une photo du montage en gros plan?
A+
Cordialement
jpbbricole
Bonjour jpbbricole!
Merci beaucoup pour ta réponse, tout d'abord. Désolé de ne pas avoir répondu plus tôt, la création de la salle d'escape prend justement beaucoup de temps ![]()
Je ne vais pas avoir le temps de faire une photo du montage, mais il s'agit très exactement de celui-ci, monté sur une mini-breadboard ![]()
Le code et le montage ont été piqués à Allistair, de PlayFull Technology. Il semble cependant utiliser des RJ45. Il ne les mentionne pas vraiment, et n'explique pas comment les câbler aux RC522.
Mon code est également strictement similaire au sien, à la différence des correct ID, bien entendu. Dans la mesure où ce code n'est pas le mien, je ne sais pas si j'ai le "droit" de le partager, venant d'un créateur de contenu qui a fait payé ce code. Il est cependant entièrement montré sur la vidéo ci-dessous.
Voici également la vidéo explicative: Escape Room Object Placement Puzzle using Arduino/RFID - YouTube
Merci encore pour ta réponse! J'espère vraiment trouver une solution. Je ne parviens pas à comprendre pourquoi certaines fois, ce montage fonctionne, et pourquoi d'autres, la "captation" des RC522 est presque aléatoire. J'ai fait 3 fois le même montage, et ce dernier fonctionne parfaitement à 2 reprises. Quant au 3e, inexplicablement, je ne parviens pas à fiabiliser la détection, même après avoir changé toutes les pièces une à une. Les modules RC522 sont peut-être plus éloignés de la breadboard; d'où mon idée des RJ45 ![]()
Bonjour nubianeko2
Un fonctionnement erratique peut provenir de 2 choses, les divers GND pas reliés convenablement au même point ou, dans ton cas, un bus SPI trop long et ou mal protégé de l'environnement externe, plus difficilement causé par le programme.
Les connecteurs RJ45 avec le câble qui va avec, comme le câble UTP CAT5 Twisted pair, très courant, de par sa structure de paires torsadées, favorise les distances plus longues.
Pour le câblage du bus SPI sur RJ45, j'ai trouvé ça

Tu n'est pas obligé de mettre des connecteurs RJ45, tu peux très bien souder les fils, l'essentiel est de bénéficier de la structure du câble et respecter la position des signaux sur le câble.
Cordialement
jpbbricole
Hey jpbbricole! Merci beaucoup pour ta réponse. Je te prie de bien vouloir m'excuser pour la lenteur de la mienne; je ne vois pas le jour en ce moment. Merci d'avoir pris le temps de me répondre!
Je crois que le problème vient du bus SPI trop long; si je ne m'abuse. Enfin; aussi de la qualité des câbles. J'utilise de bêtes jumper cable qui ne sont évidemment pas blindés ni rien ![]()
Je te prie de m'excuser, mais je ne comprends exactement pas ce que tu veux dire par la position des signaux sur le câble? Je suppose que tu veux dire que la câble 1 va nécessaire sur le GND par exemple?
Bonjour nubianeko2
C'est à dire, comme cet exemple

ou celui du post #4.
Je n'ai pas vraiment trouvé de norme pour autant qu'il en existe une.
J'ai fait des recherches avec SPI bis UTP.
Cordialement
jpbbricole
Bonsoir nubianeko2
J'ai fait des essais avec une connexion RJ45 et un câble UTP CAT5 (donc sans blindage) de 5 mètres, sans aucun problème. Je n'ai malheureusement qu'un lecteur RFID, je n'ai pas pu faire un essai "de masse".
La connexion était ainsi

Je n'ai pas cherché à répartir les signaux comme suggéré dans le post #6, mais fait du "pin to pin"
A+
Cordialement
jpbbricole
Post déplacé.
Ce n'est pas un projet fini.
Merci de lire
https://forum.arduino.cc/t/les-bonnes-pratiques-du-forum-francophone/861014/2
Les breadboards sont souvent la source de mauvais contacts. Donc il n'est pas très étonnant que tu rencontres des problèmes.
Il faut aussi vérifier si le programme est bon. Si le type vend le programme, il n'est pas certain qu'il ait présenté la version à jour. Donc il faut vérifier le code d'un œil critique. En particulier bien vérifier la gestion des Chip Select car cela peut-être la cause de conflits sur le bus SPI.
Me revoici!
Tout d'abord, merci beaucoup à vous deux pour vos réponses! Je débute encore en Arduino; et me sentir aussi soutenu fait vraiment chaud au cœur; car concevoir une salle d'escape tout seul est vraiment un sacré boulot ![]()
Parfait! C'est exactement le genre de montage que je voudrais faire
As-tu une référence pour les connexions RJ45? J'aimerais pouvoir en commander pour faire mes propres tests.
C'est vraiment super s'il n'y a pas besoin de s'embêter à répartir les signaux, cela va faciliter grandement le montage. Lorsque l'on doit brancher 4 RFID, ça peut devenir assez rapidement bordélique, cette histoire!
Désolé, je suis passé sans doute trop vite, j'aurais dû regarder plus attentivement avant de poster mon topic. Merci d'avoir déplacé le thread ![]()
Très bien; je n'avais pas vu cela ainsi
Est-il possible de poster mon code sur ce topic sans déranger?
Merci pour ton conseil! Dois-je plutôt passer sur des cartes perforées? Je n'aurais hélas pas les moyens de passer sur de véritables circuits imprimés; je pense ![]()
Bonjour nubianeko2
Oui, mettre l'entier dans le presse-papier, cliquer sur l'icône ![]()
et coller le presse-papier.
Les breadboards vont très bien pour le dévaloppement, après il faut passer ou par le PCP ou la plaque à trous comme celles-ci

Double side prototype.
Ou à mettre directement sur l'Arduino.

Pour autant que l'on aie les outils et la technique, en Chine un PCB coûte 2-3 dollars pièce.
Avec quel Arduino travailles-tu sur ce projet?
A+
Cordialement
jpbbricole
Etant donné que tu as essentiellement de la connectique à ajouter, le plus simple serait d'utiliser un shield de prototypage comme l'a proposé @jpbbricole dans le message au-dessus.
Concernant le code, avant de le copier, penser à faire ctrl+t dans l'IDE pour qu'il soit correctement indenté.
Si tu as un blocage à cause du nombre de lignes de ton message, le mettre en pièce jointe.
@jpbbricole Je te remercie pour l'ensemble des références que tu m'as données! Ca va sans doute beaucoup m'aider pour fiabiliser mon projet. J'essayerai de vous prendre une photo de mon montage; mais actuellement c'est en effet très amateur: tout est relié par des pontwires à une breadboard, donc ce n'est pas forcément foufou. Ca va me permettre sans doute de fiabiliser déjà davantage mon mécanisme; je pense! ![]()
De même, je cherchais sans trop trouver des sites permettant d'imprimer des PCB, et les tarifs étaient très rapidement prohibitifs... Avec le lien que tu m'as envoyé, j'ai presque envie de tout mettre sur une seul gros circuit imprimé ahah. Merci beaucoup, tu m'aides énormément! ![]()
Ca tombe bien; je dois en avoir un dans mon fameux kit arduino débutant! Il est peut-être temps de le sortir au grand jour.
J'envoie le code dans un message à part, pour favoriser la visibilité.
Voici donc le fameux code!
Il s'agit de poser 4 tags aux bons endroits. Une fois ceci fait, un relais s'ouvre. Si on retire un des tags, le relais se referme.
J'utilise ce code pour 3 mécanismes différents. Le premier mécanisme fonctionne à merveille. Le second a un dysfonctionnement dont j'aimerais vous parler; et le troisième ne fonctionne pas du tout; probablement à cause de la longueur des câbles (problème que je vais corriger grâce aux soins de @jpbbricole !)
Le deuxième mécanisme a un soucis (je vous ai mis le code de celui-ci). Il est assez dur à décrire, j'aurais dû mieux l'identifier. Au bout de plusieurs utilisations; l'Arduino ne semble plus répondre. Par exemple, si je pose mon dernier tag; le relais ne va pas s'ouvrir. Il arrive aussi parfois que lorsque je retire le dernier tag; je ne puisse plus fermer l'électro-aimant. Hélas; je n'ai jamais pu vérifier cela grâce au port com (je vais essayer d'identifier plus exactement le problème dans la journée). Pour le moment; je ne sais en effet pas si c'est un problème de relay (peu probable, car je l'ai changé deux fois); ou de carte Arduino qui planterait, peut-être? J'aurais aimé savoir si un watchdog pouvait être utile? ![]()
/**
"Object Placement" Puzzle
This puzzle requires the player to place one or more items in the
correct location, at which point an RFID tag embedded in the object
is detected by a sensor.
When all sensors read the tag of the correct object, the puzzle is solved.
Demonstrates:
- SPI interface shared between several devices
- RFID library
*/
//a rajouter
// DEFINES
// Provides debugging information over serial connection if defined
#define DEBUG
// LIBRARIES
// Standard SPI library comes bundled with the Arduino IDE
#include <SPI.h>
// Download and install from https://github.com/miguelbalboa/rfid
#include <MFRC522.h>
// CONSTANTS
// The number of RFID readers
const byte numReaders = 4;
// Each reader has a unique Slave Select pin
const byte ssPins[] = {2, 3, 4, 5};
// They'll share the same reset pin
const byte resetPin = 8;
// This pin will be driven LOW to release a lock when puzzle is solved
const byte lockPin = A0;
// The sequence of NFC tag IDs required to solve the puzzle
const String correctIDs[] = {"ba7cd880", "acf3e98c", "4ae9eb80", "7cd3f48c"};
//zeus: acf3e98c
// athéna: 7cd3f48c
//Poséidon: ba7cd880
//Hermès; 4ae9eb80
// GLOBALS
// Initialise an array of MFRC522 instances representing each reader
MFRC522 mfrc522[numReaders];
// The tag IDs currently detected by each reader
String currentIDs[numReaders];
/**
Initialisation
*/
void setup() {
#ifdef DEBUG
// Initialise serial communications channel with the PC
Serial.begin(9600);
Serial.println(F("Serial communication started"));
#endif
// Set the lock pin as output and secure the lock
pinMode(lockPin, OUTPUT);
digitalWrite(lockPin, LOW);
// Initialise the SPI bus
SPI.begin();
for (uint8_t i = 0; i < numReaders; i++) {
// Initialise the reader
// Note that SPI pins on the reader must always be connected to certain
// Arduino pins (on an Uno, MOSI=> pin11, MISO=> pin12, SCK=>pin13)
// The Slave Select (SS) pin and reset pin can be assigned to any pin
mfrc522[i].PCD_Init(ssPins[i], resetPin);
// Set the gain to max - not sure this makes any difference...
// mfrc522[i].PCD_SetAntennaGain(MFRC522::PCD_RxGain::RxGain_max);
#ifdef DEBUG
// Dump some debug information to the serial monitor
Serial.print(F("Reader #"));
Serial.print(i);
Serial.print(F(" initialised on pin "));
Serial.print(String(ssPins[i]));
Serial.print(F(". Antenna strength: "));
Serial.print(mfrc522[i].PCD_GetAntennaGain());
Serial.print(F(". Version : "));
mfrc522[i].PCD_DumpVersionToSerial();
#endif
// Slight delay before activating next reader
delay(100);
}
#ifdef DEBUG
Serial.println(F("--- END SETUP ---"));
#endif
}
/**
Main loop
*/
void loop() {
// Assume that the puzzle has been solved
boolean puzzleSolved = true;
// Assume that the tags have not changed since last reading
boolean changedValue = false;
// Loop through each reader
for (uint8_t i = 0; i < numReaders; i++) {
// Initialise the sensor
mfrc522[i].PCD_Init();
// String to hold the ID detected by each sensor
String readRFID = "";
// If the sensor detects a tag and is able to read it
if (mfrc522[i].PICC_IsNewCardPresent() && mfrc522[i].PICC_ReadCardSerial()) {
// Extract the ID from the tag
readRFID = dump_byte_array(mfrc522[i].uid.uidByte, mfrc522[i].uid.size);
}
// If the current reading is different from the last known reading
if (readRFID != currentIDs[i]) {
// Set the flag to show that the puzzle state has changed
changedValue = true;
// Update the stored value for this sensor
currentIDs[i] = readRFID;
}
// If the reading fails to match the correct ID for this sensor
if (currentIDs[i] != correctIDs[i]) {
// The puzzle has not been solved
puzzleSolved = false;
}
// Halt PICC
mfrc522[i].PICC_HaltA();
// Stop encryption on PCD
mfrc522[i].PCD_StopCrypto1();
}
#ifdef DEBUG
// If the changedValue flag has been set, at least one sensor has changed
if (changedValue) {
// Dump to serial the current state of all sensors
for (uint8_t i = 0; i < numReaders; i++) {
Serial.print(F("Reader #"));
Serial.print(String(i));
Serial.print(F(" on Pin #"));
Serial.print(String((ssPins[i])));
Serial.print(F(" detected tag: "));
Serial.println(currentIDs[i]);
}
Serial.println(F("---"));
}
#endif
// If the puzzleSolved flag is set, all sensors detected the correct ID
if (puzzleSolved && changedValue) {
onSolve();
}
else if (!puzzleSolved) {
digitalWrite(lockPin, LOW);
}
// Add a short delay before next polling sensors
//delay(100);
}
/**
Called when correct puzzle solution has been entered
*/
void onSolve() {
#ifdef DEBUG
// Print debugging message
Serial.println(F("Puzzle Solved!"));
#endif
// Release the lock
delay(1000);
digitalWrite(lockPin, HIGH);
Serial.println("Electro déverrouillé");
delay(2000);
//while(true) {
//delay(2000);
//digitalWrite(lockPin, HIGH);
//}
}
/**
Helper function to return a string ID from byte array
*/
String dump_byte_array(byte *buffer, byte bufferSize) {
String read_rfid = "";
for (byte i = 0; i < bufferSize; i++) {
read_rfid = read_rfid + String(buffer[i], HEX);
}
return read_rfid;
}
La ligne mfrc522[i].PCD_Init(); exécutée à chaque itération de la boucle for me parait inutile.
J'ai regardé le programme d'exemple ReadUidMultiReader qui est installé avec la librairie.
Les lecteurs ne sont pas réinitialisés systématiquement mais uniquement dans setup().
La logique de lecture des tags me parait un peu foireuse.
Si la lecture du tag ne fonctionne pas tu continues quand même à dérouler la suite du code ce qui me parait étonnant et pourrait expliquer le fonctionnement erratique.
Un conseil, passer le débit de la ligne série à 115200 bauds au lieu de 9600.
Tu me conseilles donc de déplacer cette ligne dans setup(), c'est bien cela? ![]()
As-tu une idée de ce qu'il faudrait changer pour corriger cela? ![]()
Très bien, merci, je vais faire ça immédiatement
Bonjour nubianeko2
Je me suis aperçu que ta carte RC522 quoi que presque jumelle de la mienne

n'a pas le même brochage, mais je ne pense pas que cela influence sur la qualité de transmission sur RJ45.
Une petite idée de PCB sur UNO

Pour ce qui est de l'alimentation en 3.3V. il faudra voire si l'alimentation 3.3V de l'Arduino est suffisante pour les 4 RC522.
A+
Cordialement
jpbbricole
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.
