Le but de cette page est de comprendre et d'apprendre à utiliser le shield RFID pour Arduino.
#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(" "); } } } }
#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; }
-=--=--=--=--=--=--=--=--=--=--=--=--=--=- -=- 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>