Inhaltsverzeichnis:

AVR/Arduino RFID-Reader mit UART-Code in C - Gunook
AVR/Arduino RFID-Reader mit UART-Code in C - Gunook

Video: AVR/Arduino RFID-Reader mit UART-Code in C - Gunook

Video: AVR/Arduino RFID-Reader mit UART-Code in C - Gunook
Video: Learning AVR-C Episode 10: Serial Communication (TX) 2024, November
Anonim
AVR/Arduino RFID-Lesegerät mit UART-Code in C
AVR/Arduino RFID-Lesegerät mit UART-Code in C

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

Holen Sie sich die Ware
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

Verbinden Sie die Teile
Verbinden Sie die Teile
Verbinden Sie die Teile
Verbinden Sie die Teile
Verbinden Sie die Teile
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

Schreiben Sie den Code
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!

Empfohlen: