Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Componentes e Materiais

Leitor RFID Mifare MFRC522 (qualquer tipo SPI) 1
Arduino UNO (qualquer Arduino serve) 1
Módulo Ethernet ENC28J60 (código precisa modificação para outros módulos) 1
Jumpers (genéricos) 1
Protoboard (genérica) 1
Computador (qualquer um com internet) 1

Ferramentas e Máquinas Necessárias

Aplicativos e Serviços Online

Sobre o Projeto

Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Já pensou em adicionar um sistema de segurança ou monitoramento com tags/cartões RFID em sua casa e/ou escritório? Se chegou aqui, aposto que já viu como são caros: de $200 a $2000, MUITO CARO!? Pois bem, um amigo e eu decidimos fazer um sistema que custasse menos de $100 e fizesse mais do que apenas abrir uma porta. Este é o resultado: um leitor RFID Arduino habilitado para internet. Por $20 a mais pode abrir portas. O sistema foi projetado para rastrear alunos em nossa escola e esperamos que a escola aprove.

Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Pode parecer que leva muito tempo, mas isso só me levou cerca de 6 horas (porque tive problemas de energia), mas pode levar cerca de 30 minutos para configurar como o exemplo acima. Todo o código e imagens estão abaixo.

Antes de Começar (Necessário)

Antes de começar a ler cartões e enviá-los ao servidor Telnet/TCP, precisamos de algumas bibliotecas:

Coloque ambas as bibliotecas em Program Files(x86)/Arduino/Libraries/ e reinicie o Arduino IDE.

Hardware

  1. Arduino Nano (pode modificar código para seu dispositivo)
  2. MFRC522 com cartões MIFARE
  3. Jumpers (Macho-Macho, Macho-Fêmea)
  4. Módulo/shield Ethernet ENC28J60
  5. LED RGB
  6. Conversor AC-DC 3V ou 5V > 700mA

Configuração

  1. Conecte o Arduino à protoboard (se Nano ou Micro)
  2. Consulte online o pinout da sua placa para encontrar a configuração SPI (altere valores abaixo)
  3. Conecte pino 10 do Arduino (SS) ao SS ou CS do módulo Ethernet
  4. Conecte pino 12 (MISO) ao MISO do RFID e SO do Ethernet
  5. Conecte pino 11 (MOSI) ao MOSI do RFID e SI do Ethernet
  6. Conecte pino 13 (SCK) ao SCK do RFID e SCK do Ethernet
  7. Conecte pino 9 ao pino RST do RFID
  8. Conecte pino 8 ao pino SSN do RFID
  9. Conecte pino 5 ao LED verde, 4 ao azul, 3 ao vermelho
  10. Conecte seu conversor AC-DC ao + e - da protoboard
  11. Conecte o GND do Arduino ao conversor AC-DC
  12. Conecte VCC e GND de ambos RFID e Ethernet ao conversor AC-DC (LEMBRE-SE: ESTES DISPOSITIVOS SÃO APENAS 3V!!!!! não forneça 5V) Se houver problema, use resistores para baixar a tensão para 3V
  13. Conecte pino VCC do LED ao 3V do Arduino ou 3V do conversor AC-DC
  14. Conecte cabo Ethernet ao módulo e certifique-se que está na mesma rede do computador
  15. Conecte cabo USB do computador ao Arduino
  16. Conecte o computador à mesma rede

Modifique o Código para suas Necessidades

  1. O código está bem comentado, você pode modificar partes, mas uma coisa certa é o módulo Ethernet
  2. Endereço MAC pode ficar igual (a menos que planeje construir vários)
  3. Se usa rede 192.168.x.x pode manter o IP
  4. DNS pode ficar igual, só mude para 8.8.4.4 se necessário
Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522
  1. Execute ipconfig para encontrar seu gateway (padrão 192.168.1.1) (o código atual usa 192.168.1.5)
  2. Execute prompt de comando e digite ipconfig para descobrir o IP do seu computador
Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522
  1. Role para encontrar "SEND TO SERVER" e insira o IP do seu computador ou, se fez port forwarding no roteador, seu IP público
  2. CERTIFIQUE-SE DE TER PYTHON E RODAR O SERVIDOR (Lembre-se: é apenas um código de exemplo que usamos para apresentação na escola, o servidor Python já estava pronto e quase não modificado; você pode usar qualquer servidor Telnet/TCP)

Outro código que provavelmente precisará modificar:

Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Executando o Código

  1. Conecte o conversor AC-DC na tomada
  2. Certifique-se que o Arduino está conectado ao computador
  3. Certifique-se que ambos dispositivos estão na mesma rede
  4. Carregue seu código Arduino modificado (ou o meu se funcionar para você - quase nenhuma chance de não precisar modificar)
  5. Inicie seu script Python, C++ ou qualquer servidor Telnet/TCP na sua rede
  6. Reinicie o Arduino por segurança
  7. Espere a luz ficar azul e tente ler um cartão; se o servidor recebeu o ID do cartão, você está pronto
  8. Significado das cores:
    • Roxo/vermelho piscando = iniciando
    • Vermelho = erro (cartão em ângulo estranho e/ou servidor não respondeu a tempo)
    • Verde = sucesso (servidor respondeu "go", pode ler próximo cartão)
    • Azul = aguardando/carregando (esperando cartão ou resposta)
  9. Se o Arduino travar e demorar mais de 30s para mostrar luz vermelha: o módulo Ethernet não conseguiu conectar ao servidor. Causas possíveis: Arduino sem energia suficiente (módulo Ethernet luta para enviar pacote), servidor do computador não rodando, Arduino e computador não na mesma rede.
  10. Se o Arduino travar, tente:
    • Desligue firewall do Windows
    • Nas configurações avançadas do firewall, permita entrada/saída na porta 23
    • Faça port forwarding do roteador para seu computador na porta 23
    • Se usa Wi-Fi, conecte Arduino direto no roteador e computador no mesmo
    • Compre conversor AC-DC mais robusto
    • Senão, talvez tenha digitado IP ou endereço de conexão errado
  11. Qualquer problema, contate: smerkousdavid@gmail.com
  12. PRONTO PARA USAR!!!
Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Lembre-se: não há código para sistema de fechadura de porta, pois não tenho uma. Isso significa que você terá que adicionar código se quiser usar não apenas como rastreamento, mas como sistema de fechadura com rastreamento.

Código

Código do Arduino (C/C++)

Software que vai no Arduino, quase pronto. Ajuste gateway, IP, gateway, endereço MAC e DNS.

/* 
 * ---------------------------------- 
 * MFRC522 Arduino 
 * Reader/PCD Nano v3 
 * Signal Pin Pin 
 * ---------------------------------- 
 * RST/Reset RST D9 
 * SPI SS NSS D10 
 * SPI MOSI MOSI D11 
 * SPI MISO MISO D12 
 * SPI SCK SCK D13 
 */ 
// PRIMEIRA BIBLIOTECA: UIPEthernet, SEGUNDA: MFRC522 - AMBAS NO GITHUB
#include <UIPEthernet.h>
#include <SPI.h> 
#include <MFRC522.h> 

#define RST_PIN 9 
#define SS_PIN 8 // USANDO 8 PARA RFID POIS ETHERNET USA 10

byte sector = 0;
byte blockAddr = 0;
byte trailerBlock = 1;
int red = 3;
int blue = 4;
int green = 5;

EthernetClient client;
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
signed long timeout;

void setup() {
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
  Reset();
  Serial.begin(9600);
  SPI.begin();
  
  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  IPAddress mip(192,168,1,160);
  IPAddress mdns(8,8,8,8);
  IPAddress mgate(192,168,1,5);
  IPAddress msubnet(255,255,255,0);
  Ethernet.begin(mac, mip, mdns, mgate, msubnet);
  Serial.println("Conexao bem sucedida");
  
  for(int t = 255; t > 0; t--) {
    analogWrite(red, t);
    delay(10);
  }
  
  mfrc522.PCD_Init();
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  Serial.println(F("Aproxime um Cartao"));
  dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
  timeout = 0;
  delay(2000);
  Reset();
}

void loop() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    digitalWrite(blue, LOW);
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) return;
  digitalWrite(blue, HIGH);
  
  byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 
       piccType != MFRC522::PICC_TYPE_MIFARE_1K && 
       piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Error();
    return;
  }
  
  byte status;
  byte buffer[18];
  byte size = sizeof(buffer);
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    Error();
    return;
  }
  
  status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Read() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    Error();
  }
  
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  
  // ENVIAR PARA SERVIDOR
  if (client.connect(IPAddress(192,168,1,100), 23)) {
    timeout = millis() + 1000;
    Serial.println("Cliente conectado");
    const String ID = dump_byte_array(buffer, size);
    client.println(ID);
    Serial.println("enviado: " + ID);
    delay(10);
    while(client.available() == 0) {
      if (timeout - millis() < 0) goto close;
    }
    int size;
    while((size = client.available()) > 0) {
      uint8_t* msg = (uint8_t*)malloc(size);
      size = client.read(msg, size);
      Serial.write(msg, size);
      if(size == sizeof("g") - 1) {
        Pass();
      } else {
        Error();
      }
      free(msg);
    }
    close:
    client.stop();
  } else {
    Serial.println("Nao conseguiu conectar ao Servidor");
    Error();
  }
  Reset();
}

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 Error() {
  digitalWrite(red, LOW);
  delay(700);
  digitalWrite(red, HIGH);
}

void Pass() {
  digitalWrite(green, LOW);
  delay(700);
  digitalWrite(green, HIGH);
}

void Reset() {
  digitalWrite(red, HIGH);
  digitalWrite(blue, HIGH);
  digitalWrite(green, HIGH);
}

Código do Servidor de Exemplo (Python)

Exemplo completo de como usar o servidor:

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        """
        SQL STUFF HERE
        if(self.data == SQL NAME or something) {
            self.request.sendall("g") //send good
            //INSERT TIME AND LOCATION INTO SQL HERE
        } else {
            self.request.sendall("bb") //send bad
        }
        """
        self.request.sendall("g")

if __name__ == "__main__":
    HOST, PORT = "", 23
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

Código Atualizado no GitHub

Obtenha o código mais atualizado: GitHub InternetRFIDTags

Esquemáticos

O circuito é simples, então fiz uma foto com a fiação:

Leitor RFID de Cartão Habilitado para Rede com Arduino, Ethernet ENC28J60 e MFRC522

Processo de manufatura

  1. A Indústria de Cartões de Saudação: História, Produção e Tendências Futuras
  2. Cartão de Crédito: História, Design, Fabricação e Tendências Futuras
  3. Fecheadura RFID Segura com Arduino e RC522 (MIFARE 13,56 MHz)
  4. Crie uma Fechadura RFID Segura com Arduino – Guia Passo a Passo
  5. Sistema de Presença RFID Confiável com Arduino e Python
  6. Construa um Spybot Controlado por Bluetooth com Arduino
  7. FlickMote: Controle Remoto IR por Gestos para Casa Inteligente
  8. DIY Arduino TV B-Gone: Controle Remoto Universal para Todas as TVs
  9. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  10. Leitor de Disquetes Amiga Baseado em Arduino: Recuperação de Dados Open-Source e Acessível