Indholdsfortegnelse:

AVR/Arduino RFID -læser med UART -kode i C: 4 trin
AVR/Arduino RFID -læser med UART -kode i C: 4 trin

Video: AVR/Arduino RFID -læser med UART -kode i C: 4 trin

Video: AVR/Arduino RFID -læser med UART -kode i C: 4 trin
Video: Employee Attendance Monitoring System using Face Recognition 2024, November
Anonim
AVR/Arduino RFID -læser med UART -kode i C
AVR/Arduino RFID -læser med UART -kode i C

RFID er dille, der findes overalt - fra beholdningssystemer til badge -ID -systemer. Hvis du nogensinde har været i et stormagasin og gået igennem de metaldetektorudseende ting ved indgangs-/udgangspunkterne, så har du set RFID. Der er flere steder at finde gode oplysninger om opsætning af RFID, og denne instrukser fokuserer på at installere Parallax RFID -læseren (Serial TTL) på en AVR, med vægt på C -koden, der er nødvendig for at aflæse det serielle input. Koden er i C og bruger ikke nogen eksterne biblioteker. Faktisk taler den 2400 baud direkte uden brug af en UART ved at synkronisere med RFID -læserens baudrate og læse den digitale pin, den er forbundet til. Begejstret? Også mig.

Trin 1: Få varerne

Få varerne
Få varerne

Du skal bruge følgende liste over dele:

  • RFID -læser (Parallax #28140 $ 39.99)
  • RFID -tag (Parallax #32397 $ 0.99)
  • AVR- eller Arduino -klon (hvis du bruger en lager -AVR, skal du også bruge max232, 5 x 1uF kondensatorer og et DE9 -stik)
  • Loddefrit brødbræt

Valgfri

  • 4 position header
  • Tråd

(og max232 osv. til kommunikation af taginformationen) Du kan også tilslutte din yndlings LCD -skærm i stedet for at sende tagdata via RS232.

Trin 2: Tilslut delene

Tilslut delene
Tilslut delene
Tilslut delene
Tilslut delene
Tilslut delene
Tilslut delene

Hardwaresiden af tingene er ret let. I stedet for at plonke min RFID -læser direkte ind i mit brødbræt valgte jeg at lave et hurtigt kabel, så jeg kunne flytte RFID -læseren lidt bedre rundt. Til det har jeg lige afskåret 4 positioner fra en hunstikkontakt, jeg havde liggende og loddet på tre ledninger. Elektrisk bånd afsluttede ghettostikket. RFID -læseren har 4 forbindelser:

  • Vcc
  • AKTIVER
  • UD
  • Gnd

Som du sikkert gættede det, skal du slutte Vcc til +5V og Gnd til jorden. Fordi RFID -læseren bruger så meget strøm, kan du slå på ENABLE -stiften for at slukke og tænde den med forskellige intervaller. Jeg valgte simpelthen at beholde den. Fordi den er omvendt, trækker du den LAVT for at aktivere den. Alternativt kan du slutte det til jorden. Jeg sluttede den til PIND3 for at give mig muligheder for at aktivere/deaktivere, hvis jeg besluttede mig for det. OUT -pin er, hvor læseren sender sine serielle data, efter at den har læst et tag. Jeg sluttede den til PIND2. Bemærk, i Parallax Universe betyder rødt go. Det vil sige, at en grøn LED betyder, at enheden er inaktiv og inaktiv, mens en rød LED betyder, at enheden er aktiv. * trækker på skuldrene* Gå figur.

Trin 3: Skriv koden

Skriv koden
Skriv koden

For at læse dataene fra RFID -læseren skal du vide, hvornår et tag er blevet indsendt, trække dataene ud af den serielle port og derefter sende det et sted.

RFID -læserdataformat

Parallax RFID -læseren sender data i et fast, glacialt tempo på 2400 baud. Et RFID -tag er 10 bytes. For at muliggøre fejldetektering/korrektion, da læseren kunne modregnes fra tilfældig støj, er 10-byte RFID afgrænset af en start- og stopvagt. Startvagten er line feed (0x0A), og stopvagten er vognretur (0x0D). Det ser sådan ud:

[Start Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stop Sentinel]Disse er de tre primære trin.

Ved, hvornår et tag er blevet indsendt

Jeg brugte en Pin Change Interrupt på AVR'en, der underretter firmwaren om, at der er sket en ændring på en overvåget pin. Konfiguration af AVR til dette er let og kræver indstilling af flaget, fortæller MCU'en hvilken pin du vil overvåge og indstilling af den globale afbrydelsesbit. Konfigurer PCINT

BSET (PCICR, PCIE2); // pin ændring afbryde kontrol register pcie2 BSET (PCMSK2, PCINT18); // Aktiver afbrydelse af pin -ændring for PCINT18 (PD2) BSET (SREG, 7); // Indstil SREG I-bitSkriv din rutine for afbrydelser Du vil holde din ISR kort, så i min afbrydelsesvektor læser jeg hele byte, bit for bit, og gemmer byten i et globalt flygtigt tegnarray. Jeg gør følgende ved hver afbrydelse:

  • Kontroller, om jeg er i gang
  • Centrer timingen på den midterste puls ved 2400 baud (RFID -læserens hastighed)
  • Spring startbiten over, og hold pause til midten af den næste bit
  • Læs hver bit ind i et usigneret heltal
  • Når jeg har 8 bits, skal du sætte byte i et karakter array
  • Når jeg har samlet 12 bytes, skal MCU fortælle, at tagget er blevet læst til fejlsøgning.

Jeg ændrede SoftSerial -kode fra Mikal Hart, der ændrede koden fra David Mellis for de eksperimentelt bestemte forsinkelser i de serielle rutiner.

Analyse RS232 -output

PCINT-rutinen indeholder koden til læsning af RS232-output fra RFID-læseren. Når jeg har fået 12 bytes (10-byte RFID plus vagtposter) sætter jeg bDataReady til 1 og lader hovedsløjfen behandle dataene og vise dem.

// dette er interrupt handlerISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Start bit går lavt retur; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Center på startbit for (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // spring lidt over, bror … hvis (BCHK (PIND, RFID_IN)) BSET (bit, x); ellers BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // spring stop bit RFID_tag [rxIdx] = bit; ++ rxIdx; hvis (rxIdx == 12) bDataReady = 1;}

Vis dit tag

I main (), under for (ever) loop, kontrollerer jeg, om bDataReady er blevet indstillet, hvilket signalerer, at hele RFID -strukturen er blevet sendt. Jeg kontrollerer derefter, om det er et gyldigt mærke (dvs. start- og stoptegn er henholdsvis 0x0A og 0x0D), og i så fald sender jeg det ud af min RS232 -forbindelse.

for (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Start byte:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ nStop byte:"); 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)); hvis (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Trin 4: Kode og farvel

Denne side indeholder en zip -fil med den relevante kode. Det blev skrevet i AVR Studio 4.16. Hvis du bruger programmørens notesblok, formørkelse eller vi (eller noget andet), skal du kopiere en betroet Makefile til biblioteket og tilføje disse filer til kildelinjen. Bemærk også, at timingen for den serielle læsning er baseret på en 16MHz MCU. Hvis du kører med en anden urfrekvens, skal du eksperimentelt bestemme de indstillede forsinkelser for at centrere baudhastighedspulserne. Jeg håber, at denne instruktive hjalp dig på en eller anden måde. Hvis du har forslag til, hvordan det kan forbedres, tøv ikke med at give mig besked!

Anbefalede: