Arduino и RFID-считыватель
Технология радиочастотной идентификации (RFID) набирает популярность. На ее основе создается множество приложений для различных целей. С помощью RFID устройство может считывать информацию со специальных меток при приближении их к этому устройству на достаточно малое расстояние.
В данном материале мы подключим плату 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 следующим образом:
Далее следует открыть последовательный монитор, приблизить метку к считывателю и получить ID метки. Этот ID (например, 51005F46642C) будет нужен нам для следующего скетча.
Сейчас нам нужно сделать так, чтобы система реагировала только на полученный ID. Чтобы проверить это, подключим к Arduino реле и светодиод (вывод D12 на светодиод, D13 на реле):
И зальем следующий код:
#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 будет загораться светодиод.