RFID-modul
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:
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:
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.
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.
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).
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.
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
- ↑ Datablad til EM4095 RFID-kreds
- ↑ 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