Outils pour utilisateurs

Outils du site


rfid_et_arduino

RFDuino

Le but de cette page est de comprendre et d'apprendre à utiliser le shield RFID pour Arduino.

What we need ?

Démonstrations

Code moisi qui envoie des trames en dur

#include <NewSoftSerial.h>
 
#define SIZE_KEY 11
#define SIZE_AUTH 20
#define SIZE_READ 16
#define SIZE_WRITE 4
 
NewSoftSerial rfid(7, 8);
 
int Key[SIZE_KEY];
int Auth[SIZE_AUTH];
int VarRead[SIZE_READ];
int DataToWrite[SIZE_WRITE];
char DataToWrite2[SIZE_WRITE];   // DataToWrite converti
 
 
int presence_tag;
 
void seek_key(void);
void authenticate(void);
void action_read_write();
void Read(void);
void Write(void);
 
 
void setup()
{
  Serial.begin(9600);
  Serial.println("-=--=--=--=--=--=--=--=--=-");
  Serial.println("-=- RFID  Reader/Writer -=-");
  Serial.println("-=--=--=--=--=--=--=--=--=-");
 
  rfid.begin(19200);
  delay(10);
//Halt instructions
  rfid.print(0x00, BYTE);
  rfid.print(0x00, BYTE);
  rfid.print(0x01, BYTE);
  rfid.print(0x93, BYTE);
  rfid.print(0x94, BYTE);	
  delay(50);
}
 
void loop()
{
	seek_key();
	if (presence_tag == 1)
	{		
 
 //Serial.print(27,BYTE);   //Print "esc"
 //Serial.print("[2J");
 
		Serial.print("Tag Serial Number : ");
		Serial.print(Key[8], HEX);
		Serial.print(Key[7], HEX);
		Serial.print(Key[6], HEX);
		Serial.print(Key[5], HEX);
		Serial.println();
		Serial.println();
 
 
		Serial.print("Reponse : ");
		Serial.print(Key[0], HEX);
		Serial.print(Key[1], HEX);
		Serial.print(Key[2], HEX);
		Serial.print(Key[3], HEX);
		Serial.print(Key[4], HEX);
		Serial.println();
 
		authenticate();
	}
 
 
	presence_tag = 0;
}
 
 
void seek_key()
{
  rfid.print(0xff, BYTE);
  rfid.print(0x00, BYTE);
  rfid.print(0x01, BYTE);
  rfid.print(0x82, BYTE);
  rfid.print(0x83, BYTE); 
 
  delay(10);
 
  while(rfid.available()){
    if(rfid.read() == 255){
      for(int i=1;i<SIZE_KEY;i++){
//		  int j = SIZE_KEY - i;
        Key[i]= rfid.read();
      }
    }
  }
 
 
 if(Key[2] == 6){presence_tag = 1;}
 else {presence_tag=0;}
  delay(20);	
}
 
 
//Authenticate Block 0x01 with transport key FF FF FF FF FF FF
void authenticate()
{
 
	rfid.print(0xff, BYTE);
	rfid.print(0x00, BYTE);
    rfid.print(0x03, BYTE);
    rfid.print(0x85, BYTE);
    rfid.print(0x01, BYTE);
    rfid.print(0xff, BYTE);
    rfid.print(0x88, BYTE);
 
  delay(50);
  while(rfid.available()){
    if(rfid.read() == 255){
      for(int i=1;i<SIZE_AUTH;i++){
        Auth[i]= rfid.read();
      }
    }
  }
 
	Serial.print("Login Status: ");
    Serial.print(Auth[1], HEX);
    Serial.print(Auth[2], HEX);
    Serial.print(Auth[3], HEX);
    Serial.print(Auth[4], HEX);
 
    if(Auth[4] == 76){
		Serial.print(" (Successful!)");
 
 
		action_read_write();
 
 
 
		} 
 
		else {Serial.print(" (Failed.)");} 
 
    Serial.println();  
    Serial.println();  
    Serial.println();  
 
 
 
}
 
 
void action_read_write(void)
{
 
    Serial.print("Lire ou ecrire?  \"r\" ou \"w\"");
	Serial.print("\n\n");
	Serial.flush();
	while(Serial.available() < 1){};
 
  	int action = Serial.read();
	if (action == 'r')          // Test la touche "r"
	{
		Read();
	}
 
	if (action == 'w')			// Test la touche "w"
	{
		//Write();
		Serial.println("ECRIRE 4 BYTES");
 
        while(Serial.available() < 4){};
         for (int i=0; i < SIZE_WRITE; i++){
          DataToWrite[i] = Serial.read();
          DataToWrite2[i] = char(DataToWrite[i]); 
	      }		
 
	//SEEK KEY
	rfid.print(0xff, BYTE);
    rfid.print(0x00, BYTE);
    rfid.print(0x01, BYTE);
    rfid.print(0x82, BYTE);
    rfid.print(0x83, BYTE); 
	delay(10);
	//AUTHENTICATE
	rfid.print(0xff, BYTE);
	rfid.print(0x00, BYTE);
    rfid.print(0x03, BYTE);
    rfid.print(0x85, BYTE);
    rfid.print(0x01, BYTE);
    rfid.print(0xff, BYTE);
    rfid.print(0x88, BYTE);
	delay(10);
 
	//Write data	
	rfid.print(0xFF, BYTE); 
	rfid.print(0x00, BYTE); 
	rfid.print(0x06, BYTE);
	rfid.print(0x8A, BYTE); 
	rfid.print(0x01, BYTE); 
	rfid.print(DataToWrite2[0], BYTE); //send 4 bytes from earlier
    rfid.print(DataToWrite2[1], BYTE);
    rfid.print(DataToWrite2[2], BYTE);
    rfid.print(DataToWrite2[3], BYTE);
	rfid.print(0xAA, BYTE);
	rfid.print(0x1D, BYTE);
 
 
 
	}
}
 
