Znamy się w biurach, galeriach handlowych i wielu innych miejscach, w których do pokoju może wejść tylko osoba posiadająca kartę autoryzacyjną. Systemy te wykorzystują system komunikacji RFID. RFID jest używany w centrach handlowych do powstrzymania kradzieży, ponieważ produkty są znakowane chipem RFID, a kiedy osoba opuszcza budynek z chipem RFID, automatycznie włącza się alarm. Znacznik RFID jest tak mały, jak część piasku. Systemy uwierzytelniania RFID są łatwe w projektowaniu i tanie. Niektóre szkoły i uczelnie używają obecnie systemów obecności opartych na RFID.
W tym projekcie zamierzamy zaprojektować maszynę do głosowania, która liczy tylko głosy uwierzytelnione. Odbywa się to za pomocą tagów RFID (Radio Frequency Identification). Tutaj mamy zamiar napisać program dla ATMEGA umożliwiający głosowanie tylko upoważnionym posiadaczom tagów RFID. (Sprawdź również ten prosty projekt maszyny do głosowania)
Wymagane składniki
Sprzęt: ATMEGA32, zasilacz (5v), PROGRAMATOR AVR-ISP, JHD_162ALCD (16x2LCD), kondensator 100uF (podłączany przez zasilacz), przycisk (pięć sztuk), rezystor 10KΩ (pięć sztuk), kondensator 100nF (pięć sztuk), dioda LED (dwie sztuki), EM-18 (moduł czytnika RFID).
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic.
Schemat obwodu i wyjaśnienie
W obwodzie PORTA ATMEGA32 jest podłączona do portu danych wyświetlacza LCD. W tym miejscu należy pamiętać o wyłączeniu komunikacji JTAG w PORTC do ATMEGA poprzez zmianę bajtów bezpiecznika, jeśli chcemy używać PORTC jako normalnego portu komunikacyjnego. W 16x2 LCD jest łącznie 16 pinów, jeśli jest czarne światło, jeśli nie ma podświetlenia, będzie 14 pinów. Można zasilać lub pozostawić piny podświetlenia. Teraz w 14 szpilki są kołki 8 danych (7-14 lub D0-D7), 2 szpilki zasilacza (1 i 2 lub VSS i VDD i GND i +5 V), 3 rd pin regulacji kontrastu (VEE umożliwia sprawdzenie grubości znaki powinny pokazano), 3 piny sterujące (RS i RW i E)
W obwodzie można zauważyć, że wziąłem tylko dwa piny sterujące, co daje elastyczność lepszego zrozumienia, bit kontrastu i odczyt / zapis nie są często używane, więc można je zwierać do masy. Dzięki temu wyświetlacz LCD ma najwyższy kontrast i tryb odczytu. Musimy tylko sterować pinami ENABLE i RS, aby odpowiednio wysyłać znaki i dane.
Poniżej przedstawiono połączenia wykonane dla LCD:
PIN1 lub VSS do masy
PIN2 lub VDD lub VCC do + 5 V.
PIN3 lub VEE do ziemi (daje maksymalny kontrast najlepszy dla początkującego)
PIN4 lub RS (wybór rejestru) do PD6 uC
PIN5 lub RW (odczyt / zapis) do masy (przełącza wyświetlacz LCD w tryb odczytu, ułatwiając komunikację użytkownikowi)
PIN6 lub E (Włącz) do PD5 uC
PIN7 lub D0 do PA0 uC
PIN8 lub D1 do PA1 uC
PIN9 lub D2 do PA2 uC
PIN10 lub D3 do PA3 uC
PIN11 lub D4 do PA4 uC
PIN12 lub D5 do PA5 uC
PIN13 lub D6 do PA6 uC
PIN14 lub D7 do PA7 uC
W układzie widać, że użyliśmy komunikacji 8-bitowej (D0-D7). Nie jest to jednak obowiązkowe i możemy używać komunikacji 4-bitowej (D4-D7), ale przy 4-bitowej komunikacji program staje się nieco skomplikowany, więc wolałem komunikację 8-bitową.
Czyli z samej obserwacji powyższej tabeli podłączamy 10 pinów LCD do kontrolera, w którym 8 pinów to pinów danych i 2 pinów do sterowania.
Zanim przejdziemy dalej, musimy zapoznać się z komunikacją szeregową. Moduł RFID wysyła tutaj dane do sterownika szeregowo. Ma inny tryb komunikacji, ale dla łatwej komunikacji wybieramy RS232. Pin RS232 modułu jest połączony z pinem RXD ATMEGA.
Dane przesyłane przez moduł RFID są następujące:
Teraz dla interfejsu modułu RFID wymagane są następujące funkcje:
1. Pin RXD (funkcja odbioru danych) kontrolera musi być włączony.
2. Ponieważ komunikacja jest połączona szeregowo, musimy wiedzieć, kiedy odbierane są dane, abyśmy mogli zatrzymać program do momentu odebrania całego bajtu. Odbywa się to poprzez włączenie całkowitego przerwania odbioru danych.
3. RFID przesyła dane do kontrolera w trybie 8-bitowym. Tak więc do kontrolera zostaną wysłane jednocześnie dwa znaki. Jest to pokazane w bloku rysunku 3
4. Z rysunku 3 nie ma bitów parzystości, jeden bit stopu w danych wysyłanych przez moduł.
Powyższe cechy są ustawione w rejestrach kontrolera; omówimy je pokrótce,
CZERWONY (RXEN): Ten bit reprezentuje funkcję odbioru danych, ten bit musi być ustawiony, aby dane z modułu były odbierane przez kontroler, włącza również pin RXD kontrolera.
BRĄZOWY (RXCIE): Ten bit musi być ustawiony, aby uzyskać przerwanie po udanym odbiorze danych. Włączając ten bit poznajemy zaraz po otrzymaniu 8-bitowych danych.
PINK (URSEL): Ten bit musi być ustawiony przed włączeniem innych bitów w UCSRC, po ustawieniu innych potrzebnych bitów w UCSRC; URSEL musi być wyłączony lub ustawiony na zero.
ŻÓŁTY (UCSZ0, UCSZ1, UCSZ2): Te trzy bity służą do wybierania liczby bitów danych, które odbieramy lub wysyłamy za jednym razem.
Ponieważ dane wysyłane przez moduł RFID mają 8-bitowy typ danych (RYSUNEK 3), musimy ustawić UCSZ0, UCSZ1 na jeden, a UCSZ2 na zero.
POMARAŃCZOWY (UMSEL): Ten bit jest ustawiany na podstawie tego, czy system komunikuje się asynchronicznie (oba używają innego zegara), czy synchronicznie (oba używają tego samego zegara),
Ponieważ moduł i kontroler używają innego zegara, ten bit musi być ustawiony na zero lub pozostawiony sam, ponieważ wszystkie są domyślnie ustawione na zero.
ZIELONY (UPM1, UPM0): Te dwa bity są regulowane na podstawie parzystości bitów, której używamy w komunikacji.
Ponieważ moduł RFID wysyła dane bez parzystości (RYSUNEK3), ustawiliśmy oba UPM1 i UPM0 na zero lub można je pozostawić same, ponieważ wszystkie bity w dowolnych rejestrach są domyślnie ustawione na zero.
NIEBIESKI (USBS): Ten bit jest używany do wyboru liczby bitów stopu, których używamy podczas komunikacji.
Ponieważ moduł RFID wysyła dane z jednym bitem stopu (rysunek 3), musimy po prostu zostawić bit USBS w spokoju.
Teraz w końcu musimy ustawić prędkość transmisji, z rysunku 3 widać, że moduł RFID przesyła dane do sterownika z prędkością 9600bps (bitów na sekundę).
Szybkość transmisji ustawia się w kontrolerze poprzez dobór odpowiedniego UBRRH,
Wartość UBRRH jest wybierana poprzez porównanie szybkości transmisji i częstotliwości kryształu procesora,
Zatem przez odniesienie wartość UBRR jest postrzegana jako „6”, a więc ustawiana jest prędkość transmisji.
Znajduje się tu pięć przycisków, cztery do zwiększania liczby głosów kandydatów, a piąty do zerowania głosów kandydatów. Obecne tutaj kondensatory służą do niwelowania efektu odbijania przycisków. Jeśli zostaną usunięte, kontroler może policzyć więcej niż jeden przy każdym naciśnięciu przycisku.
Rezystory podłączone do kołków służą do ograniczania prądu, gdy przycisk jest wciśnięty, aby pociągnąć kołek do ziemi. Za każdym razem, gdy przycisk jest wciśnięty, odpowiedni pin kontrolera zostaje ściągnięty do ziemi, a tym samym kontroler rozpoznaje, że dany przycisk jest wciśnięty i odpowiednią akcję, którą należy podjąć, może to być zwiększanie głosów kandydatów lub resetowanie głosów w zależności od naciśniętego przycisku.
Kiedy przycisk reprezentujący odpowiednią osobę jest wciśnięty, kontroler wybiera go i zwiększa numer odpowiedniej osoby w swojej pamięci, po zwiększeniu pokazuje wynik odpowiedniej osoby na wyświetlaczu LCD 16x2.
Działanie automatu do głosowania najlepiej wyjaśnić krok po kroku w kodzie C podanym poniżej:
Objaśnienie kodu
#include // nagłówek, aby włączyć kontrolę przepływu danych w pinach
#define F_CPU 1000000 // informowanie o częstotliwości kryształu kontrolera
#zawierać
#define E 5 // podając nazwę „enable” do 5 th pin PORTD, ponieważ jest podłączony do LCD umożliwiają pin
#define RS 6 // podając nazwę „registerselection” do 6 th pin PORTD, ponieważ jest podłączony do LCD RS pin
void send_a_command (polecenie unsigned char);
void send_a_character (znak bez znaku);
void send_a_string (char * string_of_characters);
int main (nieważne)
{
DDRA = 0xFF; // umieszczenie porta jako pinów wyjściowych
DDRD = 0b11111110;
_delay_ms (50); // dając opóźnienie 50ms
DDRB = 0b11110000; // Przyjmowanie niektórych pinów portuB jako danych wejściowych.
UCSRB - = (1 <
// umożliwienie odbioru danych całkowite przerwanie, włączenie odbioru danych pin
UCSRC - = (1 <
// zmiana innych bitów poprzez najpierw ustawienie URSEL, ustawienie dla komunikacji 8-bitowej
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // ustawienie szybkości transmisji
int16_t VOTEA = 0; // głosy person1 przechowujące pamięć
char A; // głosy person1 wyświetlają znak na LCD
int16_t VOTEB = 0;; // głosy person2 przechowujące pamięć
char B; // głosy person2 wyświetlające znak na LCD
int16_t VOTEC = 0;; // głosy person3 przechowujące pamięć
char C; // głosy person3 wyświetlające znak na LCD
int16_t VOTED = 0;; // głosy person4 przechowujące pamięć
char D; / / person4 głosy wyświetlające znak na LCD
// Poniższy kod zawiera identyfikator tagów, które należy zmienić dla różnych tagów. Muszą one zostać zaktualizowane, aby projekt działał
// Po zrzuceniu programu do kontrolera należy wziąć karty, które wymagają autoryzacji i uzyskać ID tagów, które uzyskuje się poprzez umieszczenie taga w pobliżu modułu RFID, a identyfikator zostanie wyświetlony na ekranie. Po otrzymaniu identyfikatorów należy zaktualizować program poprzez zastąpienie poniższych numerów ID nowymi numerami ID.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Teraz powyżej autoryzujemy tylko pięć kart, które można zmienić na dowolną liczbę, Na przykład weź pod uwagę, że domyślny program jest zrzucony do kontrolera, pobierz karty, które powinny być autoryzowane, umieść jedną po drugiej w pobliżu modułu, otrzymasz ID dla każdego z nich jako xxxxxxxx (907a4F87)
Jeśli mamy 7 tagów, będziemy mieć 7 ośmiobitowych identyfikatorów.
// teraz dla siedmiu kart wygląda jak // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // przydzielanie pamięci na pokazywanie ID wysyłanego przez moduł int i = 0; int głosowanie = 0; int k = 0; send_a_command (0x01); // Wyczyść ekran 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // mówienie lcdowi, że używamy 8-bitowego trybu poleceń / danych _delay_ms (50); send_a_command (0b00001111); // WYŚWIETLACZ LCD WŁĄCZONY i miga kursor char MEM; // przydzielanie pamięci do przechowywania pełnego identyfikatora tagu send_a_string ("RFID NUMBER"); // wysyłanie ciągu send_a_command (0x80 + 0x40 + 0); // przeniesienie kursora do drugiej linii podczas gdy (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR przechowuje otrzymane ośmiobitowe dane i jest traktowane jako liczba całkowita. MEM = COUNTA; // pierwsze dwa znaki są aktualizowane do pamięci itoa (COUNTA, SHOWA, 16); // komenda do umieszczenia numeru zmiennej w LCD (numer zmiennej, w którym znak do zastąpienia, która podstawa jest zmienna (tutaj dziesięć, ponieważ liczymy liczbę w podstawie10)) send_a_string (SHOWA); // nakazanie wyświetlaczowi pokazania znaku (zastąpionego numerem zmiennej) drugiej osoby po ustawieniu kursora na LCD while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // trzeci i czwarty znak są aktualizowane do pamięci while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // piąty i szósty znak są aktualizowane do pamięci while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // siódmy i osiem znaków są aktualizowane do pamięci send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
dla (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// sprawdzenie autoryzacji zakupu porównując dwa znaki jednocześnie ze znakami w pamięci PORTB - = (1 <
głosowanie = 1; // w przypadku autoryzacji ustaw VOTE } } if (vote == 0) // autoryzacja nie powiodła się, jeśli głosowanie nie jest ustawione { UCSRB - = (1 <
} while (głosowanie == 1) // rób tę pętlę aż do głosowania, jeśli jest autoryzowany { send_a_command (0x80 + 0); // przejdź do pozycji zerowej w linii 1 send_a_string ("VOTE NOW"); // wyświetlanie napisu if (bit_is_clear (PINB, 0)) // po naciśnięciu pierwszego przycisku { VOTEA ++; // zwiększa pamięć głosowania pierwszej osoby o jeden głosowanie = 0; // puszczanie pętli while po głosowaniu } if (bit_is_clear (PINB, 1)) // po naciśnięciu przycisku 2 { VOTEB ++; // zwiększamy pamięć głos 2 nd osoby po drugim głos = 0; } if (bit_is_clear (PINB, 2)) // po naciśnięciu przycisku 3 { Votec ++; // zwiększamy pamięć głos 3 rd osoby po drugim głos = 0; } if (bit_is_clear (PINB, 3)) // po naciśnięciu przycisku 4 { Wziął ++; // zwiększamy pamięć głos 4 th osobiście przez jednego głos = 0; } if (vote == 0) // wyczyszczono po otrzymaniu głosu { send_a_command (0x80 + 0); // przejdź do pozycji zerowej wiersza1 send_a_string ("DZIĘKUJĘ ZA GŁOSOWANIE"); // wyświetl ciąg dla (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // wyświetlanie głosów wszystkich czterech 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 (VOTEB, 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 (VOTED, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); dla (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // przejście do pozycji zerowej send_a_string ("RFID NUMBER"); // wyślij ciąg send_a_command (0x80 + 0x40 + 0); } } void send_a_command (polecenie unsigned char) { PORTA = polecenie; 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_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |