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ć system poboru opłat oparty na technologii RFID dla celów bezpieczeństwa. Tak więc ten system otwiera bramy i pozwala ludziom tylko z autoryzowanymi tagami RFID. Identyfikatory uprawnionych posiadaczy tagów są zaprogramowane w Mikrokontrolerze ATMEGA i tylko ci posiadacze mogą opuścić lub wejść na teren obiektu.
Wymagane składniki
Sprzęt: mikrokontroler ATmega32, zasilacz (5v), programator AVR-ISP, JHD_162ALCD (moduł LCD 16x2), kondensator 100uF (podłączony przez zasilacz), przycisk, rezystor 10KΩ, kondensator 100nF, dioda LED (dwie sztuki), EM-18 (Moduł czytnika RFID), układ scalony sterownika silnika L293D, silnik 5 V DC.
Oprogramowanie: Atmel studio 6.1, progisp lub flash magic.
Schemat obwodu i objaśnienie robocze
W pokazanym powyżej obwodzie systemu poboru opłat RFID, 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 LCD 16x2 jest 16 pinów, jeśli jest podświetlenie, jeśli nie ma podświetlenia, będzie 14 pinów. Możemy zasilać lub zostawić 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 kołków sterujących kontrastu (Pasek kontroli jak gruba powinny być pokazane znaki), 3 piny sterujące (RS i RW i E).
W obwodzie można zauważyć, że wziąłem tylko dwa piny sterujące. Daje to 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.
Połączenia, które są wykonane dla LCD, są podane poniżej:
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 MCU
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 mikrokontrolera
PIN7 lub D0 do PA0
PIN8 lub D1 do PA1
PIN9 lub D2 do PA2
PIN10 lub D3 do PA3
PIN11 lub D4 do PA4
PIN12 lub D5 do PA5
PIN13 lub D6 do PA6
PIN14 lub D7 do PA7
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. Pokazuje to powyższy rysunek.
4. Na powyższym rysunku 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ę odbierania danych. Ten bit musi być ustawiony, aby dane z modułu były odbierane przez kontroler. Umożliwia 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.
RÓŻOWY (URSEL): Ten bit musi być ustawiony przed włączeniem innych bitów w UCSRC. Po ustawieniu inne potrzebne bity w UCSRC, URSEL należy wyłączyć lub wyzerować.
ŻÓŁ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, 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, 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, musimy po prostu zostawić bit USBS w spokoju.
Teraz w końcu musimy ustawić prędkość transmisji, z powyższego rysunku jasno wynika, że moduł RFID przesyła dane do kontrolera z prędkością 9600bps (bitów na sekundę).
Szybkość transmisji ustawia się w kontrolerze poprzez wybór odpowiedniego UBRRH.
Wartość UBRRH jest wybierana poprzez odniesienie do szybkości transmisji i częstotliwości kryształu procesora, więc przez odniesienie wartość UBRR jest widziana jako „6”, a więc ustawiana jest szybkość transmisji.
Teraz, jak pokazano na rysunku, dwa piny ze sterownika idą do L293D, który jest H-BRIDGE używanym do sterowania prędkością i kierunkiem obrotów silników DC małej mocy.
L293D to układ scalony H-BRIDGE przeznaczony do napędzania silników prądu stałego o małej mocy i jest pokazany na rysunku. Ten układ scalony składa się z dwóch mostków typu h, dzięki czemu może napędzać dwa silniki prądu stałego. Tak więc ten układ scalony może być używany do sterowania silnikami robotów z sygnałów mikrokontrolera.
Teraz, jak omówiono wcześniej, ten układ scalony ma możliwość zmiany kierunku obrotów silnika prądu stałego. Osiąga się to poprzez kontrolowanie poziomów napięcia na WEJŚCIU1 i WEJŚCIU2.
Włącz Pin |
Pin wejściowy 1 |
Pin wejściowy 2 |
Kierunek silnika |
Wysoki |
Niska |
Wysoki |
Skręć w prawo |
Wysoki |
Wysoki |
Niska |
Skręć w lewo |
Wysoki |
Niska |
Niska |
Zatrzymać |
Wysoki |
Wysoki |
Wysoki |
Zatrzymać |
Tak więc, jak pokazano w powyższej tabeli, dla rotacji zgodnej z ruchem wskazówek zegara 2A powinno być wysokie, a 1A powinno być niskie. Podobnie dla ruchu w kierunku przeciwnym do ruchu wskazówek zegara 1 A powinno być wysokie, a 2 A powinno być niskie.
Za każdym razem, gdy autoryzowana karta zostanie zbliżona do modułu, silnik jest zaprogramowany tak, aby przez sekundę poruszał się zgodnie z ruchem wskazówek zegara, aby pokazać, że bramka jest otwarta, po sekundzie wraca, informując, że bramka jest zamknięta. Działanie punktu poboru opłat najlepiej wyjaśnić krok po kroku kod C podany poniżej.
Objaśnienie programowania
Poniżej znajduje się wyjaśnienie od wiersza do wiersza dotyczące kodu systemu poboru opłat RFID. Możesz zrozumieć koncepcję i działanie tego projektu, czytając poniższy kod. Aby pobrać lub skopiować, pełny kod można znaleźć na dole strony.
#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 on podłączony do LCD umożliwiają pin
#define RS 6 // nadanie nazwy „ regiselection ” na 6- tym pinie PORTD, ponieważ jest ona podłączona do pinu RS LCD
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; // Biorąc kilka pinów portuB jako dane wejściowe.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // ustawianie szybkości transmisji // Poniżej znajduje się ID tagów, które należy zmienić dla różnych tagów, Muszą one zostać zaktualizowane, aby projekt działał
/ * Po zrzuceniu programu do sterownika należy zabrać karty, które wymagają autoryzacji i uzyskać identyfikator tagów. Uzyskuje się je poprzez umieszczenie tagu 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ść jeden po drugim w pobliżu modułu, otrzymasz identyfikator 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 intensywniej miga char MEM; // przydzielanie pamięci do przechowywania pełnego identyfikatora tagu send_a_string ("NUMER RFID"); // wysyłanie łańcucha send_a_command (0x80 + 0x40 + 0); // przeniesienie kursora do drugiej linii podczas gdy (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR przechowuje odebrane 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)) {// sprawdzanie autoryzacji kupna porównujące dwa znaki jednocześnie ze znakami w pamięci PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // opóźnienie _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 (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 ++); } } |