void Read(void)
{
	Serial.println("FONCTION READ");
 
	//SEEK KEY
	rfid.print(0xff, BYTE);
    rfid.print(0x00, BYTE);
    rfid.print(0x01, BYTE);
    rfid.print(0x82, BYTE);
    rfid.print(0x83, BYTE); 
	delay(10);
	//AUTHENTICATE
	rfid.print(0xff, BYTE);
	rfid.print(0x00, BYTE);
    rfid.print(0x03, BYTE);
    rfid.print(0x85, BYTE);
    rfid.print(0x01, BYTE);
    rfid.print(0xff, BYTE);
    rfid.print(0x88, BYTE);
	delay(50);
 
	rfid.print(0xFF, BYTE);
    rfid.print(0x00, BYTE);
    rfid.print(0x02, BYTE);
    rfid.print(0x87, BYTE);
    rfid.print(0x01, BYTE);  //Lit le Byte 1
	rfid.print(0x91, BYTE);
 
    delay(50);
    while(rfid.available()){
      if(rfid.read() == 255){
        for(int i=1;i<SIZE_READ;i++){
          VarRead[i]= rfid.read();
		  Serial.print(VarRead[i], HEX);
		  Serial.print(" ");
        }
 
	}
}
 
}

Code conforme

#include <NewSoftSerial.h>
 
 
NewSoftSerial rfid(7, 8);
 
void seek_key(void);
int seek_tag(uint8_t *id, uint8_t *length);
void print_buffer(uint8_t *buf, uint16_t len)
{
	int i;
	for (i = 0; i < len; i++)
		Serial.print(buf[i]);
	Serial.print("\n");
}
 
uint8_t rfid_read_sync()
{
	while(!rfid.available());
	return rfid.read();
}
 
void setup()
{
  Serial.begin(9600);
  Serial.println("-=--=--=--=--=--=--=--=--=--=--=--=--=--=-");
  Serial.println("-=- RFID  Reader/Writer  SM130 Utility -=-");
  Serial.println("-=--=--=--=--=--=--=--=--=--=--=--=--=--=-");
 
  rfid.begin(19200);
  delay(10);
 
  //Halt instructions
  uint8_t ret[10];
  uint8_t len = 10;
 
  send_command(0x81, NULL, 0, ret, &len);
  delay(50);
  send_command(0x82, NULL, 0, ret, &len);
  delay(50);
}
 
void loop()
{
	uint8_t id[10];
	uint8_t id_len = 10;
 
	if (seek_tag(id, &id_len) == 1) {
		// read data
		send_command(0x82, NULL, 0, id, &id_len);
		delay(50);
	}
}
 
