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 saugos sumetimais suprojektuosime RFID pagrįstą rinkliavos surinkimo sistemą. Taigi ši sistema atveria vartus ir leidžia žmonėms tik su autorizuotomis RDA žymomis. Įgaliotų žymų turėtojo ID yra užprogramuoti ATMEGA mikrovaldiklyje ir tik tiems turėtojams leidžiama išeiti arba patekti į patalpas.
Būtini komponentai
Aparatūra: mikrovaldiklis „ATmega32“, maitinimo šaltinis (5v), „AVR-ISP“ programuotojas, JHD_162ALCD (16x2 LCD modulis), 100uF kondensatorius (sujungtas per maitinimo šaltinį), mygtukas, 10KΩ rezistorius, 100nF kondensatorius, LED (dvi dalys), EM-18 (RFID skaitytuvo modulis), L293D variklio tvarkyklės IC, 5 V nuolatinės srovės variklis.
Programinė įranga: „ Atmel studio 6.1“, „progisp“ arba „flash magic“.
Grandinės schema ir darbo paaiškinimas
Aukščiau pateiktoje RDA rinkliavos surinkimo sistemos grandinėje ATMEGA32 PORTA yra prijungta prie LCD duomenų prievado. Čia turėtume nepamiršti išjungti JTAG ryšio PORTC į ATMEGA, pakeisdami saugiklių baitus, jei norime naudoti PORTC kaip įprastą ryšio prievadą. 16x2 LCD ekrane yra 16 kontaktų, jei yra užpakalinė lemputė, jei nėra užpakalinės šviesos, bus 14 kontaktų. Mes galime 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 (VEE-kontrolės, kaip storio turėtų būti rodomi simboliai), 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) į MC6 PD6
PIN5 arba RW (skaitymas / rašymas) į žemę (įjungus skystųjų kristalų ekraną skaitymo režimu, palengvinamas ryšys vartotojui)
PIN6 arba E (įjungti) į mikrovaldiklio PD5
PIN7 arba D0 - PA0
PIN8 arba D1 – PA1
PIN9 arba D2 - PA2
PIN10 arba D3 - PA3
PIN11 arba D4 – PA4
PIN12 arba D5 - PA5
PIN13 arba D6 - PA6
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 aukščiau esančiame paveiksle.
4. Iš aukščiau pateikto paveikslo modulio siunčiamuose duomenyse nėra paritinių bitų, vieno sustojimo bito.
Minėtos funkcijos nustatomos valdiklių registruose; mes ketiname juos trumpai aptarti,
RED (RXEN): Šis bitas reiškia duomenų gavimo funkciją. Šį bitą reikia nustatyti, kad duomenis iš modulio gautų valdiklis. Tai taip pat įgalina valdiklio RXD kaištį.
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š įjungiant kitus bitus UCSRC. Nustačius kitus reikiamus UCSRC, URSEL bitus, reikia išjungti arba nustatyti 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ų tipo, 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, mes nustatėme nulį tiek UPM1, tiek UPM0, arba juos galime palikti ramybėje, nes visi bitai bet kuriuose registruose pagal numatytuosius nustatymus yra nuliniai.
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, mes tiesiog turime palikti USBS bitą ramybėje.
Pagaliau turime nustatyti perdavimo spartą, iš aukščiau pateikto paveikslo yra aišku, kad RFID modulis siunčia duomenis valdikliui 9600 bps (bitų per sekundę) sparta.
Perdavimo greitis nustatomas valdiklyje, pasirinkus tinkamą UBRRH.
UBRRH reikšmė parenkama kryžminiu perdavimo sparta ir procesoriaus kristalų dažniu, taigi kryžminė nuoroda UBRR vertė laikoma „6“, taigi nustatomas perdavimo greitis.
Kaip parodyta paveikslėlyje, du valdiklio kaiščiai patenka į L293D, kuris yra H tiltas, naudojamas valdyti mažos galios nuolatinės srovės variklių greitį ir sukimosi kryptį.
L293D yra H-BRIDGE IC, skirtas važiuoti mažos galios nuolatinės srovės varikliais ir parodytas paveiksle, šis IC susideda iš dviejų h-tiltų ir todėl gali valdyti du nuolatinės srovės variklius. Taigi šį IC galima naudoti robotų varikliams valdyti iš mikrovaldiklio signalų.
Kaip buvo aptarta anksčiau, šis IC gali pakeisti nuolatinės srovės variklio sukimosi kryptį. Tai pasiekiama kontroliuojant įtampos lygius INPUT1 ir INPUT2.
Įgalinti prisegimą |
1 įvesties kaištis |
2 įvesties kaištis |
Variklio kryptis |
Aukštas |
Žemas |
Aukštas |
Pasukite į dešinę |
Aukštas |
Aukštas |
Žemas |
Pasukite į kairę |
Aukštas |
Žemas |
Žemas |
Sustabdyti |
Aukštas |
Aukštas |
Aukštas |
Sustabdyti |
Taigi, kaip parodyta aukščiau esančioje lentelėje, norint sukti pagal laikrodį, 2A turėtų būti didelis, o 1A - mažas. Panašiai ir prieš laikrodžio rodyklę 1A turėtų būti didelis, o 2A - mažas.
Kai prie modulio priartinama autorizuota kortelė, variklis yra užprogramuotas sekundę judėti pagal laikrodžio rodyklę, rodyti, kad po kelių sekundžių atidaromi rinkliavos vartai, sakant, kad rinkliavos vartai uždaryti. Rinkliavos aikštės veikimas geriausiai paaiškinamas toliau pateiktu C kodo žingsniu.
Programavimo paaiškinimas
Žemiau yra RFID rinkliavos surinkimo sistemos kodo paaiškinimas iš eilutės į eilutę. Galite suprasti šio projekto idėją ir veikimą perskaitę žemiau pateiktą kodą. Norėdami atsisiųsti ar kopijuoti, visą kodą rasite puslapio apačioje.
#include // antraštė, kad įgalintumėte duomenų srautų valdymą per kaiščius
#define F_CPU 1000000 // prijungtas valdiklio kristalo dažnis
# įtraukti
#define E 5 // pavadinimo „įgalinimas“ suteikimas 5 -ajam PORTD kaiščiui, nes jis 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 laikomi įvestimi.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
ŠVEIDIMAS & = ~ (1 <
UBRRL = 6; // duomenų perdavimo spartos nustatymas // Toliau pateikiamas žymų ID, jas reikia pakeisti skirtingoms žymoms. Jie turi būti atnaujinti, kad projektas veiktų
/ * Išmetus programą į valdiklį, reikia pasiimti korteles, kurios turi leidimą, ir gauti žymos ID. Jie gaunami 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ų.
Pavyzdžiui, apsvarstykite, ar numatytoji programa yra iškelta į valdiklį, gaukite korteles, kurios turėtų būti įgaliotos. Vieta vienas po kito šalia modulio, kiekvieno asmens ID gausite 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, skirta parodyti ID siuntimą 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ų komandų / duomenų režimą _delay_ms (50); send_a_command (0b00001111); // LCD ekranas įjungtas ir mirksi kurseris char MEM; // paskirstoma atmintis, kad būtų išsaugotas visas žymos ID send_a_string ("RFID NUMERIS"); // siunčiama eilutė send_a_command (0x80 + 0x40 + 0); // kurjerio perkėlimas į antrą eilutę o (1) { o (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR saugo gautus aštuonių bitų duomenis ir įtraukiami į sveiką skaičių. MEM = COUNTA; // pirmieji du simboliai atnaujinami į atmintį 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 simboliais atmintyje PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // delsa _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 (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ė_ ++); } } |