Корректное считывание данных с RFID Reader'a
- Войдите на сайт для отправки комментариев
Имеется у меня в наличии RFID Reader. Подключаю я его к ардуино, и пытаюсь считать данные. В wiki производителя, более-менее, понятно описан процесс подключения. Есть 2 вариант подключения:
- UART
- Wiegan
Для этого, на плате есть джампер:
Как видно по фотографии он стоит в режиме wiegan (хотя у производителя, на странице википедии, видимо ошибка, потому что в обоих случаях просят поставить джампер на "U", но здравый смысл подсказывает, что U - это UART).
Так же приведу фото подключения к mega shield'у:
Так вот вопросы:
- По идее, передача через Serial, должна происходит в режиме "U" (UART), но когда я переставляю джампер на этот режим - ничего не приходит на Serial, вообще. Может и здесь проихводитель ошибся в маркировке на плате? Может буквы стоило поменять местами?
- Когда я перетыкаю джампер в режим "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.
Подскажите, пожалуйста, где я туплю?
Проверите что у вас RX,TX правильно подключены.Вернее TX (в UART RX вообще не используется, но можно и подключить). Если не ошибаюсь TX модуля, на RX платы должно идти.
Попробуйте без шилда,а напрямую в дуину. Попадались подобные шилды с тупо бракованными дорожками и какой-то и портов на шилде может не работать.
Прежде чем что-то выводить - стоит подождать стартового байта 02. Возможно вы просто слуашете что-то "с середины предложения".
Потом читаем 10 байт - сам код. Потом байт чексуммы (пока просто запомнили). Потом должен идти завершающий 03.
Если его нет - значит 02 был не стартовым, а просто попался где-то "в серийном номере" или еще где-то.
Если 03 имеется (вообщем 02 должно быть в начале, 03 в конце. между ними - ровно 11 байт (10код+1 чексумма)), то считаем чексумму для кода. Если оно совпало с чексуммой в 11 дата-байте - ну значит мы все прочитали правильно. И можно выводить код. Если нет - что-ж, ждать следующей попытки. Вполне возможно что с первого раза и не прочитается (для того чексумма и придумана).
Вот что-то такое попробуйте (будет легче искать где-начинается и где кончается)
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(); // делаем первод строки ПОСЛЕ финишного байтом (предположительно) } }Видимо вот тут-то, "Если не ошибаюсь TX модуля, на RX платы должно идти.", собака и зарылась... Домой приду проверю. Спасибо.
А вообще вашу тему можно использовать в качестве образца "вот как нужно вопросы задавать" :) И тема вменяемо названа, и описано "что ждем, что получаем". И ссылка на модуль, и на wiki производителя, и картинки. И код который запускаем и лог файл :), и код вставлен правильно :)
Все сделано для того что-бы потенциальный "помогающий" как можно меньше времени тратил на поиск справочной инфы и разгадки ребусов ("что же имел ввиду топикстартер").
Вообщем "все-бы так" ;)
Вы оказались правы. Я просто сглупил, и подключил RX к RX, а TX к TX. А нужно было, естественно, наоборот. Теперь на UART режиме всё работает как надо. Ещё раз спасибо за помощь.
я делал на выводы 2,3 по SoftwareSerial. приемник SeeedStudio Brick.
Здравствуйте. Не могу заставить работать 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 и знает как решить проблему?
"Каракули" по идее это нормально, возможно считыватель отсылает данные в бинарном формате, а в текстовом формате они выглядят "крякозябами"-каракулями
И он либо вообще не реагирует на прикладывание карты, либо показывает каракули или нули.
Каракули вызваны скорее всего не совпадением скорости обмена в терминали и настройке ардуины. в первой ссылке код с настройкой порта Serial.begin(57600); а терминал по умолчанию стоит 9600, может в этом проблема ?
мне больше нравится тот пример, который идет в комлпекте с устройством 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 }а какой модуль посоветуете для клонирования домофонных ключей?
Уважаемые форумчане! Помогите сттуденту с дипломом!
Испытываю 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 результатов не дали =\
Вот сие безобразие:
А почему у тебя rxd и txd заведены не на хардварные сериалы (и это на меге то!) ?
Помогите сттуденту с дипломом!
почему бы сразу у форума не попросить диплом тебе выписать.
*сттудент!
Здравствуйте. Не могу заставить работать 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(ардуины)
и просто читайте данные с ком порта.
У меня таокй же модуль, все прекрасно работает. А скетч у вас сильно замудрен.
А почему у тебя rxd и txd заведены не на хардварные сериалы (и это на меге то!) ?
Я говорю же, пробовал и с Serial3 например(14 и 15 порт). Простоое
If(Serial.available){
c = Serial3.read();
Serial3.print(c);
}
ничего не выдает. А про диплом коментов не надо, просто именно тут все пока зависло.
А можно же считать с тех же карт местки через SPI интерфейс? MOSI, MISO, SCK, SCA и RST пины на RFID выведены.
Я говорю же, пробовал и с Serial3 например(14 и 15 порт). Простоое
If(Serial.available){
c = Serial3.read();
Serial3.print(c);
}
ничего не выдает. А про диплом коментов не надо, просто именно тут все пока зависло.
1. Ты rx платы с tx меги соединяешь ?
2. Код не рабочий ты привел. Проверяешь один порт, а считываешь с другого
Да, 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; // выводится ошибка, если код не прочитан } }