bool read_response(uint8_t *ret, uint8_t *length, uint8_t *cmd)
{
	uint8_t crc = 0;
	uint8_t ret_header, ret_length, ret_cmd;
	int i;
 
	Serial.println("<read_response>");
 
	ret_header = rfid_read_sync();
	if(ret_header != 0xff) {
		Serial.print("bad header: 0x");
		Serial.println(ret_header, HEX);
		goto error;
	}
 
	// reserved
	crc = rfid_read_sync();
	Serial.print("reserved = 0x");
	Serial.println(crc, HEX);
 
	// length
	ret_length = rfid_read_sync();
	crc += ret_length;
	Serial.print("length = 0x");
	Serial.println(ret_length, HEX);
 
	// cmd
	ret_cmd = rfid_read_sync();
	crc += ret_cmd;
	if (cmd)
		*cmd = ret_cmd;
	ret_length--;
	Serial.print("cmd = 0x");
	Serial.println(ret_cmd, HEX);
 
	// read the answerz
	i = 0;
	Serial.print("buf = ");
	while (i < ret_length) {
		ret[i] = rfid_read_sync();
		crc += ret[i];
 
		Serial.print(ret[i], HEX);
		Serial.print(" ");
 
		i++;
	}
	Serial.println("");
 
	// crc
	if (rfid_read_sync() != crc) {
		Serial.println("bad crc");
		return false;
	}
 
	*length = ret_length;
 
	Serial.println("</read_response>\n");
 
	return true;
 
error:
	while(rfid.available())
		rfid.read();
 
	Serial.println("</read_response>\n");
	return false;
}
 
bool send_command(uint8_t cmd, const uint8_t *cmd_args, const uint8_t cmd_args_length, uint8_t *ret, uint8_t *length)
{
	uint8_t length_cmd = 1 + cmd_args_length;
	uint8_t crc = length_cmd + cmd;
	uint8_t ret_header, ret_length, ret_cmd;
	int i;
 
	Serial.print("<cmd 0x");
	Serial.print(cmd, HEX);
	Serial.println(">");
 
	rfid.print(0xff, BYTE);
	rfid.print(0x00, BYTE);
	rfid.print(length_cmd, BYTE);
	rfid.print(cmd, BYTE);
	for (i = 0; i < cmd_args_length; i++) {
		rfid.print(cmd_args[i], BYTE);
		crc += cmd_args[i];
	}
	rfid.print(crc, BYTE); 
 
	return read_response(ret, length, NULL);
}
 
int seek_tag(uint8_t *id, uint8_t *length)
{
	uint8_t cmd, type, tag_len;
	uint8_t buf[10], buf_len = 10;
	int i;
 
	if (!rfid.available())
		return 0;
 
	Serial.println("<seek tag>\n");
	read_response(buf, &buf_len, &cmd);
 
	if(cmd != 0x82) {
		Serial.print("bad command: 0x");
		Serial.println(cmd, HEX);
		goto error;
	}
 
	// type
	type = buf[0];
	Serial.print("type = 0x");
	Serial.println(type, HEX);
 
	switch (type) {
	case 0x1:
		tag_len = 7;
                Serial.println("tagtype = Mifare Ultralight");
		break;
 
	case 0x2:
                tag_len = 4;
                Serial.println("tagtype = Mifare Standard 1K");
                break;
	case 0x3:
		tag_len = 4;
                Serial.println("tagtype = Mifare Classic 4K");
		break;
	default:
		Serial.print("tagtype = Unknown RFID tag: 0x");
		Serial.println(type, HEX);
		goto error;
	}
 
	// read the answer
	i = 0;
	Serial.print("tag serial = ");
	while (i < tag_len) {
		id[i] = buf[tag_len - i];
 
		Serial.print(id[i], HEX);
		Serial.print(" ");
 
		i++;
	}
	Serial.println("");
 
	*length = tag_len;
 
	Serial.println("</seek tag>\n");
 
	return 1;
 
error:
	while(rfid.available())
		rfid.read();
 
	Serial.println("</seek_tag>\n");
	return 2;
}
Test avec un TAG Mifare 1K de chez Sparkfun
-=--=--=--=--=--=--=--=--=--=--=--=--=--=-
-=- RFID  Reader/Writer  SM130 Utility -=-
-=--=--=--=--=--=--=--=--=--=--=--=--=--=-
<cmd 0x81>
<read_response>
reserved = 0x0
length = 0x8
cmd = 0x81
buf = 55 4D 20 31 2E 33 64 
</read_response>

<cmd 0x82>
<read_response>
reserved = 0x0
length = 0x2
cmd = 0x82
buf = 4C 
</read_response>

<seek tag>

<read_response>
reserved = 0x0
length = 0x6
cmd = 0x82
buf = 2 E2 6D C5 31 
</read_response>

type = 0x2
tagtype = Mifare Standard 1K
tag serial = 31 C5 6D E2 
</seek tag>

<cmd 0x82>
<read_response>
reserved = 0x0
length = 0x2
cmd = 0x82
buf = 4C 
</read_response>

rfid_et_arduino.txt · Dernière modification: 2015/01/28 03:09 (modification externe)