В данной статье мы рассмотрим процесс чтения радиочастотных меток/карт (RFID cards) с помощью платы MSP430G2 и модуля EM-18. Каждая такая метка/карта содержит уникальный идентификатор, что делает данные карты отличным выбором для осуществления процессов аутентификации в офисах, торговых центрах, предприятиях и т.д. Системы радиочастотной идентификации (Radio Frequency Identification, RFID) очень дешевы и просты в использовании, благодаря чему они находят широкое применение в современном мире.
Ранее на нашем сайте мы уже рассматривали подключение модуля чтения радиочастотных меток EM-18 к другим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к микроконтроллеру PIC;
- к плате Arduino;
- к плате Raspberry Pi;
- к модулю ESP8266;
- к плате STM32 Blue Pill.
Необходимые компоненты
- Плата MSP430G2 LaunchPad (купить на AliExpress).
- Модуль чтения радиочастотных меток EM-18 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Модуль считывания RFID меток EM-18
Внешний вид модуля считывания RFID меток EM-18 показан на следующем рисунке.
Принцип технологии RFID (радиочастотной идентификации) достаточно прост. В данной технологии цифровые данные закодированы в виде RFID меток, которые могут быть декодированы (расшифрованы) с помощью считывателя RFID меток с использованием радиоволн. В этом плане технология радиочастотной идентификации во многом похожа на технологию привычных нам штрих-кодов, считывание которых осуществляется специальными устройствами.
Модуль чтения RFID меток EM-18 позволяет считывать информацию об идентификаторах (ID information), размещенных в RFID метках. Идентификатор RFID метки содержит уникальный 12-значный номер, который может быть считан модулем EM18 когда радиочастотная метка попадает в поле его действия (8-12 см). Модуль работает на частоте 125 кГц, содержит встроенную антенну и запитывается от напряжения 5 В постоянного тока. Считанные данные модуль передает другим устройствам с помощью последовательной связи со скоростью 9600 бод (8 бит данных и 1 стоповый бит).
Модуль EM-18 широко применяется во встраиваемой электронике и имеет ряд интересных особенностей. К примеру, его можно запитывать напряжением в диапазоне от +4.5V до 5.5V DC. Модуль во время своей работы потребляет всего 50mA тока, поэтому его можно использовать в устройствах, получающих питание от батарей и аккумуляторов. Используемая им частота 125 кГц позволяет ему работать со множеством типов RFID карт. Встроенная в него антенна позволяет ему производить считывание RFID меток на расстояниях от 8 до 12 см. Модуль работоспособен в диапазоне температур 0-80 °C, что позволяет его использовать в "жестких" условиях окружающей среды.
Назначение контактов (распиновка) модуля EM-18 показано на следующем рисунке.
Выходные данные модуля EM-18 представлены 12-значным форматом ASCII. Первые 10 цифр – это номер карты (метки), а последние 2 цифры – результат операции XOR (исключающее "или") от номера карты, они используются для проверки ошибок.
К примеру, модуль чтения считал число 0200107D0D62 с карты. В этом случае:
02 – преамбула,
00107D0D = 1080589 в десятичном формате.
62 – результат операции XOR (02 XOR 00 XOR 10 XOR 7D XOR 0D).
Следовательно, номер карты – 0001080589.
Схема проекта
Схема подключения модуля чтения радиочастотных меток EM-18 к плате MSP430G2 представлена на следующем рисунке.
Для обмена данными с модулем EM-18 мы будем использовать последовательный порт (UART) MSP430, поэтому убедитесь в том, что джамперы RXD и TXD на плате переключены на режим HW UART. После этого подключите контакт Tx модуля EM-18 к контакту RXD (P1.1) платы MSP430G2.
Прежде чем идти дальше, немного разберемся с принципами последовательной связи по протоколу RS232. Контакт RS232 модуля EM-18 у нас подключен к контакту RXD платы MSP430G2.
Данные, передаваемые RFID модулем EM-18, выглядят следующим образом:
То есть нам для того, чтобы установить связь между модулем EM-18 и MSP430, необходимо инициализировать последовательную связь в MSP430 с помощью команды:
1 2 |
Serial.begin(9600); data = Serial.read(); |
Последовательная связь с RFID модулем EM-18 будет осуществляться на скорости 9600 бод – в MSP430 мы эту скорость устанавливаем с помощью команды Serial.begin(9600), где 9600 – значение устанавливаемой скорости.
Когда бодовая скорость установлена, MSP будет готов принимать последовательные данные. С помощью команды “data = Serial.read();” мы будем осуществлять прием этих данных и сохранять их в переменной data целого типа.
Как только рядом с модулем чтения EM-18 будет появляться RFID карта, он будет считывать данные с нее и передавать их в MSP430, который будет отображать их на экране ЖК дисплея.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Писать программу мы будем в Energia IDE, которая является почти полным аналогом Arduino IDE.
Первым делом в коде программы мы подключим библиотеку для работы с ЖК дисплеем и создадим объект для работы с ним, а также объявим символьный массив для хранения RFID номеров.
1 2 3 |
#include <LiquidCrystal.h> LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5); char input[12]; |
В функции setup мы инициализируем ЖК дисплей и последовательную связь со скоростью 9600.
1 2 3 4 5 6 |
void setup() { lcd.begin(16, 2); Serial.begin(9600); ... .. |
В функции loop мы будем проверять доступны ли данные в последовательном порту или нет. Если доступны, мы будем сохранять их в массиве input[count] с помощью функции Serial.read() и отображать их по одному на экране ЖК дисплея один за одним используя цикл.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
while(Serial.available() && count < 12) // Read 12 characters and store them in input array { input[count] = Serial.read(); //storing 12 characters one by one Serial.print(input[count]); lcd.print(input[count]); delay(300); count++; if (count==12) { lcd.print(" "); count = 0; // once 12 characters are read get to start and wait for second 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 |
#include <LiquidCrystal.h> LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5); char input[12]; int count = 0; void setup() { lcd.begin(16, 2); Serial.begin(9600); lcd.setCursor(0, 0); lcd.print("Welcome.."); delay(3000); lcd.clear(); lcd.print("Place Card to"); lcd.setCursor(0, 1); lcd.print("scan"); } void loop() { if(Serial.available()==0){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Place Card to scan"); for (int positionCounter = 0; positionCounter < 13; positionCounter++) { // scroll one position left: lcd.scrollDisplayLeft(); // wait a bit: delay(150); } } if(Serial.available()>0){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("RFID No. ->"); lcd.setCursor(0, 1); delay(30); } while(Serial.available() && count < 12) // считываем 12 символов и сохраняем их в массиве { input[count] = Serial.read(); //сохраняем 12 символов Serial.print(input[count]); lcd.print(input[count]); delay(300); count++; if (count==12) { lcd.print(" "); count = 0; // после того как 12 символов считаны и обработаны готовимся к считыванию очередной карты lcd.setCursor(0, 1); //перемещаем курсор в начало экрана } } delay(3000); } |