INHOUDSOPGAWE:

AVR/Arduino RFID -leser met UART -kode in C: 4 stappe
AVR/Arduino RFID -leser met UART -kode in C: 4 stappe

Video: AVR/Arduino RFID -leser met UART -kode in C: 4 stappe

Video: AVR/Arduino RFID -leser met UART -kode in C: 4 stappe
Video: Interfacing Rotary Encoder With Arduino Uno Using ChatGPT Generated Arduino Code | Coders Cafe 2024, November
Anonim
AVR/Arduino RFID -leser met UART -kode in C
AVR/Arduino RFID -leser met UART -kode in C

RFID is die gier wat oral gevind word - van voorraadstelsels tot kenteken -ID -stelsels. As u al ooit in 'n warenhuis was en deur die metaaldetektor-dinge by die ingangspunte gegaan het, dan het u RFID gesien. Daar is verskillende plekke om goeie inligting oor die opstel van RFID te vind, en hierdie instruksies fokus op die installering van die Parallax RFID -leser (Serial TTL) op 'n AVR, met die klem op die C -kode wat nodig is om die reeksinvoer te lees. Die kode is in C en gebruik geen eksterne biblioteke nie. In werklikheid spreek dit 2400 baud direk sonder die gebruik van 'n UART deur te sinchroniseer met die baud rate van die RFID -leser en die digitale pin waarmee dit gekoppel is, te lees. Opgewonde? Ek ook.

Stap 1: Kry die goedere

Kry die goedere
Kry die goedere

