Ми знаємо в офісах, торгових центрах та в багатьох інших місцях, де в кімнату допускається лише особа, що має авторизаційну картку. Ці системи використовують систему зв'язку RFID. RFID використовується в торгових центрах, щоб зупинити крадіжку, оскільки продукти позначаються мікросхемою RFID, а коли людина виходить із будівлі з мікросхемою RFID, автоматично спрацьовує сигнал тривоги. Тег RFID розроблений настільки маленький, як частина піску. Системи аутентифікації RFID легко спроектувати і дешеві за вартістю. Сьогодні деякі школи та коледжі використовують системи відвідування на основі RFID.
У цьому проекті ми плануємо розробити систему збору мита на основі RFID для цілей безпеки. Тож ця система відкриває ворота і дозволяє людям лише з дозволеними тегами RFID. Уповноважені ідентифікатори власників тегів запрограмовані на мікроконтролер ATMEGA, і лише тим власникам дозволено залишати приміщення або входити до них.
Потрібні компоненти
Апаратне забезпечення: мікроконтролер ATmega32, блок живлення (5 в), програміст AVR-ISP, JHD_162ALCD (16x2 РК-модуль), конденсатор 100 мкФ (підключений через блок живлення), кнопка, резистор 10 кОм, конденсатор 100 нФ, світлодіод (два шматки), EM-18 (Модуль зчитування RFID), мікросхема драйвера двигуна L293D, двигун постійного струму 5 В.
Програмне забезпечення: Atmel studio 6.1, progisp або flash magic.
Принципова схема та робоче пояснення
У схемі системи збору плати за дорожній збір, показаній вище, PORTA ATMEGA32 підключений до порту даних РК-дисплея. Тут слід пам’ятати про те, щоб вимкнути зв'язок JTAG у PORTC на ATMEGA, змінивши байти запобіжників, якщо ми хочемо використовувати PORTC як звичайний порт зв'язку. У РК-дисплеї 16x2 є 16 контактів, якщо є підсвічування, якщо немає підсвічування, буде 14 контактів. Ми можемо живити або залишати підсвічувальні штифти. Тепер у 14 контактах є 8 контактів даних (7-14 або D0-D7), 2 контакти джерела живлення (1 & 2 або VSS & VDD або gnd & + 5v), 3- й контакт для контролю контрасту (VEE-контролює, наскільки товстий повинні бути показані символи), 3 керуючі штифти (RS & RW & E).
У схемі ви можете помітити, що я взяв лише два керуючі штифти. Це надає гнучкість кращого розуміння. Біт контрасту та READ / WRITE використовуються не часто, тому їх можна закоротити на землю. Це дає РК-дисплею найвищий контраст і режим читання. Нам просто потрібно контролювати ENABLE та RS-шпильки, щоб відповідно надсилати символи та дані.
Підключення, зроблені для РК-дисплея, наведені нижче:
PIN1 або VSS на землю
PIN2 або VDD або VCC до + 5 В потужності
PIN3 або VEE на землю (забезпечує максимальний контраст найкращий для початківця)
PIN4 або RS (вибір реєстрації) для PD6 MCU
PIN5 або RW (читання / запис) на землю (переведення РК в режим читання полегшує зв'язок для користувача)
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 висновків РК-дисплея до контролера, в якому 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 передає дані контролеру зі швидкістю передачі даних 9600 біт / с.
Швидкість передачі даних встановлюється в контролері, вибираючи відповідний UBRRH.
Значення UBRRH вибирається за швидкістю передачі в бодах та частотою кристалів процесора, отже, значення UBRR для перехресного посилання розглядається як '6', і тому швидкість передачі даних встановлюється.
Тепер, як показано на малюнку, два штифти контролера надходять до L293D, який є H-BRIDGE, що використовується для управління швидкістю та напрямком обертання двигунів постійного струму низької потужності.
L293D - це мікросхема H-BRIDGE, призначена для керування двигунами постійного струму низької потужності, і показана на малюнку, ця мікросхема складається з двох мостів h і тому може керувати двома двигунами постійного струму. Отже, ця ІС може використовуватися для керування двигунами роботів від сигналів мікроконтролера.
Тепер, як обговорювалося раніше, ця ІС має можливість змінювати напрямок обертання двигуна постійного струму. Це досягається контролем рівнів напруги на INPUT1 та INPUT2.
Увімкнути PIN-код |
Вхідний штифт 1 |
Вхідний штифт 2 |
Напрямок руху |
Високий |
Низький |
Високий |
Поверніть праворуч |
Високий |
Високий |
Низький |
Поверніть наліво |
Високий |
Низький |
Низький |
Стій |
Високий |
Високий |
Високий |
Стій |
Отже, як показано в наведеній вище таблиці, для повороту годинника 2A має бути високим, а 1A - низьким. Так само для проти годинникової стрілки 1А має бути високим, а 2А - низьким.
Кожного разу, коли біля модуля підносять авторизовану карту, двигун запрограмований на секунду рухатися за годинниковою стрілкою, щоб показати, що платна система відкрита через секунду, коли вона повертається назад, повідомляючи, що платна ворота закрита. Робота платної плати найкраще пояснюється поетапно кодом С, наведеним нижче.
Пояснення програмування
Нижче наведено пояснення до коду RFID-системи збору плати. Ви можете зрозуміти концепцію та роботу цього проекту, прочитавши код нижче. Щоб завантажити або скопіювати, ви можете знайти повний код внизу сторінки.
#include // заголовок, щоб увімкнути управління потоком даних над штифтами
#define F_CPU 1000000 // повідомляється прикріплена кристалічна частота контролера
#включати
#define E 5 // даючи назву “enable” 5- му виводу PORTD, оскільки він підключений до вимикача включення РК
#define RS 6 // даючи назву “registerselection” 6- му контакту PORTD, оскільки він підключений до LCD RS-контакту
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); // передача затримки 50 мс
DDRB = 0b11110000; // Беремо кілька контактів portB як вхідні дані.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // встановлення швидкості передачі // Далі міститься ідентифікатор тегів, які потрібно змінити для різних тегів. Вони повинні бути оновлені для роботи проекту
/ * Після скидання програми в контролер потрібно взяти картки, які мають бути авторизованими, і отримати ідентифікатор тегів. Вони отримуються, розміщуючи мітку біля модуля 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 восьмирозрядних ідентифікаторів. * /
// зараз для семи карток це як // 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); // повідомляючи РК, що ми використовуємо 8-бітний режим команд / даних _delay_ms (50); send_a_command (0b00001111); // ВКЛЮЧЕНО РК-ЕКРАН і блимає курсор char MEM; // виділення пам'яті для зберігання повного ідентифікатора тегу send_a_string ("НОМЕР RFID"); // рядок надсилання send_a_command (0x80 + 0x40 + 0); // переміщення курсора до другого рядка поки (1) { while (! (UCSRA & (1 <
{ } БІЛИНА = UDR; // UDR зберігає отримані вісім бітових даних і приймається у ціле число. МЕМ = КОНТАКТ; // перші два символи оновлюються до пам'яті ітоа (КОНТА, ШОУ, 16); // команда для введення змінної числа в РК (номер змінної, який символ замінити, яка основа є змінною (тут десять, оскільки ми підраховуємо число в base10)) send_a_string (SHOWA); // вказівка дисплею показати символ (замінений номером змінної) другої особи після розміщення курсора на РК-дисплеї while (! (UCSRA & (1 <
{ } БІЛИНА = UDR; ітоа (КОНТА, ШОУ, 16); send_a_string (SHOWA); МЕМ = КОНТАКТ; // третій і четвертий символи оновлюються до пам'яті while (! (UCSRA & (1 <
{ } БІЛИНА = UDR; ітоа (КОНТА, ШОУ, 16); send_a_string (SHOWA); MEM = COUNTA; // п'ятий та шостий символи оновлюються до пам'яті while (! (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 == ДОПУСТИТИ) & (MEM == АДМІТУВАТИ) & (MEM == АДМІТУВАТИ) & (MEM == АДМІТУВАТИ)) {// перевірка авторизації купуємо, порівнюючи два символи одночасно з символами в пам'яті 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) { while (* string_of_characters> 0) { send_a_character (* рядок_знаків ++); } } |