Мы знаем, что в офисах, торговых центрах и во многих других местах разрешено входить только человеку с авторизационной картой. Эти системы используют систему связи 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, прогисп или flash magic.
Принципиальная схема и объяснение работы
В схеме системы взимания платы RFID, показанной выше, ПОРТ ATMEGA32 подключен к порту данных ЖК-дисплея. Здесь мы должны не забыть отключить связь JTAG в PORTC с ATMEGA, изменив байты предохранителя, если мы хотим использовать PORTC в качестве обычного порта связи. В LCD 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 контроллера.
КОРИЧНЕВЫЙ (RXCIE): этот бит должен быть установлен для получения прерывания после успешного приема данных. Включив этот бит, мы узнаем об этом сразу после получения 8-битных данных.
РОЗОВЫЙ (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.
Включить пин |
Входной контакт 1 |
Входной контакт 2 |
Направление двигателя |
Высоко |
Низкий |
Высоко |
Поверни направо |
Высоко |
Высоко |
Низкий |
Повернуть налево |
Высоко |
Низкий |
Низкий |
Стоп |
Высоко |
Высоко |
Высоко |
Стоп |
Как показано в таблице выше, для вращения по часовой стрелке 2А должно быть высоким, а 1А - низким. Точно так же против часовой стрелки 1A должно быть высоким, а 2A должно быть низким.
Всякий раз, когда авторизованная карта подносится к модулю, двигатель запрограммирован на движение по часовой стрелке на секунду, чтобы показать, что ворота для взимания платы открываются после того, как через секунду он возвращается, показывая, что ворота для взимания сборов закрыты. Работу платной станции лучше всего объяснить пошагово в приведенном ниже коде C.
Объяснение программирования
Ниже приводится построчное объяснение кода системы взимания платы за проезд RFID. Вы можете понять концепцию и принцип работы этого проекта, прочитав приведенный ниже код. Чтобы скачать или скопировать, вы можете найти полный код внизу страницы.
#include // заголовок для включения управления потоком данных на выводах
#define F_CPU 1000000 // сообщаем, что частота кристалла контроллера подключена
#включают
#define E 5 // присвоение имени «enable» 5- му выводу PORTD, так как он подключен к выводу включения ЖК-дисплея
#define RS 6 // присвоение имени «выбор регистра» 6- му выводу PORTD, так как он подключен к выводу RS LCD
void send_a_command (команда unsigned char);
void send_a_character (символ без знака);
void send_a_string (char * string_of_characters);
int main (пусто)
{
DDRA = 0xFF; // установка порта в качестве выходных контактов
DDRD = 0b11111110;
_delay_ms (50); // выдаем задержку 50 мс
DDRB = 0b11110000; // Принимаем на входе несколько выводов portB.
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 восьмибитных идентификаторов. * /
// теперь для семи карт это идет как // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // выделяем память для отображения идентификатора, отправленного модулем int я = 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) { в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR хранит полученные восьмибитовые данные и принимает целое число. MEM = COUNTA; // первые два символа обновляются в памяти Итоа (COUNTA, SHOWA, 16); // команда для вывода номера переменной на ЖК-дисплей (номер переменной, в каком символе заменить, какая база является переменной (здесь десять, поскольку мы считаем число в базе10)) send_a_string (SHOWA); // сообщаем дисплею показывать символ (замененный номером переменной) второго человека после размещения бегунка на ЖК-дисплее в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // третий и четвертый символы обновляются в памяти в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // пятый и шестой символы обновляются в памяти в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // седьмой и восьмой символы обновляются в памяти send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
для (я = 0; я <5; я ++) { если ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// проверка авторизации покупка сравнение двух символов одновременно с символами в памяти ПОРТБ - = (1 <
ПОРТБ & = ~ (1 <
_delay_ms (220); // задержка _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); ПОРТБ - = (1 <
ПОРТБ & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); ПОРТБ & = ~ (1 <
ПОРТБ - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (команда без знака) { ПОРТА = команда; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_character (символ без знака) { ПОРТА = персонаж; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_string (char * string_of_characters) { в то время как (* строка_символов> 0) { send_a_character (* строка_символов ++); } } |