Bonjour,
Je suis en train de réaliser un jeu d'escape game. Et pour la dernière énigme, j'aimerais utiliser un system Arduino pour rendre la résolution du jeu un peu plus 'magique'.
Je suis complétement débutante. J'ai passé plusieurs journées sur les modules, les branchements et le code, mais je ne parviens pas à ce que j'aimerais faire.
Voila les composants que j'ai en ma possession :
Une carte Arduino UNO R3
4 lecteurs RFID-RC522 avec 4 badges assignés à chaque lecteur
1 bandeau LED (type WS2812B) de 10 LEDs
1 microServo SG90
L'idée serait de positionner les 4 badges en face de leurs 4 lecteurs. En conservant cette position, le bandeau LED reste allumé (peut être peut-il scintiller ?) et le MicroServo s'ouvre (entre 90° ou 180°). Si l'un des badges n'est pas positionné, rien ne se passe. Et si l'un des badges est retiré, le bandeau LED s'éteint et le Servo se referme.
J'ai réussi à faire fonctionné 1 badge avec le Servo, mais celui-ci ne reste pas en position même si le badge est encore sur le lecteur. Dès que je passe à 2 badges avec 2 lecteurs, rien ne fonctionne. Idem avec les LEDs.
J'ai pour le moment seulement fait des tests en branchement USB sur mon PC. Je suppose qu'il s'agit peut être d'une erreur de Voltage ? Ou peut être est-ce mon code qui n'est pas assez optimisé ?
Quel système d'alimentation dois-je utiliser pour faire fonctionne, au final, tous ces éléments ? Est-il possible de l'alimenter sur une batterie, une pile ? Ou dois-je forcement passer sur un branchement sur secteur ?
Je m'excuse d'avance si ces questions vous paraissent très 'simples'. Étant débutante, je sais que j'ai certaines bases à revoir...
La façon dont tu veux utiliser le lecteur de badges, nécessire de lire ce dernier en permanence. Or avec cette fonction: .PICC_HaltA()
une fois le badge lu, le lecteur se met en veilleuse et seul un mouvement du badge peut le réveiller.
Si le badge n'est plus lu, sa variable ok n'est plus mise à jour et reste à false et donc, le servo retourne à 0.
Je t'ai aussi corrigé la partie: // -------- Ouverture Servo --------
Je te laisse regarder les différences.
Quand tu développes un programme tel que celui-ci, il est vivement recommandé de voir "vivre" celui-ci par des Serial.Print(), je t'en ai mis quelques uns. Mets la console à 115200:
Le programme:
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
// -------- RFID 1 --------
#define SS_1 10
#define RST_1 9
// -------- RFID 2 --------
#define SS_2 8
#define RST_2 7
// -------- Servo --------
#define SERVO_PIN 5
MFRC522 rfid1(SS_1, RST_1);
MFRC522 rfid2(SS_2, RST_2);
Servo servo;
// UID badge lecteur 1
byte uid1[4] = {0x32, 0x07, 0x11, 0x06};
// UID badge lecteur 2
byte uid2[4] = {0x79, 0xC9, 0x31, 0x07};
void setup() {
Serial.begin(115200);
delay(500);
Serial.println(F("Lecteur RFID"));
SPI.begin();
rfid1.PCD_Init();
rfid2.PCD_Init();
servo.attach(SERVO_PIN);
// Servo fermé
servo.write(0);
}
void loop() {
bool ok1 = false;
bool ok2 = false;
// -------- Lecture RFID 1 --------
if (rfid1.PICC_IsNewCardPresent() && rfid1.PICC_ReadCardSerial()) {
if (compareUID(rfid1.uid.uidByte, uid1)) {
Serial.print(F("UID lu RFID 1 : "));
printUID(rfid2.uid.uidByte, rfid2.uid.size);
ok1 = true;
}
else
{
Serial.print(F("\tRFID 1 Carte inconnue : "));
printUID(rfid1.uid.uidByte, rfid1.uid.size);
}
//rfid1.PICC_HaltA();
}
// -------- Lecture RFID 2 --------
if (rfid2.PICC_IsNewCardPresent() && rfid2.PICC_ReadCardSerial()) {
if (compareUID(rfid2.uid.uidByte, uid2)) {
Serial.print(F("UID lu RFID 2 : "));
printUID(rfid2.uid.uidByte, rfid2.uid.size);
ok2 = true;
}
else
{
Serial.print(F("\tRFID 2 Carte inconnue : "));
printUID(rfid2.uid.uidByte, rfid2.uid.size);
}
//rfid2.PICC_HaltA();
}
// -------- Ouverture Servo --------
if (ok1 && ok2) { // Si les 2 badges sont OK
servo.write(90);
//delay(2000);
}
else
{
servo.write(0);
}
delay(100);
}
// -------- Comparaison UID --------
bool compareUID(byte *a, byte *b) {
for (byte i = 0; i < 4; i++) {
if (a[i] != b[i]) {
return false;
}
}
return true;
}
// -------- Affichage UID --------
void printUID(byte *uid, byte size) {
for (byte i = 0; i < size; i++) {
if (uid[i] < 0x10) {
Serial.print(F("0"));
}
Serial.print(uid[i], HEX);
if (i < size - 1) {
Serial.print(F(":"));
}
}
Serial.println();
}
Là tu n'as que 2 lecteurs, mais avec 4 ça deviendra ingérable, il te faudra passer par des tableaux, je te préparerai un exemple, su tu le désires.
Bonjour jp,
Merci beaucoup pour ton aide. J'ai pu faire différent tests grâce à ton code : RFID x1+ Servo
Badge 1 reste activé si il est posé
mais Servo s'ouvre et se ferme en continu tant que le badge est détecté
RFID x1 + Led + Servo
Tout fonctionne correctement (avec Scintillement des LEDs)
RFID x2 + Led
Tout fonctionne correctement (avec seulement LEDs allumées)
RFID x2 + Servo
Badge 1 et 2 restent activés si ils sont posés
mais Servo s'ouvre et se ferme en continu tant que les badges sont posés
RFID x2 + Led + Servo
Badge 1 et 2 restent activés si ils sont posés
LEDs allumées mais Servo ne s'ouvre pas
Et une fois sur deux, rien ne fonctionne... Quand je débranche et je rebranche à nouveau, rien ne se détecte.
Je ne me suis donc pas encore attardée aux 4 RFID car j'aimerais comprendre le problème déjà avec 2.
Aussi, j'aimerais savoir si ce programme (idéalement le programme final avec les 4 RFID, les LEDs et le Servo) est faisable en branchement sur secteur, voire même sur batterie ? Si oui, quel matériel dois-je utiliser ?
Quand tu dis "mais avec 4 ça deviendra ingérable, il te faudra passer par des tableaux", c'est à dire qu'il me faudrait 2 Arduinos différents ?
Je ne dis pas non à un exemple ! Merci beaucoup !
Utiliser plusieurs lecteurs RFID MFRC522 RFID Reader Module avec un Arduino n’est pas vraiment simple. Certains y arrivent sans problème, d’autres jamais, avec pourtant exactement le même code et le même câblage. En théorie le MFRC522 supporte parfaitement le SPI partagé : MOSI, MISO et SCK communs, avec juste un SS dédié par lecteur. Mais en pratique, beaucoup de clones RC522 semblent mal se comporter sur le bus SPI.
Le problème le plus souvent observé est que certains modules ne relâchent pas correctement MISO quand ils ne sont pas sélectionnés, ce qui perturbe les autres lecteurs. Résultat : lecteurs qui disparaissent, UID corrompus, fonctionnement aléatoire, ou un seul lecteur qui répond de temps en temps...
Le plus frustrant est que deux modules visuellement identiques peuvent avoir un comportement totalement différent, probablement selon la qualité du clone, du PCB ou des composants utilisés. Rien ne permet vraiment de savoir à l’avance lesquels fonctionneront correctement ensemble.
Dans la doc du GitHub l'auteur dit " * 1. More than 2 modules, require a multiplexer #191."
Si ça ne fonctionne pas comme vous voulez, ma recommendation serait plutôt de prendre un arduino Nano par lecteur pour que chacun soit indépendant et un arduino Mega comme centralisateur.
les arduino nanos sont connectés sur les 4 ports série de la Mega et envoie tout changement d'état (on pose la carte, on la retire) et la Mega pilote le bandeau LED et le moteur.
oui, bien sûr il y a plusieurs solutions. Je trouve que pour les débutants le port série c'est plus simple, on fait un simple print() et on n'a pas trop à se poser de questions c'est pour cela que j'avais proposé cela.
On pourrait sans doute n'avoir que 4 nanos et l'un d'eux joue le rôle de maître aussi, ou deux lecteurs (ça marche souvent mieux que 4) sur un seul arduino.
The problem is that the MFRC522 devices do not release the MISO output pins to high impedance state when chip select is inactive.
What you can do is to implement an OR circuit to all MISO pins.
This can be done
Either with diodes (anodes to MFRC522 MISO pins, cathodes together to Arduino board MISO pin with 330.. 1k Ohm resistor connected to GND)
Or use 74HC125 circuit (chip select signals to enable inputs, inputs are the MISO pins of the MFRCs, outputs connected together should go to Arduino MISO).
Ce qui rend le produit inutilisable dans la plus grande majorité des cas.
Cela ne serait pas plus simple d'acheter 4 MFRC522 conformes que de transformer le montage en usine à gaz?
Il faut bien sur préalablement vérifier avec un oscilloscope que cette affirmation soit fondée.
Bien sûr - la question est de savoir où les trouver… si vous lisez les forum ou les commentaires sur GitHub même l’auteur de la bibliothèque dit qu’il vaut mieux commander plus de modules que nécessaires pour espérer en avoir plusieurs corrects.
Perso j’ai fait le test - j’ai 4 lecteurs achetés à des moments différents en Asie et je n’arrive pas à en trouver 3 qui fonctionnent bien ensembles donc je dois en avoir au moins 2 merdiques mais j’arrive à faire des couples de 2 différents qui fonctionnent donc je ne peux pas simplement en éliminer un seul… j’ai jamais eu le courage de sortir l’oscillo pour creuser et je n’ai pas tester avec la protection par diode
Sour la plupart des modules NFC courants il me semble que la broche 1 des puces MFRC522 qui permet, au niveau haut, d'activer le mode I2C est soudée à la masse
Je n'en connais pas d'autre personnellement à part quelques fork qui ne changent pas grand chose (mais j'ai pas beaucoup cherché).
Passer sur des modules PN532 est l’alternative la plus courante. Le PN532 gère davantage de protocoles (ISO/IEC 14443 A/B, NFC Forum, peer-to-peer), fonctionne en SPI, I2C ou UART et est mieux supporté pour des usages NFC.
On peut avoir une application sur smartphone qui présente un badge NFC virtuel ou qui envoie des données via NFC pour l’authentification, la lecture ou l’échange d’informations sous forme de messages NDEF - ça peut donner des idées pour des jeux et autres usages si on sait coder pour les smartphones (Core NFC sur iOS et android.nfc.NfcAdapter avec Host Card Emulation (HostApduService) sur Android).
La bibliothèque MFRC522.h a été reprise pour fonctionner en i2c et s'appelle MFRC522_I2C.h.
Le fait de changer de bibliothèque peut juste éviter d'acheter quoi que ce soit