RFID čítačka: Rozdiel medzi revíziami
Zo stránky SensorWiki
(101 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 22: | Riadok 22: | ||
'''Literatúra:''' | '''Literatúra:''' | ||
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod. | * Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod. | ||
*http://www.fi.muni.cz/usr/jkucera/pv109/2005/xkukucka.htm | |||
*http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/ | |||
*Prednášky | |||
*http://www.instructables.com/id/Magic-Music-Table-RFID-iP | |||
__TOC__ | __TOC__ | ||
Riadok 30: | Riadok 35: | ||
[[Súbor:AcrobBoard.png]] | [[Súbor:AcrobBoard.png]] | ||
'''Čo je to RFID''' | |||
RFID (Radio Frequency Identification) - rádiofrekvenčný systém identifikácie je moderná technológia na identifikáciu objektov pomocou rádiofrekvenčných vĺn. Informácie sú v elektronickej podobe ukladané do malých čipov-tagov, z ktorých je možné následne načítať a opakovane prepisovať pomocou rádiových vĺn, toto spracovanie sa však nedeje po jednotlivých čítaniach ako u v súčasnosti používaných čiarových kódov, ale hromadne. Súčasné čítacie zariadenia dokážu naraz načítať až niekoľko sto tagov za minutu. Podobne ako u čiarových kódov sa informácie zaznamenávajú na nosič dát - tzv. RFID tag, ktorý je pripevnený na sledované objekty, tag obsahuje malý čip s anténou a pamäťou. RFID tagy sú základom systému pre ukladanie a prenos informácií pomocou elektromagnetických vĺn. Môže ich hromadne prečítať a zaznamenať príslušné čítacie zariadenie, ktoré môže byť pevné alebo mobilné. Pomocou vĺn vyžiarených z čítacieho zariadenia dôjde k nabitiu chipu a následne sa informácie uložené v chipe bezdrôtovo prenesú späť do čítacieho zariadenia (každý tag obsahuje tzv. EPC kód - electronic product code, jedná sa o jednoznačné sériové číslo tagu). | |||
Každá implementácia RFID technológie obsahuje tagy pre označenie objektov, čítacie zariadenia a tzv. Middleware (riadiaci systém, ktorý zaisťuje hromadné spracovanie všetkých načítaných tagov v dosahu čítacích zariadení a prenesení spracovaných dát do náväzného informačného alebo riadiaceho systému). | |||
Pridelené frekvenčné pásma pre UHF tagy: | |||
*Región 1 865 - 869 MHz Európa a Afrika | |||
*Region 2 902 - 928 MHz USA, Kanada a Mexiko | |||
*Región 3 950 - 956 MHz Japonsko a Ázie | |||
'''Vlastnosti RFID reader-u (čítačky)''' | |||
*firma Parallax | |||
*dve LED diódy na signalizovanie stavu | |||
*komunikačná rýchlosť 2400 baud | |||
*čitanie tagov s frekvenciou 125kHz | |||
*napájacie napätie 4,5 - 5,5 V | |||
*rozmery: 62.2 x 82.5 x 5.57 mm | |||
*rozsah pracovnej teploty: -40 to +85 °C | |||
*4 piny: VCC, /ENABLE, SOUT, GND | |||
''Zapojenie pinov RFID čítačky'' | |||
[[Súbor:p.png]] | |||
'''Komunikácia pomocou I2C''' | |||
*sériová synchrónna zbernica vyvinutá firmou Philips nazývaná aj InterIntegrated Circuit | |||
*počet obvodov pripojených na zbernicu je obmedzený počtom adries a celkovou kapacitou zbernice <400 pF (jednotkou dĺžky je pF) | |||
*Na prenos informácie sú použité dve nesymetrické vedenia: | |||
SCL(hodiny) | |||
SDA(data) | |||
Tieto vodiče sú obojsmerné a pomocou PULL UP rezistorov ťahané hore. Všetky zariadenia pripojené na zbernicu musia mať "otvorený kolektor". Budiče zbernice majú implementované "drôtové AND". | |||
*obvody, ktoré používajú I2C protokol zahŕňajú pamäte EEPROM a RAM, senzory teploty, expandéry portov, hodiny reálneho času, atď. | |||
''Módy prenosu (prenosová rýchlosť):'' | |||
*Standard mode: <100kb/s | |||
*Fast mode: <400kb/s | |||
*Fast mode plus: <1000kb/s | |||
*High-speed mode: <3400kb/s (10bit adresa, až 1024 zariadení ) | |||
''I2C prenos dát'' | |||
Dáta sú po SDA prenášané bytovo. Niekoľko bytov oraničených Start a stoP podmienkami. Prenos bitu je podmienený jedným impulzom na SCL. Signál na SDA vodiči musí byť stabilný ak je CLK signál v úrovni Log. 1. | |||
*Ak je zbernica voľná, môže sa uskutočniť prenos. T.j. oba vodiče sú v logickej jednotke. | |||
*MASTER inicializuje a ukončuje prenos. | |||
*Prenos sa začne, ak MASTER odvysiela Start podmienku | |||
*Prenos sa ukončí, ak MASTER odvysiela stoP podmienku | |||
*Zbernica je medzi Start a stoP podmienkou v stave „busy“ | |||
*Ak sa medzi Start a stoP podmienkou objaví opakovaný Start, tento stav sa označuje ako REPEATED Start podmienka (Sr, S) | |||
*Start a stoP podmienka sa realizujú ako zmena na SDA počas vysokej úrovne na SCL vodiči | |||
''I2C Protokol'' | |||
[[Súbor:pro.jpg]] | |||
'''UART''' | |||
Najskôr len veľmi stručne o tom, čo je to UART a na čo môže byť dobrý. Skratka UART by sa dala preložiť ako univerzálny asynchrónny prijímač / vysielač. Je to kúsok hardvéru, ktorý pomocou dvoch pinov (väčšinou označovaných ako RX a TX) odosiela a prijíma dáta. Keďže sa jedná o asynchrónne spôsob komunikácie, obsahuje prijímač aj vysielač vlastný generátor hodinového signálu, ktorým sa UART riadi. A keďže je UART univerzálny, je tiež možné rýchlosť týchto hodín riadiť (nie je stanovená), rovnako ako veľkosť jedného bajtu, počet stôp bitov, paritný bit, atď. Často môžeme tiež počuť skratku USART. Jedná sa v podstate o to isté, len s tým rozdielom, že je USART obsahuje aj synchrónny režim. | |||
== Popis riešenia == | == Popis riešenia == | ||
Pin VCC sme zapojili na +5V a pin GND na zem. Pin ENABLE je invertovaný, co znamená nízka (low) úroveň ho aktivuje. Alternatívne sa dá tiež pripojiť na Gnd. My sme ho zapojili na PIN D3. Pin OUT je pin kde sú posielané dáta po prečítaní tagu. My sme ho pripojili na PIN D2. Vizuálna indikácia stavu RFID čítačky je pomocou LED diód daných na čítačku. Keď je modul úspešne napájaný a číta niečo tak svieti zelená LED. Ked je modul aktívny a hľadá komunikáciu so správnym tagom svieti červená LED. | |||
RFID čítačka je aktivovaná cez pin /ENABLE. Keď je napájaná a /ENABLE je na log.0 modul sa spustí do aktívnej úrovne. Keď /ENABLE je na log.1 alebo nezapojený modul posiela stav IDLE. | |||
RFID prenáša dáta cez USB virtual COM port driver. Toho ľahko povoluje prístup k dátam z každej softwarovej aplikácie, programovacieho jazyka alebo zbernice, ktorá komunikuje s COM portom. Keď je RFID aktívna a tag je správne priložený kód je prenášaný ako 12 bitový ASCII string sériovo do formátu, kde štart a stop bit nám indentifikujú že string bol poslaný správne a 10 prostredných bitov je kód. | |||
'''Schéma zapojenia čítačky''' | |||
[[Súbor:schemickaaa.jpg]] | |||
Riadok 55: | Riadok 124: | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Všeobecný pohľad nato ako program funguje je možno vidieť na nasledujúcom vývojovom diagrame. Program je napísaný v programovacom prostredí AVR Studio 4. | |||
[[Súbor:diaggrramm.png]] | |||
<source lang="c"> | <source lang="c"> | ||
int main( | #include "common.h" | ||
#include <avr/interrupt.h> | |||
printf(" | #include <stdlib.h> | ||
return(0); | #include "serial.h" | ||
#include<stdio.h> | |||
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); | |||
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ); | |||
static void RFID_init(void); | |||
static void RFID_ena(uint8_t ena); | |||
static void TunedDelay(uint16_t); | |||
#define RFID_IN PIND2 | |||
#define RFID_ENA PIND3 | |||
// Values taken from SoftSerial from Mikal Hart | |||
#define CENTER_DELAY 471 | |||
#define INTRABIT_DELAY 950 | |||
static volatile uint8_t bDataReady; | |||
static volatile uint8_t rxIdx; | |||
int RFID_tag[12]; | |||
int main() | |||
{ | |||
inituart(); | |||
stdout = &uart_output; | |||
stdin = &uart_input; | |||
DDRD = (1<<DDD6) | (1<<DDD5); | |||
PORTD = (0<<PD6) | (0<<PD5); //D5 zelena LED | |||
_delay_ms(5000); | |||
RFID_init(); | |||
RFID_ena(1); | |||
TunedDelay(947); | |||
for (;;) | |||
{ | |||
if (bDataReady) | |||
{ | |||
printf("RFID tag: "); | |||
for(uint8_t x = 1; x < 11; x++) | |||
{ | |||
x++; | |||
printf("%i",RFID_tag[x]); | |||
if (x%2==0 && x<9) | |||
printf("-"); | |||
} | |||
printf("\n"); | |||
//53-50-66-69-53 BLUE KEYCHAIN PASIVE | |||
if (RFID_tag[10]==53 && RFID_tag[8]==69 && RFID_tag[6]==66 &&RFID_tag[4]==50 && RFID_tag[2]==53) | |||
{ | |||
printf("Správny kód\n"); | |||
PORTD = (1<<PD5); | |||
_delay_ms(2000); | |||
PORTD = (0<<PD5); | |||
_delay_ms(500); | |||
printf("Prístup povolený\n\n"); | |||
} | |||
else { | |||
printf("Nesprávny kód!!\n"); | |||
PORTD = (1<<PD6); | |||
_delay_ms(2000); | |||
PORTD = (0<<PD6); | |||
_delay_ms(500); | |||
printf("Priloz inu kartu!\n\n"); | |||
} | |||
rxIdx = 0; | |||
bDataReady = 0; | |||
} | |||
} | |||
} | |||
void RFID_init() | |||
{ | |||
bDataReady = 0; | |||
rxIdx = 0; | |||
// RFID_IN input from RFID Reader SOUT, RFID_ENA output to RFID Reader /ENA | |||
BSET(DDRD, RFID_ENA); | |||
BSET(PORTD,RFID_IN); // pullup | |||
BSET(PCICR,PCIE2); // pin change interrupt control register pcie2 -> PCICR = 0b00000100 | |||
BSET(PCMSK2,PCINT18); // enable pin change interrupt for PCINT18 (PD2) -> PCMSK2 = 0b00000100 | |||
BSET(SREG,7); // Set SREG I-bit -> SREG = 0b10000000 | |||
} | |||
ISR(PCINT2_vect) | |||
{ | |||
if (BCHK(PIND,RFID_IN)) // Start bit goes low | |||
return; | |||
uint8_t bit = 0; | |||
TunedDelay(CENTER_DELAY); // Center on start bit | |||
for (uint8_t x = 0; x < 8; x++) | |||
{ | |||
TunedDelay(INTRABIT_DELAY); | |||
if (BCHK(PIND,RFID_IN)) | |||
BSET(bit,x); | |||
else | |||
BCLR(bit,x); | |||
} | |||
TunedDelay(INTRABIT_DELAY); | |||
RFID_tag[rxIdx] = bit; | |||
++rxIdx; | |||
if (rxIdx == 12) | |||
bDataReady = 1; | |||
} | |||
void RFID_ena(uint8_t ena) | |||
{ | |||
if (ena) | |||
BCLR(PORTD,RFID_ENA); | |||
else | |||
BSET(PORTD,RFID_ENA); | |||
} | |||
void TunedDelay(uint16_t delay) // delay function | |||
{ | |||
uint8_t tmp=0; | |||
asm volatile("sbiw %0, 0x01 \n\t" | |||
"ldi %1, 0xFF \n\t" | |||
"cpi %A0, 0xFF \n\t" | |||
"cpc %B0, %1 \n\t" | |||
"brne .-10 \n\t" | |||
: "+r" (delay), "+a" (tmp) | |||
: "0" (delay) | |||
); | |||
} | |||
void CriticalSegment(uint8_t ena) | |||
{ | |||
static uint8_t sreg; | |||
if (ena) | |||
{ | |||
sreg = SREG; // save off our global status register | |||
cli(); // stop global interrupts | |||
} else | |||
{ | |||
SREG = sreg; // restore global interrupt flag (and any other prev settings) | |||
} | |||
} | |||
} | } | ||
</source> | </source> | ||
Zdrojový kód: [[Médiá: | Zdrojový kód: [[Médiá:common.c]] [[Médiá:common.h]] [[Médiá:RFID_.c]] [[Médiá:serialll.c]] [[Médiá:serialll.h]] | ||
=== Overenie === | |||
RFID čítačku treba zapojiť na +5V. Pred prvým použitím je potrebné nastaviť prenosovú rýchlosť 2400 baudov, 8 dátovych bitov, 1 štart bit, 1 stop bit a žiadnu paritu. Pripojenie mikropočítača je urobené pomocou USB kábla. AK svieti červená LED, tak čítačka je pripravená na čítanie a čaká kým priložíme dáky tag ( kartu, kľúčenku na prečítanie). Keď priložíme k čítačke kartu tak nám prečíta kód ktorý je tam nahraný, a môžeme ho vidieť pomocou UART komunikácie v PC. Tento kód však nie je správny, tak LED dióda svieti na červeno a uvidíme výpis: Nesprávny kód! Ak priložíme kľučenku vypíše sa nám správny kód, rozsvieti sa zelená LED a uvidíme nápis Prístup povolený. | |||
Obrázky na ilustráciu | |||
[[Súbor:rfid2.jpg]] | |||
[[Súbor:rfid4.jpg]] | |||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]] |
Aktuálna revízia z 16:11, 13. január 2015
Autori: | Martin Kocian a Juraj Švančara | |
Študijný odbor: | Aplikovaná mechatronika | 2. Ing. (2014) |
Zadanie
Pomocou RFID čítačky navrhnite elektronický zámok na kód. Popíšte princíp RFID vyhodnocovanie, zistite akú triedu RFID prvkov je schopná čítačka rozpoznať a zmerajte ukážkové data a vyhodnoťte meranie.
http://www.parallax.com/product/28140
Literatúra:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
- http://www.fi.muni.cz/usr/jkucera/pv109/2005/xkukucka.htm
- http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/
- Prednášky
- http://www.instructables.com/id/Magic-Music-Table-RFID-iP
Analýza
Našou úlohou, ako bolo spomenuté je navrhnúť pomocou RFID čítačky elektronický zámok na kód. Čo v princípe znamená, že ak priložíme k čítačke kartu (klúčenku), alebo hocičo čo v sebe obsahuje kód, tak ten sa vyhodnotí ako správny len ten ktorý sme v kóde zadefinovali my. Adresy a dáta sú prenášané sériovo pomocou zbernice I2C. Komunikácia bola vykonaná cez univerzálne sériové rozhranie UART. Ako mikroprocesor sme použili ATmegu 328P,ktorý je dosadený na vývojovej doske Acrob, s ktorou sme pracovali aj na cvičení.
Čo je to RFID
RFID (Radio Frequency Identification) - rádiofrekvenčný systém identifikácie je moderná technológia na identifikáciu objektov pomocou rádiofrekvenčných vĺn. Informácie sú v elektronickej podobe ukladané do malých čipov-tagov, z ktorých je možné následne načítať a opakovane prepisovať pomocou rádiových vĺn, toto spracovanie sa však nedeje po jednotlivých čítaniach ako u v súčasnosti používaných čiarových kódov, ale hromadne. Súčasné čítacie zariadenia dokážu naraz načítať až niekoľko sto tagov za minutu. Podobne ako u čiarových kódov sa informácie zaznamenávajú na nosič dát - tzv. RFID tag, ktorý je pripevnený na sledované objekty, tag obsahuje malý čip s anténou a pamäťou. RFID tagy sú základom systému pre ukladanie a prenos informácií pomocou elektromagnetických vĺn. Môže ich hromadne prečítať a zaznamenať príslušné čítacie zariadenie, ktoré môže byť pevné alebo mobilné. Pomocou vĺn vyžiarených z čítacieho zariadenia dôjde k nabitiu chipu a následne sa informácie uložené v chipe bezdrôtovo prenesú späť do čítacieho zariadenia (každý tag obsahuje tzv. EPC kód - electronic product code, jedná sa o jednoznačné sériové číslo tagu).
Každá implementácia RFID technológie obsahuje tagy pre označenie objektov, čítacie zariadenia a tzv. Middleware (riadiaci systém, ktorý zaisťuje hromadné spracovanie všetkých načítaných tagov v dosahu čítacích zariadení a prenesení spracovaných dát do náväzného informačného alebo riadiaceho systému). Pridelené frekvenčné pásma pre UHF tagy:
- Región 1 865 - 869 MHz Európa a Afrika
- Region 2 902 - 928 MHz USA, Kanada a Mexiko
- Región 3 950 - 956 MHz Japonsko a Ázie
Vlastnosti RFID reader-u (čítačky)
- firma Parallax
- dve LED diódy na signalizovanie stavu
- komunikačná rýchlosť 2400 baud
- čitanie tagov s frekvenciou 125kHz
- napájacie napätie 4,5 - 5,5 V
- rozmery: 62.2 x 82.5 x 5.57 mm
- rozsah pracovnej teploty: -40 to +85 °C
- 4 piny: VCC, /ENABLE, SOUT, GND
Zapojenie pinov RFID čítačky
Komunikácia pomocou I2C
- sériová synchrónna zbernica vyvinutá firmou Philips nazývaná aj InterIntegrated Circuit
- počet obvodov pripojených na zbernicu je obmedzený počtom adries a celkovou kapacitou zbernice <400 pF (jednotkou dĺžky je pF)
- Na prenos informácie sú použité dve nesymetrické vedenia:
SCL(hodiny) SDA(data)
Tieto vodiče sú obojsmerné a pomocou PULL UP rezistorov ťahané hore. Všetky zariadenia pripojené na zbernicu musia mať "otvorený kolektor". Budiče zbernice majú implementované "drôtové AND".
- obvody, ktoré používajú I2C protokol zahŕňajú pamäte EEPROM a RAM, senzory teploty, expandéry portov, hodiny reálneho času, atď.
Módy prenosu (prenosová rýchlosť):
- Standard mode: <100kb/s
- Fast mode: <400kb/s
- Fast mode plus: <1000kb/s
- High-speed mode: <3400kb/s (10bit adresa, až 1024 zariadení )
I2C prenos dát
Dáta sú po SDA prenášané bytovo. Niekoľko bytov oraničených Start a stoP podmienkami. Prenos bitu je podmienený jedným impulzom na SCL. Signál na SDA vodiči musí byť stabilný ak je CLK signál v úrovni Log. 1.
- Ak je zbernica voľná, môže sa uskutočniť prenos. T.j. oba vodiče sú v logickej jednotke.
- MASTER inicializuje a ukončuje prenos.
- Prenos sa začne, ak MASTER odvysiela Start podmienku
- Prenos sa ukončí, ak MASTER odvysiela stoP podmienku
- Zbernica je medzi Start a stoP podmienkou v stave „busy“
- Ak sa medzi Start a stoP podmienkou objaví opakovaný Start, tento stav sa označuje ako REPEATED Start podmienka (Sr, S)
- Start a stoP podmienka sa realizujú ako zmena na SDA počas vysokej úrovne na SCL vodiči
UART
Najskôr len veľmi stručne o tom, čo je to UART a na čo môže byť dobrý. Skratka UART by sa dala preložiť ako univerzálny asynchrónny prijímač / vysielač. Je to kúsok hardvéru, ktorý pomocou dvoch pinov (väčšinou označovaných ako RX a TX) odosiela a prijíma dáta. Keďže sa jedná o asynchrónne spôsob komunikácie, obsahuje prijímač aj vysielač vlastný generátor hodinového signálu, ktorým sa UART riadi. A keďže je UART univerzálny, je tiež možné rýchlosť týchto hodín riadiť (nie je stanovená), rovnako ako veľkosť jedného bajtu, počet stôp bitov, paritný bit, atď. Často môžeme tiež počuť skratku USART. Jedná sa v podstate o to isté, len s tým rozdielom, že je USART obsahuje aj synchrónny režim.
Popis riešenia
Pin VCC sme zapojili na +5V a pin GND na zem. Pin ENABLE je invertovaný, co znamená nízka (low) úroveň ho aktivuje. Alternatívne sa dá tiež pripojiť na Gnd. My sme ho zapojili na PIN D3. Pin OUT je pin kde sú posielané dáta po prečítaní tagu. My sme ho pripojili na PIN D2. Vizuálna indikácia stavu RFID čítačky je pomocou LED diód daných na čítačku. Keď je modul úspešne napájaný a číta niečo tak svieti zelená LED. Ked je modul aktívny a hľadá komunikáciu so správnym tagom svieti červená LED.
RFID čítačka je aktivovaná cez pin /ENABLE. Keď je napájaná a /ENABLE je na log.0 modul sa spustí do aktívnej úrovne. Keď /ENABLE je na log.1 alebo nezapojený modul posiela stav IDLE. RFID prenáša dáta cez USB virtual COM port driver. Toho ľahko povoluje prístup k dátam z každej softwarovej aplikácie, programovacieho jazyka alebo zbernice, ktorá komunikuje s COM portom. Keď je RFID aktívna a tag je správne priložený kód je prenášaný ako 12 bitový ASCII string sériovo do formátu, kde štart a stop bit nám indentifikujú že string bol poslaný správne a 10 prostredných bitov je kód.
Schéma zapojenia čítačky
Algoritmus a program
Všeobecný pohľad nato ako program funguje je možno vidieť na nasledujúcom vývojovom diagrame. Program je napísaný v programovacom prostredí AVR Studio 4.
#include "common.h"
#include <avr/interrupt.h>
#include <stdlib.h>
#include "serial.h"
#include<stdio.h>
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ);
static void RFID_init(void);
static void RFID_ena(uint8_t ena);
static void TunedDelay(uint16_t);
#define RFID_IN PIND2
#define RFID_ENA PIND3
// Values taken from SoftSerial from Mikal Hart
#define CENTER_DELAY 471
#define INTRABIT_DELAY 950
static volatile uint8_t bDataReady;
static volatile uint8_t rxIdx;
int RFID_tag[12];
int main()
{
inituart();
stdout = &uart_output;
stdin = &uart_input;
DDRD = (1<<DDD6) | (1<<DDD5);
PORTD = (0<<PD6) | (0<<PD5); //D5 zelena LED
_delay_ms(5000);
RFID_init();
RFID_ena(1);
TunedDelay(947);
for (;;)
{
if (bDataReady)
{
printf("RFID tag: ");
for(uint8_t x = 1; x < 11; x++)
{
x++;
printf("%i",RFID_tag[x]);
if (x%2==0 && x<9)
printf("-");
}
printf("\n");
//53-50-66-69-53 BLUE KEYCHAIN PASIVE
if (RFID_tag[10]==53 && RFID_tag[8]==69 && RFID_tag[6]==66 &&RFID_tag[4]==50 && RFID_tag[2]==53)
{
printf("Správny kód\n");
PORTD = (1<<PD5);
_delay_ms(2000);
PORTD = (0<<PD5);
_delay_ms(500);
printf("Prístup povolený\n\n");
}
else {
printf("Nesprávny kód!!\n");
PORTD = (1<<PD6);
_delay_ms(2000);
PORTD = (0<<PD6);
_delay_ms(500);
printf("Priloz inu kartu!\n\n");
}
rxIdx = 0;
bDataReady = 0;
}
}
}
void RFID_init()
{
bDataReady = 0;
rxIdx = 0;
// RFID_IN input from RFID Reader SOUT, RFID_ENA output to RFID Reader /ENA
BSET(DDRD, RFID_ENA);
BSET(PORTD,RFID_IN); // pullup
BSET(PCICR,PCIE2); // pin change interrupt control register pcie2 -> PCICR = 0b00000100
BSET(PCMSK2,PCINT18); // enable pin change interrupt for PCINT18 (PD2) -> PCMSK2 = 0b00000100
BSET(SREG,7); // Set SREG I-bit -> SREG = 0b10000000
}
ISR(PCINT2_vect)
{
if (BCHK(PIND,RFID_IN)) // Start bit goes low
return;
uint8_t bit = 0;
TunedDelay(CENTER_DELAY); // Center on start bit
for (uint8_t x = 0; x < 8; x++)
{
TunedDelay(INTRABIT_DELAY);
if (BCHK(PIND,RFID_IN))
BSET(bit,x);
else
BCLR(bit,x);
}
TunedDelay(INTRABIT_DELAY);
RFID_tag[rxIdx] = bit;
++rxIdx;
if (rxIdx == 12)
bDataReady = 1;
}
void RFID_ena(uint8_t ena)
{
if (ena)
BCLR(PORTD,RFID_ENA);
else
BSET(PORTD,RFID_ENA);
}
void TunedDelay(uint16_t delay) // delay function
{
uint8_t tmp=0;
asm volatile("sbiw %0, 0x01 \n\t"
"ldi %1, 0xFF \n\t"
"cpi %A0, 0xFF \n\t"
"cpc %B0, %1 \n\t"
"brne .-10 \n\t"
: "+r" (delay), "+a" (tmp)
: "0" (delay)
);
}
void CriticalSegment(uint8_t ena)
{
static uint8_t sreg;
if (ena)
{
sreg = SREG; // save off our global status register
cli(); // stop global interrupts
} else
{
SREG = sreg; // restore global interrupt flag (and any other prev settings)
}
}
}
Zdrojový kód: Médiá:common.c Médiá:common.h Médiá:RFID_.c Médiá:serialll.c Médiá:serialll.h
Overenie
RFID čítačku treba zapojiť na +5V. Pred prvým použitím je potrebné nastaviť prenosovú rýchlosť 2400 baudov, 8 dátovych bitov, 1 štart bit, 1 stop bit a žiadnu paritu. Pripojenie mikropočítača je urobené pomocou USB kábla. AK svieti červená LED, tak čítačka je pripravená na čítanie a čaká kým priložíme dáky tag ( kartu, kľúčenku na prečítanie). Keď priložíme k čítačke kartu tak nám prečíta kód ktorý je tam nahraný, a môžeme ho vidieť pomocou UART komunikácie v PC. Tento kód však nie je správny, tak LED dióda svieti na červeno a uvidíme výpis: Nesprávny kód! Ak priložíme kľučenku vypíše sa nám správny kód, rozsvieti sa zelená LED a uvidíme nápis Prístup povolený.
Obrázky na ilustráciu