Question:
Impossible de lire l'entrée sur les broches GPIO SDA / SCL
emptyset
2013-01-24 04:41:20 UTC
view on stackexchange narkive permalink

Je suis totalement perplexe en essayant de comprendre comment lire l'entrée des broches GPIO SDA / SCL sur le Pi.

Contexte: J'ai un lecteur RFID Wiegand 26 dont je souhaite lire les données. L'idée est que je récupère les bits du lecteur, que je les analyse / les interprète comme Wiegand, et à partir de là, je peux faire un certain nombre de choses. Pour l'instant, je ne suis concerné que par le dépannage de cette partie, même si ma configuration fait partie d'un système plus vaste.

Références: J'utilise le Pi Doorman comme guide, et j'utilise son programme C qui utilise la bibliothèque WiringPi. J'ai suivi les instructions pour installer la bibliothèque WiringPi et je compile wiegand.c avec les commutateurs, comme indiqué sur le site Web.

Il y a deux parties dont je sais que je dois déboguer, le circuit et le code.

Le circuit: Le circuit est montré dans l'image / pièce jointe ci-dessous. J'ai une Revision 1 Pi, que j'ai vérifiée en écrivant un petit programme pour appeler la méthode qui renvoie la révision en incluant câblagepi.h . J'ai obtenu de l'aide de certains spécialistes de l'électronique, car ce n'est pas ma timonerie. Comme vous pouvez le voir, le Pi Cobbler est utilisé, et nous connectons la terre de l'alimentation 12V au lecteur à l'une des broches de terre Pi. 5V sort du lecteur sur D0 (vert) et D1 (blanc), que nous abaissons à 3,3V, avant de se connecter respectivement à SDA et SCL. C'est également ainsi que cela est décrit dans le commentaire de wiegand.c.

the circuit

Le commentaire note également que la tension est maintenue élevée sur les deux lignes de données, j'ai donc testé avec un multimètre et a vu que près de 3,3 V entrait dans les broches Pi Cobbler pour chaque ligne. De plus, nous avons connecté les lignes à un oscilloscope et lorsque je glisse la carte RFID, comme décrit, la tension chute brièvement à 0V. Cela nous donne l'assurance que le circuit est précis, mais n'hésitez pas à revoir l'image et à me faire savoir si vous avez des pointeurs, surtout si vous avez réussi à le faire.

Le code: Le programme wiegand.c , semble bien écrit. Ce sont essentiellement deux threads qui maintiennent le waitForInterrupt sur chaque ligne de données, indéfiniment, jusqu'à ce que les bits soient lus. Un compteur est déclenché, qui tente plus ou moins de collecter tous les bits possibles d'une impulsion.

J'ai compilé le code selon les instructions de Pi Doorman, et je l'ai exécuté. Cela m'invite à utiliser le code de site standard, je dis Y puis appuyez sur Entrée. Lorsque je glisse la carte RFID, rien n'apparaît.

Il y a certaines choses que j'ai faites pour déboguer le code, principalement des instructions d'impression. Je ne suis pas allé très loin, sauf pour confirmer que le code doit fonctionner comme il est écrit. Comme je l'ai dit ci-dessus, j'ai téléchargé la source de la bibliothèque WiringPi et inspecté les méthodes pour voir ce qui se passait dans les coulisses, et j'ai vérifié que j'avais une Revision 1 Pi avec un petit programme pour l'exclure. De plus, dans le dossier / sys / class / gpio / sur le Pi, il y a des liens symboliques gpio0 et gpio1 définis, donc je pense avoir preuve solide que j'ai une carte de révision 1.

J'ai examiné de plus près la fonction câblagePiSetupSys qui est l'une des premières choses appelées par wiegand.c . Il y a une boucle ici:

  for (pin = 0; pin < 64; ++ pin) {sprintf (fName, "/ sys / class / gpio / gpio% d / value", broche); sysFds [pin] = open (fName, O_RDWR);}  

Donc, il se passe quelque chose ici. Quand je retourne à wiegand.c et ajoute du code à chaque thread, pour imprimer la valeur de retour de la fonction waitForInterrupt , c'est -2 . waitForInterrupt extrait essentiellement la valeur du tableau du descripteur de fichier, donc le -2 est finalement la valeur de retour de l'appel open () ici dans la fonction de configuration.

Je ne sais pas ce que cela signifie, mais c'est probablement une estimation sûre que l'appel open () pour la lecture / écriture a échoué, simplement parce que c'est la convention C de renvoyer des valeurs négatives pour des choses comme ça. Donc, si je ne peux pas ouvrir la broche en lecture / écriture, je ne peux pas lire les données.

Je dois également noter: la compilation et l'exécution de wiegand.c ont été faites sous l'utilisateur root , donc je ne pense pas que ce soit un problème d'autorisations. De plus, j'exécute wheezy debian sur ce Pi, au cas où cela compte.

Donc, quelques questions: - Où est-ce que je vais à partir d'ici, en termes de suivi ce que signifie l'erreur, ou en modifiant le code pour affiner cela davantage? - Quelqu'un a-t-il utilisé avec succès le Raspi et ce logiciel pour lire les données de cette manière, à partir d'un lecteur RFID comme celui-ci ou quelque chose de similaire?

J'espère que je n'ai rien oublié, mais faites-moi savoir si j'ai besoin de fournir des informations supplémentaires.

Le lecteur émet-il un bip lorsqu'il lit une carte ok? Ou est-ce à nous de le faire? J'ai le même lecteur que j'essaye de me connecter à une carte piface mais ça ne fait rien ...
avez-vous fait fonctionner cela correctement? seriez-vous en mesure de clarifier le dessin à la main? les deux valeurs de résistance sont-elles 100ohm? où les broches d0 et d1 se connectent-elles à ce circuit? :)
Deux réponses:
#1
+5
ikku
2013-01-26 20:14:11 UTC
view on stackexchange narkive permalink

