Радиочастотная идентификация (Radio Frequency Identification, RFID) применяется во многих областях современной жизни: в системах безопасности, контроля доступа и т.п. С помощью модуля радиочастотной идентификации (RFID module) мы можем записывать или считывать небольшое количество данных из пассивной радиочастотной метки/карты (Passive RFID tag).
Для чтения информации с радиочастотных меток нам будет необходим микроконтроллер с последовательным портом связи (UART). В данном проекте для этой цели мы будем использовать микроконтроллер PIC16F877A. Считываемый им номер радиочастотной метки мы будем отображать на экране ЖК дисплея 16x2.
Также на нашем сайте мы рассматривали подключение модуля чтения радиочастотных меток EM-18 к другим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi;
- к модулю ESP8266;
- к плате STM32 Blue Pill.
Принцип работы модуля радиочастотной идентификации EM-18
EM-18 является дешевым, компактным и энергоэффективным модулем радиочастотной идентификации. Он работает на частоте 125 кГц и совместим с радиочастотными метками, работающими на этой же частоте. Модуль EM-18 использует генератор, демодулятор и декодер для считывания информации с пассивных карт.
Радиочастотные метки
Существует три типа радиочастотных меток/карт (RFID tags): пассивные, активные и пассивные с батарейкой. Они выпускаются различных форм и размеров. В нашем проекте мы будем использовать радиочастотные карты, работающие на частоте 125 кГц (их внешний вид представлен на рисунке), но есть радиочастотные карты использующие другие частоты.
Модуль не поддерживает карты Hid Proxcard и Indala.
Принцип работы модуля
В даташите на модуль EM-18, размещенный по адресу http://www.alselectro.com/files/rfid-ttl-em18.pdf, мы можем увидеть внешний вид обратной стороны модуля и схему его подключения.
Модуль EM-18 для обмена данными с другими устройствами использует протокол последовательной связи (UART) со скоростью 9600 бод. Когда к модулю подносят метку/карту с "правильным" номером на транзистор BC557 подается отпирающее напряжение и зуммер начинает издавать звуковой сигнал. В нашем проекте мы будем использовать модуль EM-18, который имеет в своем составе зуммер, светодиод и дополнительный порт RS232. Его внешний вид показан на следующем рисунке.
Данные на выход последовательного порта связи (UART) модуля EM-18 поступают в 12-битном формате ASCII. Первые 10 бит из этих 12-ти содержат номер радиочастотной метки (RFID tag number), а остальные 2 бита используются для обнаружения и коррекции ошибок. Фактически эти 2 бита представляют собой результат операции XOR от номера метки (10 бит). Модуль EM-18 считывает этот номер на частоте 125 кГц с радиочастотной метки/карты.
Номер для пассивных меток/карт зашивается в них на заводе-изготовителе. Поскольку источника питания (батарейки) в таких метках нет, то считать этот номер с них можно только подавая на них магнитное поле от модуля чтения этих меток.
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Модуль чтения радиочастотных меток EM-18 (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
- Конденсаторы 100 мкФ и 1 мкФ на 12V (купить на AliExpress).
- Резисторы 4,7 кОм, 2,2 кОм, 470 Ом (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Зуммер (купить на AliExpress).
- Транзистор BC557.
- Светодиод (купить на AliExpress).
- Адаптер питания 5V.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема подключения модуля чтения радиочастотных меток EM-18 к микроконтроллеру PIC представлена на следующем рисунке.
Как видите, схема достаточно проста – мы всего лишь подключили ЖК дисплей 16х2 к port RB микроконтроллера PIC, а выход модуля EM-18 – к приемному контакту (Rx) последовательного порта связи (UART) микроконтроллера.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение программы для микроконтроллера PIC
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Для лучшего понимания кода этой программы рекомендуем ознакомиться со статьями про подключение ЖК дисплея к микроконтроллеру PIC и использованию в нем последовательного порта связи.
Первым делом в программе мы настроим биты конфигурации микроконтроллера, зададим тактовую частоту и подключим необходимые библиотеки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include "supporing_cfile\lcd.h" #include "supporing_cfile\eusart1.h" |
Затем запрограммируем функцию для инициализации системы. В ней мы будем инициализировать ЖК дисплей и последовательный порт микроконтроллера.
1 2 3 4 5 6 7 8 9 |
/* This Function is for system initializations. */ void system_init(void){ TRISB = 0x00; //PORT B set as output pin lcd_init(); // This will initialize the lcd EUSART1_Initialize(); // This will initialize the Eusart } |
Далее в функции main мы будем использовать 13-битный массив, в котором будем хранить номер радиочастотной метки. Мы будем последовательно принимать каждый бит этого номера с помощью функции EUSART1_Read(), код которой содержится в библиотеке для работы с UART. После того как мы примем 12 бит, мы будем выводить массив этих бит в виде строки на экран ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void main(void) { unsigned char count; unsigned char RF_ID[13]; system_init(); lcd_com(0x80); lcd_puts("Circuit Digest"); while (1){ for (count=0; count<12; count++){ RF_ID[count] = 0; RF_ID[count]=EUSART1_Read(); } lcd_com(0xC0); // Set the cursor for second line beginning lcd_puts("ID: "); lcd_puts(RF_ID); } } |
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
/* * File: main.c * Author: Sourav Gupta * By:- circuitdigest.com * Created on August 15, 2018, 2:26 PM */ // PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include <xc.h> #include <stdio.h> #include <string.h> #include "supporing_cfile\lcd.h" #include "supporing_cfile\eusart1.h" /* Hardware related definition */ #define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay /* Other Specific definition */ void system_init(void); // This will initialize the system. void main(void) { unsigned char count; unsigned char RF_ID[13]; system_init(); lcd_com(0x80); lcd_puts("Circuit Digest"); while (1){ for (count=0; count<12; count++){ RF_ID[count] = 0; RF_ID[count]=EUSART1_Read(); } lcd_com(0xC0); // Set the cursor for second line begining lcd_puts("ID: "); lcd_puts(RF_ID); } } /* This Function is for system initializations. */ void system_init(void){ TRISB = 0x00; //PORT B устанавливаем в режим работы на вывод данных lcd_init(); // инициализируем ЖК дисплей EUSART1_Initialize(); // инициализируем последовательный порт } |
Модуль не поддерживает карты Hid Proxcard и Indala, хотя они низкочастотные 125Khz! Укажите это в тексте статьи
Хорошо, указал