Question:
Problème de partage de MISO avec plusieurs lecteurs RFID RC522
Jesse Mount
2015-12-01 20:52:27 UTC
view on stackexchange narkive permalink

Donc, depuis environ 8,5 heures (presque sans interruption), j'ai essayé de résoudre un problème et j'ai épuisé toutes les recherches auxquelles je pouvais penser.

Je construis un puzzle cela nécessite 5 lecteurs RFID sur le 1 Arduino, mais pour le plaisir des tests, je n'ai utilisé que 2.

Les deux lecteurs fonctionnent indépendamment, je peux lire les UID des petites cartes, ce qui est tout Je dois faire, mais dès que je leur fais partager la ligne MISO, il arrête simplement d'imprimer quoi que ce soit. Je ne sais pas pourquoi.

Les deux lecteurs ont une alimentation et une masse externes de 3,3 V communes, ils partagent toutes les autres lignes mais ont un Slave Select individuel. Pour les tests, j'ai mis leurs deux câbles MISO dans une maquette qui mène ensuite à l'Arduino sur la broche 12, mais il n'imprimera l'UID que lorsqu'un seul câble est branché sur la carte d'expérimentation.

Alors est là quelque chose de spécial que je dois faire pour que cela fonctionne? Y a-t-il une raison pour laquelle les lecteurs partageant une ligne MISO la briseraient? Même si je n'initialise pas l'un d'entre eux, le fait qu'il soit branché le casse toujours. J'ai essayé de régler un sur HIGH et un sur LOW, les deux sur LOW, les deux sur HIGH, rien ne le change.

De plus, quelque chose d'autre me déroute, c'est censé être actif LOW pour activer le SS, mais quand seulement 1 est branché sur la ligne MISO, peu importe dans quel état il se trouve, il s'imprime toujours ...

J'ai fait un petit test sur mon croquis juste un il y a un moment et s'est rendu compte que lorsque les deux sont connectés au MISO, l'esquisse ne progressera pas au-delà de cette ligne (qui est également la première ligne de la boucle)

  if (! mfrc522_2.PICC_IsNewCardPresent () ) return;  

Je sais que tout le reste fonctionne parce que cela fonctionne quand il n'y a rien d'autre branché sur la ligne MISO, mais j'en ai besoin pour fonctionner quand tous les autres sont aussi branchés.

S'il vous plaît s'il vous plaît, si vous avez une idée, faites le moi savoir.

J'utilise la bibliothèque MFRC522

MODIFIER:

C'est essentiellement la configuration que j'utilise: enter image description here

Je n'utilise aucun traducteur de tension ou décalage, tout est 5v de l'arduino à l'exception de l'alimentation des lecteurs qui provient d'une alimentation externe 3,3v comme mentionné précédemment.

Je suis à peu près certain qu'il s'agit de la fiche technique du RC522 que j'utilise, même si je ne suis pas sûr que ce soit V1 ou V2, mais étant donné les différences entre eux, je ne le fais pas. Je pense que cela compte:

http://www.nxp.com/documents/data_sheet/MFRC522.pdf

Je ne sais pas s'ils sont capables de partager des lignes MISO comme quelqu'un l'a dit ci-dessous, j'ai juste supposé que je pourrais?

