8 (800) 350-30-16

RDM6300. Работа с бесконтактными картами

Дата: / Категория: Связь / Автор: DOC_tr

Недавно нам пришла достаточно большая партия товара, и в их числе RDM6300 RFID-считыватель, о котором и пойдет речь в сегодняшней статье.

Так как Arduino слишком слаба для управления высоковольтными приборами (например светом, или магнитным замком), то управлять мы будем единственным универсальным устройством, подходящим для управления большими токами - реле. А уже что именно вы захотите подключить к реле - решать вам.

Всю информацию о данном модуле вы можете найти на нашем сайте (конкретно по данной ссылке). Там же вы можете найти и его распиновку.

По неведомым мне причинам, на ногах модуля нет никакого обозначения. Поэтому нам придется использовать схему подключения.

Схема проста - в нашем варианте блок P3 использовать не будет. К блоку P2 подключаем обмотку, которая идет в комплекте и будет считывать все данные, а блок P1 будем подключать по следующей схеме

  • PIN1 (TX) -> RX
  • PIN2 (RX) -> TX
  • PIN4 (GND) -> GND
  • PIN5 (DC) -> 5V

В нашей схеме мы будем использовать реле и 2 светодиода - красный и зеленый. Красный будет гореть когда карточка, поднесенная к обмотке, не занесена в базу, а зеленый будет питаться от одного сигнального контакта с реле, и они будут срабатывать одновременно.

Вот вся схема, по которой я буду подключать наши устройства

А вот как это выглядит на столе.

Светодиодов, конечно, не видно. Да и по хорошему их нужно подключать через резисторы, а светодиод с реле запитывать от отдельных контактов. Но так как у нас материал только для учебных целей, то "и так сойдет".

Схема подключения в данном случае не важна - намного интереснее сам скетч, с которым я очень долго возился.

Карты в комплект не входят, но у меня чисто случайно завалялись 3 карты со студенческих времен. В нашем универе они служили пропусками, а мне послужат для тестирования.

Перейдем к подготовке.

Везде пишут, что достаточно всего лишь метода find. Например.

#include <SoftwareSerial.h>

SoftwareSerial RfidReader(0, 1);

void setup(){
Serial.begin(9600);
RfidReader.begin(9600);
}

void loop() {
if (RfidReader.available() > 0) {
if(RfidReader.find("CARD NUMBER")){
// карта найдена
}
}
}

Такой метода и правда есть, но, по неизвестным мне причинам, он работает через раз, и с большой задержкой. И даже выставление таймаута, как советуют на StackOverflow (RfidReader.setTimeout(50)) не помогает.

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

Для начала нам нужно определить номера карт, которые мы будем пропускать.

Данные карт состоят из массива, длиной в 14 символов. Их, конечно, можно считать в качестве строки (12 символов), но с ней очень много возни, да и работает не так быстро как хотелось бы. Именно поэтому в данном модуле я применяю сравнение не строк, а массивов.

С помощью следующего скетча, при приближении карты к обмотке, мы увидим 14 чисел, которые и характеризуют каждую карточку.

#include <SoftwareSerial.h>

SoftwareSerial RfidReader(0, 1);
int num;
int count = 0;

void setup(){
Serial.begin(9600);
RfidReader.begin(9600);
}

void loop() {
if (RfidReader.available() > 0) {
count++;
num = RfidReader.read();
Serial.print(num, DEC);
if(count >= 14){
Serial.println(' ');
count = 0;
} else {
Serial.print(", ");
}
}
}

А вот, собственно что выдает нам наш монитор.

 Если присмотреться, то можно увидеть, что на картинке есть 3 варианта различных строк. Каждый из них показывает номер одной из карт. В своем тесте я буду использовать 2 валидные карты. Соответственно из 3х карт, 2 будут включать зеленый светодиод и реле, а оставшаяся будет включать красный светодиод

Ниже вы можете увидеть скетч. Я постарался прокомментировать все непонятные моменты.

#include <SoftwareSerial.h>

// Подключаем сам ридер
SoftwareSerial RfidReader(0, 1);

int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;

// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
int tags[][14] = {
{2, 55, 53, 48, 48, 56, 49, 68, 65, 55, 52, 53, 65, 3 },
{2, 49, 54, 48, 48, 49, 69, 55, 50, 56, 55, 70, 68, 3 }
// просто добавьте сюда еще строки - например {2, 49, 54, 48, 48, 49, 69, 55, 50, 56, 55, 70, 68, 3 }
};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void setup(){
RfidReader.begin(9600);
Serial.begin(9600);
pinMode(yes, OUTPUT);
pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
bool comparetag(int aa[14], int bb[14]){
bool ff = false;
int fg = 0;
for (int cc = 0 ; cc < 14 ; cc++){
if (aa[cc] == bb[cc]){
fg++;
}
}
if (fg == 14){
ff = true;
}
return ff;
}

void loop(){
reads = ok = false;
// если карта поднесена
if (RfidReader.available() > 0) {
delay(100);
// создаем массив с данными поднесенной карты
for (int x = 0 ; x < 14 ; x++){
data1 = RfidReader.read();
newtag[x] = data1;
}
RfidReader.flush();
reads = true;
// по очереди сравниваем данные карты с валидным массивом
for(int i = 0; i < sizeof(tags) ; i++){
if (comparetag(newtag, tags[i]) == true){
ok = true;
break;
}
}
}
// если произошло считывание
if(reads){
// если карта есть в списке валидных
if (ok){
digitalWrite(yes, HIGH);
delay(2000);
digitalWrite(yes, LOW);
}
// если карт нету в списке валидных
else {
digitalWrite(no, HIGH);
delay(2000);
digitalWrite(no, LOW);
}
ok = false;
}
}

И теперь, приложив валидную карточку мы увидим следующее

Красный огонек на реле, показывает то, что оно замкнуто.

А если поднести карточку не из списка, то

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

Надеюсь данная статья оказалась вам полезна.

Теги: #RDM6300, #RFID

Ваша оценка:

Рейтинг: 10.0 (Оценок: 3)

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены