Mes žinome biuruose, prekybos centruose ir daugelyje kitų vietų, kur į kambarį leidžiama patekti tik asmeniui, turinčiam leidimo kortelę. Šios sistemos naudoja RDA ryšio sistemą. RDA yra naudojama prekybos centruose, siekiant sustabdyti vagystę, nes gaminiai žymimi RFID lustu, o kai asmuo palieka pastatą su RFID lustu, automatiškai įsijungia aliarmas. RFID žyma sukurta tokia maža kaip smėlio dalis. RFID autentifikavimo sistemas lengva projektuoti ir jos yra pigios. Kai kurios mokyklos ir kolegijos šiais laikais naudoja RFID lankomumo sistemas.
Šiame projekte mes sukursime balsavimo mašiną, kuri skaičiuos tik patvirtintus balsus. Tai daroma naudojant RFID (radijo dažnio identifikavimo) žymes. Čia mes parašysime ATMEGA programą, leidžiančią balsuoti tik įgaliotiems RDA žymenų turėtojams. (Taip pat patikrinkite šį paprastą balsavimo mašinos projektą)
Būtini komponentai
Aparatūra: ATMEGA32, maitinimo šaltinis (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kondensatorius (prijungtas prie maitinimo šaltinio), mygtukas (penki vienetai), 10KΩ rezistorius (penki vienetai), 100nF kondensatorius (penki vienetai), LED (dvi dalys), EM-18 (RDA skaitytuvo modulis).
Programinė įranga: „ Atmel studio 6.1“, „progisp“ arba „flash magic“.
Grandinės schema ir paaiškinimas
Grandinėje ATMEGA32 PORTA yra prijungta prie LCD duomenų prievado. Čia reikia nepamiršti išjungti JTAG ryšį PORTC į ATMEGA, pakeičiant saugiklių baitus, jei norite naudoti PORTC kaip įprastą ryšio prievadą. 16x2 LCD ekrane iš viso yra 16 kontaktų, jei šviečia juoda šviesa, jei nėra užpakalinės šviesos, bus 14 kontaktų. Galima maitinti arba palikti galinio apšvietimo kaiščius. Dabar 14 kaiščių yra 8 duomenų kaiščiai (7-14 arba D0-D7), 2 elektros tiekimo kaiščių (1 & 2 arba Vss & VDD arba GND & + 5V), 3 -oji kaištis kontrasto valdymas (V formos,-kontroliuoja, kaip storio simboliai turėtų būti parodyta), 3 valdymo kaiščiai (RS & RW & E)
Grandinėje galite pastebėti, kad aš paėmiau tik du valdymo kaiščius, tai suteikia lankstumo geriau suprasti, kontrasto bitai ir READ / WRITE nėra dažnai naudojami, todėl juos galima sutrumpinti. Tai padidina LCD kontrasto ir skaitymo režimą. Mes tiesiog turime valdyti ENABLE ir RS smeigtukus, kad galėtume atitinkamai siųsti simbolius ir duomenis.
LCD jungtys pateikiamos žemiau:
PIN1 arba VSS į žemę
PIN2 arba VDD arba VCC iki + 5v maitinimo
PIN3 arba VEE į žemę (suteikia maksimalų kontrastą pradedantiesiems)
PIN4 arba RS (registracijos pasirinkimas) į uC PD6
PIN5 arba RW (skaitymas / rašymas) į žemę (įjungus skystųjų kristalų ekraną skaitymo režimu, palengvinamas ryšys vartotojui)
PIN6 arba E (įjungti) į uC PD5
PIN7 arba D0 – PA0 iš uC
PIN8 arba U1 nuo D1 iki PA1
PIN9 arba D2 – PA2 iš uC
U10 PIN10 arba D3 – PA3
PIN11 arba D4 – PA4 iš uC
U12 PIN12 arba D5 – PA5
PIN13 arba D6 – PA6 iš uC
U14 PIN14 arba D7 – PA7
Grandinėje galite pamatyti, kad mes naudojome 8 bitų ryšį (D0-D7). Tačiau tai nėra privaloma ir mes galime naudoti 4 bitų ryšį (D4-D7), tačiau su 4 bitų ryšio programa tampa šiek tiek sudėtinga, todėl man labiau patiko 8 bitų ryšys.
Taigi, vien stebint aukščiau pateiktą lentelę, mes sujungiame 10 LCD kontaktų su valdikliu, kuriame 8 kontaktai yra duomenų kaiščiai ir 2 valdikliai.
Prieš eidami į priekį, turime suprasti apie nuoseklųjį ryšį. RFID modulis čia nuosekliai siunčia duomenis valdikliui. Jis turi kitą ryšio būdą, tačiau, kad būtų lengviau bendrauti, mes renkamės RS232. Modulio RS232 kaištis yra prijungtas prie ATMEGA RXD kaiščio.
RDA modulio siunčiami duomenys yra tokie:
Dabar RFID modulio sąsajai reikalingos šios funkcijos:
1. Turi būti įjungtas valdiklio RXD kaištis (duomenų priėmimo funkcija).
2. Kadangi ryšys yra nuoseklus, turime žinoti, kai gaunamas duomenų pasisveikinimas, kad galėtume sustabdyti programą, kol bus gautas visas baitas. Tai daroma įgalinus duomenis gauti visišką pertraukimą.
3. RDA siunčia duomenis valdikliui 8 bitų režimu. Taigi vienu metu valdikliui bus nusiųsti du simboliai. Tai parodyta 3 paveikslo bloke
4. Pagal 3 paveikslą modulio siunčiamuose duomenyse nėra paritinių bitų, vieno sustojimo bito.
Minėtos funkcijos nustatomos valdiklių registruose; mes ketiname juos trumpai aptarti,
RAUDONA (RXEN): Šis bitas reiškia duomenų priėmimo funkciją. Šis bitas turi būti nustatytas valdiklio gautiems duomenims iš modulio, taip pat įjungiamas valdiklio RXD kaištis.
BROWN (RXCIE): Šis bitas turi būti nustatytas norint pertraukti po sėkmingo duomenų gavimo. Įgalinę šį bitą mes sužinome iškart po to, kai gaunami 8 bitų duomenys.
PINK (URSEL): Šis bitas turi būti nustatytas prieš įgalinant kitus bitus UCSRC, nustačius kitus reikalingus bitus UCSRC; URSEL turi būti išjungtas arba nustatytas į nulį.
GELTONA (UCSZ0, UCSZ1, UCSZ2): Šie trys bitai naudojami renkant gaunamų ar siunčiamų duomenų bitų skaičių vienu ypu.
Kadangi RFID modulio siunčiami duomenys yra 8 bitų duomenų tipo (3 PAVEIKSLAS), turime nustatyti UCSZ0, UCSZ1 į vieną, o UCSZ2 - į nulį.
ORANGE (UMSEL): Šis bitas nustatomas atsižvelgiant į tai, ar sistema bendrauja asinchroniškai (abu naudoja skirtingą laikrodį), ar sinchroniškai (abu naudoja tą patį laikrodį),
Kadangi modulis ir valdiklis naudoja skirtingą laikrodį, šį bitą reikia nustatyti į nulį arba palikti ramybėje, nes pagal numatytuosius nustatymus jie visi yra nustatyti į nulį.
ŽALIA (UPM1, UPM0): Šie du bitai koreguojami atsižvelgiant į bitų paritetą, kurį naudojame bendraujant.
Kadangi RDA modulis siunčia duomenis be pariteto (3 PAVEIKSLAS), mes abu nustatėme UPM1, UPM0 į nulį arba juos galima palikti atskirai, nes visi bitai bet kuriame registre yra numatyti nuliui.
MĖLYNA (USBS): Šis bitas naudojamas norint pasirinkti sustabdymo bitų skaičių, kurį naudojame ryšio metu.
Kadangi RFID modulis siunčia duomenis vienu sustojimo bitu (3 pav.), Mes tiesiog turime palikti USBS bitą ramybėje.
Pagaliau turime nustatyti perdavimo spartą, iš 3 paveikslo aišku, kad RFID modulis siunčia duomenis valdikliui 9600 bps (bitų per sekundę) sparta.
Perdavimo greitis nustatomas valdiklyje, pasirenkant tinkamą UBRRH,
UBRRH vertė parenkama kryžminant baudų perdavimo spartą ir procesoriaus kristalų dažnį,
Taigi pagal kryžminę nuorodą UBRR vertė yra „6“, taigi nustatomas duomenų perdavimo greitis.
Čia yra penki mygtukai, keturi skirti padidinti kandidatų balsus, o penktasis - iš naujo nustatyti kandidatų balsus. Čia esantys kondensatoriai skirti panaikinti mygtukų atšokimo efektą. Jei jie bus pašalinti, valdiklis kiekvieną kartą paspaudus mygtuką gali suskaičiuoti daugiau nei vieną.
Smeigtukams prijungti rezistoriai yra skirti srovei riboti, kai mygtukas paspaudžiamas kaiščiui žemyn nuleisti. Kai tik paspaudžiamas mygtukas, atitinkamas valdiklio kaištis nusileidžia ant žemės ir tokiu būdu valdiklis supranta, kad tam tikras mygtukas yra paspaustas ir reikia atlikti atitinkamus veiksmus, tai gali padidinti kandidatų balsus arba iš naujo nustatyti balsus, atsižvelgiant į paspaustą mygtuką.
Kai paspaudžiamas atitinkamą asmenį rodantis mygtukas, valdiklis jį pasiima ir padidina atitinkamo asmens numerį savo atmintyje, po to padidindamas, jis parodo atitinkamų asmenų balus 16x2 LCD ekrane.
Balsavimo mašinos veikimas geriausiai paaiškinamas toliau pateiktu C kodo žingsniu:
Kodo paaiškinimas
#include // antraštė, kad įgalintumėte duomenų srautų valdymą kaiščiams
#define F_CPU 1000000 // prijungtas valdiklio kristalo dažnis
# įtraukti
#define E 5 // suteikiant pavadinimą „įjungti“ 5 -ajam PORTD kaiščiui, nes jis yra prijungtas prie LCD įjungimo kaiščio
#define RS 6 // pavadinimo „registerselection“ suteikimas 6 -ajam PORTD kaiščiui, nes jis prijungtas prie LCD RS kaiščio
void send_a_command (nepasirašyta char komanda);
void send_a_character (nepasirašytas simbolis);
void send_a_string (char * string_of_characters);
int main (negaliojantis)
{
DDRA = 0xFF; // porta įdėjimas kaip išvesties kaiščiai
DDRD = 0b11111110;
_delay_ms (50); // suteikiant 50ms vėlavimą
DDRB = 0b11110000; // Kai kurie „PortB“ kaiščiai naudojami kaip įvestis.
UCSRB - = (1 <
// įgalinant duomenų gavimą visiškai nutraukti, įgalinant duomenų gavimo PIN kodą
UCSRC - = (1 <
// kitų bitų keitimas pirmiausia nustatant URSEL, nustatant 8 bitų ryšį
UCSRC & = ~ (1 <
ŠVEIDIMAS & = ~ (1 <
UBRRL = 6; // duomenų perdavimo spartos nustatymas
int16_t VOTEA = 0; // asmuo1 balsai saugo atmintį
char A; // asmuo1 balsai, rodantys simbolį LCD
int16_t VOTEB = 0;; // asmuo2 balsai saugo atmintį
simbolis B; // asmuo2 balsai, rodantys simbolį LCD
int16_t VOTEC = 0;; // asmuo3 balsai saugo atmintį
char C; // asmuo3 balsai, rodantys simbolį LCD
int16_t BALSO = 0;; // asmuo4 balsai saugo atmintį
D simbolis; / / asmuo 4 balsai, rodantys simbolį LCD
// Toliau yra žymų ID, jas reikia pakeisti skirtingoms žymoms. Jie turi būti atnaujinti, kad projektas veiktų
// Išmetus programą į valdiklį, reikia pasiimti korteles, kurios turi būti patvirtintos, ir gauti žymos ID. Jos gaunamos uždėjus žymą prie RDA modulio, o ID bus rodomas ekrane. Gavus ID, programa turi būti atnaujinta pakeičiant žemiau nurodytus ID numerius naujais.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Dabar aukščiau mes suteikiame leidimą tik penkioms kortelėms, kurias galima pakeisti į bet kurį skaičių, Pvz., Apsvarstykite, ar numatytoji programa yra išmesta į valdiklį, gaukite korteles, kurios turėtų būti autorizuotos, viena po kitos įdėkite šalia modulio, kiekvienam iš jų gausite ID kaip xxxxxxxx (907a4F87), Jei turėsime 7 žymas, turėsime 7 aštuonių bitų ID.
// dabar septynioms kortoms eina kaip // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)};; // paskirstoma atmintis rodant ID, siunčiamą moduliu int i = 0; int balsas = 0; int k = 0; send_a_command (0x01); // Išvalyti ekraną 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // pasakyti LCD, kad mes naudojame 8 bitų komandos / duomenų režimą _delay_ms (50); send_a_command (0b00001111); // LCD EKRANAS ĮJUNGTAS ir mirksi kurseris char MEM; // skirta atminčiai, kad būtų išsaugotas visas žymos ID send_a_string („RFID NUMERIS“); // siunčiama eilutė send_a_command (0x80 + 0x40 + 0); // kurjerio perkelimas į antrą eilutę o (1) { o (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR saugo gautus aštuonių bitų duomenis ir yra įtraukiamas į sveiką skaičių. MEM = COUNTA; // pirmieji du simboliai atnaujinami atmintyje itoa (COUNTA, SHOWA, 16); // komanda kintamojo skaičiaus įdėjimui į LCD ekraną (kintamasis skaičius, kuriame simbolyje reikia pakeisti, kuri bazė yra kintama (čia dešimt, nes skaičiuojame skaičių bazėje10)) send_a_string (SHOWA); // nurodymas ekrane rodyti antrojo asmens simbolį (pakeistą kintamuoju skaičiumi), padėjus kursorių ant LCD o (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // trečiasis ir ketvirtasis simboliai atnaujinami į atmintį o (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // penktas ir šeštas simboliai atnaujinami į atmintį o (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // septintasis ir aštuoni simboliai atnaujinami atmintyje send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
už (i = 0; i <5; i ++) { jei ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) {// tikrinant, ar nėra autorizacijos, lyginkite du simbolius vienu metu su atmintyje esančiais simboliais PORTB - = (1 <
balsas = 1; // jei leidžiama, rinkite BALSĄ } } jei (balsavimas == 0) // autorizacija nepavyko, jei balsavimas nenustatytas { UCSRB - = (1 <
} while (balsavimas == 1) // atlikite šią ciklą, kol balsuosite, jei bus leista { send_a_command (0x80 + 0); // eikite į nulinę poziciją 1 eilutėje send_a_string („BALSKITE DABAR“); // rodoma eilutė if (bit_is_clear (PINB, 0)) // kai paspaudžiamas vienas mygtukas { VOTEA ++; // padidina vieno asmens balsavimo atmintį vienu balsas = 0; // paleidus, kol ciklas eina po balsavimo } if (bit_is_clear (PINB, 1)) // kai paspaudžiamas mygtukas 2 { VOTEB ++; // padidina 2 -ojo asmens balsų atmintį vienu balsas = 0; } if (bit_is_clear (PINB, 2)) // kai paspaudžiamas mygtukas 3 { VOTEC ++; // prieaugio balsuoti atmintis 3 -iasis asmuo pagal vieną balsas = 0; } if (bit_is_clear (PINB, 3)) // kai paspaudžiamas mygtukas 4 { VOTED ++; // padidina 4 -ojo asmens balsų atmintį vienu balsas = 0; } jei (balsavimas == 0) // pašalinta po gauto balsavimo { send_a_command (0x80 + 0); // pereiti į 1 eilutės nulinę padėtį send_a_string („AČIŪ UŽ BALSĄ“); // rodyti eilutę už (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // rodomi visų keturių asmenų balsai 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); siųsti_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); siųsti_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (Balsuota, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); už (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // juda į nulinę padėtį send_a_string („RFID NUMERIS“); // siųsti eilutę send_a_command (0x80 + 0x40 + 0); } } void send_a_command (nepasirašyta char komanda) { PORTA = komanda; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (nepasirašytas simbolis) { PORTA = simbolis; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* simbolių eilutė_ ++); } } |