Poznáme v kanceláriách, nákupných centrách a na mnohých ďalších miestach, kde má do miestnosti vstup iba osoba s autorizačnou kartou. Tieto systémy využívajú komunikačný systém RFID. RFID sa používa v nákupných centrách na zastavenie krádeží, pretože výrobky sú označené čipom RFID a keď osoba opustí budovu s čipom RFID, automaticky sa aktivuje alarm. RFID štítok je navrhnutý tak malý, ako súčasť piesku. RFID autentifikačné systémy sa dajú ľahko navrhnúť a sú lacné. Niektoré školy a vysoké školy v súčasnosti používajú dochádzkové systémy založené na RFID.
V tomto projekte navrhneme hlasovacie zariadenie, ktoré počíta iba overené hlasy. To sa deje pomocou štítkov RFID (Radio Frequency Identification). Tu napíšeme program pre ATMEGA, ktorý umožní hlasovanie iba autorizovaným držiteľom značiek RFID. (Skontrolujte tiež tento jednoduchý projekt hlasovacieho zariadenia)
Súčasti sú povinné
Hardvér: ATMEGA32, napájací zdroj (5 V), AVR-ISP PROGRAMÁTOR, JHD_162ALCD (16x2LCD), kondenzátor 100 uF (pripojený na napájací zdroj), tlačidlo (päť kusov), odpor 10 KΩ (päť kusov), kondenzátor 100 nF (päť kusov), LED (dva kusy), EM-18 (modul čítačky RFID).
Softvér: Atmel studio 6.1, progisp alebo flash magic.
Schéma zapojenia a vysvetlenie
V obvode PORTA ATMEGA32 je pripojený k dátovému portu LCD. Tu by ste si mali pamätať, že chcete deaktivovať komunikáciu JTAG v PORTC na ATMEGA zmenou bajtov poistky, ak chcete použiť PORTC ako normálny komunikačný port. Na 16x2 LCD je celkovo 16 pinov, ak je tam čierne svetlo, ak nie je podsvietenie, bude 14 pinov. Jeden môže napájať alebo nechať kolíky podsvietenia. Teraz v 14 kolíkoch je 8 dátových kolíkov (7-14 alebo D0-D7), 2 kolíky napájacieho zdroja (1 a 2 alebo VSS & VDD alebo gnd & + 5v), 3. kolík na kontrolu kontrastu (VEE - určuje, aké silné by mali byť znaky) zobrazené), 3 ovládacie kolíky (RS & RW & E)
V obvode môžete pozorovať, že som vzal iba dva ovládacie piny, čo dáva flexibilitu lepšieho porozumenia, kontrastný bit a READ / WRITE sa často nepoužívajú, takže môžu byť skratované k zemi. Toto nastavuje LCD do najvyššieho kontrastu a režimu čítania. Potrebujeme iba ovládať piny ENABLE a RS, aby sme mohli zodpovedajúcim spôsobom odosielať znaky a údaje.
Pripojenia, ktoré sa vykonávajú pre LCD, sú uvedené nižšie:
PIN1 alebo VSS na zem
PIN2 alebo VDD alebo VCC na napájanie + 5 V.
PIN3 alebo VEE na zem (poskytuje maximálny kontrast najlepšie pre začiatočníkov)
PIN4 alebo RS (výber registra) na PD6 uC
PIN5 alebo RW (čítanie / zápis) na zem (prepnutie LCD do režimu čítania uľahčuje komunikáciu pre používateľa)
PIN6 alebo E (povoliť) na PD5 uC
PIN7 alebo D0 až PA0 uC
PIN8 alebo D1 až PA1 uC
PIN9 alebo D2 až PA2 uC
PIN10 alebo D3 až PA3 uC
PIN11 alebo D4 až PA4 uC
PIN12 alebo D5 až PA5 uC
PIN13 alebo D6 až PA6 uC
PIN14 alebo D7 až PA7 uC
V obvode môžete vidieť, že sme použili 8-bitovú komunikáciu (D0-D7). To však nie je povinné a môžeme použiť 4-bitovú komunikáciu (D4-D7), ale so 4-bitovým komunikačným programom sa stáva trochu zložitejšou, takže som uprednostnil 8-bitovú komunikáciu.
Takže iba z pozorovania vyššie uvedenej tabuľky pripájame 10 pinov LCD k ovládaču, v ktorom 8 pinov sú dátové piny a 2 piny pre riadenie.
Predtým, ako napredujeme, musíme pochopiť sériovú komunikáciu. Tu modul RFID odosiela dáta do radiča sériovo. Má iný spôsob komunikácie, ale pre ľahkú komunikáciu sme vybrali RS232. Pin RS232 modulu je pripojený k RXD pinu ATMEGA.
Údaje odoslané modulom RFID idú ako:
Teraz sú pre rozhranie modulu RFID potrebné tieto funkcie:
1. Musí byť povolený pin RXD (funkcia príjmu dát) radiča.
2. Pretože komunikácia je sériová, musíme to vedieť vždy, keď je prijatý dátový bye, aby sme mohli program zastaviť, kým nedostaneme úplný bajt. To sa deje povolením úplného prerušenia prijímania údajov.
3. RFID odosiela údaje do radiča v 8bitovom režime. Takže do radiča budú naraz odoslané dva znaky. Toto je zobrazené v bloku na obrázku 3
4. Z obrázku 3 nie sú žiadne paritné bity, jeden stop bit v dátach odosielaných modulom.
Vyššie uvedené funkcie sú nastavené v registroch radiča; budeme o nich krátko diskutovať,
ČERVENÁ (RXEN): Tento bit predstavuje funkciu prijímania údajov, tento bit musí byť nastavený na to, aby dáta z modulu boli prijímané riadiacou jednotkou, umožňuje tiež pin RXD riadiacej jednotky.
BROWN (RXCIE): Tento bit musí byť nastavený na získanie prerušenia po úspešnom prijatí dát. Povolením tohto bitu spoznáme bezprostredne po 8-bitovom príjme údajov.
PINK (URSEL): Tento bit musí byť nastavený pred povolením ďalších bitov v UCSRC, po nastavení ďalších potrebných bitov v UCSRC; URSEL musí byť deaktivovaný alebo vynulovaný.
ŽLTÁ (UCSZ0, UCSZ1, UCSZ2): Tieto tri bity sa používajú na výber počtu dátových bitov, ktoré prijímame alebo odosielame naraz.
Pretože dáta zasielané RFID modulom sú 8bitový dátový typ (OBRÁZOK 3), musíme UCSZ0, UCSZ1 nastaviť na jednu a UCSZ2 na nulu.
ORANŽOVÁ (UMSEL): Tento bit je nastavený na základe toho, či systém komunikuje asynchrónne (obe používajú odlišné hodiny) alebo synchrónne (obe používajú rovnaké hodiny),
Pretože modul a kontrolér používajú odlišné hodiny, musí byť tento bit nastavený na nulu alebo ponechaný sám, pretože všetky sú predvolene nastavené na nulu.
ZELENÁ (UPM1, UPM0): Tieto dva bity sú upravené na základe bitovej parity, ktorú používame pri komunikácii.
Pretože RFID modul odosiela dáta bez parity (OBRÁZOK 3), nastavili sme obidve UPM1, UPM0 na nulu alebo ich môžeme nechať osamote, pretože všetky bity v ľubovoľných registroch sú štandardne nastavené na nulu.
MODRÁ (USBS): Tento bit sa používa na výber počtu stop bitov, ktoré používame počas komunikácie.
Pretože RFID modul odosiela dáta s jedným stop bitom (obrázok 3), musíme nechať bit USBS na pokoji.
Teraz musíme konečne nastaviť prenosovú rýchlosť, z obrázku 3 je zrejmé, že modul RFID odosiela dáta do radiča s prenosovou rýchlosťou 9600 bps (bitov za sekundu).
Prenosová rýchlosť sa nastavuje v ovládači výberom vhodnej UBRRH,
Hodnota UBRRH sa vyberá krížovou prenosovou rýchlosťou a kryštálovou frekvenciou CPU,
Takže krížovým odkazom sa hodnota UBRR považuje za „6“, a tak sa nastavuje prenosová rýchlosť.
Je tu prítomných päť tlačidiel, štyri na zvýšenie hlasov kandidátov a piate na resetovanie hlasov kandidátov na nulu. Kondenzátory, ktoré sú tu prítomné, slúžia na potlačenie efektu odskakovania tlačidiel. Ak sú odstránené, ovládač môže počítať viac ako jedno pri každom stlačení tlačidla.
Rezistory pripojené k pinom slúžia na obmedzenie prúdu, keď je stlačené tlačidlo na stiahnutie kolíka k zemi. Kedykoľvek je stlačené tlačidlo, zodpovedajúci kolík ovládača sa stiahne na zem, a tak ovládač rozpozná, že je stlačené určité tlačidlo a je potrebné vykonať príslušnú akciu, môže to byť zvyšovanie počtu kandidátov na hlasovanie alebo vynulovanie hlasov v závislosti od stlačeného tlačidla.
Keď je stlačené tlačidlo predstavujúce zodpovedajúcu osobu, ovládač ju vyberie a zvýši číslo zodpovedajúcej osoby vo svojej pamäti. Po prírastku zobrazí skóre zodpovedajúcich osôb na LCD displeji 16x2.
Fungovanie hlasovacieho zariadenia je najlepšie vysvetliť krok za krokom v kóde C uvedenom nižšie:
Vysvetlenie kódu
#include // header to allow data flow control over pins
#define F_CPU 1000000 // pripojená kryštálová frekvencia radiča
#include
#define E 5 // dávať meno "povoliť" na 5 th pin PORTD, pretože je spojený s LCD umožniť pin
#define RS 6 // pomenovanie „registerselection“ šiestemu pinu PORTD, pretože je pripojený k pinu LCD RS
void send_a_command (nepodpísaný príkaz char);
void send_a_character (znak bez znaku);
void send_a_string (char * retazec_charakterov);
int main (void)
{
DDRA = 0xFF; // uvedenie porty ako výstupných kolíkov
DDRD = 0b11111110;
_delay_ms (50); // oneskorenie 50ms
DDRB = 0b11110000; // Prijatie niektorých pinov portB ako vstupu.
UCSRB - = (1 <
// povolenie prijímania údajov úplné prerušenie, povolenie prijímania údajov pinom
UCSRC - = (1 <
// zmena ďalších bitov najskôr nastavením URSEL, nastavením pre 8 bitovú komunikáciu
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // nastavenie prenosovej rýchlosti
int16_t VOTEA = 0; // osoba1 hlasov ukladajúcich pamäť
char A; // osoba1 hlasov zobrazujúcich znak na LCD
int16_t VOTEB = 0;; // osoba2 hlasy ukladajúce pamäť
char B; // osoba2 hlasov zobrazujúcich znak na LCD
int16_t VOTEC = 0;; // osoba3 hlasy ukladajúce pamäť
char C; // osoba3 hlasy zobrazujúce znak na LCD
int16_t HLASOVANÉ = 0;; // osoba4 hlasy ukladajúce pamäť
znak D; / / osoba4 hlasy zobrazujúce znak na LCD displeji
// Nasledujúci text obsahuje ID značiek, ktoré je potrebné zmeniť pre rôzne značky. Tieto musia byť aktualizované, aby projekt fungoval
// Po vyhodení programu do ovládača je potrebné vziať karty, ktoré musia byť autorizované, a získať ID štítkov, ktoré sa získajú umiestnením štítku do blízkosti modulu RFID a ID sa zobrazí na obrazovke. Po získaní identifikačných údajov musí byť program aktualizovaný nahradením nižšie uvedených identifikačných čísel novými identifikačnými číslami.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Teraz vyššie autorizujeme iba päť kariet, ktoré je možné zmeniť na ľubovoľné číslo, Napríklad zvážte, že predvolený program je uložený v radiči, získajte karty, ktoré by mali byť autorizované, jednu za druhou v blízkosti modulu, získate ID pre každú z nich ako xxxxxxxx (907a4F87), Ak máme 7 značiek, budeme mať 7 osembitových ID.
// teraz pre sedem kariet to ide ako // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // pridelenie pamäte na zobrazenie ID odoslaného modulom int i = 0; int hlasovanie = 0; int k = 0; send_a_command (0x01); // Vymazať obrazovku 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // informovanie lcd, že používame 8bitový príkazový / dátový režim _delay_ms (50); send_a_command (0b00001111); // LCD OBRAZOVKA ZAPNUTÁ a kurzor bliká char MEM; // pridelenie pamäte na uloženie úplného ID štítku send_a_string ("RFID NUMBER"); // odosielací reťazec send_a_command (0x80 + 0x40 + 0); // presunutie kurzora do druhého riadku zatiaľ čo (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR ukladá prijaté osembitové dáta a berie sa ako celé číslo. MEM = COUNTA; // prvé dva znaky sa aktualizujú do pamäte itoa (COUNTA, SHOWA, 16); // príkaz na vloženie variabilného čísla na LCD (variabilné číslo, v ktorom znaku sa má nahradiť, ktorá báza je premenná (tu desať, keďže počítame číslo v base10)) send_a_string (SHOWA); // informovanie displeja, aby zobrazil znak (nahradený variabilným počtom) druhej osoby po umiestnení kurzora na LCD while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // tretí a štvrtý znak sa aktualizujú do pamäte while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // piaty a šiesty znak sa aktualizujú do pamäte while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // siedmy a osem znakov sa aktualizujú do pamäte send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
pre (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// kontrola nákupu autorizácie porovnaním dvoch znakov naraz so znakmi v pamäti PORTB - = (1 <
vote = 1; // ak je povolené nastavenie HLASUJTE } } if (vote == 0) // autorizácia zlyhala, ak hlas nie je nastavený { UCSRB - = (1 <
} while (hlas == 1) // urobte túto slučku, kým nebudete hlasovať, ak je to povolené { send_a_command (0x80 + 0); // prejsť na pozíciu nula na riadku1 send_a_string ("HLASUJTE HNED"); // zobrazujúci reťazec if (bit_is_clear (PINB, 0)) // pri stlačení jedného tlačidla { VOTEA ++; // zvýši hlasovú pamäť prvej osoby o jednu vote = 0; // po hlasovaní nechať cyklus while } if (bit_is_clear (PINB, 1)) // // pri stlačení tlačidla 2 { VOTEB ++; // zvýši hlasovaciu pamäť druhej osoby o jednu hlas = 0; } if (bit_is_clear (PINB, 2)) // // pri stlačení tlačidla 3 { VOTEC ++; // zvýši hlasovaciu pamäť tretej osoby o jednu hlas = 0; } if (bit_is_clear (PINB, 3)) // pri stlačení tlačidla 4 { Volila ++; // zvýšiť pamäť hlasovania 4 th osoba raz hlas = 0; } if (hlas == 0) // vymazané po prijatí hlasovania { send_a_command (0x80 + 0); // presun do nulovej polohy riadku1 send_a_string ("THANK U ZA HLAS"); // zobraziť reťazec pre (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // zobrazovanie hlasov všetkých štyroch osôb 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 (HLAS, 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 (HLASOVANÉ, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); pre (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // presun do nulovej polohy send_a_string ("RFID NUMBER"); // pošle reťazec send_a_command (0x80 + 0x40 + 0); } } void send_a_command (nepodpísaný príkaz char) { PORTA = príkaz; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (znak bez znaku) { PORTA = znak; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_character) { while (* string_of_character> 0) { send_a_character (* string_of_character ++); } } |