Vous utilisez une carte arduino 5V sans traducteurs de tension, non? Si tel est le cas, vous n'êtes pas conforme aux spécifications de ces modules, ce qui peut entraîner un dysfonctionnement.
@frarugi87, que les lecteurs travaillent individuellement suggère que ce n'est pas le problème. En outre, MISO est une entrée pour Arduino et les sorties du système 3V3 vers les entrées du système 5V fonctionnent correctement.
Jesse Mount, veuillez modifier la question et spécifier les tensions utilisées; si des convertisseurs / décaleurs de tension sont utilisés; et les numéros de modèle des lecteurs. Alors que les esclaves SPI utilisent généralement des sorties à drain ouvert pour que MISO puisse être câblé ensemble, certains ne le font pas. Sans numéro de modèle, qui peut dire?
@jwpat7 Vous voulez sûrement dire des sorties à trois états, pas des sorties à drain ouvert ...
Merci @Majenko,, c'est ce que j'aurais dû dire, concernant SPI. Je pensais à IIC par erreur.
@jwpat7 Par ailleurs, je ne trouve aucune mention de trois états sur MISO dans la fiche technique MFRC522. Cela ne veut pas dire qu'il n'y en a pas, mais cela ne signifie pas non plus qu'il y a ...
Jesse Mount, regardez peut-être le post du 06 mai 2014 à 23h34 sur [raspberrypi.org/forums[https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=70756) et indiquez ici si votre RFC22 correspond à l'un des 2 indiqués ici (le troisième lien est mauvais). Cet article explique également comment vérifier que le protocole est SPI, etc.
Celui que j'ai ressemble au rouge, mais il est bleu. ['Image Here'.] (Http://img.td-imgs.com/images/24/83/262483_130300060699139324.jpg) Je suis sûr qu'il utilise SPI car je n'ai aucun problème à communiquer avec le Serial du RC522. Le seul problème que je rencontre est d'utiliser plus de 1. S'il y a un autre RC522 branché sur la ligne MISO, cela provoque une erreur de communication et empêche toute donnée d'être imprimée sur le Serial à partir de l'un ou l'autre appareil, que ce soit le 2ème est initiée ou non, ou à quel état logique les broches SS sont définies.
@jwpat7 en fait, le problème n'est pas du côté de l'arduino, mais du côté de l'appareil. Vous envoyez 5V sur des broches qui ne peuvent supporter que 3,8V si je me souviens bien (Vcc + 0,5). Vous travaillez donc en dehors des spécifications. S'ils fonctionnent même dans ces conditions, d'accord, mais vous pouvez vous attendre à des comportements étranges de cette configuration. À mon humble avis, la première chose à faire est de réduire les entrées 5V à 3,3. Même un diviseur de tension passif peut fonctionner. Ensuite, lorsque vous êtes sûr que vous travaillez en suivant les spécifications, vous pouvez modifier autre chose
Où pouvez-vous trouver quelque chose? J'ai un problème similaire. http://arduino.stackexchange.com/questions/29494/connecting-saleae-logic-8-to-miso-pin-12-on-uno-3-w-nrf24l01-halts-program On dirait que ça pourrait être du même type du problème.
Je n'ai pas de réputation à commenter mais je tiens à remercier Michael. Sa solution est parfaite, j'étais coincé pendant des jours. Ainsi, Multi RFID avec le logiciel SPI fonctionne comme un charme!
Trois réponses:
Michael
2017-05-10 05:12:18 UTC
view on stackexchange narkive permalink

Je rejoins cette conversation TRÈS tard, mais peut-être que ma réponse pourra aider quelqu'un qui vient tout juste d'examiner la question.

J'ai pu faire travailler SEVEN RC522 sur un Arduino! Ma solution était très similaire à votre idée, sauf qu'au lieu de la broche SS, j'ai utilisé la broche MISO.

Unique MISO diagram

Si vous regardez dans comment fonctionnent les broches, toutes sont des sorties allant du maître (Arduino) aux esclaves (RC522), SAUF pour la broche MISO qui est une entrée allant des esclaves au maître.

Donc je a donné à chaque scanner RC522 sa propre broche MISO sur l'Arduino, et le reste des broches a été partagé avec tous les scanners.

Pour le faire fonctionner avec le code, la solution la plus simple que j'ai trouvée était d'initialiser un nouveau RFID en utilisant la broche MISO correspondante chaque fois que je voulais lire à partir de l'un des RC522.

Cela a fonctionné pour l'Arduino car vous pouvez définir plusieurs broches numériques comme MISO, mais je n'ai pas compris comment pour que cela fonctionne encore sur un Raspberry Pi (sans utiliser de multiplexeur) car le Pi a quelques broches spécifiques qui sont utilisées pour MISO.

Voici un exemple de code. Il utilisait la bibliothèque Sunfounder (voici un tutoriel à ce sujet: https://www.sunfounder.com/learn/RFID_kit_V1_for_Arduino/lesson-29-rfid-entrance-guard-system-rfid-kit-v1-0 -for-arduino.html) C'est assez moche mais cela a fonctionné.

  void checkRFID (int i) {if (i == 0) {rfid.begin (2, 4,5,7,3,6); } si (i == 1) {rfid.begin (2,4,5,8,3,6); } si (i == 2) {rfid.begin (2,4,5,9,3,6); } si (i == 3) {rfid.begin (2,4,5,10,3,6); } si (i == 4) {rfid.begin (2,4,5,11,3,6); } si (i == 5) {rfid.begin (2,4,5,12,3,6); } si (i == 6) {rfid.begin (2,4,5,13,3,6); } retard (100); rfid.init (); statut uchar; uchar str [MAX_LEN]; // Carte de recherche, retour des types de carte status = rfid.request (PICC_REQIDL, str); if (statut! = MI_OK) {retour; } // Afficher le type de carte rfid.showCardType (str); // Empêche les conflits, retourne les 4 octets Numéro de série de la carte status = rfid.anticoll (str);
if (status == MI_OK) {memcpy (serNum, str, 5); rfid.showCardID (serNum); // affiche l'ID de la carte Serial.println (); Serial.println (); } retard (100); rfid.halt (); // commande la carte en mode veille}  
utilisiez-vous un Arduino Uno ou l'un des autres Arduinos?
Comment attribuez-vous les broches numériques en tant que MISO? Quelle bibliothèque utilisiez-vous pour votre SPI?
@sa_leinad J'ai utilisé Arduino Uno normal
@sa_leinad et moi avons utilisé la bibliothèque de sunfounder. Voici leur tutoriel: https://www.sunfounder.com/learn/RFID_kit_V1_for_Arduino/lesson-29-rfid-entrance-guard-system-rfid-kit-v1-0-for-arduino.htmlAvec leur librairie vous initialisez le RFID en fournissant toutes les broches qui devraient être utilisées pour chaque broche RC522, comme ceci: `rfid.begin (irq, sck, mosi, miso, nss, rst);` c'était donc aussi simple que de changer la broche miso que j'avais fournie. Donc, par exemple, je ferais `rfid.begin (2,4,5,7,3,6);` pour vérifier un lecteur, puis faire `rfid.begin (2,4,5,8,3,6); `pour vérifier le prochain lecteur, et ainsi de suite.
Michael, tu es génial !!! J'ai eu des problèmes pour connecter 5 modules rfid pendant une semaine et rien n'a aidé. Vous avez résolu mon problème, merci. Cela fonctionne parfaitement :)
@Michael avez-vous connecté uniquement SCK, MOSI, SS, MISO? avez-vous laissé IRQ et RST non connectés? La broche SS est le SDA, correct?
Hé mec, tu as sauvé mon temps. Merci. Je me demande simplement pourquoi cette bibliothèque n'est pas dans les bibliothèques ou ailleurs?
En fait, le "truc" ne vient pas vraiment de la RFID LIB de Sunfounder, mais de la "sous-librairie" qu'ils utilisent, qui se trouve dans le même dossier et qui est .... SoftSPI! Cette bibliothèque semble agir un peu comme Software serial car elle vous permet de déclarer les PINS que vous voulez pour SPI. Très intéressant!!!!
bigjosh
2015-12-02 08:12:17 UTC
view on stackexchange narkive permalink

En regardant la fiche technique du MFR522, il n'est pas clair qu'il prenne même en charge SPI multidrop. Il ne mentionne rien sur l'état des broches de sortie SPI lorsque la puce n'est pas sélectionnée. Il mentionne également que la puce utilise la ligne de sélection esclave pour détecter le mode de communication à utiliser au démarrage, mais ne mentionne rien sur la façon dont la puce réagira aux changements sur cette broche après le démarrage.

Compte tenu de cela, ainsi que le fait que votre bibliothèque ne semble pas non plus prendre en charge les connexions à plusieurs MFR522, je suppose que cette puce ne prend en charge qu'un lien SPI 1-to-1.

De plus, les caractéristiques de synchronisation SPI dans le La fiche technique spécifie comment le SS (appelé NSS) doit être élevé avant que la communication ne puisse commencer, mais ne spécifie pas combien de temps après que SS passe à l'état bas que le MISO passe à trois états, ce qui serait une chose importante à savoir si la puce prend en charge la multidrop SPI.

Tout cela est corroboré par le comportement que vous observez. Si les deux puces pilotent la ligne MISO simultanément, la communication ne sera pas possible lorsque les deux sont connectés.

Pour prendre en charge plusieurs connexions MFR522, vous pourriez éventuellement ...

  1. Utilisez un tampon de multiplexage pour n'activer les lignes SPI que sur une puce à la fois. L'inconvénient est que vous auriez besoin de matériel supplémentaire, mais l'avantage est que vous pourriez probablement utiliser la bibliothèque existante intacte en sélectionnant le MFR522 souhaité avant de faire les appels linéaires.

  2. Connectez chaque MFR522 à un GPIO différent broches sur l'Arduino et bit bang le SPI à chaque puce indépendamment. L'avantage est que vous n'avez pas besoin de matériel supplémentaire et que vous avez potentiellement beaucoup de flexibilité sur la façon dont vous accédez aux MFR522. L'inconvénient est que vous devrez mettre à niveau ce SPI bit-bang dans la bibliothèque ou utiliser (ou écrire) une autre bibliothèque.

J'ai vu cette question se poser plusieurs fois au fil des ans, donc si vous choisissez l'option n ° 2, veuillez publier votre code afin que d'autres puissent l'utiliser!

Une expérience

Je vous propose de le faire pour savoir si vos puces sont compatibles avec SPI multi-drop ...

  1. Mettez votre système sous tension avec un lecteur RC522.
  2. Vérifiez et assurez-vous que cela fonctionne.
  3. Déconnectez les lignes SS et MISO du RC522 pour qu'elles ne soient plus connectées à l'Arduino (ou à autre chose). Laissez le RC522 sous tension - s'il se réinitialise, il risque de perdre la configuration SPI détectée automatiquement.
  4. Utilisez un cavalier pour connecter la ligne SS à la terre.
  5. Connectez la ligne MISO à la terre avec une résistance de 1K ohm.
  6. Utilisez un multimètre pour vérifier la tension sur la ligne MISO.
  7. Connectez la ligne MISO à Vcc avec la résistance de 1K ohm.
  8. Utilisez un multimètre pour vérifier la tension sur la ligne MISO.
  9. Connectez la ligne SS à Vcc.
  10. Répétez les étapes 3-6.

Rapportez le tableau des 4 lectures de tension que vous avez obtenues et nous devrions avoir notre réponse!

Bien que la fiche technique puisse être plus claire, il est extrêmement improbable qu'une puce qui prétend être un périphérique SPI échoue finalement à trois états de la ligne MISO lorsqu'elle n'est pas sélectionnée. En tout cas, il devrait être facilement testé.
Je serais enclin à être d'accord, mais une recherche rapide sur Google montre que de nombreuses personnes ont exactement le même problème - la connexion d'un 2e MFRC522 à la ligne MISO empêche le premier de fonctionner. Notez également que d'autres fiches techniques NXP mentionnent spécifiquement le tristate lorsqu'il est disponible (c'est-à-dire que le PCF85063BTL indique que la ligne de sortie de données SPI est "à haute impédance lorsqu'elle ne conduit pas". Sans avoir quelques puces en main à tester, il n'y a aucun moyen de savoir bien sûr, mais sur la base de toutes les preuves, je pense que cette puce ne prend probablement pas en charge le SPI multidrop.
Si quelqu'un en a 2 dans la région de New York, LMK et nous pouvons les examiner et obtenir une réponse finale faisant autorité!
Vous n'avez pas besoin de deux d'entre eux pour tester ce comportement - vous pouvez le tester avec un et une résistance.
«avec le fait que votre bibliothèque ne semble pas non plus prendre en charge les connexions à plusieurs MFR522» - cela ne semble pas être vrai. Il contient un exemple de code pour l'utilisation de plusieurs lecteurs: https://github.com/miguelbalboa/rfid/blob/master/examples/ReadUidMultiReader/ReadUidMultiReader.ino
Rodrigo Franco
2017-08-22 03:43:35 UTC
view on stackexchange narkive permalink

Je ne sais pas si chaque module a une résistance de pull-up dans sck et mosi si tel est le cas, il se pourrait que pour chaque module connecté sur les lignes, la résistance diminue. alors peut-être que le module ne peut pas laisser tomber la tension, il n'y a donc pas de communication. Vérifiez avec un multimètre la résistance entre Vcc et MOSI, elle doit généralement être d'environ 4,7k. j'espère que cela pourrait aider.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...