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 zasnovali glasovalni stroj, ki šteje samo potrjene glasove. To se naredi z uporabo RFID (Radio Frequency Identification) oznak. Tukaj bomo napisali program za ATMEGA, ki bo omogočal glasovanje samo pooblaščenim imetnikom oznak RFID. (Preverite tudi ta preprost projekt glasovalne naprave)
Potrebne komponente
Strojna oprema: ATMEGA32, napajalnik (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), kondenzator 100uF (povezan prek napajalnika), gumb (pet kosov), upor 10KΩ (pet kosov), kondenzator 100nF (pet kosov), LED (dva kosa), EM-18 (RFID modul bralnika).
Programska oprema: Atmel studio 6.1, progisp ali flash magic.
Shema vezja in razlaga
V vezju PORTA ATMEGA32 je priključen na podatkovna vrata LCD. Tukaj ne pozabite onemogočiti komunikacije JTAG v PORTC-u na ATMEGA s spremembo bajtov varovalk, če želite uporabljati PORTC kot običajna komunikacijska vrata. Na 16x2 LCD-ju je na splošno 16 nožic, če je črna luč, če ni zadnje luči, bo 14 nožic. Lahko napajate ali pustite zatiče zadnje luči. 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 nadzor kontrasta (vee-kontrole kako debela mora biti znake prikazano), 3 krmilne nožice (RS & RW & E)
V vezju lahko opazite, da sem vzel le dva krmilna zatiča, kar omogoča boljše razumevanje, kontrastni bit in READ / WRITE se ne uporabljajo pogosto, tako da jih je mogoče kratko spojiti na maso. 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 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 uC
PIN5 ali RW (branje / pisanje) na ozemljitev (LCD v načinu branja olajša komunikacijo za uporabnika)
PIN6 ali E (Omogoči) do PD5 uC
PIN7 ali D0 do PA0 uC
PIN8 ali D1 do PA1 uC
PIN9 ali D2 do PA2 uC
PIN10 ali D3 do PA3 uC
PIN11 ali D4 do PA4 uC
PIN12 ali D5 do PA5 uC
PIN13 ali D6 do PA6 od uC
PIN14 ali D7 do PA7 uC
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 v bloku na sliki 3
4. Na sliki 3 v podatkih, ki jih pošilja modul, ni paritetnih bitov, en stopni bit.
Zgornje funkcije so nastavljene v registrih krmilnikov; o njih bomo na kratko razpravljali,
RDEČA (RXEN): Ta bit predstavlja funkcijo prejemanja podatkov, ta bit mora biti nastavljen za podatke iz modula, ki jih bo sprejemal krmilnik, omogoča pa 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, potem ko nastavite druge potrebne bite v UCSRC; URSEL mora biti onemogočen ali postavljen 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 (SLIKA3), moramo UCSZ0, UCSZ1 nastaviti na eno in UCSZ2 na nič.
ORANŽNA (UMSEL): Ta bit je nastavljen 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 (SLIKA3), 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 (slika 3), moramo bit USBS pustiti pri miru.
Zdaj moramo nazadnje nastaviti hitrost prenosa, iz slike3 je jasno, 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 s hitrostjo navzkrižnega prenosa in frekvenco kristala CPU,
Torej je vrednost navzkrižnega sklica UBRR videti kot "6" in tako je nastavljena hitrost prenosa.
Tu je prisotnih pet gumbov, štirje za povečanje glasov kandidatov in peti za ponastavitev glasov kandidatov na nič. Tukaj prisotni kondenzatorji izničijo odskočni učinek gumbov. Če jih odstranite, lahko krmilnik vsakič, ko pritisnete gumb, šteje več kot eno.
Upori, priključeni na nožice, so namenjeni omejevanju toka, ko pritisnete gumb, da zatič potegnete navzdol na tla. Vsakič, ko pritisnete gumb, se ustrezni zatič krmilnika potegne navzdol in tako krmilnik prepozna, da je pritisnjen določen gumb in je treba izvesti ustrezno dejanje, lahko poveča glasove kandidatov ali ponastavi glasove, odvisno od pritisnjenega gumba.
Ko pritisnete gumb, ki predstavlja ustrezno osebo, jo krmilnik izbere in v njenem pomnilniku poveča številko ustrezne osebe, potem ko na zaslonu LCD prikaže rezultat ustreznih oseb.
Delovanje glasovalne naprave je najbolje razloženo v korakih po spodaj navedeni kodi C:
Razlaga kode
#include // header, da omogoči nadzor pretoka podatkov nad zatiči
#define F_CPU 1000000 // pripovedovalna frekvenca kristalnega krmilnika
#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 <
// omogočanje podatkov prejema popolno prekinitev, omogočanje prejema podatkov pin
UCSRC - = (1 <
// spreminjanje drugih bitov s prvo nastavitvijo URSEL, nastavitev za 8-bitno komunikacijo
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // nastavitev hitrosti prenosa
int16_t VOTEA = 0; // glasovi osebe1 shranijo pomnilnik
char A; // oseba1 glasov, ki prikazuje znak na LCD-ju
int16_t VOTEB = 0;; // oseba2 glasova shranjuje spomin
char B; // oseba2 glasovi, ki prikazujejo znak na LCD-prikazovalniku
int16_t VOTEC = 0;; // oseba3 glasov shrani spomin
char C; // oseba3 glasovi, ki prikazujejo znak na LCD-ju
int16_t GLASOVALO = 0;; // oseba4 glasov shrani spomin
char D; / / oseba 4 glasovi, ki prikazujejo znak na LCD-ju
// 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 jih je treba pooblastiti, in dobiti ID oznak, ki jih dobimo tako, da oznako postavimo 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 samo pet kart, ki jih lahko spremenimo v poljubno število, Na primer, upoštevajte, da je privzeti program odložen v krmilnik, vzemite kartice, ki jih je treba pooblastiti, postavite eno za drugo v bližini modula, za vsako 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 indikator utripa char MEM; // dodeljevanje 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 <
{ } COUNTA = UDR; // UDR shrani prejete osem bitne podatke in je sprejet v celo število. MEM = COUNTA; // 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 <
vote = 1; // če je pooblaščen nastavi GLAS } } if (glas == 0) // pooblastilo ni uspelo, če glasovanje ni nastavljeno { UCSRB - = (1 <
} while (vote == 1) // ponovi to zanko, dokler ni izglasovan, če je dovoljen { send_a_command (0x80 + 0); // pojdimo na položaj nič v vrstici1 send_a_string ("GLASAJ ZDAJ"); // prikaz niza if (bit_is_clear (PINB, 0)) // ob pritisku enega gumba { VOTEA ++; // povečanje glasovnega spomina prve osebe za enega vote = 0; // sprostitev zanke while po glasovanju } if (bit_is_clear (PINB, 1)) // ob pritisku na gumb 2 { VOTEB ++; // povečanje glasovnega pomnilnika 2. osebe za eno glas = 0; } if (bit_is_clear (PINB, 2)) // ob pritisku na gumb 3 { VOTEC ++; // prirastek spomin glasov za 3 rd osebe po enega glas = 0; } if (bit_is_clear (PINB, 3)) // ob pritisku na gumb 4 { Glasoval ++; // prirastek spomin glasov za 4 th oseba z enim glas = 0; } if (glas == 0) // počisti se po prejetem glasovanju { send_a_command (0x80 + 0); // premakni se na položaj nič vrstice1 send_a_string ("HVALA ZA GLASOVANJE"); // prikaz niza za (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // prikaz glasov vseh štirih oseb send_a_string ("A ="); send_a_command (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (A); send_a_command (0x80 + 8); send_a_string ("B ="); send_a_command (0x80 + 10); itoa (VOTEB, B, 10); send_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); send_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (GLASOVALO, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); za (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // premik v ničelni položaj send_a_string ("Številka RFID"); // pošlji niz send_a_command (0x80 + 0x40 + 0); } } 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 ++); } } |