Știm în birouri, centre comerciale și în multe alte locuri unde numai persoana cu card de autorizare are voie să intre în cameră. Aceste sisteme utilizează un sistem de comunicații RFID. RFID este utilizat în centrele comerciale pentru a opri furtul, deoarece produsele sunt etichetate cu cip RFID și atunci când o persoană părăsește clădirea cu cipul RFID, se declanșează automat o alarmă. Eticheta RFID este concepută la fel de mică ca o parte a nisipului. Sistemele de autentificare RFID sunt ușor de proiectat și sunt ieftine. Unele școli și colegii folosesc în prezent sisteme de prezență bazate pe RFID.
În acest proiect, vom proiecta un sistem de colectare a taxelor bazat pe RFID din motive de securitate. Așadar, acest sistem deschide porți și permite oamenilor doar etichetele RFID autorizate. ID-urile autorizate ale deținătorului de etichete sunt programate în microcontrolerul ATMEGA și numai acei deținători au voie să părăsească sau să intre în incintă.
Componente necesare
Hardware: microcontroler ATmega32, sursă de alimentare (5v), programator AVR-ISP, JHD_162ALCD (modul LCD 16x2), condensator 100uF (conectat la sursa de alimentare), buton, rezistor 10KΩ, condensator 100nF, LED (două bucăți), EM-18 (Modul cititor RFID), IC driver driver L293D, motor DC 5V.
Software: Atmel studio 6.1, progisp sau flash magic.
Diagrama circuitului și explicația de lucru
În circuitul sistemului de colectare a taxelor RFID prezentat mai sus, PORTA din ATMEGA32 este conectat la portul de date al LCD-ului. Aici ar trebui să ne amintim să dezactivăm comunicarea JTAG în PORTC în ATMEGA prin schimbarea octeților siguranței, dacă vrem să folosim PORTC ca un port de comunicație normal. În ecranul LCD 16x2, există 16 pini peste tot dacă există o lumină de fundal, dacă nu există lumină de fundal vor exista 14 pini. Putem alimenta sau lăsa pinii luminii din spate. Acum, în cele 14 pinii există 8 pini de date (7-14 sau D0-D7), 2 pini de alimentare (1 & 2 sau VSS & VDD sau gnd & + 5v), 3 rd pini pentru controlul contrastului (VEE-controale cât de gros trebuie afișate caractere), 3 pini de control (RS & RW & E).
În circuit, puteți observa că am luat doar doi pini de control. Acest lucru oferă flexibilitatea unei mai bune înțelegeri. Bitul de contrast și READ / WRITE nu sunt adesea folosite, astfel încât acestea pot fi scurtcircuitate la sol. Acest lucru pune LCD în cel mai mare contrast și modul de citire. Trebuie doar să controlăm ENABLE și pinii RS pentru a trimite caractere și date în consecință.
Conexiunile realizate pentru LCD sunt date mai jos:
PIN1 sau VSS la masă
PIN2 sau VDD sau VCC la + 5v putere
PIN3 sau VEE la sol (oferă un contrast maxim optim pentru un începător)
PIN4 sau RS (Register Selection) la PD6 de MCU
PIN5 sau RW (citire / scriere) la masă (pune LCD în modul de citire facilitează comunicarea pentru utilizator)
PIN6 sau E (Activare) la PD5 al microcontrolerului
PIN7 sau D0 la PA0
PIN8 sau D1 până la PA1
PIN9 sau D2 până la PA2
PIN10 sau D3 la PA3
PIN11 sau D4 la PA4
PIN12 sau D5 până la PA5
PIN13 sau D6 până la PA6
PIN14 sau D7 la PA7
În circuit, puteți vedea că am folosit comunicația pe 8 biți (D0-D7). Cu toate acestea, acest lucru nu este obligatoriu și putem folosi comunicația pe 4 biți (D4-D7), dar programul de comunicare pe 4 biți devine puțin complex, așa că am preferat comunicarea pe 8 biți.
Deci, din simpla observare a tabelului de mai sus, conectăm 10 pini de LCD la controler în care 8 pini sunt pini de date și 2 pini pentru control.
Înainte de a merge mai departe, trebuie să înțelegem despre comunicarea în serie. Modulul RFID de aici trimite datele către controler în serie. Are un alt mod de comunicare, dar pentru o comunicare ușoară alegem RS232. Pinul RS232 al modulului este conectat la pinul RXD al ATMEGA.
Datele trimise de modulul RFID sunt:
Acum, pentru interfața modulului RFID, sunt necesare următoarele caracteristici:
1. Pinul RXD (caracteristică de primire a datelor) al controlerului trebuie activat.
2. Întrucât comunicarea este serială, trebuie să știm ori de câte ori sunt primite datele bye, astfel încât să putem opri programul până când este primit octetul complet. Acest lucru se realizează prin activarea unei întreruperi complete a datelor.
3. RFID trimite date către controler în modul 8 biți. Deci, două caractere vor fi trimise controlerului odată. Acest lucru este prezentat în figura de mai sus.
4. Din figura de mai sus, nu există biți de paritate, un bit de oprire în datele trimise de modul.
Funcțiile de mai sus sunt setate în registrele controlerului; le vom discuta pe scurt,
ROȘU (RXEN): Acest bit reprezintă caracteristica de primire a datelor. Acest bit trebuie setat pentru ca datele din modul să fie primite de către controler. De asemenea, activează pinul RXD al controlerului.
MARO (RXCIE): Acest bit trebuie setat pentru a obține o întrerupere după recepționarea cu succes a datelor. Activând acest bit, vom afla, imediat după primirea datelor pe 8 biți.
PINK (URSEL): Acest bit trebuie setat înainte de a activa alți biți în UCSRC. După setare, alți biți necesari în UCSRC, URSEL trebuie să fie dezactivați sau puși la zero.
GALBEN (UCSZ0, UCSZ1, UCSZ2): Acești trei biți sunt utilizați pentru selectarea numărului de biți de date pe care îi primim sau îi trimitem într-o singură trecere.
Deoarece datele trimise de modulul RFID sunt de tip 8bit, trebuie să setăm UCSZ0, UCSZ1 la unu și UCSZ2 la zero.
ORANGE (UMSEL): Acest bit este setat pe baza faptului că sistemul comunică asincron (ambele folosesc ceas diferit) sau sincron (ambele utilizează același ceas).
Deoarece modulul și controlerul utilizează ceas diferit, acest bit trebuie setat la zero sau lăsat singur, deoarece toate sunt setate la zero în mod implicit.
VERZ (UPM1, UPM0): Acești doi biți sunt reglați pe baza parității de biți pe care o folosim în comunicare.
Deoarece modulul RFID trimite date fără paritate, am setat ambele UPM1, UPM0 la zero sau pot fi lăsate în pace, deoarece toți biții din orice registre sunt setați la zero în mod implicit.
ALBASTRU (USBS): Acest bit este utilizat pentru alegerea numărului de biți de oprire pe care îi folosim în timpul comunicării.
Deoarece modulul RFID trimite date cu un bit de oprire, trebuie doar să lăsăm bitul USBS singur.
Acum, în sfârșit, trebuie să setăm rata de transmisie, din figura de mai sus este clar că modulul RFID trimite date către controler cu o viteză de transmisie de 9600bps (biți pe secundă).
Rata de transmisie este setată în controler alegând UBRRH corespunzător.
Valoarea UBRRH este aleasă prin rata de referință încrucișată și frecvența cristalelor CPU, Deci prin valoarea UBRR de referință încrucișată este văzută ca „6”, astfel încât rata de transmisie este setată.
Acum, așa cum se arată în figură, doi pini de la controler merg la L293D, care este un H-BRIDGE folosit pentru a controla viteza și direcția de rotație pentru motoarele de curent continuu de mică putere.
L293D este un IC H-BRIDGE conceput pentru acționarea motoarelor de curent continuu de mică putere și este prezentat în figură, acest IC este format din două punți h și astfel poate acționa două motoare de curent continuu. Deci, acest CI poate fi utilizat pentru a conduce motoarele robotului de la semnalele microcontrolerului.
Acum, așa cum am discutat înainte, acest CI are capacitatea de a schimba direcția de rotație a motorului de curent continuu. Acest lucru se realizează prin controlul nivelurilor de tensiune la INPUT1 și INPUT2.
Activați Pin |
Pinul de intrare 1 |
Pinul de intrare 2 |
Direcția motorului |
Înalt |
Scăzut |
Înalt |
Obligatoriu Dreapta |
Înalt |
Înalt |
Scăzut |
Vireaza la stanga |
Înalt |
Scăzut |
Scăzut |
Stop |
Înalt |
Înalt |
Înalt |
Stop |
Deci, așa cum se arată în tabelul de mai sus, pentru rotația în sens orar, 2A ar trebui să fie ridicat și 1A ar trebui să fie scăzut. În mod similar, în sensul acelor de ceasornic, 1A trebuie să fie ridicat și 2A să fie scăzut.
Ori de câte ori un card autorizat este adus în apropierea modulului, motorul este programat să se deplaseze în sensul acelor de ceasornic pentru o secundă, pentru a arăta că poarta de taxare este deschisă după o secundă în care se întoarce, spunând că poarta de taxă este închisă. Funcționarea pieței de taxare este explicată cel mai bine pas cu pas al codului C dat mai jos.
Explicație de programare
Mai jos este o explicație de la o linie la alta pentru codul sistemului de colectare a taxelor RFID. Puteți înțelege conceptul și funcționarea acestui proiect citind codul de mai jos. Pentru descărcare sau copiere, puteți găsi codul complet în partea de jos a paginii.
#include // header pentru a permite controlul fluxului de date peste pini
#define F_CPU 1000000 // indicând frecvența cristalului controlerului atașată
#include
#define E 5 // da numele „permite“ 5 - lea PIN al PORTD, deoarece acesta este conectat la LCD permite PIN -
#define RS 6 // dând numele „registerselection” la al șaselea pin al PORTD, deoarece este conectat la pinul RS RS
void send_a_command (comandă char nesemnată);
void send_a_character (caracter de caractere nesemnat);
void send_a_string (char * șir_de_caractere);
int main (nul)
{
DDRA = 0xFF; // punerea porta ca pini de ieșire
DDRD = 0b11111110;
_delay_ms (50); // oferind o întârziere de 50ms
DDRB = 0b11110000; // Luând niște pini portB ca intrare.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // setarea ratei de transmisie // Următoarele conțin ID-ul etichetelor, acestea trebuie modificate pentru diferite etichete, acestea trebuie actualizate pentru ca proiectul să funcționeze
/ * După ce ați aruncat programul în controler, trebuie să luați cardurile care trebuie autorizate și să obțineți eticheta ID. Acestea sunt obținute prin plasarea etichetei lângă modulul RFID și ID-ul va fi afișat pe ecran. După obținerea ID-urilor, programul trebuie actualizat prin înlocuirea numerelor de identificare de mai jos cu numere de identificare noi.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Acum, mai sus, autorizăm doar cinci cărți, acestea putând fi schimbate cu orice număr.
De exemplu, considerați că programul implicit este aruncat în controler, obțineți cardurile care ar trebui să fie autorizate. Plasați unul după altul lângă modul, veți obține ID-ul pentru fiecare dintre acestea ca xxxxxxxx (907a4F87), Dacă avem 7 etichete pe care le avem, atunci vom avea 7 ID de 8 biți. * /
// acum pentru șapte cărți merge ca. // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // alocarea memoriei pentru afișarea ID-ului trimis de modul int i = 0; vot int = 0; int k = 0; send_a_command (0x01); // Ștergeți ecranul 0x01 = 00000001 _delay_ms (50); send_a_comand (0x38); // spunând lcd că folosim modul de comandă / date pe 8 biți _delay_ms (50); send_a_command (0b00001111); // LCD SCREEN ON și cursorul clipește char MEM; // alocarea memoriei pentru a stoca ID-ul complet al etichetei send_a_string ("NUMĂR RFID"); // trimiterea șirului send_a_comand (0x80 + 0x40 + 0); // mutarea cursorului pe linia a doua în timp ce (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR stochează datele de opt biți primite și este luată într-un număr întreg. MEM = COUNTA; // primele două caractere sunt actualizate în memorie itoa (COUNTA, SHOWA, 16); // comanda pentru introducerea numărului variabil în LCD (număr variabil, în ce caracter trebuie înlocuit, care bază este variabilă (zece aici, deoarece numărăm numărul în baza10)) send_a_string (SHOWA); // indicând afișajului să afișeze caracterul (înlocuit cu numărul variabil) al persoanei a doua după poziționarea cursorului pe LCD while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // al treilea și al patrulea caracter sunt actualizate în memorie while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // al cincilea și al șaselea caracter sunt actualizate în memorie while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // șaptea și opt caractere sunt actualizate în memorie send_a_string (""); send_a_comand (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
pentru (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// verificarea autorizației cumpără compararea a două caractere odată cu caracterele din memorie PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // întârziere _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 (comandă char nesemnată) { PORTA = comanda; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (caracter de caractere nesemnat) { PORTA = personaj; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* șir_de_caractere> 0) { send_a_character (* șir_de_caractere ++); } } |