Корректное считывание данных с RFID Reader'a

Vir
Offline
Зарегистрирован: 04.12.2012

Имеется у меня в наличии RFID Reader. Подключаю я его к ардуино, и пытаюсь считать данные. В wiki производителя, более-менее, понятно описан процесс подключения. Есть 2 вариант подключения:

  1. UART
  2. Wiegan

Для этого, на плате есть джампер:

Как видно по фотографии он стоит в режиме wiegan (хотя у производителя, на странице википедии, видимо ошибка, потому что в обоих случаях просят поставить джампер на "U", но здравый смысл подсказывает, что U - это UART).

Так же приведу фото подключения к mega shield'у:

Так вот вопросы:

  1. По идее, передача через Serial, должна происходит в режиме "U" (UART), но когда я переставляю джампер на этот режим - ничего не приходит на Serial, вообще. Может и здесь проихводитель ошибся в маркировке на плате? Может буквы стоило поменять местами?
  2. Когда я перетыкаю джампер в режим "W" (wiegan) на Serial данные приходят. Но, какие-то странные, не такие, как описано на wiki-странице.

Так вот, когда я подношу карту на Serial приходят следующие данные:

255
255
254
255
255
254
255
254
255
254
255

Код следующий:

void RFIDReaderInit()
{
  Serial3.begin(9600);
}
 
void RFIDReaderHandler()
{
  if (Serial3.available())
  {
	while(Serial3.available())
	{
	  Serial.println(Serial3.read());
	}
  }
}

init запускается в setup'е, а handler запускается в loop'e. Если верить wiki-странице, то должны приходить тех. данные + номер карточки. Однако на моей карте написано: "0006152627 093.56879". Я так полагаю, что первая часть это и есть номер карты, но тогда он не совпадает с тем, что приходит по Serial.

Подскажите, пожалуйста, где я туплю?

leshak
Offline
Зарегистрирован: 29.09.2011

Проверите что у вас RX,TX правильно подключены.Вернее TX (в UART RX вообще не используется, но можно и подключить). Если не ошибаюсь TX модуля, на RX платы должно идти.

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

Прежде чем что-то выводить - стоит подождать стартового байта 02. Возможно вы просто слуашете что-то "с середины предложения".

Потом читаем 10 байт - сам код. Потом байт чексуммы (пока просто запомнили). Потом должен идти завершающий 03.

Если его нет - значит 02 был не стартовым, а просто попался где-то "в серийном номере" или еще где-то.

Если 03 имеется (вообщем 02 должно быть в начале, 03 в конце. между ними - ровно 11 байт (10код+1 чексумма)), то считаем чексумму для кода. Если оно совпало с чексуммой в 11 дата-байте - ну значит мы все прочитали правильно. И можно выводить код. Если нет - что-ж, ждать следующей попытки. Вполне возможно что с первого раза и не прочитается (для того чексумма и придумана).

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Вот что-то такое попробуйте (будет легче искать где-начинается и где кончается)

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

void loop(){
   if(Serial3.available()){
     byte ch=Serial3.read();

      if(ch=0x02)Serial.println(); // делаем первод строки ПЕРЕД стартовым байтом (предположительно)
      
      Serial.print(ch,HEX); // лучше сразу выводть в шестнадцатеричном
      Serial.print(" "); // разделим пробелами что-бы лучше читалось

      if(ch=0x03)Serial.println(); // делаем первод строки ПОСЛЕ финишного байтом (предположительно)
   }
}

 

Vir
Offline
Зарегистрирован: 04.12.2012

Видимо вот тут-то, "Если не ошибаюсь TX модуля, на RX платы должно идти.", собака и зарылась... Домой приду проверю. Спасибо.

leshak
Offline
Зарегистрирован: 29.09.2011

А вообще вашу тему можно использовать в качестве образца "вот как нужно вопросы задавать" :) И тема вменяемо названа, и описано "что ждем, что получаем". И ссылка на модуль, и на wiki производителя, и картинки. И код который запускаем и лог файл :), и код вставлен правильно :)

Все сделано для того что-бы потенциальный "помогающий" как можно меньше времени тратил на поиск справочной инфы и разгадки ребусов ("что же имел ввиду топикстартер").

Вообщем "все-бы так" ;)

