Frage:
Eingabe an SDA / SCL-GPIO-Pins kann nicht gelesen werden
emptyset
2013-01-24 04:41:20 UTC
view on stackexchange narkive permalink

Ich bin total ratlos, wenn ich herausfinden will, wie man Eingaben in die SDA / SCL-GPIO-Pins auf dem Pi liest.

Kontext: Ich habe einen Wiegand 26-RFID-Leser dass ich Daten von lesen möchte. Die Idee ist, dass ich die Teile vom Leser bekomme, sie als Wiegand analysiere / interpretiere und von dort aus eine Reihe von Dingen tun kann. Im Moment beschäftige ich mich nur mit der Fehlerbehebung in diesem Teil, obwohl mein Setup Teil eines größeren Systems ist.

Referenzen: Ich habe den Pi Doorman verwendet Website als Leitfaden, und ich verwende sein C-Programm, das die WiringPi-Bibliothek verwendet. Ich habe die Anweisungen zum Installieren der WiringPi-Bibliothek befolgt und wiegand.c mit den Schaltern kompiliert, wie auf der Website gezeigt.

Ich weiß, dass ich zwei Teile debuggen muss, die Schaltung und den Code.

Die Schaltung: Die Schaltung ist in der Abbildung / im Anhang unten dargestellt. Ich habe einen Revision 1 Pi, den ich durch Schreiben eines kleinen Programms überprüft habe, um die Methode aufzurufen, die die Revision zurückgibt, indem wiringpi.h eingeschlossen wird. Ich habe Hilfe von einigen Elektronikleuten bekommen, da dies nicht mein Steuerhaus ist. Wie Sie sehen können, wird der Pi Cobbler verwendet, und wir verbinden die Erdung von der 12-V-Stromversorgung zum Lesegerät mit einem der Pi-Erdungsstifte. 5 V kommen aus dem Lesegerät an D0 (grün) und D1 (weiß), die wir auf 3,3 V herabsetzen, bevor wir sie an SDA bzw. SCL anschließen. So wird es auch im Kommentar in wiegand.c beschrieben.

the circuit

Der Kommentar stellt außerdem fest, dass die Spannung auf beiden Datenleitungen hoch gehalten wird, also habe ich mit getestet ein Multimeter und sah, dass nahe 3,3 V in die Pi Cobbler-Pins für jede Leitung gingen. Außerdem haben wir die Leitungen an ein Oszilloskop angeschlossen, und wenn ich die RFID-Karte wie beschrieben durchwische, fällt die Spannung kurz auf 0 V ab. Das gibt uns die Gewissheit, dass die Schaltung genau ist, aber Sie können das Bild gerne überprüfen und mich wissen lassen, ob Sie Hinweise haben, insbesondere, wenn dies erfolgreich funktioniert hat.

Der Code: Das Programm wiegand.c scheint gut geschrieben zu sein. Grundsätzlich sind es zwei Threads, die den waitForInterrupt in jeder Datenzeile auf unbestimmte Zeit halten, bis Bits gelesen werden. Es wird ein Zähler ausgelöst, der mehr oder weniger versucht, alle möglichen Bits aus einem Impuls zu sammeln.

Ich habe den Code gemäß den Anweisungen von Pi Doorman kompiliert und ausgeführt. Ich werde aufgefordert, den Standard-Site-Code zu verwenden. Ich sage Y und drücke dann die Eingabetaste. Wenn ich die RFID-Karte durchwische, wird nichts angezeigt.

Ich habe einige Dinge getan, um den Code zu debuggen, hauptsächlich Druckanweisungen. Ich bin nicht weit gekommen, außer um zu bestätigen, dass der Code so funktionieren sollte, wie er geschrieben wurde. Wie ich oben sagte, habe ich die Quelle für die WiringPi-Bibliothek heruntergeladen und die Methoden überprüft, um zu sehen, was hinter den Kulissen passiert, und überprüft, ob ich einen Revision 1 Pi mit einem kleinen Programm hatte, um dies auszuschließen. Außerdem sind im Ordner / sys / class / gpio / auf dem Pi die Symlinks gpio0 und gpio1 definiert Starke Beweise Ich habe eine Revision 1-Karte.

Ich habe mir die Funktion wiringPiSetupSys genauer angesehen, die eines der ersten Dinge ist, die von wiegand.c code aufgerufen werden >. Hier gibt es eine Schleife:

  für (Pin = 0; Pin < 64; ++ Pin) {sprintf (fName, "/ sys / class / gpio / gpio% d / value", Stift); sysFds [pin] = open (fName, O_RDWR);}  

Hier passiert also etwas. Wenn ich zu wiegand.c zurückkehre und jedem Thread Code hinzufüge, um den Rückgabewert der Funktion waitForInterrupt auszudrucken, ist es -2 . waitForInterrupt zieht den Wert grundsätzlich aus dem Dateideskriptor-Array heraus, sodass -2 letztendlich der Rückgabewert aus dem Aufruf von open () ist die Setup-Funktion.

Ich weiß nicht, was das bedeutet, aber es ist wahrscheinlich eine sichere Vermutung, dass der Aufruf von open () zum Lesen / Schreiben fehlgeschlagen ist, nur weil es die C-Konvention ist, negative Werte für solche Dinge zurückzugeben. Wenn ich den Pin zum Lesen / Schreiben nicht öffnen kann, kann ich keine Daten lesen.

Ich sollte auch beachten: Das Kompilieren und Ausführen von wiegand.c wurde durchgeführt unter dem Benutzer root , daher denke ich nicht, dass dies ein Berechtigungsproblem ist. Außerdem führe ich auf diesem Pi pfeifendes Debian aus, falls dies wichtig ist.

Also ein paar Fragen: - Wohin gehe ich von hier aus in Bezug auf das Tracking? Was bedeutet der Fehler? Oder den Code ändern, um ihn weiter einzugrenzen? - Hat jemand den Raspi und diese Software erfolgreich verwendet, um Daten auf diese Weise von einem RFID-Lesegerät wie diesem oder ähnlichem zu lesen?

Ich hoffe, ich habe nichts ausgelassen, aber lassen Sie mich wissen, wenn ich zusätzliche Informationen benötigen muss.

Gibt der Leser einen Piepton ab, wenn er eine Karte liest? Oder liegt es an uns, dies zu verwirklichen? Ich habe den gleichen Leser, den ich versuche, mit einem Piface-Board zu verbinden, aber es macht nichts ...
Hast du das richtig zum Laufen gebracht? Könnten Sie die Handzeichnung klären? sind beide Widerstandswerte 100 Ohm? Wo verbinden sich die Pins d0 und d1 mit dieser Schaltung? :) :)
Zwei antworten:
#1
+5
ikku
2013-01-26 20:14:11 UTC
view on stackexchange narkive permalink

In erster Linie:

Wenn ich in Ihren Schuhen stecke, würde ich mich generell von Wiegand fernhalten !!!

Warum :

  1. Wiegand ist ein Swipecard-Protokoll, das in den 1980er Jahren entwickelt wurde. Es wird keine Taktsignal- oder Geschwindigkeitsanzeige verwendet. Das Daten-Timing basiert auf dem zuletzt übertragenen Bit + der Wiegand-Verzögerungszeit. Dies ist ein Nachteil, macht jedoch die Verwendung nicht unmöglich. Abgesehen davon, dass es viele verschiedene Implementierungen und Änderungen am Protokoll selbst gibt, wird dies nicht durchgeführt, da es ein so gutes Protokoll ist.
  2. Wiegand 26 überträgt einen 24-Bit-Code + 2 Paritätsbits, selbst die billigsten Die RFID-Implementierung (125-kHz-EM4102-RFID-Chips) verwendet 40-Bit-Code in jeder RFID-Karte. Ihr Leser emuliert Wiegand, weil es für dieses Zeug keine "echten" Leser mehr gibt. Dies bedeutet, dass die ERSTEN 24 Bits der RFID-Karte gesendet und die verbleibenden 26 Bits gelöscht werden. Dies führt zu doppelten Karten, da der größte Teil der Daten nicht einmal übertragen wird! Dieses Problem ist noch wichtiger, wenn Sie EPC (96 Bit oder mehr) verwenden, dann wird nur ein Bruchteil der Gesamtdaten übertragen.
  3. Die meisten (ich denke sogar alle!) Der modernen RFID-Lesegeräte haben Wiegand Als Option, um mit sehr alten Installationen kompatibel zu sein, unterstützt Ihr Reader wahrscheinlich auch die serielle Ausgabe. Bitte tun Sie sich selbst einen Gefallen und verwenden Sie alles, was außer Wiegand verfügbar ist.
  4. ol>

    Über die Hardware:

    Sie können nur methodisch und sehr präzise jeden Teil Ihrer Hardware zuerst überprüfen. Die Tatsache, dass eine Leitung vorübergehend auf 0 V gezogen wird, bedeutet nicht, dass die Kommunikation tatsächlich funktioniert.

    Bei einem Oszilloskop sollte beim Überprüfen der Kommunikationskabel eine Impulsfolge angezeigt werden. Wenn keine Daten gesendet werden, werden sowohl DATA0 als auch DATA1 auf den Hochspannungspegel gebracht. Wenn eine 0 gesendet wird, wird das DATA0-Kabel auf eine niedrige Spannung gezogen, während das DATA1-Kabel auf einer hohen Spannung bleibt. Wenn eine 1 gesendet wird, wird das Kabel DATA1 auf eine niedrige Spannung gezogen, während DATA0 auf einer hohen Spannung bleibt. Sie sollten dies auf einem Oszilloskop sehen, auf 5 V vor den Pegelwandlern und auf 3,3 V nach.

    Sie sollten dieses Signal bis zu dem auf der RPI-Karte angeschlossenen GPIO verfolgen / überwachen, wenn dies konstant ist Sie können sagen, dass die Hardware stabil arbeitet. Stellen Sie außerdem sicher, dass Sie die richtigen Pins verwenden und das Signal beim Eintritt in das RPi immer noch akzeptabel aussieht. Breadboard hat aufgrund seiner Bauweise einige unerwünschte Effekte (hauptsächlich Kapazitäten), aber für die Durchschnittsgeschwindigkeit von Wiegand sollte dies nicht allzu viel beeinflussen, aber überprüfen Sie es trotzdem.

    Danach können Sie sich die Software ansehen. Diese Fehler (-2), über die Sie sprechen, sind ein Hinweis darauf, dass etwas nicht zufrieden ist. Sie müssen diese überprüfen, bevor Sie fortfahren. Ich bin sicher, dass Google oder eine Manpage die Antwort darauf geben kann. Wenn Daten in diesen Interrupt-Handlern eingehen, sollten sie ausgelöst werden (ich schätze ungefähr 26 Mal pro "Wischen"). Wenn dies nicht geschieht, kommen immer noch keine Daten an. Wenn Sie jedoch den Code überprüfen, sieht es so aus, als ob er funktionieren könnte Daher denke ich, dass die Hardware im Moment immer noch nicht in optimaler Form ist.

    Sie können auch sehen, ob diese Interrupt-Handler ausgelöst werden, indem Sie die 3.3V einfach manuell mit dem von Ihnen verwendeten Eingang verbinden und die Verbindung trennen. Wenn Sie dem Interrupt-Handler etwas printf () hinzufügen, sollte etwas sein Wird mindestens einmal gedruckt, wenn Sie die 3,3 V von diesem Pin trennen (Kante und Fall werden von GPIO verwendet, ich nehme an, dies bedeutet Auslöser bei fallender Flanke).

    Und um Ihre letzte Frage zu beantworten: Ja, ich hatte kein Problem mit RFID-Lesegeräten auf dem RPi, aber ich habe Wiegand von Anfang an gemieden!

    Hoffe das hilft ...

Danke für die Tipps! Es war letztendlich die Hardware (schwaches Signal), wie Sie aus der Antwort unten sehen können. Wenn ich also einen besseren Leser bekomme, könnte ich alle 40 Bits in einem ähnlichen Softwareprogramm lesen? Es ist gut zu wissen, für ein zukünftiges Upgrade.
Möglicherweise kann Ihr aktueller Leser Ihnen bereits die realen Daten (alle 40 Bit) senden, aus den Gründen, auf die ich in Punkt 2 und 3 unter "Warum" hingewiesen habe.
#2
+1
emptyset
2013-01-29 08:42:19 UTC
view on stackexchange narkive permalink

Also bekam ich Hilfe von einem Freeside-Kollegen bei der Verkabelung des RFID-Lesegeräts mit dem GPIO des Pi. Ich verstehe die Schaltung nicht vollständig, aber das Wesentliche ist, dass es nicht genug Signal gab, das den GPIO des Pi mit der Schaltung so erreichte, wie ich es verdrahtet hatte. Stattdessen haben wir uns das ausgedacht (siehe unten).

the circuit diagram

the implemented circuit

Wenn Sie dann das Programm wiegand.c erneut ausführen, Dieses Mal haben wir ein gutes Signal erhalten und das Programm konnte das Bit-Array korrekt dekodieren und die RFID-Token-ID generieren!



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...