U benodig die volgende lys onderdele:

  • RFID -leser (Parallax #28140 $ 39,99)
  • RFID -tag (Parallax #32397 $ 0.99)
  • AVR- of Arduino -kloon (as u 'n voorraad -AVR gebruik, benodig u ook 'n maksimum van 232, 5 x 1uF kapasitors en 'n DE9 -aansluiting)
  • Soldeerlose broodbord

Opsioneel

  • Kopskrif met 4 posisies
  • Draad

(en die max232 ens. vir die kommunikasie van die etiketinligting) U kan ook u gunsteling LCD -skerm verbind in plaas van die stuur van data via RS232.

Stap 2: Koppel die onderdele

Koppel die onderdele
Koppel die onderdele
Koppel die onderdele
Koppel die onderdele
Koppel die onderdele
Koppel die onderdele

Die hardeware -kant van dinge is redelik maklik. In plaas daarvan om my RFID -leser direk in my broodbord te steek, het ek besluit om 'n vinnige kabel te maak sodat ek die RFID -leser 'n bietjie beter kon rondskuif. Daarvoor het ek net 4 posisies afgesny van 'n vroulike voetstukstrook waaroor ek gelê het en aan drie drade gesoldeer het. Elektriese band het die ghetto -aansluiting voltooi. Die RFID -leser het 4 verbindings:

  • Vcc
  • SKAKEL
  • UIT
  • Gnd

Soos u waarskynlik geraai het, koppel Vcc aan +5V en Gnd aan die grond. Omdat die RFID -leser soveel krag verbruik, kan u met die ENABLE -pen druk om dit met verskillende tussenposes aan en uit te skakel. Ek het eenvoudig gekies om dit aan te hou. Omdat dit omgekeerd is, trek u dit LOW om dit te aktiveer. Alternatiewelik kan u dit met die grond verbind. Ek het dit aan PIND3 gekoppel om my die opsies te gee om in/uit te skakel as ek besluit. Die OUT -pen is waarheen die leser sy seriële data stuur nadat hy 'n etiket gelees het. Ek het dit gekoppel aan PIND 2. Let wel, in die Parallax Heelal beteken rooi gaan. Dit wil sê, 'n groen LED beteken dat die eenheid onaktief en ledig is, terwyl 'n rooi LED beteken dat die eenheid aktief is. * trek sy skouers op* Gaan figuur.

Stap 3: Skryf die kode

Skryf die kode
Skryf die kode

Om die data van die RFID -leser te lees, moet u weet wanneer 'n etiket ingedien is, die data uit die seriële poort trek en dit dan iewers heen stuur.

RFID -leser dataformaat

Die Parallax RFID -leser stuur data teen 'n vaste, ystydige tempo van 2400 baud. 'N RFID -etiket is 10 grepe. Om die opsporing/regstelling van foute moontlik te maak, word die 10-byte RFID begrens deur 'n begin- en stopwagter, aangesien die leser van willekeurige geraas afgeskakel kan word. Die beginwag is lynvoer (0x0A) en die stopwagter is vervoeropgawe (0x0D). Dit lyk so:

[Begin Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stop Sentinel]Dit is die drie primêre stappe.

Weet wanneer 'n etiket ingedien is

Ek het 'n Pin Change Interrupt op die AVR gebruik wat die firmware in kennis stel dat 'n verandering op 'n gemonitorde pin plaasgevind het. Dit is maklik om die AVR hiervoor in te stel en dit is nodig om die vlag te stel, die MCU te vertel watter pen u wil monitor en die globale onderbrekingsbit in te stel. Stel PCINT op

BSET (PCICR, PCIE2); // pin change interrupt control register pcie2 BSET (PCMSK2, PCINT18); // maak onderbreking van pen verander vir PCINT18 (PD2) BSET (SREG, 7); // Stel SREG I-bit inSkryf u onderbrekingsdiensroetine: u wil u ISR kort hou, so in my onderbrekingsvektor lees ek die hele greep, stukkie vir stukkie, en stoor die greep in 'n globale wisselvallige karakterreeks. Ek doen die volgende by elke onderbreking:

  • Kontroleer of ek aan die gang is
  • Sentreer die tydsberekening op die middelste pols met 2400 baud (die snelheid van die RFID -leser)
  • Slaan die beginpunt oor en wag tot die middel van die volgende bietjie
  • Lees elke stukkie in 'n ongetekende heelgetal
  • As ek 8 bisse het, sit die byte in 'n karakterreeks
  • As ek 12 grepe versamel het, laat die MCU weet dat die etiket gelees is vir foutopsporing.

Ek het die SoftSerial -kode verander van Mikal Hart, wat die kode van David Mellis gewysig het vir die eksperimenteel bepaalde vertragings in die reeksroetines.

Ontleed RS232 -uitset

Die PCINT-roetine bevat die kode vir die lees van die RS232-uitset van die RFID-leser. Toe ek 12 grepe (10-byte RFID plus sentinels) gekry het, stel ek bDataReady op 1 en laat die hooflus die data verwerk en dit vertoon.

// dit is die interrupt handlerISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Begin bietjie gaan lae opbrengs; uint8_t bietjie = 0; TunedDelay (CENTER_DELAY); // Sentreer op beginbit vir (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // slaan 'n bietjie oor, broer … as (BCHK (PIND, RFID_IN)) BSET (bietjie, x); anders BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // slaan stopbit RFID_tag [rxIdx] = bietjie oor; ++ rxIdx; as (rxIdx == 12) bDataReady = 1;}

Vertoon u merker

In die hoof (), tydens die vir (ooit) lus, kyk ek of bDataReady ingestel is, wat aandui dat die hele RFID -struktuur gestuur is. Ek kyk dan of dit 'n geldige etiket is (dws begin- en stopkarakters is onderskeidelik 0x0A en 0x0D), en indien wel, stuur ek dit uit my RS232 -verbinding.

vir (;;) {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:"); vir (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); as (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Stap 4: Kode en afskeid

Hierdie bladsy bevat 'n zip -lêer met die relevante kode. Dit is in AVR Studio 4.16 geskryf. As u 'n notaboek, verduistering of vi (of iets anders) van die programmeerder gebruik, moet u 'n betroubare Makefile in die gids kopieer en hierdie lêers by die bronlyn voeg. Let ook op dat die tydsberekening vir die reeksleesafdeling gebaseer is op 16 MHz MCU. As u op 'n ander klokfrekwensie werk, moet u die ingestelde vertragings eksperimenteel bepaal om die baudrate -pulse te konsentreer. Ek hoop dat hierdie instruksies u op 'n manier gehelp het. As u voorstelle het oor hoe dit verbeter kan word, moet u dit asseblief laat weet!

Aanbeveel: