Znamo u uredima, trgovačkim centrima i na mnogim drugim mjestima gdje samo osoba s autorizacijskom karticom smije ulaziti u sobu. Ovi sustavi koriste RFID komunikacijski sustav. RFID se koristi u trgovačkim centrima za zaustavljanje krađe jer su proizvodi označeni RFID čipom, a kada osoba napusti zgradu s RFID čipom automatski se uključuje alarm. RFID oznaka dizajnirana je tako mala kao dio pijeska. RFID sustave za provjeru autentičnosti lako je dizajnirati, a jeftini su. Neke škole i fakulteti danas koriste RFID sustave pohađanja nastave.
U ovom ćemo projektu dizajnirati automat za glasanje koji broji samo potvrđene glasove. To se postiže korištenjem RFID (Radio Frequency Identification) oznaka. Ovdje ćemo napisati program za ATMEGA koji će omogućiti glasanje samo ovlaštenim nositeljima RFID oznaka. (Također provjerite ovaj jednostavan projekt automata za glasanje)
Komponente potrebne
Hardver: ATMEGA32, napajanje (5v), AVR-ISP PROGRAMER, JHD_162ALCD (16x2LCD), kondenzator 100uF (spojen preko napajanja), gumb (pet komada), otpornik 10KΩ (pet komada), kondenzator 100nF (pet komada), LED (dva komada), EM-18 (RFID modul čitača).
Softver: Atmel studio 6.1, progisp ili flash magic.
Kružni dijagram i objašnjenje

U krugu PORTA ATMEGA32 spojen je na podatkovni port LCD-a. Ovdje treba imati na umu da onemogućite JTAG komunikaciju u PORTC-u u ATMEGA promjenom bajtova osigurača, ako želite koristiti PORTC kao uobičajeni komunikacijski priključak. Na LCD zaslonu 16x2 ukupno je 16 pinova ako postoji crno svjetlo, a ako nema pozadinskog svjetla, bit će 14 pinova. Može se napajati ili ostaviti igle stražnjeg svjetla. Sada u 14 pinova postoji 8 podatkovnih pinova (7-14 ili D0-D7), 2 pina za napajanje (1 & 2 ili VSS & VDD ili gnd & + 5v), treći pinski za kontrolu kontrasta (VEE - kontrolira koliko debeli znakovi trebaju biti prikazano), 3 upravljačka zatiča (RS & RW & E)
U krugu možete primijetiti da sam uzeo samo dva upravljačka zatiča, što daje fleksibilnost za bolje razumijevanje, kontrastni bit i READ / WRITE se ne koriste često, tako da se mogu kratko spojiti na masu. Ovo LCD postavlja u najveći kontrast i način čitanja. Samo trebamo kontrolirati ENABLE i RS igle da bi u skladu s tim slali znakove i podatke.
Priključci koji se rade za LCD prikazani su u nastavku:
PIN1 ili VSS na masu
PIN2 ili VDD ili VCC do + 5v snage
PIN3 ili VEE na zemlju (daje maksimalni kontrast najbolji za početnike)
PIN4 ili RS (registracijski odabir) na PD6 od uC
PIN5 ili RW (čitanje / pisanje) na masu (stavlja LCD u način čitanja olakšava komunikaciju za korisnika)
PIN6 ili E (Omogući) na PD5 od uC
PIN7 ili D0 do PA0 od uC
PIN8 ili D1 do PA1 od uC
PIN9 ili D2 do PA2 od uC
PIN10 ili D3 do PA3 od uC
PIN11 ili D4 do PA4 od uC
PIN12 ili D5 do PA5 od uC
PIN13 ili D6 do PA6 od uC
PIN14 ili D7 do PA7 od uC
U krugu možete vidjeti da smo koristili 8-bitnu komunikaciju (D0-D7). Međutim, to nije obvezno i možemo koristiti 4-bitnu komunikaciju (D4-D7), ali s 4-bitnim komunikacijskim programom postaje pomalo složen, pa sam preferirao 8-bitnu komunikaciju.
Dakle, iz pukog promatranja gornje tablice spajamo 10 pinova LCD-a na kontroler u kojem su 8 pinova podatkovne i 2 pina za kontrolu.
Prije nego što krenemo naprijed, moramo razumjeti serijsku komunikaciju. Ovdje RFID modul serijski šalje podatke kontroloru. Ima i drugi način komunikacije, ali za jednostavnu komunikaciju odabiremo RS232. RS232 pin modula povezan je s RXD pinom ATMEGA-e.
Podaci koje šalje RFID modul idu kao:

Sada su za sučelje RFID modula potrebne sljedeće značajke:
1. RXD pin (značajka primanja podataka) kontrolera mora biti omogućen.
2. Budući da je komunikacija serijska, moramo znati kad god se primaju podaci, kako bismo mogli zaustaviti program dok se ne primi kompletan bajt. To se postiže omogućavanjem da podaci dobivaju potpuni prekid.
3. RFID šalje podatke kontroloru u 8-bitnom načinu. Dakle, dva znaka bit će poslana upravljaču odjednom. To je prikazano u bloku na slici3
4. Na slici 3 nema bitova pariteta, jedan zaustavni bit u podacima koje šalje modul.
Gore navedene značajke postavljene su u registre kontrolera; razgovarat ćemo o njima ukratko,


CRVENO (RXEN): Ovaj bit predstavlja značajku primanja podataka, taj bit mora biti postavljen da bi podaci iz modula primali kontroler, on također omogućava RXD pin regulatora.
SMEĐA (RXCIE): Ovaj bit mora biti postavljen za dobivanje prekida nakon uspješnog prijema podataka. Omogućavanjem ovog bita upoznajemo se odmah nakon primanja 8-bitnih podataka.
PINK (URSEL): Ovaj bit mora biti postavljen prije omogućavanja ostalih bitova u UCSRC, nakon postavljanja ostalih potrebnih bitova u UCSRC; URSEL mora biti onemogućen ili postavljen na nulu.
ŽUTO (UCSZ0, UCSZ1, UCSZ2): Ova tri bita koriste se za odabir broja podatkovnih bitova koje primamo ili šaljemo u jednom potezu.

Budući da podaci koje šalje RFID modul imaju 8-bitni tip podataka (SLIKA3), moramo postaviti UCSZ0, UCSZ1 na jedan, a UCSZ2 na nulu.
NARANČASTA (UMSEL): Ovaj bit postavljen je na temelju toga komunicira li sustav asinkrono (oba koriste drugačiji sat) ili sinkrono (oba koriste isti sat),

Budući da modul i kontroler koriste drugačiji sat, taj bit mora biti postavljen na nulu ili ostavljen sam jer su svi prema zadanim postavkama postavljeni na nulu.
ZELENO (UPM1, UPM0): Ova dva bita prilagođena su na temelju pariteta bitova koje koristimo u komunikaciji.

Budući da RFID modul šalje podatke bez pariteta (SLIKA3), postavili smo i UPM1, UPM0 na nulu ili ih možemo ostaviti same jer su svi bitovi u bilo kojem registru prema zadanim postavkama postavljeni na nulu.
PLAVO (USBS): Ovaj bit služi za odabir broja zaustavnih bitova koje koristimo tijekom komunikacije.

Budući da RFID modul šalje podatke s jednim zaustavnim bitom (slika3), jednostavno moramo USBS bit ostaviti na miru.
Sada napokon trebamo postaviti brzinu prijenosa, sa slike 3 je jasno da RFID modul šalje podatke kontroleru brzinom prijenosa od 9600 bps (bitova u sekundi).
Brzina prijenosa se postavlja u regulatoru odabirom odgovarajućeg UBRRH,

Vrijednost UBRRH odabire se brzinom prijenosa podataka i frekvencijom kristala CPU,
Dakle, unakrsnom referencom vrijednost UBRR vidi se kao '6', i tako je postavljena brzina prijenosa.

Ovdje je prisutno pet gumba, četiri za povećanje glasova kandidata, a peto za resetiranje glasova kandidata na nulu. Ovdje prisutni kondenzatori služe za poništavanje efekta odbijanja gumba. Ako se uklone, kontroler može brojati više od svakog puta kad se pritisne tipka.
Otpornici spojeni na pinove služe za ograničavanje struje, kad se pritisne tipka za spuštanje klina na zemlju. Kad god se pritisne tipka, odgovarajući pin regulatora se spušta na zemlju i tako kontrolor prepoznaje da se pritisne određena tipka i poduzima odgovarajuća radnja, to može biti povećanje glasova kandidata ili resetiranje glasova ovisno o pritisnutom gumbu.
Kad se pritisne tipka koja predstavlja odgovarajuću osobu, kontroler je odabire i uvećava broj odgovarajuće osobe u svojoj memoriji, nakon povećanja prikazuje rezultat odgovarajućih osoba na LCD zaslonu 16x2.
Rad glasačke mašine najbolje je objasniti u koraku po koraku dolje navedenog C koda:
Objašnjenje koda
#include // zaglavlje kako bi se omogućila kontrola protoka podataka nad iglama
#define F_CPU 1000000 // pripojena kristalna frekvencija kontrolera
#include
#define E 5 // davanje naziva „omogućiti” na 5 th pin PORTD, budući da je spojen na LCD omogućiti pin
#define RS 6 // dajući naziv „registerselection” do 6 th pin PORTD, jer je spojen na pin LCD RS
void send_a_command (nepotpisana naredba char);
void send_a_character (nepotpisani znak znaka);
poništi string_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // stavljanje porta kao izlaznih pinova
DDRD = 0b11111110;
_delay_ms (50); // davanje kašnjenja od 50 ms
DDRB = 0b11110000; // Uzimanje nekih portB pinova kao ulaza.
UCSRB - = (1 <
// omogućavanje podataka prima potpuni prekid, omogućavanje primanja podataka pin
UCSRC - = (1 <
// promjena ostalih bitova prvo postavljanjem URSEL-a, postavkom za 8-bitnu komunikaciju
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // postavljanje brzine prijenosa
int16_t VOTEA = 0; // osoba1 glasa čuva memoriju
char A; // person1 glasovi koji prikazuju znak na LCD-u
int16_t VOTEB = 0;; // osoba2 glasa sprema memoriju
char B; // person2 glasovi koji prikazuju znak na LCD-u
int16_t VOTEC = 0;; // osoba3 glasa čuvajući memoriju
char C; // osoba3 glasa prikazujući znak na LCD-u
int16_t GLASALO = 0;; // osoba4 glasa sprema memoriju
char D; / / person4 glasova koji prikazuju znak na LCD-u
// Sljedeće sadrži ID oznaka, one se moraju mijenjati za različite oznake. Moraju se ažurirati da bi projekt mogao funkcionirati
// Nakon izbacivanja programa u kontroler treba uzeti kartice koje moraju biti autorizirane i dobiti ID oznaka, one se dobivaju stavljanjem oznake blizu RFID modula i ID će se prikazati na ekranu. Nakon dobivanja ID-ova, program se mora ažurirati zamjenom donjih ID brojeva novim ID brojevima.
|
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Sada gore odobravamo samo pet karata, koje se mogu promijeniti u bilo koji broj, Na primjer, uzmite u obzir da je zadani program izbačen u kontroler, uzmite kartice koje bi trebale biti ovlaštene smjestite jednu za drugom u blizini modula, za svaku ćete dobiti ID kao xxxxxxxx (907a4F87), Ako imamo 7 oznaka, imamo 7 osmerobitnih ID-a.
|
// sada za sedam karata ide kao // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // dodjeljivanje memorije za prikaz ID-a koji šalje modul int i = 0; int glas = 0; int k = 0; send_a_command (0x01); // Očisti zaslon 0x01 = 00000001 _zakašnjenje_ms (50); send_a_command (0x38); // poručujući lcd-u da koristimo 8-bitni način naredbe / podataka _zakašnjenje_ms (50); send_a_command (0b00001111); // LCD ZASLON UKLJUČEN i indikator treperi char MEM; // dodjeljivanje memorije za spremanje kompletnog ID-a oznake send_a_string ("RFID BROJ"); // slanje niza send_a_command (0x80 + 0x40 + 0); // pomicanje kursora u drugi redak dok (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR pohranjuje primljeni osmerobitni podatak i uzima se u cijeli broj. MEM = COUNTA; // prva dva znaka se ažuriraju u memoriju itoa (COUNTA, SHOWA, 16); // naredba za stavljanje varijabilnog broja u LCD (broj varijable, koji znak koji treba zamijeniti, koja je baza varijabilna (deset ovdje jer brojimo u base10)) send_a_string (SHOWA); // kazivanje zaslona da pokaže karakter (zamijenjen promjenljivim brojem) druge osobe nakon postavljanja kursora na LCD while (! (UCSRA & (1 <
{ } TAČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = KONTA; // treći i četvrti znak se ažuriraju u memoriju while (! (UCSRA & (1 <
{ } TAČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // peti i šesti znak se ažuriraju u memoriju while (! (UCSRA & (1 <
{ } TAČKA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // sedmi i osam znakova ažuriraju se u memoriju send_a_string (""); send_a_ naredba (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
za (i = 0; i <5; i ++) { ako je ((MEM == DOPUSTITI) & (MEM == DOPUSTITI) & (MEM == DOPUSTITI) & (MEM == DOPUSTITI)) {// provjera autorizacije kupujem uspoređujući dva znaka odjednom s likovima u memoriji PORTB - = (1 <
vote = 1; // ako je ovlašteno postaviti GLASAJ } } if (vote == 0) // autorizacija nije uspjela ako glas nije postavljen { UCSRB - = (1 <
} while (vote == 1) // radi ovu petlju dok se ne izglasa, ako je ovlašteno { send_a_command (0x80 + 0); // idemo na poziciju nula na liniji1 send_a_string ("GLASAJTE SADA"); // prikazuje niz if (bit_is_clear (PINB, 0)) // kada se pritisne jedan gumb { VOTEA ++; // povećavanje memorije glasova prvog lica za jedan vote = 0; // puštanje while petlje nakon glasanja } if (bit_is_clear (PINB, 1)) // kada se pritisne tipka 2 { VOTEB ++; // povećavanje memorije glasova druge osobe za jednu glas = 0; } if (bit_is_clear (PINB, 2)) // kada se pritisne tipka 3 { VOTEC ++; // povećavanje memorije glasova treće osobe za jednu glas = 0; } if (bit_is_clear (PINB, 3)) // kad se pritisne tipka 4 { Glasao ++; // povećajte glasova memoriju od 4 -og osobe po jedan glas = 0; } if (glas == 0) // briše se nakon primljenog glasa { send_a_command (0x80 + 0); // pomicanje na nultu poziciju linije1 send_a_string ("HVALA NA GLASANJU"); // prikaz niza za (k = 0; k <10; k ++) { _zakašnjenje_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_ naredba (0x80 + 0); // prikazivanje glasova sve četiri osobe send_a_string ("A ="); send_a_ naredba (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (A); send_a_ naredba (0x80 + 8); send_a_string ("B ="); send_a_ naredba (0x80 + 10); itoa (VOTEB, B, 10); send_a_string (B); send_a_ naredba (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_ naredba (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); send_a_string (C); send_a_ naredba (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_ naredba (0x80 + 0x40 + 10); itoa (GLASALO, D, 10); send_a_string (D); send_a_ naredba (0x80 + 0x40 + 16); za (k = 0; k <25; k ++) { _zakašnjenje_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // pomicanje u nulti položaj send_a_string ("RFID BROJ"); // pošalji niz send_a_ naredba (0x80 + 0x40 + 0); } } void send_a_command (nepotpisana naredba char) { PORTA = naredba; PORTD & = ~ (1 <
PORTD - = 1 <
_zakašnjenje_ms (50); PORTD & = ~ 1 <
PORTA = 0; } poništi send_a_character (nepotpisani znak znaka) { PORTA = lik; PORTD - = 1 <
PORTD - = 1 <
_zakašnjenje_ms (50); PORTD & = ~ 1 <
PORTA = 0; } poništi string_a_string (char * string_of_characters) { while (* niz_znaka> 0) { send_a_character (* string_of_characters ++); } } |
