RFID свой чужой

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Вечер добрый господа начинаю осваивать RFID. В наличии есть Arduino+Matrix II(em-marine)

все подключил как надо, есть тестовый скетч работает показывает НЕХ карт.

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

#include <OneWire.h>

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема

void setup() {// стартовая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
  
}

void loop() {

  if(ds.reset()){ // если обнаружено устройттво
    ds.write(0x33); // отправляем команду "считать ROM"
    delay(50); // на всякий случай ждем
    for(int i=0;i<8;i++){
    addr[i] = ds.read(); // считываем
    }
    
    Serial.print("ROM ="); // выводим
  for(int i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  
  Serial.println();
    
    delay(500);
  }
  
}

Помогите с решением.

Geronimo
Offline
Зарегистрирован: 06.05.2013

#include <OneWire.h>

#define GREEN_LED 7
#define RED_LED 8

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема
byte validHex[8] = {1,2,3,4,5,6,7,8};
byte result;
void setup() {// стар,товая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
 pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
}

void loop() {
    if(ds.reset()){ // если обнаружено устройттво 
      ds.write(0x33); // отправляем команду "считать ROM" delay(50); // на всякий случай ждем 
      for(int i=0;i<8;i++)
      {
          addr[i] = ds.read(); // считываем 
      } 
      Serial.print("ROM ="); // выводим 
      result = 1;
      for(int i = 0; i < 8; i++) 
      { 
         result &= addr[i]==validHex[i]; 
      }
      if(result)
      { 
         digitalWrite(GREEN_LED,HIGH); 
      }
      else 
      {
         digitalWrite(RED_LED,LOW); 
      }
      Serial.println(); 
      delay(500);
    }
 }

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Спасибо большое но что то не то, не работает, диоды не загораются. 

byte validHex[8] = {1,2,3,4,5,6,7,8};

В эту строку вписывать НЕХ карты, или она не изменяема?

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

вместо 1 2 3 4 5 6 хекс валидной карты

 

ну хотябы один должен зажечься)

Geronimo
Offline
Зарегистрирован: 06.05.2013
#include <OneWire.h>

#define GREEN_LED 7
#define RED_LED 8

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема
byte validHex[8] = {1,2,3,4,5,6,7,8};
byte result;
void setup() {// стар,товая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
 pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
}

void loop() {
  digitalWrite(GREEN_LED,LOW); 
  digitalWrite(RED_LED,LOW); 
    if(ds.reset()){ // если обнаружено устройттво 
      ds.write(0x33); // отправляем команду "считать ROM" delay(50); // на всякий случай ждем 
      for(int i=0;i<8;i++)
      {
          addr[i] = ds.read(); // считываем 
      } 
      Serial.print("ROM ="); // выводим 
      result = 1;
      for(int i = 0; i < 8; i++) 
      { 
         result &= addr[i]==validHex[i]; 
      }
      if(result)
      { 
         digitalWrite(GREEN_LED,HIGH); 
      }
      else 
      {
         digitalWrite(RED_LED,HIGH); 
      }
      Serial.println(); 
      delay(1000);
    }
 }