Vir
Offline
Зарегистрирован: 04.12.2012

Вы оказались правы. Я просто сглупил, и подключил RX к RX, а TX к TX. А нужно было, естественно, наоборот. Теперь на UART режиме всё работает как надо. Ещё раз спасибо за помощь.

std
Offline
Зарегистрирован: 05.01.2012

я делал на выводы 2,3 по SoftwareSerial. приемник SeeedStudio Brick.

pegaseg
Offline
Зарегистрирован: 28.07.2013

Здравствуйте. Не могу заставить работать RFID-считыватель, подключенный к Arduino...

Есть следующий комплект:
1. Arduino Mega 1280: http://www.aliexpress.com/item/for-Arduino-Mega-Atmega1280-16AU-Atmega-1280-USB-cabel-new/1011446998.html
2. RFID-считыватель RDM630: http://www.alibaba.com/product-gs/529041244/RDM630_Small_size_125KHz_134_2KHz.html
Спецификации на этот считыватель в PDF можно посмотреть здесь: http://www.seeedstudio.com/depot/datasheet/RDM630-Spec..pdf
3. RFID-карты на 125 кГц: http://devicter.ru/goods/EM4100-125kHz-RFID-Card

Подключаю RFID-считыватель к Arduino как написано здесь: http://www.instructables.com/id/Twitter-Poem-Box/step2/Seeed-RFID/
и здесь: http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/#step1

RFID ->  Arduino:
Pin 1 -> 2 (цифровой)
Pin 2 -> 3 (цифровой)
Pin 4 -> GND
Pin 5 -> +5V

Скетч следующий:

/* Modified from
* Crazy People
* By Mike Cook April 2009
* An RFID reader outputing 26 bit Wiegand code to pins:-
* Reader attached to Pins 2 & 3
* Interrupt service routine gathers Wiegand pulses (zero or one) until 26 have been received
* Then a string is sent to Serial
*/
volatile long reader1 = 0;
volatile int reader1Count = 0;
void reader1One(void) {
         reader1Count++;
         reader1 = reader1 << 1;
         reader1 |= 1;
}
void reader1Zero(void) {
         reader1Count++;
         reader1 = reader1 << 1;
}
void setup()
{
         Serial.begin(9600);
         // Attach pin change interrupt service routines from the Wiegand RFID readers
         attachInterrupt(0, reader1Zero, RISING);//DATA0 to pin 2
         attachInterrupt(1, reader1One, RISING); //DATA1 to pin 3
         delay(10);
         // the interrupt in the Atmel processor misses out the first negitave pulse as the inputs are already high,
         // so this gives a pulse to the reader input line to get the interrupts working properly.
         // Then clear out the reader variables.
         // The readers are open collector sitting normally at a one so this is OK
         for(int i = 2; i<4; i++){
                 pinMode(i, OUTPUT);
                 digitalWrite(i, HIGH); // enable internal pull up causing a one
                 digitalWrite(i, LOW); // disable internal pull up causing zero and thus an interrupt
                 pinMode(i, INPUT);
                 digitalWrite(i, HIGH); // enable internal pull up
         }
         delay(10);
         // put the reader input variables to zero
         reader1 = 0;
         reader1Count = 0;
}
void loop() {
         if(reader1Count >=26){
                 int serialNumber=(reader1 >> 1) & 0x3fff;
                 int siteCode= (reader1 >> 17) & 0x3ff;
                 Serial.print(" Reader 1:");
                 Serial.print(reader1,HEX);
                 Serial.print(" ");
                 Serial.print("Reader 1 converted to DEC:");
                 Serial.print(reader1& 0xfffffff);
                 Serial.print(" ");
                 Serial.print("siteCode:");
                 Serial.print(siteCode);
                 Serial.print(" ");
                 Serial.print("serial number:");
                 Serial.println(serialNumber);
                 reader1 = 0;
                 reader1Count = 0;
         }
}

В итоге в мониторе COM-порта (в независимости от того какую карту я прикладываю к антенне) выводится следующий текст:
Reader 1:0 Reader 1 converted to DEC:0 siteCode:0 serial number:0

Пробовал также подключать как написано в следующих ссылках:
1. http://maniacbug.wordpress.com/2011/10/09/125khz-rfid-module-rdm630/
2. http://blog.iteadstudio.com/play-rdm630-with-arduino/

И он либо вообще не реагирует на прикладывание карты, либо показывает каракули или нули.

В чем может быть проблема?
Может кто-нибудь сталкивался с RFID-считывателем RDM630 и знает как решить проблему?

vlkam
Offline
Зарегистрирован: 17.02.2013

pegaseg пишет:
И он либо вообще не реагирует на прикладывание карты, либо показывает каракули или нули.

"Каракули" по идее это нормально, возможно считыватель отсылает данные в бинарном формате, а в текстовом формате они выглядят "крякозябами"-каракулями

romster
Offline
Зарегистрирован: 15.04.2013

pegaseg пишет:

И он либо вообще не реагирует на прикладывание карты, либо показывает каракули или нули.

Каракули вызваны скорее всего не совпадением скорости обмена в терминали и настройке ардуины. в первой ссылке код с настройкой порта  Serial.begin(57600); а терминал по умолчанию стоит 9600, может в этом проблема ?

romster
Offline
Зарегистрирован: 15.04.2013

мне больше нравится тот пример, который идет в комлпекте с устройством http://http://m5.img.dxcdn.com/CDDriver/CD/sku.206725.zip

// link between the computer and the SoftSerial Shield
//at 9600 bps 8-N-1
//Computer is connected to Hardware UART
//SoftSerial Shield is connected to the Software UART:D2&D3 
 
#include <SoftwareSerial.h>
 
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64]; // buffer array for data recieve over serial port
int count=0;     // counter for buffer array 
void setup()
{
  SoftSerial.begin(9600);               // the SoftSerial baud rate   
  Serial.begin(9600);             // the Serial port of Arduino baud rate.
 
}
 
void loop()
{
  if (SoftSerial.available())              // if date is comming from softwareserial port ==> data is comming from SoftSerial shield
  {
    while(SoftSerial.available())          // reading data into char array 
    {
      buffer[count++]=SoftSerial.read();     // writing data into array
      if(count == 64)break;
  }
    Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
    clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
    count = 0;                   // set counter of while loop to zero
    Serial.println();    // в столбик мне нравится больше =)
 
 
  }
  if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
    {
    SoftSerial.write(Serial.read());       // write it to the SoftSerial shield

  };
}
void clearBufferArray()              // function to clear buffer array
{
  for (int i=0; i<count;i++)
    { buffer[i]=NULL;}                  // clear all index of array with command NULL
}

 

stels
Offline
Зарегистрирован: 03.01.2014

а какой модуль посоветуете для клонирования домофонных ключей?

BATA
Offline
Зарегистрирован: 26.04.2014

Уважаемые форумчане! Помогите сттуденту с дипломом!

Испытываю Arduino Mega 2560 v3.0 от DFRObot с модулем RFID. Без шилдов, напрямую.

Как не пытал их на Serial, Serial1-3 и портах через SoftwareSerial на пинах он не выдает никакой информации вообще.

даташит по RFID http://www.elechouse.com/elechouse/images/product/13.56MHZ_RFID_Module/13.56MHZ_RFID_Manual.pdf

по карточке http://www.nxp.com/documents/data_sheet/M001053_MF1ICS50_rev5_3.pdf

Скетчи постов 2 и 10 результатов не дали =\

Вот сие безобразие:

 

vlkam
Offline
Зарегистрирован: 17.02.2013

А почему у тебя rxd и txd заведены не на хардварные сериалы (и это на меге то!) ?

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

BATA пишет:

Помогите сттуденту с дипломом!

почему бы сразу у форума не попросить диплом тебе выписать.

*сттудент!

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

pegaseg пишет:

Здравствуйте. Не могу заставить работать RFID-считыватель, подключенный к Arduino...

Есть следующий комплект:
1. Arduino Mega 1280: http://www.aliexpress.com/item/for-Arduino-Mega-Atmega1280-16AU-Atmega-1280-USB-cabel-new/1011446998.html
2. RFID-считыватель RDM630: http://www.alibaba.com/product-gs/529041244/RDM630_Small_size_125KHz_134_2KHz.html
Спецификации на этот считыватель в PDF можно посмотреть здесь: http://www.seeedstudio.com/depot/datasheet/RDM630-Spec..pdf
3. RFID-карты на 125 кГц: http://devicter.ru/goods/EM4100-125kHz-RFID-Card

Подключаю RFID-считыватель к Arduino как написано здесь: http://www.instructables.com/id/Twitter-Poem-Box/step2/Seeed-RFID/
и здесь: http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/#step1

RFID ->  Arduino:
Pin 1 -> 2 (цифровой)
Pin 2 -> 3 (цифровой)
Pin 4 -> GND
Pin 5 -> +5V

 

подключите

RX(считывателя)в TX(ардуины)

TX(считывателя)в RX(ардуины)

и просто читайте данные с ком порта.

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

BATA
Offline
Зарегистрирован: 26.04.2014

vlkam пишет:

А почему у тебя rxd и txd заведены не на хардварные сериалы (и это на меге то!) ?

 

Я говорю же, пробовал и с Serial3 например(14 и 15 порт). Простоое

If(Serial.available){

c = Serial3.read();

Serial3.print(c);

}

ничего не выдает. А про диплом коментов не надо, просто именно тут все пока зависло.

BATA
Offline
Зарегистрирован: 26.04.2014

А можно же считать с тех же карт местки через SPI интерфейс? MOSI, MISO, SCK, SCA и RST пины на RFID выведены.

vlkam
Offline
Зарегистрирован: 17.02.2013

BATA пишет:

Я говорю же, пробовал и с Serial3 например(14 и 15 порт). Простоое

If(Serial.available){

c = Serial3.read();

Serial3.print(c);

}

ничего не выдает. А про диплом коментов не надо, просто именно тут все пока зависло.

1. Ты rx платы с tx меги соединяешь ?
2. Код не рабочий ты привел. Проверяешь один порт, а считываешь с другого

BATA
Offline
Зарегистрирован: 26.04.2014

Да, rx платы с tx меги, tx платы c rx меги.

Кстати по даташиту у данного RFID девайса есть два режима: common и basic, они определяют вид команд для передачи устройству через мегу. Я так и не разобрался по документации, стоит ли сам модуль уже в режиме считыания или же его нужно сначала предустановить, дабы он корректно работал. Судя по работе ледов(CARD, MODE и STAT) мои карточки он улавливает.

При тестировании с портомами Serial и Serial3 обнаружил, что Serial выдает на монитор результат(неизвестно откуда и что он значит) даже если RFID модуль не подключен. Serial3 в монитор вообще ничего не выдает. Видимо, причина банально в том, что Serail1,2,3 просто никогда не отображает монитор, только Serial.

Составил такой скетч по наброскам сайта DVRobot:

 int CMD[64]; 
 int comlen =0; 
 int out_flag =0; 

 void setup()    
 {    
     Serial.begin(9600); //устанавливает скорость UART 
     Serial1.begin(9600);  
     Serial.println("Serial number = \n");  // отображение серийного номера  метки    
  
     delay(10); 
     Serial1.write(0x02); //команда автоматического чтения серийного номера метки 
 }    
 void loop() 
 {    

     if(Serial1.available())   
     { 
       int a = SerialReadHexDigit(); 
       if(a>=0){ 
         CMD [comlen]= a; 
         comlen++; 
       } 
       delay(50); 
     } 

     for(int i=0; i<comlen; i+=2){ 
       int c = Serial1.write( CMD[i]*16 + CMD[i+1]); 
     } 
     comlen =0; 

     if(Serial1.available()) 
     { 
       byte c = Serial1.read(); 
       if (c<10) Serial1.print("0"); 
       Serial.print(c,HEX); //Показываем серийный номер в HEX    
       Serial.print(" ");//выводим в терминал 
       out_flag =1; 
     } 
     if (out_flag >0) { 
       Serial.println(); 
       out_flag = 0; 
     } 

 } 

 int SerialReadHexDigit() 
 { 
     byte c = (byte) Serial1.read(); 
     if (c >= '0' && c <= '9') { 
       return c - '0'; 
     }    
     else if (c >= 'a' && c <= 'f') { 
       return c - 'a' + 10; 
     }    
     else if (c >= 'A' && c <= 'F') { 
       return c - 'A' + 10; 
     }    
     else { 
       return -1;   // выводится ошибка, если код не прочитан 
     } 
 }