Innehållsförteckning:

AVR/Arduino RFID -läsare med UART -kod i C: 4 steg
AVR/Arduino RFID -läsare med UART -kod i C: 4 steg

Video: AVR/Arduino RFID -läsare med UART -kod i C: 4 steg

Video: AVR/Arduino RFID -läsare med UART -kod i C: 4 steg
Video: Arduino Missile Defense Radar System in ACTION 2024, November
Anonim
AVR/Arduino RFID -läsare med UART -kod i C
AVR/Arduino RFID -läsare med UART -kod i C

RFID är vurmen, som finns överallt - från lagersystem till ID -system för märken. Om du någonsin har varit på ett varuhus och gått igenom de metalldetektor-snygga sakerna vid ingångs-/utgångspunkterna, har du sett RFID. Det finns flera ställen att hitta bra information om hur man konfigurerar RFID, och den här instruerbara fokuserar på att installera Parallax RFID -läsaren (Serial TTL) på en AVR, med tonvikt på C -koden som behövs för att läsa serieingången. Koden finns i C och använder inga externa bibliotek. Faktum är att den talar 2400 baud direkt utan att använda en UART genom att synkronisera med RFID -läsarens baudhastighet och läsa den digitala stift som den är ansluten till. Upphetsad? Jag med.

Steg 1: Skaffa varorna

Skaffa varorna
Skaffa varorna

Du behöver följande lista med delar:

  • RFID -läsare (Parallax #28140 $ 39,99)
  • RFID -tagg (Parallax #32397 $ 0,99)
  • AVR- eller Arduino -klon (om du använder en AVR i lager behöver du också max232, 5 x 1uF kondensatorer och en DE9 -kontakt)
  • Lödlös brödbräda

Frivillig

  • Sidhuvud med 4 positioner
  • Tråd

(och max232 etc för kommunikation av etikettinformationen) Du kan också ansluta din favorit LCD -skärm istället för att skicka taggdata via RS232.

Steg 2: Anslut delarna

Anslut delarna
Anslut delarna
Anslut delarna
Anslut delarna
Anslut delarna
Anslut delarna

Hårdvarusidan är en ganska enkel sak. Istället för att plonka in min RFID -läsare direkt i min brödbräda valde jag att göra en snabbkabel så att jag kunde flytta runt RFID -läsaren lite bättre. För det klippte jag bara av 4 positioner från en honkontaktremsa som jag hade liggande och lödde på tre ledningar. Eltejp slutförde ghettokontakten. RFID -läsaren har 4 anslutningar:

  • Vcc
  • GÖR DET MÖJLIGT
  • UT
  • Gnd

Som du säkert gissade, anslut Vcc till +5V och Gnd till jord. Eftersom RFID -läsaren förbrukar så mycket ström kan du slå på ENABLE -stiftet för att stänga av och på med olika intervall. Jag valde helt enkelt att fortsätta. Eftersom den är inverterad drar du den LÅG för att aktivera den. Alternativt kan du ansluta den till jord. Jag kopplade den till PIND3 för att ge mig alternativ för att aktivera/inaktivera om jag bestämde mig för det. OUT -stiftet är dit läsaren skickar sina seriella data efter att den läst en tagg. Jag kopplade den till PIND2. Observera, i Parallax -universum betyder rött att gå. Det vill säga en grön lysdiod betyder att enheten är inaktiv och inaktiv, medan en röd lysdiod betyder att enheten är aktiv. * rycka på axlarna* Gå figur.

Steg 3: Skriv koden

Skriv koden
Skriv koden

För att läsa data från RFID -läsaren måste du veta när en tagg har skickats in, dra ut data från serieporten och skicka den någonstans.

RFID Reader Data Format

Parallax RFID -läsare skickar data i en fast, glacial takt på 2400 baud. En RFID -tagg är 10 byte. För att möjliggöra feldetektering/-korrigering, eftersom läsaren kan avstängas från slumpmässigt brus, begränsas 10-bytes RFID av en start- och stoppvakt. Startvaktmästaren är radmatning (0x0A) och stoppvaktposten är vagnretur (0x0D). Det ser ut så här:

[Start Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stop Sentinel]Det här är de tre primära stegen.

Vet när en tagg har skickats in

Jag använde ett Pin Change Interrupt på AVR som meddelar firmware att en ändring har skett på en övervakad pin. Att konfigurera AVR för detta är enkelt och kräver att flaggan ställs in, meddelar MCU vilken pin du vill övervaka och ställer in den globala avbrottsbiten. Konfigurera PCINT

BSET (PCICR, PCIE2); // stiftbyte avbryt kontrollregister pcie2 BSET (PCMSK2, PCINT18); // aktivera stiftbytesavbrott för PCINT18 (PD2) BSET (SREG, 7); // Ställ in SREG I-bitSkriv din avbrottsrutin Du vill hålla din ISR kort så i min avbrottsvektor läser jag hela byten bit för bit och lagrar byten i en global flyktig teckenmatris. Jag gör följande vid varje avbrott:

  • Kontrollera att jag är igång
  • Centrera timingen på mittpulsen vid 2400 baud (RFID -läsarens hastighet)
  • Hoppa över startbiten och pausa till mitten av nästa bit
  • Läs in varje bit i ett osignerat heltal
  • När jag har 8 bitar lägger du in byten i en teckenmatris
  • När jag har samlat 12 byte, låt MCU veta att taggen har lästs för feldetektering.

Jag modifierade SoftSerial -koden från Mikal Hart som ändrade koden från David Mellis för de experimentellt bestämda förseningarna i serierutinerna.

Analysera RS232 -utgång

PCINT-rutinen innehåller koden för att läsa RS232-utmatningen från RFID-läsaren. När jag har fått 12 byte (10-byte RFID plus vaktposter) ställer jag in bDataReady till 1 och låter huvudslingan bearbeta data och visa dem.

// detta är interrupt handlerISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Startbiten blir låg avkastning; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Center på startbiten för (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // hoppa över lite, bror … om (BCHK (PIND, RFID_IN)) BSET (bit, x); annars BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // hoppa över stoppbit RFID_tag [rxIdx] = bit; ++ rxIdx; if (rxIdx == 12) bDataReady = 1;}

Visa din tagg

I main (), under för (någonsin) loop, kontrollerar jag om bDataReady har ställts in, vilket signalerar att hela RFID -strukturen har skickats. Jag kontrollerar sedan om det är en giltig tagg (dvs. start- och stopptecken är 0x0A respektive 0x0D), och i så fall skickar jag ut min RS232 -anslutning.

för (;;) {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 ("\ nStoppbyte:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16));#endif if (ValidTag ()) {USART_tx_S ("\ nRFID Tag:"); för (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); om (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Steg 4: Kod och avsked

Denna sida innehåller en zip -fil med relevant kod. Det skrevs i AVR Studio 4.16. Om du använder programmerarens anteckningsblock, eclipse eller vi (eller något annat) måste du kopiera en betrodd Makefile till katalogen och lägga till dessa filer på källraden. Observera också att tidpunkten för den seriella lässektionen är baserad på en 16MHz MCU. Om du kör med en annan klockfrekvens måste du experimentellt bestämma de inställda fördröjningarna för att centrera baudfrekvenspulserna. Jag hoppas att denna instruerbara hjälpte dig på något sätt. Om du har några förslag på hur det kan förbättras, tveka inte att meddela mig!

Rekommenderad: