Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
RFID ist der Trend und überall zu finden – von Inventarsystemen bis hin zu Ausweis-ID-Systemen. Wenn Sie schon einmal in einem Kaufhaus waren und an den Ein-/Ausgängen durch diese Metalldetektoren gelaufen sind, dann haben Sie RFID gesehen. Es gibt mehrere Orte, um gute Informationen zum Einrichten von RFID zu finden, und diese Anleitung konzentriert sich auf die Installation des Parallax RFID-Lesers (serielles TTL) auf einem AVR, mit Schwerpunkt auf dem C-Code, der zum Lesen der seriellen Eingabe erforderlich ist. Der Code ist in C und verwendet keine externen Bibliotheken. Tatsächlich spricht es 2400 Baud direkt ohne die Verwendung eines UART, indem es sich mit der Baudrate des RFID-Lesegeräts synchronisiert und den digitalen Pin liest, mit dem er verbunden ist. Aufgeregt? Ich auch.
Schritt 1: Holen Sie sich die Ware
Sie benötigen die folgende Teileliste:
- RFID-Lesegerät (Parallaxe #28140 39,99 $)
- RFID-Tag (Parallaxe #32397 0,99 €)
- AVR- oder Arduino-Klon (wenn Sie einen Standard-AVR verwenden, benötigen Sie auch einen max232, 5 x 1uF-Kondensatoren und einen DE9-Anschluss)
- Lötfreies Steckbrett
Optional
- Kopfzeile mit 4 Positionen
- Kabel
(und das max232 usw. für die Kommunikation der Tag-Informationen) Sie können auch Ihren bevorzugten LCD-Bildschirm anschließen, anstatt Tag-Daten über RS232 zu senden.
Schritt 2: Verbinden Sie die Teile
Die Hardwareseite der Dinge ist ziemlich einfach. Anstatt meinen RFID-Leser direkt in mein Steckbrett zu stecken, entschied ich mich für ein schnelles Kabel, damit ich den RFID-Leser etwas besser bewegen konnte. Dafür habe ich einfach 4 Positionen von einer Buchsenleiste, die ich herumliegen hatte, abgeschnitten und an drei Drähten angelötet. Isolierband vervollständigte den Ghetto-Anschluss. Der RFID-Leser hat 4 Anschlüsse:
- Vcc
- AKTIVIEREN
- AUS
- Gnd
Wie Sie es wahrscheinlich erraten haben, verbinden Sie Vcc mit +5V und Gnd mit Masse. Da der RFID-Leser so viel Strom verbraucht, können Sie den ENABLE-Pin anschlagen, um ihn in verschiedenen Intervallen aus- und wieder einzuschalten. Ich habe mich einfach dafür entschieden, es beizubehalten. Da es invertiert ist, ziehen Sie es LOW, um es zu aktivieren. Alternativ können Sie es mit Masse verbinden. Ich habe es mit PIND3 verbunden, um mir Optionen zum Aktivieren / Deaktivieren zu geben, wenn ich mich dafür entscheide. Am OUT-Pin sendet der Reader seine seriellen Daten, nachdem er ein Tag gelesen hat. Ich habe es mit PIND2 verbunden. Beachten Sie, dass im Parallax Universe Rot bedeutet, dass es geht. Das heißt, eine grüne LED bedeutet, dass das Gerät inaktiv und inaktiv ist, während eine rote LED bedeutet, dass das Gerät aktiv ist. *achselzucken* Denk mal.
Schritt 3: Schreiben Sie den Code
Um die Daten vom RFID-Lesegerät zu lesen, müssen Sie wissen, wann ein Tag gesendet wurde, die Daten von der seriellen Schnittstelle abziehen und dann irgendwohin senden.
Datenformat des RFID-Lesegeräts
Der Parallax RFID-Leser sendet Daten mit einem festen, eiszeitlichen Tempo von 2400 Baud. Ein RFID-Tag ist 10 Byte groß. Um eine Fehlererkennung/-korrektur zu ermöglichen, da das Lesegerät durch zufälliges Rauschen ausgelöst werden könnte, wird das 10-Byte-RFID durch einen Start- und Stopp-Wächter begrenzt. Der Start-Wächter ist Zeilenvorschub (0x0A) und der Stopp-Wächter ist Wagenrücklauf (0x0D). Es sieht aus wie das:
[Start Sentinel |Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|Byte 6|Byte 7|Byte 8|Byte 9|Byte 10| Wächter stoppen]Dies sind die drei wichtigsten Schritte.
Wissen, wann ein Tag gesendet wurde
Ich habe einen Pin Change Interrupt auf dem AVR verwendet, der die Firmware benachrichtigt, dass eine Änderung an einem überwachten Pin aufgetreten ist. Die Konfiguration des AVR dafür ist einfach und erfordert das Setzen des Flags, die Angabe des zu überwachenden Pins der MCU und das Setzen des globalen Interrupt-Bits. PCINT konfigurieren
BSET(PCICR, PCIE2); // Pinänderungs-Interrupt-Steuerregister pcie2 BSET (PCMSK2, PCINT18); // Pin-Wechsel-Interrupt für PCINT18 (PD2) aktivieren BSET (SREG, 7); // Setze SREG I-BitSchreiben Sie Ihre Interrupt-Service-Routine Sie möchten Ihre ISR kurz halten, also lese ich in meinem Interrupt-Vektor das gesamte Byte, Bit für Bit, und speichere das Byte in einem globalen flüchtigen Zeichenarray. Bei jedem Interrupt mache ich folgendes:
- Überprüfen Sie, ob ich am Anfang stehe
- Zentrieren Sie das Timing auf den mittleren Puls bei 2400 Baud (die Geschwindigkeit des RFID-Lesers)
- Überspringe das Startbit und pausiere bis zur Mitte des nächsten Bits
- Lies jedes Bit in eine vorzeichenlose ganze Zahl ein
- Wenn ich 8 Bit habe, füge das Byte in ein Zeichenarray ein
- Wenn ich 12 Byte gesammelt habe, teilen Sie der MCU mit, dass das Tag zur Fehlererkennung gelesen wurde.
Ich habe SoftSerial-Code von Mikal Hart modifiziert, der Code von David Mellis für die experimentell ermittelten Verzögerungen in den seriellen Routinen modifiziert hat.
RS232-Ausgang parsen
Die PCINT-Routine enthält den Code zum Lesen der RS232-Ausgabe des RFID-Readers. Wenn ich 12 Bytes (10-Byte-RFID plus Sentinels) habe, setze ich bDataReady auf 1 und lasse die Hauptschleife die Daten verarbeiten und anzeigen.
// Dies ist der Interrupt-HandlerISR (PCINT2_vect) { if (BCHK (PIND, RFID_IN)) // Startbit geht auf Low Return; uint8_t-Bit = 0; TunedDelay(CENTER_DELAY); // Auf Startbit zentrieren für (uint8_t x = 0; x < 8; x++) { TunedDelay(INTRABIT_DELAY); // ein bisschen überspringen, Bruder… if (BCHK(PIND, RFID_IN)) BSET(bit, x); sonst BCLR(bit, x); } TunedDelay(INTRABIT_DELAY); // Stoppbit überspringen RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}
Zeigen Sie Ihr Tag an
In main() überprüfe ich während der for(ever)-Schleife, ob bDataReady gesetzt wurde, was signalisiert, dass die gesamte RFID-Struktur gesendet wurde. Ich überprüfe dann, ob es ein gültiges Tag ist (dh Start- und Stoppzeichen sind 0x0A bzw. 0x0D), und wenn ja, sende ich es über meine RS232-Verbindung aus.
for (;;){ if (bDataReady) {#ifdef _DEBUG_ USART_tx_S("Startbyte: "); USART_tx_S(itoa(RFID_tag[0], &ibuff[0], 16)); ibuff[0] = 0; ibuff[1] = 0; USART_tx_S("\nStopbyte: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nRFID-Tag: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(RFID_tag[x], ibuff, 16)); if (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}
Schritt 4: Code und Abschied
Diese Seite enthält eine ZIP-Datei mit dem entsprechenden Code. Es wurde in AVR Studio 4.16 geschrieben. Wenn Sie den Editor des Programmierers, Eclipse oder vi (oder etwas anderes) verwenden, müssen Sie ein vertrauenswürdiges Makefile in das Verzeichnis kopieren und diese Dateien zur Quellzeile hinzufügen. Beachten Sie auch, dass das Timing für den seriellen Leseabschnitt auf a basiert 16MHz-MCU. Wenn Sie mit einer anderen Taktfrequenz laufen, müssen Sie experimentell die abgestimmten Verzögerungen bestimmen, um die Baudratenimpulse zu zentrieren. Ich hoffe, dass diese Anleitung Ihnen in irgendeiner Weise geholfen hat. Wenn Sie Verbesserungsvorschläge haben, zögern Sie nicht, mich zu informieren!