Leonardo+RDM6300

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

имеется Arduino Leonardo и rfid reader RDM 6300

Прочитал все темы у нас, остановился на этой

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

Reader 1:3FFFFFF Reader 1 converted to DEC:268435455 siteCode:511 serial number:16383
 
Иногда (где-то 1 из 150) выдает (опять же рандомно на любую карту):
 
Reader 1:3FFFFFF Reader 1 converted to DEC:67108863 siteCode:511 serial number:16383
 
Как жить дальше?
/* 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;
         }
}

 

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

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