Ние знаем в офиси, търговски центрове и на много други места, където само човекът с карта за оторизация има право да влиза в стаята. Тези системи използват RFID комуникационна система. RFID се използва в търговските центрове за спиране на кражбите, тъй като продуктите са маркирани с RFID чип и когато човек напусне сградата с RFID чип, алармата се вдига автоматично. RFID етикетът е проектиран толкова малък, колкото част от пясък. RFID системите за удостоверяване са лесни за проектиране и са евтини на цена. В днешно време някои училища и колежи използват базирани на RFID системи за присъствие.
В този проект ще проектираме RFID базирана система за събиране на такси за целите на сигурността. Така че тази система отваря врати и позволява на хората само с упълномощени RFID тагове. Одобрените идентификационни номера на притежателите на етикети се програмират в микроконтролера ATMEGA и само тези притежатели имат право да напускат или влизат в помещенията.
Необходими компоненти
Хардуер: ATmega32 микроконтролер, захранване (5v), AVR-ISP програмист, JHD_162ALCD (16x2 LCD модул), 100uF кондензатор (свързан през захранването), бутон, 10KΩ резистор, 100nF кондензатор, LED (два броя), EM-18 (RFID четец модул), L293D двигател IC, 5V DC мотор.
Софтуер: Atmel studio 6.1, progisp или flash magic.
Електрическа схема и работно обяснение
В схемата на системата за събиране на пътни такси RFID, показана по-горе, PORTA на ATMEGA32 е свързана към порта за данни на LCD. Тук не трябва да забравяме да деактивираме комуникацията JTAG в PORTC на ATMEGA, като сменим байтовете на предпазителите, ако искаме да използваме PORTC като нормален комуникационен порт. В 16x2 LCD има 16 щифта, ако има задно осветление, ако няма задно осветление, ще има 14 извода. Можем да захранваме или да оставяме щифтовете за задно осветяване. Сега в 14-те извода има 8 извода за данни (7-14 или D0-D7), 2 извода за захранване (1 & 2 или VSS & VDD или gnd & + 5v), 3 -ти извод за контрол на контраста (VEE-контролира колко дебел е трябва да се показват символи), 3 контролни щифта (RS & RW & E).
Във веригата можете да забележите, че съм взел само два контролни щифта. Това дава гъвкавост на по-добро разбиране. Контрастният бит и READ / WRITE не се използват често, така че могат да бъдат късо заземени. Това поставя LCD в най-висок контраст и режим на четене. Просто трябва да контролираме ENABLE и RS щифтовете, за да изпращаме символи и данни по съответния начин.
Връзките, които са направени за LCD, са дадени по-долу:
PIN1 или VSS към земята
PIN2 или VDD или VCC до + 5v мощност
PIN3 или VEE към земята (дава максимален контраст най-добър за начинаещи)
PIN4 или RS (Избор на регистър) към PD6 на MCU
PIN5 или RW (четене / запис) към земята (поставя LCD в режим на четене, улеснява комуникацията за потребителя)
PIN6 или E (Активиране) към PD5 на микроконтролера
PIN7 или D0 до PA0
PIN8 или D1 до PA1
PIN9 или D2 до PA2
PIN10 или D3 до PA3
PIN11 или D4 до PA4
PIN12 или D5 до PA5
PIN13 или D6 до PA6
PIN14 или D7 до PA7
Във веригата можете да видите, че сме използвали 8-битова комуникация (D0-D7). Това обаче не е задължително и можем да използваме 4-битова комуникация (D4-D7), но с 4-битова комуникационна програма става малко сложна, затова предпочетох 8-битова комуникация.
Така че само от наблюдение на горната таблица ние свързваме 10 щифта LCD към контролер, в който 8 щифта са щифтове за данни и 2 щифта за управление.
Преди да продължим напред, трябва да разберем за серийната комуникация. Модулът RFID тук изпраща данни към контролера последователно. Той има друг режим на комуникация, но за лесна комуникация избираме RS232. RS232 пинът на модула е свързан с RXD пин на ATMEGA.
Данните, изпратени от модула RFID, са както следва:
Сега за интерфейса на RFID модула се изискват следните функции:
1. RXD щифтът (функция за получаване на данни) на контролера трябва да бъде активиран.
2. Тъй като комуникацията е серийна, трябва да знаем всеки път, когато се получи данните, за да можем да спрем програмата, докато не бъде получен целият байт. Това се прави, като се даде възможност на данните да получават пълно прекъсване.
3. RFID изпраща данни към контролера в 8-битов режим. Така че два знака ще бъдат изпратени на контролера наведнъж. Това е показано на горната фигура.
4. От горната фигура няма битове за паритет, един стоп бит в данните, изпратени от модула.
Горните функции са зададени в регистрите на контролера; ще ги обсъдим накратко,
ЧЕРВЕНО (RXEN): Този бит представлява функция за получаване на данни. Този бит трябва да бъде зададен за данните от модула да се получават от контролера. Той също така позволява RXD щифт на контролера.
BROWN (RXCIE): Този бит трябва да бъде настроен за получаване на прекъсване след успешно приемане на данни. Чрез активирането на този бит ние опознаваме веднага след получаване на 8-битови данни.
PINK (URSEL): Този бит трябва да бъде зададен преди да се активират други битове в UCSRC. След настройка, други необходими битове в UCSRC, URSEL трябва да бъдат деактивирани или поставени на нула.
ЖЪЛТ (UCSZ0, UCSZ1, UCSZ2): Тези три бита се използват за избор на броя битове за данни, които получаваме или изпращаме с едно движение.
Тъй като данните, изпратени от RFID модула, са 8-битов тип данни, трябва да зададем UCSZ0, UCSZ1 на едно и UCSZ2 на нула.
ОРАНЖЕВ (UMSEL): Този бит се задава въз основа на това дали системата комуникира асинхронно (и двете използват различен часовник), или синхронно (и двата използват един и същ часовник).
Тъй като модулът и контролерът използват различен часовник, този бит трябва да бъде зададен на нула или да бъде оставен сам, тъй като всички те са настроени на нула по подразбиране.
ЗЕЛЕН (UPM1, UPM0): Тези два бита се коригират въз основа на битов паритет, който използваме в комуникацията.
Тъй като RFID модулът изпраща данни без паритет, ние зададохме и двете UPM1, UPM0 на нула или те могат да бъдат оставени сами, тъй като всички битове във всеки регистър са зададени на нула по подразбиране.
СИН (USBS): Този бит се използва за избор на броя битове за спиране, които използваме по време на комуникацията.
Тъй като RFID модулът изпраща данни с един стоп бит, просто трябва да оставим USBS бита сам.
Сега най-накрая трябва да зададем скорост на предаване, от фигурата по-горе става ясно, че RFID модулът изпраща данни към контролера със скорост на предаване 9600bps (бита в секунда).
Скоростта на предаване се задава в контролера чрез избор на подходящия UBRRH.
Стойността на UBRRH се избира чрез кръстосана скорост на предаване и честота на кристала на процесора, така че чрез кръстосана препратка стойността на UBRR се разглежда като „6“ и така се задава скоростта на предаване.
Както е показано на фигурата, два щифта от контролера преминават към L293D, който е H-BRIDGE, използван за контрол на скоростта и посоката на въртене за двигатели с постоянен ток с ниска мощност.
L293D е интегрална схема H-BRIDGE, предназначена за задвижване на двигатели с постоянен ток с ниска мощност и е показана на фигура, тази интегрална схема се състои от два h-моста и така може да управлява два DC двигателя. Така че тази интегрална схема може да се използва за задвижване на роботизирани двигатели от сигналите на микроконтролера.
Както вече беше обсъдено по-рано, тази интегрална схема има способността да променя посоката на въртене на DC мотора. Това се постига чрез контролиране на нивата на напрежение при INPUT1 и INPUT2.
Активиране на ПИН |
Входен щифт 1 |
Входен щифт 2 |
Посока на двигателя |
Високо |
Ниска |
Високо |
Обърни се на дясно |
Високо |
Високо |
Ниска |
Завийте наляво |
Високо |
Ниска |
Ниска |
Спри се |
Високо |
Високо |
Високо |
Спри се |
Така както е показано в горната таблица, за въртене по часовников механизъм 2А трябва да е високо, а 1А да е ниско. По същия начин за обратно на часовниковата стрелка 1A трябва да бъде висока и 2A трябва да бъде ниска.
Всеки път, когато се доближи оторизирана карта в близост до модула, двигателят се програмира да се движи по посока на часовниковата стрелка за секунда, за да покаже, че портата за пътни такси е отворена след секунда, когато се върне, като казва, че портата за пътна такса е затворена. Работата на платната за пътна такса е най-добре обяснена в стъпка по стъпка от кода С, даден по-долу
Обяснение на програмирането
По-долу е обяснението на реда до кода на системата за събиране на пътни такси RFID. Можете да разберете концепцията и работата на този проект, като прочетете кода по-долу. За да изтеглите или копирате, можете да намерите пълния код в долната част на страницата.
#include // header, за да се даде възможност за контрол на потока от данни над щифтовете
#define F_CPU 1000000 // прикрепена кристална честота на контролера
#include
#define E 5 // даване на име “enable” на 5 -ти щифт на PORTD, тъй като е свързан с щифт за активиране на LCD
#define RS 6 // даване на име “registerselection” на 6 -ти пин на PORTD, тъй като е свързан с LCD RS pin
void send_a_command (неподписана команда char);
void send_a_character (неподписан знак);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // поставяне на порта като изходни щифтове
DDRD = 0b11111110;
_delay_ms (50); // дава забавяне от 50ms
DDRB = 0b11110000; // Вземане на някои портB щифтове като вход.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // задаване на скорост на предаване // Следното съдържа ID на маркери, те трябва да бъдат променени за различни тагове. Те трябва да бъдат актуализирани, за да работи проектът
/ * След изхвърлянето на програмата в контролера трябва да се вземат картите, които трябва да бъдат упълномощени, и да се получи идентификаторът на маркерите. Те се получават чрез поставяне на маркера близо до RFID модула и идентификаторът ще бъде показан на екрана. След получаване на идентификационните номера, програмата трябва да бъде актуализирана чрез замяна на долните идентификационни номера с нови идентификационни номера.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Сега по-горе разрешаваме само пет карти, които могат да бъдат променени на произволен номер.
Например помислете, че програмата по подразбиране се изхвърля в контролера, вземете картите, които трябва да бъдат упълномощени. Поставете един след друг в близост до модула, ще получите идентификатора за всеки като xxxxxxxx (907a4F87), Ако имаме 7 маркера, които имаме, тогава ще имаме 7 осем битови ID. * /
// сега за седем карти става като // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // разпределяне на паметта за показване на идентификатора, изпратен от модул int i = 0; int глас = 0; int k = 0; send_a_command (0x01); // Изчистване на екрана 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // казваме на lcd, че използваме 8-битов режим за команди / данни _delay_ms (50); send_a_command (0b00001111); // ВКЛЮЧЕН ЕКРАН НА ЕКРАНА и мига курсора char MEM; // разпределяне на паметта за съхраняване на пълен идентификатор на етикет send_a_string ("RFID НОМЕР"); // изпращащ низ send_a_command (0x80 + 0x40 + 0); // преместване на курсора на втора линия докато (1) { докато (! (UCSRA & (1 <
{ } БРОЯ = UDR; // UDR съхранява получените осем битови данни и се приема в цяло число. MEM = COUNTA; // първите два знака се актуализират в паметта итоа (КОНТА, ШОУ, 16); // команда за поставяне на номер на променлива в LCD (номер на променлива, в кой символ да се замени, коя база е променлива (тук десет, тъй като броим число в base10)) send_a_string (SHOWA); // казва на дисплея да показва символ (заменен с променлив номер) на второ лице след позициониране на курсора на LCD докато (! (UCSRA & (1 <
{ } БРОЯ = UDR; итоа (КОНТА, ШОУ, 16); send_a_string (SHOWA); MEM = COUNTA; // третият и четвъртият знак се актуализират в паметта докато (! (UCSRA & (1 <
{ } БРОЯ = UDR; итоа (КОНТА, ШОУ, 16); send_a_string (SHOWA); MEM = COUNTA; // петият и шестият знак се актуализират в паметта докато (! (UCSRA & (1 <
{ } БРОЯ = UDR; итоа (КОНТА, ШОУ, 16); send_a_string (SHOWA); MEM = COUNTA; // седмият и осем символа се актуализират в паметта send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
за (i = 0; i <5; i ++) { ако ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// проверка за разрешение за покупка, сравняване на два знака наведнъж с символите в паметта 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 <
_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 (неподписана команда char) { PORTA = команда; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_character (неподписан знак) { PORTA = символ; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_string (char * string_of_characters) { докато (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |