Arduino и RFID-считыватель

Технология радиочастотной идентификации (RFID) набирает популярность. На ее основе создается множество приложений для различных целей. С помощью RFID устройство может считывать информацию со специальных меток при приближении их к этому устройству на достаточно малое расстояние.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/174-arduino-i-rfid-schityvatel/images/arduino-i-rfid-schityvatel-1.png

В данном материале мы подключим плату Arduino Uno и RFID-считыватель EM-18 для того, чтобы управлять реле и светодиодом.

При включении считыватель передает радиочастотные сигналы. Когда метка будет поднесена к считывателю, она получит эти сигналы с помощью своей внутренней антенны. Затем радиочастотные колебания будут преобразованы в энергию, которой хватит для передачи данных от метки к считывателю. Кроме того, считыватель по последовательному каналу связи передаст идентификатор (ID) метки внешнему устройству. Сегодня доступен широкий ассортимент модулей считывателей, и наиболее распространенным и простым в использовании является EM-18. Этот модуль считывает пассивные RFID-метки и отправляет ID в микроконтроллер Arduino.

Для начала нам нужно поместить в Arduino следующий код:

int count = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available())
{
count = 0; // сбрасываем считыватель
// Продолжаем считывать байт за байтом из буфера, пока он не станет пустым
{
char input = Serial.read();
Serial.print(input);
count++; //
delay(5); //
}
Serial.println();
Serial.print("Tag Length : ");
Serial.print(count);
Serial.println(" Bytes");
}
}

Затем подключим Arduino Uno и EM-18 следующим образом:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/174-arduino-i-rfid-schityvatel/images/arduino-i-rfid-schityvatel-2.png

Далее следует открыть последовательный монитор, приблизить метку к считывателю и получить ID метки. Этот ID (например, 51005F46642C) будет нужен нам для следующего скетча.

Сейчас нам нужно сделать так, чтобы система реагировала только на полученный ID. Чтобы проверить это, подключим к Arduino реле и светодиод (вывод D12 на светодиод, D13 на реле):

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/174-arduino-i-rfid-schityvatel/images/arduino-i-rfid-schityvatel-3.png https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/174-arduino-i-rfid-schityvatel/images/arduino-i-rfid-schityvatel-4.png

И зальем следующий код:

#define RELAYPIN 13
#define WARNLEDPIN 12
char tag[] ="51005F46642C"; // Заменить своим ID
char input[12];      // Переменная для хранения полученных ID
int count = 0;       // счетчик для навигации по массиву символов input[]
boolean flag = 0;    // Переменная для хранения состояния совпадения ID
void setup()
{
Serial.begin(9600);  // инициализация последовательного порта
pinMode(RELAYPIN,OUTPUT);    // выход реле
pinMode(WARNLEDPIN,OUTPUT); // светодиод для сигнализации неправильного ID
}
void loop()
{
if(Serial.available())// проверяем, пришли ли данные с RFID-считывателя.
{
count = 0; // обнуляем счетчик
/* Продолжаем считывать байт за байтом из буфера, пока он не станет пустым
или 12-й байт будет прочитан */
     while(Serial.available() && count < 12)
{
input[count] = Serial.read(); // Читаем 1 байт данных и записываем в массив input[]
count++; // инкрементируем счетчик
delay(5);
}
/* Когда счетчик достигает значения 12, останавливаем процесс и сравниваем каждое значнение
массива input[] с нашим записанным значением */
if(count == 12) //
{
count =0; // обнуляем счетчик
flag = 1;
/* перебираем все значения */
while(count<12 && flag !=0)
{
if(input[count]==tag[count])
flag = 1; // при совпадении устанавливаем переменную flag в 1
else
flag= 0;
/* при несовпадении устанавливаем переменную flag в 0 и
прекращаем сравнивание */
count++; // инкрементируем счетчик
}
}
     if(flag == 1) // Если flag = 1, значит метка соответствует
{
Serial.println("Access Allowed!");
digitalWrite(RELAYPIN,HIGH);
delay (5000);
digitalWrite (RELAYPIN,LOW);
}
else
{
Serial.println("Access Denied"); // Неверное сообщение от метки
digitalWrite(WARNLEDPIN,HIGH);
delay(5000);
digitalWrite(WARNLEDPIN,LOW);
}
/* заполняем массив значением 'F' для перезаписи его элементов, чтобы
подготовить их для следующего цикла чтения */
for(count=0; count<12; count++)
{
input[count]= 'F';
}
count = 0; // обнуляем счетчик
}
}

Теперь каждый раз при считывании нужного ID на 5 секунд будет срабатывать реле. Ее можно задействовать для управления нагрузкой. При несовпадении ID будет загораться светодиод.