D'abord et avant tout:

Si j'étais à votre place, je resterais loin de Wiegand en général !!!

Pourquoi :

  1. Wiegand est un protocole swipecard développé dans les années 1980. Il n'utilise aucune forme de signal d'horloge ou d'indication de vitesse, la synchronisation des données est effectuée sur la base du dernier bit qui a été transféré + le temps de retard Wiegand. Ceci est un inconvénient mais ne rend pas son utilisation impossible. Outre le fait qu'il existe de nombreuses implémentations et modifications différentes sur le protocole lui-même, cela n'est pas fait car c'est un si bon protocole.
  2. Wiegand 26, transfère un code 24 bits + 2 bits de parité, même le plus bon marché L'implémentation RFID (puces RFID 125Khz EM4102) utilise un code 40 bits dans chaque carte RFID. Votre lecteur émule Wiegand parce que les «vrais» lecteurs pour ce genre de choses n'existent plus. Cela signifie qu'il enverra les 24 premiers bits de la carte RFID et supprimera les 26 bits restants. Cela entraînera des cartes en double, car la plus grande partie des données n'est même pas transférée! Ce problème est encore plus important lorsque vous utilisez EPC (96 bits ou plus), alors seule une fraction du total des données est transférée.
  3. La plupart (je suppose que même tous!) Des lecteurs RFID modernes ont Wiegand comme option pour être compatible avec des installations très anciennes, il y a de fortes chances que votre lecteur supporte également la sortie série, veuillez vous rendre service et utiliser tout ce qui est disponible à l'exception de Wiegand.

À propos de Matériel:

La seule chose que vous pouvez faire est de vérifier méthodiquement et très précisément chaque partie de votre matériel en premier. Le fait qu'une ligne soit momentanément tirée à 0V ne signifie pas que la communication fonctionne réellement.

Sur un oscilloscope, vous devriez voir un «train d'impulsions» lors de la vérification des fils de communication. Lorsqu'aucune donnée n'est envoyée, DATA0 et DATA1 sont tirés au niveau de tension «élevé». Lorsqu'un 0 est envoyé, le fil DATA0 est tiré à une basse tension tandis que le fil DATA1 reste à une tension élevée. Lorsqu'un 1 est envoyé, le fil DATA1 est tiré à une tension basse tandis que DATA0 reste à une tension élevée. Vous devriez voir cela sur un oscilloscope, sur 5v avant les convertisseurs de niveau et à 3,3v après.

Vous devriez tracer / surveiller ce signal jusqu'au GPIO connecté sur la carte RPI, si cela est constant vous pouvez dire que le matériel fonctionne de manière stable. Assurez-vous également que vous utilisez les bonnes broches et que le signal semble toujours acceptable lorsqu'il entre dans le RPi. Breadboard, en raison de la façon dont ils sont construits, ont des effets indésirables (principalement des capacités), mais pour la vitesse moyenne de Wiegand cela ne devrait pas trop influencer je suppose, mais vérifiez quand même.

Après cela, vous pouvez commencer à regarder le logiciel. Ces erreurs (-2) dont vous parlez indiquent que quelque chose ne va pas, vous devrez les vérifier avant de continuer. Je suis sûr que Google ou une page de manuel peuvent fournir la réponse à cela. De plus, lorsque les données arrivent, ces gestionnaires d'interruptions devraient se déclencher (je suppose environ 26 fois par «balayage»), si cela ne se produit pas, les données n'arrivent toujours pas. Mais en vérifiant le code, il semble que cela devrait pouvoir fonctionner , donc je suppose que pour le moment, le matériel n'est toujours pas dans une forme optimale.

Vous pouvez également voir si ces gestionnaires d'interruption se déclenchent simplement en connectant et en déconnectant manuellement le 3.3v à l'entrée que vous utilisez, si vous ajoutez de printf () au gestionnaire d'interruption, quelque chose devrait être imprimé au moins une fois lorsque vous déconnectez le 3.3v de cette broche (le bord et la chute sont utilisés par gpio, je suppose que cela signifie le déclenchement sur le front descendant).

Et pour répondre à votre dernière question, oui, je je n'ai eu aucun problème à utiliser les lecteurs RFID sur le RPi, mais j'ai évité Wiegand depuis le début!

J'espère que cela vous aidera ...

Merci pour les conseils! Cela a fini par être le matériel (signal faible) comme vous pouvez le voir dans la réponse ci-dessous.Donc, si j'obtiens un meilleur lecteur, je pourrais lire les 40 bits dans un logiciel similaire? Il est bon de savoir pour une future mise à jour.
Il y a de fortes chances que votre lecteur actuel puisse déjà vous envoyer les données réelles (les 40 bits), pour les raisons que j'ai indiquées aux points 2 et 3 sous «Pourquoi».
#2
+1
emptyset
2013-01-29 08:42:19 UTC
view on stackexchange narkive permalink

J'ai donc obtenu l'aide d'un membre de Freeside pour connecter le lecteur RFID au GPIO du Pi. Je ne comprends pas complètement le circuit, mais l'essentiel est qu'il n'y avait pas assez de signal atteignant le GPIO du Pi avec le circuit comme je l'avais câblé. Au lieu de cela, nous avons trouvé ceci (voir ci-dessous).

the circuit diagram

the implemented circuit

Ensuite, lors de la nouvelle exécution du programme wiegand.c cette fois, nous avons obtenu un bon signal et le programme a pu décoder correctement le tableau de bits et générer l'identifiant du jeton RFID!



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...