Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een netwerk-ingeschakelde RFID-kaartlezer met Arduino, ENC28J60 Ethernet en MFRC522

Onderdelen en benodigdheden

  • Mifare MFRC522 RFID-lezer – 1 stuk (elke SPI RFID-lezer werkt)
  • Arduino UNO – 1 stuk (elke Arduino werkt)
  • ENC28J60 Ethernet-module – 1 stuk (code aanpassen voor andere modules)
  • Jumper wires (generiek) – 1 set
  • Breadboard (generiek) – 1 stuk
  • Computer – 1 stuk (met internetverbinding)

Benodigde tools en machines

  • Schaar (of kabelklep)

Apps en online diensten

  • PyCharm (voor Python-server)
  • Arduino IDE

Over dit project

Heb je ooit gedacht aan een RFID-tag/kaart beveiligings- of monitoringsysteem voor thuis of kantoor? Als je hier bent, heb je waarschijnlijk al gezien hoe duur ze zijn: $200 tot $2000, TE DUUR! Een vriend en ik besloten een systeem te bouwen onder de $100 dat meer kan dan alleen een deur openen. Een internet-ingeschakelde Arduino RFID-lezer die voor $20 extra een deur kan openen. Dit systeem was ontworpen om leerlingen op onze middelbare school te tracken en we hopen dat de school het goedkeurt.

Voordat we beginnen (noodzakelijk)

Voordat we kaarten kunnen scannen en naar onze Telnet/TCP-server sturen, hebben we bibliotheken nodig:

Plaats beide in Program Files(x86)/Arduino/Libraries/ en herstart Arduino IDE.

Hardware

  1. Arduino Nano (code aanpassen voor andere boards)
  2. MFRC522 met MIFARE-kaarten
  3. Jumper wires (Male-Male, Male-Female)
  4. ENC28J60 Ethernet-module/shield
  5. RGB LED
  6. 3V OF 5V AC-DC converter (>700mA)

Opstelling

  1. Arduino op breadboard (als Nano/Micro)
  2. Zoek pinout van je board voor SPI-pinnen (waarden in code aanpassen)
  3. Arduino pin 10 (SS) → Ethernet module SS/CS
  4. Arduino pin 12 (MISO) → RFID MISO en Ethernet SO
  5. Arduino pin 11 (MOSI) → RFID MOSI en Ethernet SI
  6. Arduino pin 13 (SCK) → RFID SCK en Ethernet SCK
  7. Arduino pin 9 → RFID RST
  8. Arduino pin 8 → RFID SSN
  9. Arduino pin 5 → Groene LED, 4 → Blauwe, 3 → Rode
  10. AC-DC converter aan + en - op breadboard
  11. Arduino GND aan AC-DC GND
  12. VCC en GND van RFID en Ethernet aan AC-DC (LET OP: DEZE APPARATEN ZIJN ALLEEN 3V!!!! Geen 5V aanbieden. Bij problemen weerstanden gebruiken om spanning te verlagen)
  13. LED VCC aan Arduino 3V of AC-DC 3V
  14. Ethernetkabel aan module, zelfde netwerk als computer
  15. USB-kabel computer → Arduino
  16. Computer op zelfde netwerk

Code aanpassen aan je behoeften

  1. Code is goed gecommentarieerd. Een zekerheid: de Ethernet-module instellingen.
  2. MAC-adres kan gelijk (tenzij je meerdere bouwt)
  3. Bij 192.168.x netwerk kan IP gelijk
  4. DNS kan gelijk (alleen wijzigen naar 8.8.4.4 indien nodig)
  5. Voer ipconfig uit voor gateway (standaard 192.168.1.1, code heeft 192.168.1.5)
  6. Vind je computer IP met ipconfig
  7. In code: zoek "SEND TO SERVER", vul IP van je computer in (of publieke IP als port-forwarded)
  8. Zorg dat Python draait met de server (voorbeeldcode voor presentatie, elke Telnet/TCP-server werkt)

Code draaien

  1. AC-DC aan stopcontact
  2. Arduino aan computer (USB)
  3. Beide op zelfde netwerk
  4. Arduino code flashen (aangepaste of originele)
  5. Python/C++ server starten op netwerk
  6. Arduino herstarten voor de zekerheid
  7. Wacht tot licht blauw wordt, scan kaart. Als server ID ontvangt: klaar!
  8. LED betekenissen:
    • Paars/vervaagend rood = opstarten
    • Rood = fout (kaart scheef, server reageert niet)
    • Groen = OK (server reageert met "go")
    • Blauw = wachten/laden (op kaart of reactie)
  9. Als Arduino >30s lagaard voordat rood licht: Ethernet-module kan niet met server verbinden. Mogelijke oorzaken: ontoereikende stroom, server niet draaiend, niet op zelfde netwerk.
  10. Oplossingen: Windows firewall uit, poort 23 toestaan, router port-forward poort 23, bedradige verbinding, zwaardere AC-DC adapter, IP-adressen controleren.
  11. Anders contact: smerkousdavid@gmail.com

LET OP: Er zit geen code voor de deurslot-systeem in, omdat ik er geen heb. Je moet zelf code toevoegen als je dit niet alleen als trackingsysteem maar ook als deurslot wilt gebruiken.

Code

Arduino-code (C/C++)

/* 
 * MFRC522 Arduino Reader/PCD Nano v3
 * Signaal Pin Pin
 * RST/Reset RST D9
 * SPI SS NSS D10
 * SPI MOSI MOSI D11
 * SPI MISO MISO D12
 * SPI SCK SCK D13
 */
#include <UIPEthernet.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9
#define SS_PIN 8 // 8 voor RFID want Ethernet gebruikt 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("Succesful connection");
  
  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("Scan a Card"));
  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();
  
  // NAAR SERVER STUREN
  if (client.connect(IPAddress(192,168,1,100), 23)) {
    timeout = millis() + 1000;
    Serial.println("Client connected");
    String ID = dump_byte_array(buffer, size);
    client.println(ID);
    Serial.println("sent :" + 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("Couldn't connect to Server");
    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);
}

Voorbeeld servercode (Python)

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()

Bijgewerkte code op GitHub

Meest recente versie: GitHub repository

Schema's

De schakeling is simpel, foto met bedrading:

Bouw een netwerk-ingeschakelde RFID-kaartlezer met Arduino, ENC28J60 Ethernet en MFRC522

Productieproces

  1. De Kaartjesindustrie: Geschiedenis, Productie en Toekomsttrends
  2. Creditcard: Geschiedenis, Ontwerp, Productie en Toekomsttrends
  3. Veilige Arduino RFID-deurslot bouwen met RC522 (MIFARE 13,56 MHz)
  4. Maak een Veilige Arduino RFID Slot – Stapsgewijze Handleiding
  5. Betrouwbaar Arduino RFID Aanwezigheidssysteem Aangedreven door Python
  6. Bluetooth-gecontroleerde Arduino Spybot bouwen
  7. FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
  8. DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
  9. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  10. Find Me: Slimme Item Locator met Arduino en Bluetooth
  11. Arduino-gebaseerde Amiga-floppylezer: Goedkope open-source dataherstel