RFID свой чужой
- Войдите на сайт для отправки комментариев
Втр, 27/05/2014 - 23:00
Вечер добрый господа начинаю осваивать 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);
}
}
Помогите с решением.
#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); } }Спасибо большое но что то не то, не работает, диоды не загораются.
byte validHex[8] = {1,2,3,4,5,6,7,8};В эту строку вписывать НЕХ карты, или она не изменяема?
вместо 1 2 3 4 5 6 хекс валидной карты
ну хотябы один должен зажечься)
#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 и гасил
Спасибо))))) За сторания пытаюсь ему скормить 1AAE719070038 , а он ругаеться на суфикс, я так пологаю нужно без (AAE) вставлять?
Красный зажигаеться, при любой карте. У зеленого сменил пин, т.к с 7 читаю Matrix, может я чо то в схеме с подтяжкой напутал. У меня после 7 пина стоит сопротивление 4,7ком , а потом уже DATA0 c Matrix`a.
что ваша программа из первого поста ввывела?
Она считывает HEX, все 11 карточек имеют разный НЕХ. Смотрел примеры типо access control rfid , но не чего толком не понял, ибо кода море.
В сериале что вывело?
1AAE719070038 это что такое?
Я не доганяю как 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"); } } } }В терминале пишет такое:
начнем скарты,хекс у вас сколько байт?
6 или 8?
#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); } }По сути 8, а как узнать сколько он может быть?
Он считывает код карты и преобразовывает его в Dallas Touch Memory( эмуляция DS1990A)
в массив validHex вписываете
1 C1 B7 19 0 70 0 96
или другие хексы
каждый элемент массива - два знака
вводить в шестнадцаричной форме 0x**
0x1 ,0xC1 ,0xB7 ,0x19 ,0x0 ,0x70 ,0x0 ,0x96
Оно?
Спасибо огромное все работает как часы))))))))
А если нужно добавить валидных карт еще, то через что их добавить? Case?
я бы создал двумерный массив
Что то типо того:
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}};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}};Спасибо огромное)))))) Дай бог тебе здоровья)))))))))
И снова я)
код такой
#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[0][i];
для сравнения с 0-вой картой
Ох еще раз огромное спасибо))))) Снова выручил))))))))))))
Блин не работает откликаеться тока на самую первую карту в массиве...
а со второй как делали?
Если 0 заменять на 1 ,2 то карты читаються по одной по очереди
встате переблр в цикл..
Если можно пример как) щас просто с работой нету сильно много времени, практиковать изучение программирование дуинки. выхватываю местами)
for (count = 0 ; count ≤ 7 ; count ++) {Оно?
угу если у вас 8 карточек. но там надо схему проверки переделать
Ругается(
По сути 4 карты валидных, и 4 невалид
#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); } }Спасибо огромное еще раз)))))))))
правильно
Всем привет!!!
Народ я только пытаюсь осваивать Arduino, подскажите плиз как подключить вот такой девайс CP-Z2L (считыватель proximity карт http://www.tinko.ru/p-205192.html)...
Подскажите плиз как подулючить к UNO (через макету)
Там есть следующие провода:
12В+, GND, DATA0, DATA1
12В и GND подаю напрямую от отдельного БП, пытюсь подключить через 10kOm резистор к DATA0 и\или DATA1, в монитор выводятся хаотично HEX данные... не пойму так и должно быть или что-то я делаю не так.?
Подскажите плиз! Спасибо!
Читай инструкцию, там написано что надо 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);
}
}
наверное я что-то делаю не так... не хочет он работать... :(
https://youtu.be/KS1dHULk65w
Незнаю может поможет может нет. Сделай у ардуино общию землю минус
Data0, Data1 - это протокол wiegand.
Действительно!!!
Спасибо! будут разбираться с wiegando-ом
Я думаю следует покопать тему
http://forum.arduino.cc/index.php/topic,17085.0.html
Добрый день!
Подскажите, пожалуйста, в какую сторону двигаться. Ситуация следующая:
У меня схема подключения и считыватель такие же (как у 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
Подскажите, пожалуйста, в какую сторону двигаться. Ситуация следующая:
У меня схема подключения и считыватель такие же (как у 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
Спасибо за скетч очень помог)) А теперь вопрос- Как сделать так чтобы светодиод загорался при правильной последовательности поднесенных карт?) Например- Есть карты с номерами:1,2,3, Номера Hex известны. Нам нужно чтобы при поднесении карт в комбинации ,например 231, Светодиод загорелся)
заводим двумерный массив id[n][4], где n-количество верных карт
вариант а) заводим второй массив такой же размерности, который является буфером для хранения номеров поднесенных карт. По окончании считывания всех карт сравниваем массивы поэлементно. Если полное совпадение массивов, значит карты поднесены в верной последовательности.
вариант б) заводим счетчик, равный количеству карт, и изначально равный нулю. При поднесении карты сравниваем ее номер с тем же квартетом в массиве, где прописаны верные карты. Если есть совпадение номера карты, то счетчик увеличиваем на единичку и сдвигаемся на следующий квартет. По окончании считывания всех карт сравниваем значение счетчика и количества карт. Если совпадение, значит карты поднесены в верной последовательности.
Плиз - помоги - столкнулся с аналогичным девайсом.
Но только при подключении считываение идет один раз на 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В питается. Нужен отдельный источник питания. Если у тебя проблема не в этом, то опиши подробнее схему подключения и код.
Как минимум данные через делитель напряжения на резистораь и GND на считывателе и ардуино соединить.