Hoje eu quero usar o módulo de leitura de tags NFC com o meu Arduíno. A ideia é construir um protótipo simples para ler tags NFC e validá-las contra um servidor remoto (por exemplo, um servidor node tcp). Dependendo da tag, vamos desencadear uma saída digital ou outra. No exemplo, conectaremos leds a essas saídas, mas na vida real podemos abrir portas ou algo parecido.
Usaremos um módulo MFRC522. É um leitor e escritor de tags Mifare RFID/NFC barato.
Conexão MFRC522:
- sda: 10 (*) -> 8
- sck: 13
- Mosi: 11
- Miso: 12
- Rq: —
- Gnd: Gnd
- Rst: 9
- 3.3V: 3.3V
Neste exemplo, usaremos um escudo ethernet para conectar nossa placa Arduíno à LAN. Devemos tomar cuidado com disso. Se usarmos o escudo ethernet com um MFRC522, há um conflito SPI (devido ao leitor de cartão SD do escudo ethernet). Precisamos usar outro pin SDA (aqui estou usando o pin 8 em vez do 10) e desabilitar o SPI do w5100 antes de configurar a Ethernet.
// disable w5100 SPI pinMode(10, OUTPUT); digitalWrite(10, HIGH);
Aqui está o código Arduino
#include <SPI.h> #include <MFRC522.h> #include <Ethernet.h> #include <EthernetClient.h> #define RST_PIN 9 #define SS_PIN 8 #define ERROR_PIN 7 #define OPEN_PIN 6 #define OPEN_DELAY 2000 char server[] = "192.168.1.104"; int port = 28001; signed long timeout; byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; MFRC522 mfrc522(SS_PIN, RST_PIN); EthernetClient client; void printArray(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } } String dump_byte_array(byte *buffer, byte bufferSize) { String out = ""; for (byte i = 0; i < bufferSize; i++) { out += String(buffer[i] < 0x10 ? " 0" : " ") + String(buffer[i], HEX); } out.toUpperCase(); out.replace(" ", ""); return out; } void resetLeds() { digitalWrite(OPEN_PIN, LOW); digitalWrite(ERROR_PIN, LOW); } void open() { Serial.println("OPEN!"); digitalWrite(OPEN_PIN, HIGH); delay(OPEN_DELAY); digitalWrite(OPEN_PIN, LOW); } void error() { Serial.println("ERROR!"); digitalWrite(ERROR_PIN, HIGH); delay(OPEN_DELAY); digitalWrite(ERROR_PIN, LOW); } void scanCard() { byte status; byte buffer[18]; int err = 0; byte size = sizeof(buffer); EthernetClient c; if (mfrc522.PICC_IsNewCardPresent()) { if (mfrc522.PICC_ReadCardSerial()) { const String ID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println("New tag read: " + ID); mfrc522.PICC_HaltA(); if (client.connect(server, port)) { timeout = millis() + 3000; client.println("OPEN:" + ID); delay(10); while(client.available() == 0) { if (timeout - millis() < 1000) { error(); goto close; } } int size; bool status; while((size = client.available()) > 0) { uint8_t* msg = (uint8_t*)malloc(size); size = client.read(msg,size); //Serial.write(msg, size); // 4F4B -> OK // 4E4F4B -> NOK status = dump_byte_array(msg, size) == "4F4B"; free(msg); } Serial.println(status ? "OK!" : "NOK!"); if (status) { open(); } else { error(); } close: client.stop(); } else { Serial.println("Connection Error"); error(); } } } } void setup() { resetLeds(); Serial.begin(9600); Serial.println("Setup ..."); // disable w5100 SPI pinMode(10, OUTPUT); digitalWrite(10, HIGH); SPI.begin(); mfrc522.PCD_Init(); if (Ethernet.begin(mac) == 0) { Serial.println("DHCP Error"); error(); while (true) {} } Serial.print("My IP: "); for (byte B = 0; B < 4; B++) { Serial.print(Ethernet.localIP()[B], DEC); Serial.print("."); } Serial.println(); Serial.println("Finish setup"); timeout = 0; } void loop() { resetLeds(); scanCard(); delay(200); }
Agora, só precisamos criar um servidor tcp simples com node para validar nossas tags NFC.
var net = require('net'); var LOCAL_PORT = 28001; var validTags = ['X3C86AD9']; var validateTag = function(tag) { return validTags.indexOf(tag) > -1; }; var server = net.createServer(function (socket) { console.log(socket.remoteAddress + ":" + socket.remotePort); socket.on('data', function(msg) { var out; [action, tag] = msg.toString().toUpperCase().trim().split(":"); console.log(action, tag); switch (action) { case 'OPEN': out = validateTag(tag) ? "OK" : "NOK"; console.log(out); socket.write(out); break; default: console.log("unknown action:", action); } socket.destroy(); }); }); server.listen(LOCAL_PORT, '0.0.0.0');
E isso é tudo. Aqui, um vídeo com o exemplo de trabalho
O código completo disponível na minha conta do github.
Referências sobre rfid e Arduino: aqui, aqui e aqui.
***
Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2017/06/12/nfc-tag-reader-with-arduino/