Innholdsfortegnelse:

AVR/Arduino RFID -leser med UART -kode i C: 4 trinn
AVR/Arduino RFID -leser med UART -kode i C: 4 trinn

Video: AVR/Arduino RFID -leser med UART -kode i C: 4 trinn

Video: AVR/Arduino RFID -leser med UART -kode i C: 4 trinn
Video: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, November
Anonim
AVR/Arduino RFID -leser med UART -kode i C
AVR/Arduino RFID -leser med UART -kode i C

RFID er mani, funnet overalt - fra beholdningssystemer til merke -ID -systemer. Hvis du noen gang har vært på et varehus og gått gjennom de metalldetektor-utseende tingene ved inngangs-/utgangspunkter, så har du sett RFID. Det er flere steder å finne god informasjon om konfigurering av RFID, og denne instruksjonsfokus fokuserer på å installere Parallax RFID -leseren (Serial TTL) på en AVR, med vekt på C -koden som er nødvendig for å lese seriell inngang. Koden er i C og bruker ikke eksterne biblioteker. Faktisk snakker den 2400 baud direkte uten bruk av en UART ved å synkronisere med RFID -leserens baudhastighet og lese den digitale pinnen den er koblet til. Spent? Jeg også.

Trinn 1: Få varene

Få varene
Få varene

Du trenger følgende liste over deler:

  • RFID -leser (Parallax #28140 $ 39.99)
  • RFID -tag (Parallax #32397 $ 0.99)
  • AVR- eller Arduino -klon (hvis du bruker en lager -AVR, trenger du også en maks232, 5 x 1uF kondensatorer og en DE9 -kontakt)
  • Loddefritt brødbrett

Valgfri

  • To posisjon overskrift
  • Metalltråd

(og max232 osv. for kommunikasjon av taginformasjonen) Du kan også koble til din favoritt LCD -skjerm i stedet for å sende tagdata via RS232.

Trinn 2: Koble delene

Koble delene
Koble delene
Koble delene
Koble delene
Koble delene
Koble delene

Maskinvaresiden av ting er ganske enkel. I stedet for å plonere RFID -leseren min direkte inn i brødbrettet, valgte jeg å lage en rask kabel slik at jeg kunne flytte RFID -leseren litt bedre rundt. For det, kuttet jeg bare 4 posisjoner fra en hunkontakthodestrimmel jeg hadde liggende og loddet på tre ledninger. Elektrisk tape fullførte ghettokontakten. RFID -leseren har 4 tilkoblinger:

  • Vcc
  • MULIGGJØRE
  • UTE
  • Gnd

Som du sannsynligvis gjettet det, kobler du Vcc til +5V og Gnd til bakken. Fordi RFID -leseren bruker så mye strøm, kan du slå på ENABLE -pinnen for å slå den av og på med forskjellige intervaller. Jeg valgte ganske enkelt å beholde den. Fordi den er invertert, trekker du den LAV for å aktivere den. Alternativt kan du koble den til bakken. Jeg koblet den til PIND3 for å gi meg muligheter for å aktivere/deaktivere hvis jeg bestemte meg for det. OUT -pinnen er der leseren sender sine serielle data etter at den har lest en tag. Jeg koblet den til PIND2. Merk, i Parallax Universe betyr rødt go. Det vil si at en grønn LED betyr at enheten er inaktiv og inaktiv, mens en rød LED betyr at enheten er aktiv. * trekker på skuldrene* Gå figur.

Trinn 3: Skriv koden

Skriv koden
Skriv koden

For å lese dataene fra RFID -leseren må du vite når en tag er sendt inn, trekke dataene ut av serieporten og deretter sende dem et sted.

RFID Reader Data Format

Parallax RFID -leseren sender data i et fast istid på 2400 baud. En RFID -kode er 10 byte. For å gjøre det mulig å oppdage/korrigere feil, siden leseren kan settes av fra tilfeldig støy, er 10-byte RFID begrenset av en start- og stoppvakt. Startvaktmesteren er linjemating (0x0A) og stoppvaktmesteren er vognretur (0x0D). Det ser slik ut:

[Start Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stopp Sentinel]Dette er de tre hovedtrinnene.

Vet når en tag er sendt inn

Jeg brukte en Pin Change Interrupt på AVR som varsler fastvaren om at det har skjedd en endring på en overvåket pin. Det er enkelt å konfigurere AVR for dette og krever å sette flagget, fortelle MCU hvilken pin du vil overvåke og sette den globale avbruddsbiten. Konfigurer PCINT

BSET (PCICR, PCIE2); // pin -change interrupt control register pcie2 BSET (PCMSK2, PCINT18); // aktivere avbrudd for pin -endring for PCINT18 (PD2) BSET (SREG, 7); // Sett SREG I-bitSkriv din avbruddstjenesterutine Du vil beholde din ISR kort, så i min avbruddsvektor leser jeg hele byten, bit for bit, og lagrer byten i et globalt flyktig tegnsett. Jeg gjør følgende ved hvert avbrudd:

  • Kontroller at jeg er i gang
  • Sentrer timingen på midtpulsen ved 2400 baud (hastigheten til RFID -leseren)
  • Hopp over startbiten og pause til midten av neste bit
  • Les hver bit inn i et usignert heltall
  • Når jeg har 8 bits, setter du byten inn i en tegnserie
  • Når jeg har samlet 12 byte, må MCU vite at taggen er lest for feildeteksjon.

Jeg endret SoftSerial -koden fra Mikal Hart som endret koden fra David Mellis for de eksperimentelt bestemte forsinkelsene i serierutinene.

Analyse RS232 -utgang

PCINT-rutinen inneholder koden for lesing av RS232-utdata fra RFID-leseren. Når jeg har fått 12 byte (10-byte RFID pluss sentineler) setter jeg bDataReady til 1 og lar hovedsløyfen behandle dataene og vise dem.

// dette er interrupt handlerISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Start bit går lav retur; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Senter på startbit for (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // hoppe over litt, bror … hvis (BCHK (PIND, RFID_IN)) BSET (bit, x); annet BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // hopp over stoppbit RFID_tag [rxIdx] = bit; ++ rxIdx; hvis (rxIdx == 12) bDataReady = 1;}

Vis taggen din

I main (), under for (ever) loop, sjekker jeg for å se om bDataReady er satt, og signaliserer at hele RFID -strukturen er sendt. Jeg sjekker deretter om det er en gyldig tag (dvs. start- og stopptegn er henholdsvis 0x0A og 0x0D), og i så fall sender jeg den ut min RS232 -tilkobling.

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 ("\ nStopp 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; }}

Trinn 4: Kode og farvel

Denne siden inneholder en zip -fil med den relevante koden. Den ble skrevet i AVR Studio 4.16. Hvis du bruker programmererens notisblokk, formørkelse eller vi (eller noe annet), må du kopiere en klarert Makefile til katalogen og legge disse filene til kildelinjen. Vær oppmerksom på at timingen for den serielle leseseksjonen er basert på en 16MHz MCU. Hvis du kjører med en annen klokkefrekvens, må du eksperimentelt bestemme de innstilte forsinkelsene for å sentrere baudfrekvenspulsene. Jeg håper at denne instruktøren hjalp deg på en eller annen måte. Hvis du har forslag til hvordan det kan forbedres, ikke nøl med å gi meg beskjed!

Anbefalt: