RFID-modul

Fra HTX Arduino
Spring til navigation Spring til søgning

Selve den grundlæggende teknik bag RFID en beskrevet på siden RFID

Arduino RFID

Til Arduino har vi 4 forskellige færdigkøbte RFID moduler. to der arbejder på 125kHz og to der arbejder på 13,56MHz.

Umiddelbart er de to moduler til 125kHz nemmest at arbejde med, da de blot sender det kode der er hard-kodet ind i RFID-tagget.

Modul RDM6300 til 125 kHz læsning

Modulet er relativt simpelt at arbejde med, da det kun kan læse RFID-tags. Det der kan læses i et RFID-tag er en 5 bytes kode, der gerne skulle være unik for netop dette TAG. De 5 byte sendes som hexadecimale tal, så der sendes to karakterer for hver byte der er i adressen.

RFID-læseren skal forbindes med Arduinoen og behøver kun Gnd, +5V og TX, der skal have forbindelse til et frit databen (2-13).

RFID-læseren ser ud som vist herunder:
RFID-læse af typen RDM6300

Det giver en ASCII-streng af følgende format:

Karakter Indhold Betydning
0 0x02 Start-of-Text
1-2 Hex-byte 2 ASCII karakterer 0-9 og A-F, der angiver en byte
3-4 Hex-byte 2 ASCII karakterer 0-9 og A-F, der angiver en byte
5-6 Hex-byte 2 ASCII karakterer 0-9 og A-F, der angiver en byte
7-8 Hex-byte 2 ASCII karakterer 0-9 og A-F, der angiver en byte
9-10 Hex-byte 2 ASCII karakterer 0-9 og A-F, der angiver en byte
11-12 CS-byte En byte, der er XOR-checksum af de ovenstående
13 0x03 End-of-Text

Software til læsning fra DRM6300 RFID-læser

RFID-læseren tilsluttes en Arduino, så de data RFID-læseren sender ud, når den læser et RFID-tag, kan læses af Arduinoen.

Til dette formål anvendes Software Serial modulet, der kommer med som standard i Arduino installationen.

Software Eksemplet kan hentes som RFID-2 i denne denne ZIP-fil, og koden ser ud som følger:

// RFID modul testet på Programmerings Shield
// Testen er foretaget med RDM6300
//
// Modificeret til at have LCD på, og den kan genkende 3 RFID chips Rød, Grøn og Blå
// Bent Arnoldsen 2023

#include <SoftwareSerial.h>

// Rx og Tx sidder modsat på ATS125KRW i forhold til RDM6300
#define RX_pin 8
#define TX_pin 9

SoftwareSerial rfid(RX_pin, TX_pin); // RX, TX

String modtaget = "";
String valid [] = {
  "11000E76AFC6",
  "0F005BC253C5",
  "0F007CEE65F8"
};

int antal = 3;

int counts [] = {0, 0, 0};

String tekst [] = {
  "Red    ",
  "Green  ",
  "Blue   ",
  "-----       "
};

unsigned long lastRec = 0;

#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 13, en = 12, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int tid = 0;
int startTid = 500;
int stopBeep = 490;

boolean alarm = false;

void setup() {
  Serial.begin(9600);
  rfid.begin(9600);
  Serial.println("RFID reader Serial Monitor");
  Serial.println("RDM6300");
  Serial.println();
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("RFID Reader!");
  lcd.setCursor(0,1);
  lcd.print("RDM6300");
  delay(2000);
  pinMode(10, OUTPUT);
}

void loop() {
  if (rfid.available()) {
    byte ch = rfid.read();
    // Serial.print(ch);
    // Serial.print(" ");
    if (ch == 2) {  // Start karakter
      modtaget = "";
    } else if (ch == 3) {  // Slut karakter
      // RDM6300 sender flere gange, når den holdes på med ca. 150 ms interval
      // Derfor skal der være gået mere end 500 ms siden den sidst modtagne, for at godkende
      if ((millis() - lastRec) > 500) {
        Serial.print("Modtaget ");
        Serial.println(modtaget);
        boolean validRec = false;
        for (int n = 0; n < antal; n++) {  // Løb alle valide igennem
          if (modtaget.equals(valid[n])) {
            Serial.println("Godkendt");  // Godkend hvis den findes
            Serial.println(tekst[n]);
            lcd.setCursor(0,1);
            lcd.print(tekst[n]);
            counts[n]++;
            lcd.print(counts[n]);
            tid = startTid;
            validRec = true;
            digitalWrite(10, HIGH);
          }
        }
        if (! validRec) {
            lcd.setCursor(0,1);
            lcd.print(tekst[antal]);
        }
      }
      lastRec = millis();
    } else {
      modtaget += char(ch);  // Her opsamles karaktererne fra RFID'en
    }
  }
  delay(10);   // Vi tæller 0,01 sekund ad gangen
  if (tid > stopBeep) {  // Pin 10 kan sættes til en lydgiver, der så kommer med et beep
    tid = tid - 1;
    if (tid == stopBeep) {
      digitalWrite(10, LOW);
      tid = 0;
    }
  }
}

Koden er opbygget på følgende måde:

  • Først angives hvordan software serial er defineret og sluttet til - man kan nøjes med at forbinde ben 8 til RFID-læserens TX-ben - Ben 9 vil stadig være optaget på Arduinoen.
  • Der angives variabler til modtagelsen og defineres 3 gyldige RFID-tags og hvad de skal skrive i displayet.
  • Der angives hvordan et LCD display er tilsluttet, så Arduinoen kan skrive resultater ud her.
  • I setup() tilsluttes en seriel port til debug og den serielle port rfid til modtagelse, og der skrives ud til debug og til displayet.
  • I loop() tjekkes på om der kommer en karakter fra RFID'en, og hvis der gør, så læses den.
  • Den modtagne karakter håndteres på 3 forskellige måder.
  • Er karakteren 2, så gøres klar til modtagelse af et nyt tag ved at slette det modtagne.
  • Er karakteren 3, så er det slutningen, og her håndteres alle muligheder for modtagelse, som beskrevet efterfølgende.
  • Alle andre karakterer samles op i modtage-strengen.
  • Ved afslutningen af strengen kontrolleres først om det er mere end et halvt sekund siden den sidste streng blev modtaget, ellers tolkes det som om der er samme RFID-tag man modtager igen, og det ignoreres. Hvis det er et nyt tag skrives en testudskrift. Herefter løbes de forskellige valide tags igennem, og hvis det er fundet, så skrives det ud, både som testudskrift og på displayet - det er her man skal kode den funktionalitet ind man ønsker.
  • Hvis der ikke er fundet et validt RFID-tag, så skrives en fejlmarkering i displayet.
  • Den sidste del af koden håndterer den udgang der kan anvendes til en lydgiver eller en LED, som markerer at RFID-tagget er genkendt.

Modul ATS125KRW til 125 kHz læsning

Modulet er relativt simpelt at arbejde med, da det kun kan læse RFID-tags. Det der kan læses i et RFID-tag er 10-cifret decimaltal, der gerne skulle være unik for netop dette TAG.

RFID-læseren skal forbindes med Arduinoen og behøver kun Gnd, +5V og TX, der skal have forbindelse til et frit databen (2-13).

RFID-læseren ser ud som vist herunder:
125 kHz RFID læser (vist med spole, kort og beeper

Link til leveradør

Det giver en ASCII-streng af følgende format:

Karakter Indhold Betydning
0-9 Decimal-tag 10 ASCII karakterer 0-9, der angiver et decimaltal
10 0x0D En karakter, der betyder Carridge Return
13 0x0A En karakter, der betyder Line Feed

Software til læsning fra ATS125KRW RFID-læser

RFID-læseren tilsluttes en Arduino, så de data RFID-læseren sender ud, når den læser et RFID-tag, kan læses af Arduinoen.

Til dette formål anvendes Software Serial modulet, der kommer med som standard i Arduino installationen.

Software Eksemplet kan hentes som RFID-1 i denne denne ZIP-fil, og koden ser ud som følger:

// RFID modul testet på Programmerings Shield
// Testen er foretaget med ATS125KRW
//
// Modificeret til at have LCD på, og den kan genkende 3 RFID chips Rød, Grøn og Blå
// Bent Arnoldsen 2023

#include <SoftwareSerial.h>

// Rx og Tx sidder modsat på ATS125KRW i forhold til RDM6300
#define RX_pin 9
#define TX_pin 8

SoftwareSerial rfid(RX_pin, TX_pin); // RX, TX

String modtaget = "";
String valid [] = {
  "0000947887",
  "0006013523",
  "0008187493"
};

int antal = 3;

int counts [] = {0, 0, 0};

String tekst [] = {
  "Red      ",
  "Green    ",
  "Blue     ",
  "-----       "
};

#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 13, en = 12, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int tid = 0;
int startTid = 500;
int stopBeep = 490;

boolean alarm = false;

void setup() {
  Serial.begin(9600);
  rfid.begin(9600);
  Serial.println("RFID reader Serial Monitor");
  Serial.println("ATS125KRW");
  Serial.println();
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("RFID Reader!");
  lcd.setCursor(0,1);
  lcd.print("ATS125KRW");
  delay(2000);
  pinMode(10, OUTPUT);
}

void loop() {
  if (rfid.available()) {
    byte ch = rfid.read();
    // Serial.print(ch);
    // Serial.print(" ");
    if (ch == 10) {  // Sidste afsluttende karakter
      modtaget = "";
    } else if (ch == 13) {  // Slut karakter
      // Modulet sender kun resultatet en gang i hver aflæsning, så vi kan bruge resultatet direkte
      Serial.print("Modtaget ");
      Serial.println(modtaget);
      boolean validRec = false;
      for (int n = 0; n < antal; n++) {  // Løb alle valide igennem
        if (modtaget.equals(valid[n])) {
          Serial.println("Godkendt");  // Godkend hvis den findes
          Serial.println(tekst[n]);
          lcd.setCursor(0,1);
          lcd.print(tekst[n]);
          counts[n]++;
          lcd.print(counts[n]);
          tid = startTid;
          validRec = true;
          digitalWrite(10, HIGH);
        }
      }
      if (! validRec) {
          lcd.setCursor(0,1);
          lcd.print(tekst[antal]);
      }
    } else {
      modtaget += char(ch);  // Her opsamles karaktererne fra RFID'en
    }
  }
  delay(10);   // Vi tæller 0,01 sekund ad gangen
  if (tid > stopBeep) {
    tid = tid - 1;
    if (tid == stopBeep) {
      digitalWrite(10, LOW);
      tid = 0;
    }
  }
}

Koden er opbygget på følgende måde:

  • Først angives hvordan software serial er defineret og sluttet til - man kan nøjes med at forbinde ben 9 til RFID-læserens TX-ben - Ben 8 vil stadig være optaget på Arduinoen.
  • Der angives variabler til modtagelsen og defineres 3 gyldige RFID-tags og hvad de skal skrive i displayet.
  • Der angives hvordan et LCD display er tilsluttet, så Arduinoen kan skrive resultater ud her.
  • I setup() tilsluttes en seriel port til debug og den serielle port rfid til modtagelse, og der skrives ud til debug og til displayet.
  • I loop() tjekkes på om der kommer en karakter fra RFID'en, og hvis der gør, så læses den.
  • Den modtagne karakter håndteres på 3 forskellige måder.
  • Er karakteren 10 (0x0A), så gøres klar til modtagelse af et nyt tag ved at slette det modtagne. Det er godt nok den sidst modtagne karakter, men det der skal håndteres er blevet håndteret ved modtagelse af karakter 13
  • Er karakteren 13 (0x0D), så er det slutningen af informationen, og her håndteres alle muligheder for modtagelse, som beskrevet efterfølgende.
  • Alle andre karakterer samles op i modtage-strengen.
  • Denne RFID-modtager sender kun informationen én gang, så der skrives en testudskrift. Herefter løbes de forskellige valide tags igennem, og hvis det er fundet, så skrives det ud, både som testudskrift og på displayet - det er her man skal kode den funktionalitet ind man ønsker.
  • Hvis der ikke er fundet et validt RFID-tag, så skrives en fejlmarkering i displayet.
  • Den sidste del af koden håndterer den udgang der kan anvendes til en lydgiver eller en LED, som markerer at RFID-tagget er genkendt.

Fleksibelt modul til 13,56 MHz

Ikke testet.

Modulet skulle være meget fleksibelt, da man kan kommunikere med Serielt interface, IIC og SPI bus.

Der skulle være udviklet et bibliotek, så Arduino kan kommunikere med modulet ved hjælp af SPI.

RFID og NFC modul

Link til leveradør

Link til dokumentation

Modul til læsning og skrivning på 13,56 MHz RFID

Modulet er noget besværligt at kommunikere med, da det anvender 106 kBaud seriel kommunikation.

Mifare RFID-modul

Link til Leverandør

RFID-modul baseret på EM4095

Modulet RFID er lavet til at læse et RFID-tag med og aflevere det i et array.

Modulet består af Hardware til modulet og Software til modulet (endnu ikke implementeret).

Totaldiagram over RFID-modulet

Print med SMD-chip til at styre de 125kHz sending/modtagelse

Boardet er baseret på kredsen[1], og kredsløbet vist til højre er baseret på en application note[2].

Selve boardet er lagt ud i EAGLE og filerne kan hentes i Denne ZIP-fil.

Software modulet RFID.jal

Fordi der er flere måder at læse RFID tags vha. PIC, er der i zip-filen flere forskellige filer. Alle filerne forsøger at læse tagget og skrive værdien på et LCD display. Hver fil bruger dens egen metode, men forsøger at læse et tag og skrive indholdet ud på et LCD-display.

media:RFID-modul.zip

Interface fil til RFID-int

Den ene metode der er anvendt er at basere sig på interrupt, så kredsen sender et signal til PIC'en, når der er aflæst et RFID-tag. Signalet til PIC'en går ind i et ben der håndterer interrupt, så læsningen sker i en interrupt-rutine.

Interface fil til RFID-wait

Den anden metode baserer sig på polling, hvilket går ud på at mail-loopet jævnligt tjekker om der er aflæst et RFID-tag ved at læse status i kredsen, og når kredsen har aflæst et gyldigt RFID-tag, så læser softwaren det nede i kredsen.

Anvendelsen af RFID modulet

Et RFID system består af en sender/modtager, der kan sende et signal ud, og modtage et svar fra et RFID tag. Til et system hører der normalt flere forskellige tags, som indeholder hver sin unikke kode, så man kan genkende de enkelte tags. Når et RFID tag modtager et signal på den frekvens den arbejder på, så svarer den tilbage med et signal på samme frekvens. I svaret ligger den kode som tagget indeholder, som sender/modtageren kan aflæse. Nogle eksempler på hvor man finder RFID er i Bro-Bizz'er, hvor man har et tag i bilens forrude og betalingsanlægget aflæser, og i mobiltelefoner, der kan aflæse forskellige tags bygget til dem.

Tags er opdelt i aktive tags og passive tags - Aktive har en indbygget strømkilde og rækker længere, men hvis strømmen til tagget forsvinder, kan man ikke bruge det. Passive tags bruger derimod energi fra signalet der bliver sendt, som tagget så bruger til at sende et signal retur - Det betyder, at tagget ikke skal bruge nogen strømkilde, men har en kortere rækkevide fordi den energi der er i signalet er meget lille

RFID-koden skrives specielt i Manchesterkode (Som beskrevet på RFID), hvilket gør det lidt besværligt at aflæse koden i PIC'en.

Der ligger noget af teorien bag RFID beskrevet generelt.

Referencer

  1. Datablad til EM4095 RFID-kreds
  2. Application note til EM4095 RFID-kreds
Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX

Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display