V pisarnah, nakupovalnih središčih in na mnogih drugih mestih vemo, da lahko v sobo vstopi samo oseba z avtorizacijsko kartico. Ti sistemi uporabljajo RFID komunikacijski sistem. RFID se v nakupovalnih središčih uporablja za zaustavitev kraje, saj so izdelki označeni s čipom RFID in ko oseba zapusti stavbo s čipom RFID, se samodejno sproži alarm. Oznaka RFID je zasnovana tako majhno kot del peska. Sistemi za preverjanje pristnosti RFID so enostavni za načrtovanje in poceni. Nekatere šole in fakultete danes uporabljajo sisteme za udeležbo na osnovi RFID.
V tem projektu bomo iz varnostnih razlogov zasnovali RFID sistem cestninjenja. Ta sistem torej odpira vrata in omogoča ljudem samo pooblaščene oznake RFID. Pooblaščeni ID-ji imetnikov oznak so programirani v mikrokrmilniku ATMEGA in samo ti imetniki lahko zapustijo ali vstopijo v prostore.
Potrebne komponente
Strojna oprema: mikrokrmilnik ATmega32, napajalnik (5v), programer AVR-ISP, JHD_162ALCD (16x2 LCD modul), kondenzator 100uF (priključen na napajalnik), gumb, upor 10KΩ, kondenzator 100nF, LED (dva kosa), EM-18 (RFID modul bralnika), IC gonilnik motorja L293D, 5V DC motor.
Programska oprema: Atmel studio 6.1, progisp ali flash magic.
Shema vezja in delovna razlaga
V zgornjem vezju sistema za pobiranje cestnin RFID je PORTA ATMEGA32 priključen na podatkovna vrata LCD. Tukaj ne pozabite onemogočiti komunikacije JTAG v PORTC-u na ATMEGA s spremembo bajtov varovalk, če želimo PORTC uporabiti kot običajna komunikacijska vrata. V 16x2 LCD-ju je 16 zatičev, če obstaja osvetlitev ozadja, če ni osvetlitve ozadja, bo 14 zatičev. Lahko napajamo ali pustimo zatiče za osvetlitev ozadja. Sedaj v 14 zatiči obstaja 8 podatkovnih zatiči (7-14 ali D0-D7), 2 Mrežni zatiči (1 & 2 ali VSS in VDD ali gnd in +5), 3 rd pin za ostrino (vee kontrolami kako debel prikazani naj bodo znaki), 3 krmilne nožice (RS & RW & E).
V vezju lahko opazite, da sem vzel le dva kontrolna zatiča. To omogoča fleksibilnost boljšega razumevanja. Kontrastni bit in READ / WRITE se ne uporabljata pogosto, zato jih je mogoče kratko skleniti na tla. To LCD zaslon postavi v najvišji kontrast in način branja. Samo nadzorovati moramo ENABLE in RS pin, da ustrezno pošljemo znake in podatke.
Povezave, ki so narejene za LCD, so podane spodaj:
PIN1 ali VSS na ozemljitev
PIN2 ali VDD ali VCC do + 5v moči
PIN3 ali VEE na tla (za začetnike daje največji kontrast)
PIN4 ali RS (Register Selection) na PD6 MCU
PIN5 ali RW (branje / pisanje) na ozemljitev (LCD v načinu branja olajša komunikacijo za uporabnika)
PIN6 ali E (Omogoči) za PD5 mikrokrmilnika
PIN7 ali D0 do PA0
PIN8 ali D1 do PA1
PIN9 ali D2 do PA2
PIN10 ali D3 do PA3
PIN11 ali D4 do PA4
PIN12 ali D5 do PA5
PIN13 ali D6 do PA6
PIN14 ali D7 do PA7
V vezju lahko vidite, da smo uporabili 8-bitno komunikacijo (D0-D7). Vendar to ni obvezno in lahko uporabljamo 4-bitno komunikacijo (D4-D7), vendar s 4-bitnim komunikacijskim programom postane nekoliko zapleten, zato sem raje 8-bitno komunikacijo.
Torej iz zgolj opazovanja zgornje tabele povežemo 10 zatičev LCD na krmilnik, v katerem so 8 zatiči podatkovni zatiči in 2 zatiči za nadzor.
Preden nadaljujemo, moramo razumeti serijsko komunikacijo. Tu RFID modul zaporedno pošilja podatke krmilniku. Ima drug način komunikacije, vendar za lažjo komunikacijo izberemo RS232. Zatič RS232 modula je povezan z RXD zatičem ATMEGA.
Podatki, ki jih pošilja modul RFID, so:
Zdaj so za vmesnik modula RFID potrebne naslednje funkcije:
1. Vtičnica RXD (funkcija prejemanja podatkov) krmilnika mora biti omogočena.
2. Ker je komunikacija zaporedna, moramo vedeti, kdaj je prejemnik podatkov, zato lahko zaustavimo program, dokler ne prejmemo celotnega bajta. To se naredi tako, da se omogoči popolna prekinitev podatkov.
3. RFID pošilja podatke krmilniku v 8-bitnem načinu. Torej bosta krmilniku naenkrat poslana dva znaka. To je prikazano na zgornji sliki.
4. Na zgornji sliki ni nobenega paritetnega bita, en zaustavitveni bit v podatkih, ki jih pošilja modul.
Zgornje funkcije so nastavljene v registrih krmilnikov; o njih bomo na kratko razpravljali,
RDEČA (RXEN): Ta bit predstavlja funkcijo prejema podatkov. Ta bit mora biti nastavljen za podatke iz modula, ki jih krmilnik sprejema. Omogoča tudi RXD pin krmilnika.
RJAVA (RXCIE): Ta bit mora biti nastavljen za prekinitev po uspešnem sprejemu podatkov. Z omogočanjem tega bita spoznamo takoj po 8-bitnem prejemu podatkov.
PINK (URSEL): Ta bit je treba nastaviti, preden omogočite druge bite v UCSRC. Po nastavitvi je treba druge potrebne bite v UCSRC, URSEL onemogočiti ali jih postaviti na nič.
RUMENA (UCSZ0, UCSZ1, UCSZ2): Ti trije biti se uporabljajo za izbiro števila podatkovnih bitov, ki jih prejmemo ali pošljemo v enem samem potezu.
Ker so podatki, ki jih pošilja modul RFID, 8-bitni podatkovni tip, moramo UCSZ0, UCSZ1 nastaviti na eno in UCSZ2 na nič.
ORANŽNA (UMSEL): Ta bit se nastavi glede na to, ali sistem komunicira asinhrono (oba uporabljata drugačno uro) ali sinhrono (oba uporabljata isto uro).
Ker modul in krmilnik uporabljata drugačno uro, mora biti ta bit nastavljen na nič ali ga pustiti pri miru, saj so vsi privzeto nastavljeni na nič.
ZELENA (UPM1, UPM0): Ta dva bita se prilagodita glede na parnost bitov, ki jo uporabljamo v komunikaciji.
Ker RFID modul pošilja podatke brez paritete, smo oba UPM1, UPM0 nastavili na nič ali pa jih lahko pustimo pri miru, saj so vsi biti v katerem koli registru privzeto nastavljeni na nič.
MODRA (USBS): Ta bit se uporablja za izbiro števila zaustavitvenih bitov, ki jih uporabljamo med komunikacijo.
Ker RFID modul pošilja podatke z enim stop-bitom, moramo bit USBS pustiti pri miru.
Zdaj moramo nazadnje nastaviti hitrost prenosa, iz zgornje slike je razvidno, da modul RFID pošilja podatke krmilniku s hitrostjo prenosa 9600 bps (bitov na sekundo).
Hitrost prenosa se nastavi v krmilniku z izbiro ustreznega UBRRH.
Vrednost UBRRH se izbere z navzkrižno referenčno hitrostjo prenosa podatkov in frekvenco kristala CPU.
Kot je prikazano na sliki, gresta dva zatiča krmilnika v L293D, ki je H-MOST, ki se uporablja za nadzor hitrosti in smeri vrtenja za enosmerne motorje z majhno močjo.
L293D je H-BRIDGE IC, ki je zasnovan za pogon enosmernih motorjev z nizko močjo in je prikazan na sliki, ta IC je sestavljen iz dveh h-mostov in tako lahko poganja dva enosmerna motorja. Tako se ta IC lahko uporablja za pogon robotskih motorjev iz signalov mikrokrmilnika.
Kot smo že omenili, ima ta IC možnost spremeniti smer vrtenja enosmernega motorja. To dosežemo z nadzorovanjem ravni napetosti na INPUT1 in INPUT2.
Omogoči pin |
Vhodni zatič 1 |
Vhodni zatič 2 |
Smer motorja |
Visoko |
Nizko |
Visoko |
Zavij desno |
Visoko |
Visoko |
Nizko |
Zavijemo levo |
Visoko |
Nizko |
Nizko |
Nehaj |
Visoko |
Visoko |
Visoko |
Nehaj |
Kot je prikazano v zgornji tabeli, mora biti za vrtenje v smeri ure 2A visoka in 1A nizka. Podobno mora biti v nasprotni smeri urnega kazalca 1A visoka in 2A nizka.
Kadar je pooblaščena kartica približana modulu, je motor programiran tako, da se za sekundo premika v smeri urnega kazalca, da se pokaže, da se vrata za cestnino odprejo po sekundi, ko se vrnejo in sporočijo, da so vrata za cestnino zaprta. Delovanje cestninske postaje je najbolje razloženo v korakih po spodnji spodnji kodi C.
Pojasnilo programiranja
Spodaj je razlaga za vrstico kode RFID sistema cestninjenja. Koncept in delovanje tega projekta lahko razumete tako, da preberete spodnjo kodo. Za prenos ali kopiranje najdete celotno kodo na dnu strani.
#include // header, da omogoči nadzor pretoka podatkov nad zatiči
#define F_CPU 1000000 // pripovedovalna frekvenca kristalnega regulatorja
#include
# define E 5 // daje ime "omogoči" do 5 th pin PORTD, saj je povezan z LCD omogočiti pin
# define RS 6 // daje ime "registerselection" do 6 th pin PORTD, saj je povezan z LCD RS pin
void send_a_command (nepodpisani ukaz char);
void send_a_character (nepodpisan znak char);
neveljavno string_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // postavljanje porta kot izhodnih zatičev
DDRD = 0b11111110;
_delay_ms (50); // podaja zamudo 50ms
DDRB = 0b11110000; // Vzemimo nekaj zatičev portB kot vhod.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // nastavitev hitrosti prenosa // Naslednje vsebuje ID oznak, ki jih je treba spremeniti za različne oznake. Posodobiti jih je treba, da projekt deluje
/ * Po oddaji programa v krmilnik je treba vzeti kartice, ki morajo biti avtorizirane, in dobiti ID oznak. Dobite jih tako, da oznako postavite blizu modula RFID in ID bo prikazan na zaslonu. Po pridobitvi ID-jev je treba program posodobiti z zamenjavo spodnjih ID-številk z novimi ID-številkami.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Zdaj zgoraj dovoljujemo le pet kart, ki jih lahko spremenimo v poljubno število.
Na primer, upoštevajte, da je privzeti program odložen v krmilnik, poiščite kartice, ki jih je treba pooblastiti. Postavite enega za drugim blizu modula, za vsakega boste dobili ID kot xxxxxxxx (907a4F87), Če imamo 7 oznak, bomo imeli 7 osem bitnih ID-jev. * /
// zdaj za sedem kart gre kot // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // dodeljevanje pomnilnika za prikaz ID-ja, ki ga pošilja modul int i = 0; int glas = 0; int k = 0; send_a_command (0x01); // Počisti zaslon 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // povemo lcd, da uporabljamo 8-bitni način ukazov / podatkov _delay_ms (50); send_a_command (0b00001111); // LCD ZASLON VKLOPLJEN in kurzor utripa char MEM; // dodelitev pomnilnika za shranjevanje celotnega ID-ja oznake send_a_string ("ŠTEVILKA RFID"); // pošiljanje niza send_a_command (0x80 + 0x40 + 0); // premikanje kazalca v drugo vrstico medtem ko (1) { while (! (UCSRA & (1 <
{ } TOČKA = UDR; // UDR shrani prejete osem bitne podatke in jih vzamemo v celo število. MEM = TEŽKA; // prva dva znaka se posodobita v pomnilnik itoa (COUNTA, SHOWA, 16); // ukaz za vnos spremenljive številke v LCD (spremenljiva številka, kateri znak naj se nadomesti, katera osnova je spremenljiva (tukaj je deset, saj štejemo število v base10)) send_a_string (SHOWA); // povem zaslonu, naj pokaže znak (nadomeščen s spremenljivo številko) druge osebe po postavitvi kazalca na LCD while (! (UCSRA & (1 <
{ } TOČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = TEŽKA; // tretji in četrti znak se posodobita v pomnilnik while (! (UCSRA & (1 <
{ } TOČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // peti in šesti znak se posodobita v pomnilnik while (! (UCSRA & (1 <
{ } TOČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // sedmi in osem znakov se posodobi v pomnilnik send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
za (i = 0; i <5; i ++) { če ((MEM == DOPUSTI) & (MEM == DOPUSTI) & (MEM == DOPUSTI & & (MEM == PRIHODI)) {// preverjanje dovoljenja za nakup, primerjava dveh znakov hkrati z znaki v pomnilniku PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // zamuda _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (nepodpisani ukaz char) { PORTA = ukaz; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (nepodpisan znak char) { PORTA = znak; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } neveljavno string_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |