125Khz RFID module - UART - RDM 630


Tenho visto várias empresas com acesso por cartões utilizando RFID e fiquei curioso para saber como funciona esta tecnologia. Encontrei no site seedstudio o produto 125Khz RFID Module modelo RDM630 com um preço bem razoável e resolvi testar para entender o funcionamento.

Na imagem acima está apresentada a montagem que fiz com o módulo em uma breadboard e com a saída da leitura dos cartões ou chaveiros para o LCD serial. A antena é bem frágil e por isso montei dentro de um saco plástico para proteção. Para controlar o sistema utilizei a placa Tatuino nano da tato.ind.br.
Quando o chaveiro RFID é passado a uma distância de no máximo 5 cm da antena os dados do chip são apresentados na tela LCD com o MAC adress e checksum. O código é basicamente para apresentar os dados da porta serial no terminal da IDE do arduino ou em um LCD como eu fiz.

Os dados  vem em formato ASCII, segundo modelo abaixo:

02 / 10ASCII Data Characters / Checksum  / 03
O módulo é bem simples de montar porque já vem com os pinos soldados e encaixa sem problemas nos furos da breadboard, sendo a montagem que fiz a seguinte:

RDM630 - INTERFACE TTL RS232

 P1
PIN 1 TX - Para o RX do arduino
PIN 2 RX - Para o TX do arduino
PIN 3 - Livre
PIN 4 - Ground
PIN 5 - 5 V

P2
PIN1 - Fio vermelho da antena
PIN1 - Fio preto da antena

P3
Para conexão de led- não utilizei

O código usado neste exemplo foi modificado para apresentação dos dados no lcd e foi montado para uso com o leitor de RFID ID-12 vendido na sparkfun:

---------------------------------------------------------------------------------------------------------------------------

// RFID reader ID-12 for Arduino 
// Based on code by BARRAGAN  
// and code from HC Gilje - http://hcgilje.wordpress.com/resources/rfid_id12_tagreader/
// Modified for Arudino by djmatic
// Modified for ID-12 and checksum by Martijn The - http://www.martijnthe.nl/
//
// Use the drawings from HC Gilje to wire up the ID-12.
// Remark: disconnect the rx serial wire to the ID-12 when uploading the sketch

#include <SoftwareSerial.h>

#define txPin 2
SoftwareSerial LCD = SoftwareSerial(0, txPin);

void setup() {
  Serial.begin(9600);                                 // connect to the serial port
  pinMode(txPin, OUTPUT);
  LCD.begin(2400);
  clearLCD();
  clearCURSOR();
}

void loop () {
  byte i = 0;
  byte val = 0;
  byte code[6];
  byte checksum = 0;
  byte bytesread = 0;
  byte tempbyte = 0;

  if(Serial.available() > 0) {
    if((val = Serial.read()) == 2) {                  // check for header 
      bytesread = 0; 
      while (bytesread < 12) {                        // read 10 digit code + 2 digit checksum
        if( Serial.available() > 0) { 
          val = Serial.read();
          if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) { // if header or stop bytes before the 10 digit reading 
            break;                                    // stop reading
          }

          // Do Ascii/Hex conversion:
          if ((val >= '0') && (val <= '9')) {
            val = val - '0';
          } else if ((val >= 'A') && (val <= 'F')) {
            val = 10 + val - 'A';
          }

          // Every two hex-digits, add byte to code:
          if (bytesread & 1 == 1) {
            // make some space for this hex-digit by
            // shifting the previous hex-digit with 4 bits to the left:
            code[bytesread >> 1] = (val | (tempbyte << 4));

            if (bytesread >> 1 != 5) {                // If we're at the checksum byte,
              checksum ^= code[bytesread >> 1];       // Calculate the checksum... (XOR)
            };
          } else {
            tempbyte = val;                           // Store the first hex digit first...
          };

          bytesread++;                                // ready to read next digit
        } 
      } 

      // Output to Serial:

      if (bytesread == 12) {   
       clearLCD();
       clearCURSOR();
       selectLineOne();        // if 12 digit read is complete
       LCD.print("Code:");
        for (i=0; i<5; i++) {
          if (code[i] < 16) LCD.print("0");
           LCD.print(code[i], HEX);
        }
        Serial.println();
        selectLineTwo();
        LCD.print("Check:");
        LCD.print(code[5], HEX);
        LCD.print(code[5] == checksum ? "-passed" : "-error");       
        
      }

      bytesread = 0;
    }
  }
}

void selectLineOne(){  //puts the cursor at line 0 char 0.
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(128, BYTE);    //position
}
void selectLineTwo(){  //puts the cursor at line 0 char 0.
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(192, BYTE);    //position
}

void clearCURSOR(){
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(0xC, BYTE);   //clear command.
}

void clearLCD(){
   LCD.print(0xFE, BYTE);   //command flag
   LCD.print(0x01, BYTE);   //clear command.
}

void serCommand(){   //a general function to call the command flag for issuing all other commands   
  LCD.print(0xFE, BYTE);
}


----------------------------------------------------------------------------------------------------------------------------

Alguns links com outros exemplos:

http://www.gumbolabs.org/2009/10/17/parallax-rfid-reader-arduino/
http://planaheist.com/imagehost/?v=dsc00456.jpg
http://www.trileet.com/node/34
http://kalshagar.wikispaces.com/ARCPO
http://www.arduino.cc/playground/Code/ID12
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1274920778
http://blog.formatlos.de/2008/12/08/arduino-id-12/

2 comentários:

Faça seu comentário.

Internet of Things

LUX com arduino GPRS shield e sensor LDR.

/*
Graph: Feed 38642, Datastream lux
*/

Laboratórios, Lojas e Produtos

Blogs, Comunidades e Revistas