Ошибся, вместо того чтобы зажечь красный я посылал LOW и гасил

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Спасибо))))) За сторания пытаюсь ему скормить 1AAE719070038 , а он ругаеться на суфикс, я так пологаю нужно без (AAE) вставлять?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Красный зажигаеться, при любой карте. У зеленого сменил пин, т.к с 7 читаю Matrix, может я чо то в схеме с подтяжкой напутал. У меня после 7 пина стоит сопротивление 4,7ком , а потом уже DATA0 c Matrix`a.

Geronimo
Offline
Зарегистрирован: 06.05.2013

что ваша программа из первого поста ввывела?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Она считывает HEX, все 11 карточек имеют разный НЕХ. Смотрел примеры типо access control rfid , но не чего толком не понял, ибо кода море.

Geronimo
Offline
Зарегистрирован: 06.05.2013

В сериале что вывело?

1AAE719070038 это что такое?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Я не доганяю как HEX привильно вписать вот пример одного скетча:

#include <EEPROM.h>
#include <RFIDDB.h>

RFIDDB rfiddb;
char* testTag = "22007AC2C5";
char* fakeTag = "2222222222";

void setup()
{
  rfiddb = RFIDDB();
  Serial.begin(9600);
  Serial.println("Arduino Ready");
}

void loop()
{
  char inByte;
  if (Serial.available() > 0) {
    inByte = Serial.read();
    switch(inByte){
      case 'U':
        Serial.println("Upload time!");
        rfiddb.readTags();
        break;
      case 'P':
        rfiddb.printTags();
        break;
      case 'T':
        Serial.print(testTag);
        if(rfiddb.validTag(testTag)){
          Serial.println(" is in the RFIDDB");
        } else {
          Serial.println(" is NOT in the RFIDDB");
        }
        Serial.print(fakeTag);
        if(rfiddb.validTag(fakeTag)){
          Serial.println(" is in the RFIDDB");
        } else {
          Serial.println(" is NOT in the RFIDDB");
        }
    }
  }
}

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

В терминале пишет такое:

Start...
ROM = 1 C1 B7 19 0 70 0 96
ROM = 1 92 FF 19 0 70 0 36
ROM = 1 19 FC 19 0 70 0 6A
ROM = 1 CB D6 19 0 70 0 85
ROM = 1 FD FC 19 0 70 0 9F
ROM = 1 C4 B7 19 0 70 0 7D
ROM = 1 A7 A4 19 0 70 0 D5
ROM = 1 AA E7 19 0 70 0 38
ROM = 1 A5 A4 19 0 70 0 BB
ROM = 1 FA FC 19 0 70 0 1A
ROM = 1 1 4 5E 0 4B 0 60
ROM = 1 C1 B7 19 0 70 0 96
 
Geronimo
Offline
Зарегистрирован: 06.05.2013

начнем скарты,хекс у вас сколько байт?

6 или 8?

Geronimo
Offline
Зарегистрирован: 06.05.2013
#include <OneWire.h>

#define GREEN_LED 7
#define RED_LED 8

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема
byte validHex[8] = {0x1, 0xC1, 0xB7, 0x19, 0x0, 0x70, 0x0, 0x96};
byte result;
void setup() {// стар,товая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
 pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
}

void loop() {
  digitalWrite(GREEN_LED,LOW); 
  digitalWrite(RED_LED,LOW); 
    if(ds.reset()){ // если обнаружено устройттво 
      ds.write(0x33); // отправляем команду "считать ROM" delay(50); // на всякий случай ждем 
      for(int i=0;i<8;i++)
      {
          addr[i] = ds.read(); // считываем 
      } 
      Serial.print("ROM ="); // выводим 
      result = 1;
      for(int i = 0; i < 8; i++) 
      { 
         result &= addr[i]==validHex[i]; 
      }
      if(result)
      { 
         digitalWrite(GREEN_LED,HIGH); 
      }
      else 
      {
         digitalWrite(RED_LED,HIGH); 
      }
      Serial.println(); 
      delay(1000);
    }
 }

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

По сути 8, а как узнать сколько он может быть?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Он считывает код карты и преобразовывает его в Dallas Touch Memory( эмуляция DS1990A)

Geronimo
Offline
Зарегистрирован: 06.05.2013

в массив validHex вписываете

1 C1 B7 19 0 70 0 96

или другие хексы

 

каждый элемент массива - два знака

 

вводить в шестнадцаричной форме 0x**

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

0x1 ,0xC1 ,0xB7 ,0x19 ,0x0 ,0x70 ,0x0 ,0x96

Оно?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Спасибо огромное все работает как часы))))))))

А если нужно добавить валидных карт еще, то через что их добавить? Case?

Geronimo
Offline
Зарегистрирован: 06.05.2013

я бы создал двумерный массив

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Что то типо того:

byte validHex[8] ={ {0x1, 0xC1, 0xB7, 0x19, 0x0, 0x70, 0x0, 0x96},
                    {0x1, 0xC2, 0xB6, 0x24, 0x7, 0x50, 0x0, 0x31},
                    {0x1, 0xC2, 0xF0, 0x28, 0x0, 0x18, 0x0, 0x14}};

 

Geronimo
Offline
Зарегистрирован: 06.05.2013
byte validHex[3][8] ={ {0x1, 0xC1, 0xB7, 0x19, 0x0, 0x70, 0x0, 0x96},
                    {0x1, 0xC2, 0xB6, 0x24, 0x7, 0x50, 0x0, 0x31},
                    {0x1, 0xC2, 0xF0, 0x28, 0x0, 0x18, 0x0, 0x14}};

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Спасибо огромное)))))) Дай бог тебе здоровья)))))))))

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

И снова я)

код такой

#include <OneWire.h>

#define GREEN_LED 4
#define RED_LED 8

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема
byte validHex[3][8] = {{0x1, 0xC1, 0xB7, 0x19, 0x0, 0x70, 0x0, 0x96},
                       {0x1, 0x92, 0xFF, 0x19, 0x0, 0x70, 0x0, 0x36},
                       {0x1, 0xFA, 0xFC, 0x19, 0x0, 0x70, 0x0, 0x1A}};
byte result;
void setup() {// стар,товая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
 pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
}

void loop() {
  digitalWrite(GREEN_LED,LOW); 
  digitalWrite(RED_LED,LOW); 
    if(ds.reset()){ // если обнаружено устройттво 
      ds.write(0x33); // отправляем команду "считать ROM" delay(50); // на всякий случай ждем 
      for(int i=0;i<8;i++)
      {
          addr[i] = ds.read(); // считываем 
      } 
      Serial.print("ROM ="); // выводим 
      result = 1;
      for(int i = 0; i < 8; i++) 
      { 
         result &= addr[i]==validHex[i]; 
      }
      if(result)
      { 
         digitalWrite(GREEN_LED,HIGH); 
      }
      else 
      {
         digitalWrite(RED_LED,HIGH); 
      }
      Serial.println(); 
      delay(1000);
    }
 }

Ругается на строку

result &= addr[i]==validHex[i]; 
sketch_may29a.ino: In function 'void loop()':
sketch_may29a:33: error: ISO C++ forbids comparison between pointer and integer

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

result &= addr[i]==validHex[0][i];

для сравнения с 0-вой картой

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Ох еще раз огромное спасибо))))) Снова выручил))))))))))))

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Блин не работает откликаеться тока на самую первую карту в массиве...

Geronimo
Offline
Зарегистрирован: 06.05.2013

а со второй как делали?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013
result &= addr[i]==validHex[0][i];

Если 0 заменять на 1 ,2 то карты читаються по одной по очереди

Geronimo
Offline
Зарегистрирован: 06.05.2013

встате переблр в цикл..

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

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

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013
for (count = 0 ; count ≤ 7 ; count ++) {

Оно?

Geronimo
Offline
Зарегистрирован: 06.05.2013

угу если у вас 8 карточек. но там надо схему проверки переделать

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013
   for(int i = 0; i ≤ 8; i++)

Ругается( 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

По сути 4 карты валидных, и 4 невалид

Geronimo
Offline
Зарегистрирован: 06.05.2013
#include <OneWire.h>

#define GREEN_LED 4
#define RED_LED 8
#define CARD_NUM 3

OneWire ds(7); // выход считывателя на 7 пин
byte addr[8];// буфер приема
byte validHex[CARD_NUM][8] = {{0x1, 0xC1, 0xB7, 0x19, 0x0, 0x70, 0x0, 0x96},
                       {0x1, 0x92, 0xFF, 0x19, 0x0, 0x70, 0x0, 0x36},
                       {0x1, 0xFA, 0xFC, 0x19, 0x0, 0x70, 0x0, 0x1A}};

void setup() {// стар,товая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
 pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
}

void loop() {
  digitalWrite(GREEN_LED,LOW); 
  digitalWrite(RED_LED,LOW); 
    if(ds.reset()){ // если обнаружено устройттво 
      ds.write(0x33); // отправляем команду "считать ROM" delay(50); // на всякий случай ждем 
      for(int i=0;i<8;i++)
      {
          addr[i] = ds.read(); // считываем 
      } 
      Serial.print("ROM ="); // выводим 
      byte result = 0;
      for(int c = 0;c<CARD_NUM;c++)
      {
          byte lres = 1
           for(int i = 0; i < 8; i++) 
          { 
           lres &= addr[i]==validHex[c][i]; 
          }
         result |= lres;
      }
      if(result)
      { 
         digitalWrite(GREEN_LED,HIGH); 
      }
      else 
      {
         digitalWrite(RED_LED,HIGH); 
      }
      Serial.println(); 
      delay(1000);
    }
 }

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013
byte lres = 1;

Спасибо огромное еще раз)))))))))

Geronimo
Offline
Зарегистрирован: 06.05.2013

правильно

zebox
Offline
Зарегистрирован: 08.02.2015

Всем привет!!!

Народ я только пытаюсь осваивать Arduino, подскажите плиз как подключить вот такой девайс CP-Z2L (считыватель proximity карт http://www.tinko.ru/p-205192.html)...

Подскажите плиз как подулючить к UNO (через макету)

Там есть следующие провода:

12В+, GND, DATA0, DATA1

12В и GND подаю напрямую от отдельного БП, пытюсь подключить через 10kOm резистор к DATA0 и\или DATA1, в монитор выводятся хаотично HEX данные... не пойму так и должно быть или что-то я делаю не так.?

Подскажите плиз! Спасибо!

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Читай инструкцию, там написано что надо DATA1 Протокол: Touch Memory, следовательно работать нужно через 1-Wire

И попробуй сопротивление 4.7кОм. 

 

#include <OneWire.h>



OneWire ds(7); // выход считывателя на 7 пин



byte addr[8];// буфер приема



void setup() {// стартовая инициализация

  Serial.begin(9600);

  delay(100);

  Serial.println("Start...");

  

}



void loop() {  

  if(ds.reset()){ // если обнаружено устройттво

    ds.write(0x33); // отправляем команду "считать ROM"

    delay(50); // на всякий случай ждем

    for(int i=0;i<8;i++){

      addr[i] = ds.read(); // считываем

    }

    

    Serial.print("ROM ="); // выводим

  for(int i = 0; i < 8; i++) {

    Serial.write(' ');

    Serial.print(addr[i], HEX);

  }

  

  Serial.println();

    

    delay(500);

  }

  

}
zebox
Offline
Зарегистрирован: 08.02.2015

наверное я что-то делаю не так... не хочет он работать... :(

https://youtu.be/KS1dHULk65w

 

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Незнаю может поможет может нет. Сделай у ардуино общию землю минус

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Data0, Data1 - это протокол wiegand.

zebox
Offline
Зарегистрирован: 08.02.2015

Действительно!!! 

Спасибо! будут разбираться с wiegando-ом

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Я думаю следует покопать тему 

 

http://forum.arduino.cc/index.php/topic,17085.0.html

megagosha
Offline
Зарегистрирован: 05.10.2015

Добрый день! 

Подскажите, пожалуйста, в какую сторону двигаться. Ситуация следующая: 

У меня схема подключения и считыватель  такие же (как у zebox). CP-Z-2l (Вот документация: (http://www.ironlogic.ru/il.nsf/file/ru_cp-z-2l.pdf/$FILE/cp-z-2l.pdf 

Как я понял, он поддерживает два протокола Touch Memory/Wiegand26. Я пробовал использовать оба протокола, но не получилось. В силу того, что Wiegand26 не очень удобен, как мне показалось, то я решил использовать Touch Memory. Код, представленный здесь, у меня не работает. На выходе пусто. Подскажите, что можно сделать, как понять хотя бы, что не так. Заранее спасибо. 

 

 

UPD: Все работает) Ошибка была в схеме подключения. Считыватель действительно поддерживает one touch эмуляцию и может работает с onewire 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

megagosha пишет:

Подскажите, пожалуйста, в какую сторону двигаться. Ситуация следующая: 

У меня схема подключения и считыватель  такие же (как у zebox). CP-Z-2l (Вот документация: (http://www.ironlogic.ru/il.nsf/file/ru_cp-z-2l.pdf/$FILE/cp-z-2l.pdf 

Как я понял, он поддерживает два протокола Touch Memory/Wiegand26. Я пробовал использовать оба протокола, но не получилось. В силу того, что Wiegand26 не очень удобен, как мне показалось, то я решил использовать Touch Memory. Код, представленный здесь, у меня не работает. На выходе пусто. Подскажите, что можно сделать, как понять хотя бы, что не так. Заранее спасибо. 

UPD: Все работает) Ошибка была в схеме подключения. Считыватель действительно поддерживает one touch эмуляцию и может работает с onewire 

Плиз - помоги - столкнулся с аналогичным девайсом.

Но только при подключении считываение идет один раз на 10 попыток и те 0000 или FFFF.

Скетч как на далласе 1990:

#include <OneWire.h>
OneWire ds(10); // выход считывателя на 10 пин
byte addr[8];// буфер приема
byte validHex[8] = {1,2,3,4,5,6,7,8};
byte result;

void setup() {// стар,товая инициализация
    Serial.begin(9600);
    delay(100);
    Serial.println("Start...");
}

   
void loop() {
     if(ds.reset()){ // если обнаружено устройттво
        ds.write(0x33); // отправляем команду "считать ROM" 
        delay(10); // на всякий случай ждем
        for(int i=0;i<8;i++)
        {
            addr[i] = ds.read(); // считываем
        }
        Serial.print("ROM =."); // выводим
        for(int i = 0; i < 8; i++)
        {
           Serial.print(addr[i],HEX);
           Serial.print(".");
        }
        Serial.println();
        delay(1000);
      }
}

Если не трудно - мыло at0mix@bk.ru

 

forestpd
Offline
Зарегистрирован: 24.08.2016

Спасибо за скетч очень помог)) А теперь вопрос- Как сделать так чтобы светодиод загорался при правильной последовательности поднесенных карт?) Например- Есть карты с номерами:1,2,3, Номера Hex известны. Нам нужно чтобы при поднесении карт в комбинации ,например 231, Светодиод загорелся)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

заводим двумерный массив id[n][4], где n-количество верных карт

вариант а) заводим второй массив такой же размерности, который является буфером для хранения номеров поднесенных карт. По окончании считывания всех карт сравниваем массивы поэлементно. Если полное совпадение массивов, значит карты поднесены в верной последовательности.

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

megagosha
Offline
Зарегистрирован: 05.10.2015

at0mix пишет:

 

Плиз - помоги - столкнулся с аналогичным девайсом.

Но только при подключении считываение идет один раз на 10 попыток и те 0000 или FFFF.

Скетч как на далласе 1990:

#include <OneWire.h>
OneWire ds(10); // выход считывателя на 10 пин
byte addr[8];// буфер приема
byte validHex[8] = {1,2,3,4,5,6,7,8};
byte result;

void setup() {// стар,товая инициализация
    Serial.begin(9600);
    delay(100);
    Serial.println("Start...");
}

   
void loop() {
     if(ds.reset()){ // если обнаружено устройттво
        ds.write(0x33); // отправляем команду "считать ROM" 
        delay(10); // на всякий случай ждем
        for(int i=0;i<8;i++)
        {
            addr[i] = ds.read(); // считываем
        }
        Serial.print("ROM =."); // выводим
        for(int i = 0; i < 8; i++)
        {
           Serial.print(addr[i],HEX);
           Serial.print(".");
        }
        Serial.println();
        delay(1000);
      }
}

Если не трудно - мыло at0mix@bk.ru

 

 

Уже плохо помню, что там и как было. Помойму я не сразу заметил, что он от 12В питается. Нужен отдельный источник питания. Если у тебя проблема не в этом, то опиши подробнее схему подключения и код. 

Aleksey_338
Offline
Зарегистрирован: 11.03.2014

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