Pentru a face si eu teste cu placa Arduino, am achizitionat de pe ebay un pachet de identificare radio compus dintr-un receptor RFID-RC522, o cartela dreptunghiulara (tip card bancar) si una tip breloc pentru chei, care lucreaza pe frecventa de 13,56Mhz.
Conectarea receptorului RFID-RC522 cu placa de dezvoltare Arduino se face in modul SPI, de forma:
Pentru experimente, am testat doua librarii: intai libraria MRFC522 si, apoi libraria L26_Arduino.
Schema de conectare dintre placa Arduino si receptorul RFID este simpla, iar alimentarea de face de la 3,3V:
Dupa incarcarea diverselor sketch-uri, am obtinut:
Am facut mici modificari ale unuia din sketch-urile incluse in librarie, in sensul de a identifica una din cartele:
Sketch-ul modificat de mine este:
// https://github.com/LeadergDotCom/L26_Arduino - broken now..
// https://github.com/beatname/L26_Arduino
// http://nicuflorica.blogspot.com/
// http://arduinotehniq.blogspot.com/
/*
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN,RST_PIN);
int serNum[5];
int ics = 0; // number of card putting ;D
void setup(){
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop(){
if(rfid.isCard()){
ics = ics + 1;
if(rfid.readCardSerial()){
Serial.print("secventa ");
Serial.print(ics);
Serial.print(" si cod card = ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[4],DEC);
Serial.println("");
Serial.println("---------");
if ((rfid.serNum[0]==36) && (rfid.serNum[1]==192)
&& (rfid.serNum[2]==166) && (rfid.serNum[3]==171)
&& (rfid.serNum[4]==233))
{Serial.println("NICUUUUU");
Serial.println("---------");
}
}
}
rfid.halt();
delay(500);
}
Am realizat un film cu un sketch putin modificat pentru a identifica cele 2 cartele, ca fiind cartela principala sau secundara; filmuletul se numeste RFID-RC522 si Arduino:
Sketch-ul scris de mine, combina sketch-ul anterior, cu partea de afisaj LCD1602 cu interfata i2c:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // or 0x27
// https://github.com/LeadergDotCom/L26_Arduino - broken now
// https://github.com/beatname/L26_Arduino
// http://nicuflorica.blogspot.com/
// http://arduinotehniq.blogspot.com/
/*
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN,RST_PIN);
int serNum[5];
int ics = 0; // number of card putting ;D
void setup(){
Serial.begin(9600);
SPI.begin();
rfid.init();
lcd.init();
lcd.backlight(); //enciende la iluminacion
lcd.setCursor(2, 0);
lcd.print("RFID control");
lcd.setCursor(3, 1);
lcd.print("by niq_ro");
delay(2000);
}
void loop(){
if(rfid.isCard()){
ics = ics + 1;
if(rfid.readCardSerial()){
Serial.print("secventa ");
Serial.print(ics);
Serial.print(" si cod card = ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[4],DEC);
Serial.println("");
Serial.println("---------");
if ((rfid.serNum[0]==36) && (rfid.serNum[1]==192)
&& (rfid.serNum[2]==166) && (rfid.serNum[3]==171)
&& (rfid.serNum[4]==233))
{Serial.println("Salut Nicu!");
Serial.println("---------");
lcd.setCursor(0, 1);
lcd.print("cheie principala");
}
if ((rfid.serNum[0]==50) && (rfid.serNum[1]==160)
&& (rfid.serNum[2]==75) && (rfid.serNum[3]==181)
&& (rfid.serNum[4]==108))
{Serial.println("Salut Nicu! Ai cartela de rezerva!");
Serial.println("---------");
lcd.setCursor(0, 1);
lcd.print("cheie secundara ");
}
}
}
rfid.halt();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" ");
}
Am realizat si pentru aceasta varianta un filmulet numit RFID-RC522, Arduino si afisaj LCD1602 pe i2c: iar sketch-ul va fi:
17.10.2014 Pentru a putea face un sistem de acces pentru mai multe persoane, am mai cumparat chei de rezerva de pe ebay.#include <Wire.h>
//#include <LiquidCrystal_I2C.h>// include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // https://github.com/LeadergDotCom/L26_Arduino - broken now// https://github.com/beatname/L26_Arduino // http://nicuflorica.blogspot.com/ // http://arduinotehniq.blogspot.com/ /* * Read a card using a mfrc522 reader on your SPI interface * Pin layout should be as follows (on Arduino Uno): * MOSI: Pin 11 / ICSP-4 * MISO: Pin 12 / ICSP-1 * SCK: Pin 13 / ISCP-3 * SS: Pin 10 * RST: Pin 9 */ #include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN,RST_PIN); int serNum[5]; int ics = 0; // number of card putting ;D void setup(){ Serial.begin(9600); SPI.begin(); rfid.init(); lcd.begin(16,2); lcd.setCursor(2, 0); lcd.print("RFID control"); lcd.setCursor(3, 1); lcd.print("by niq_ro"); delay(2000); } void loop(){ if(rfid.isCard()){ ics = ics + 1; if(rfid.readCardSerial()){ Serial.print("secventa "); Serial.print(ics); Serial.print(" si cod card = "); Serial.print(rfid.serNum[0],DEC); Serial.print(" "); Serial.print(rfid.serNum[1],DEC); Serial.print(" "); Serial.print(rfid.serNum[2],DEC); Serial.print(" "); Serial.print(rfid.serNum[3],DEC); Serial.print(" "); Serial.print(rfid.serNum[4],DEC); Serial.println(""); Serial.println("---------"); if ((rfid.serNum[0]==36) && (rfid.serNum[1]==192) && (rfid.serNum[2]==166) && (rfid.serNum[3]==171) && (rfid.serNum[4]==233)) {Serial.println("Salut Nicu!"); Serial.println("---------"); lcd.setCursor(0, 1); lcd.print("cheie principala"); } if ((rfid.serNum[0]==50) && (rfid.serNum[1]==160) && (rfid.serNum[2]==75) && (rfid.serNum[3]==181) && (rfid.serNum[4]==108)) {Serial.println("Salut Nicu! Ai cartela de rezerva!"); Serial.println("---------"); lcd.setCursor(0, 1); lcd.print("cheie secundara "); } } } rfid.halt(); delay(500); lcd.setCursor(0, 1); lcd.print(" "); }
25.11.2014
Deoarece am avut o solicitare de la Gzregorz din Polonia pentru a modifica sketch-ul pentru a actiona un releu timp de 10 secunde, mi-am facut timp si a rezultat urmatorul sketch pentru a conecta un modul cu releu pe pinul D8:
// control acces by niq_ro with 10 second time acses
#include <Wire.h>
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// https://github.com/LeadergDotCom/L26_Arduino - broken now
// https://github.com/beatname/L26_Arduino
// http://nicuflorica.blogspot.com/
// http://arduinotehniq.blogspot.com/
/*
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN,RST_PIN);
int serNum[5];
int ics = 0; // number of card putting ;D
int releu = 8; // relay is at D8
void setup(){
Serial.begin(9600);
SPI.begin();
rfid.init();
lcd.begin(16,2);
lcd.setCursor(2, 0);
lcd.print("RFID control");
lcd.setCursor(3, 1);
lcd.print("by niq_ro");
delay(2000);
pinMode(releu, OUTPUT);
digitalWrite(releu, LOW); // relay is OFF
}
void loop(){
if(rfid.isCard()){
ics = ics + 1;
if(rfid.readCardSerial()){
Serial.print("secventa ");
Serial.print(ics);
Serial.print(" si cod card = ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[4],DEC);
Serial.println("");
Serial.println("---------");
if ((rfid.serNum[0]==36) && (rfid.serNum[1]==192)
&& (rfid.serNum[2]==166) && (rfid.serNum[3]==171)
&& (rfid.serNum[4]==233))
{Serial.println("Salut Nicu!");
Serial.println("---------");
lcd.setCursor(0, 1);
lcd.print("cheie principala");
digitalWrite(releu, HIGH); // relay is ON
delay(10000); //
}
if ((rfid.serNum[0]==50) && (rfid.serNum[1]==160)
&& (rfid.serNum[2]==75) && (rfid.serNum[3]==181)
&& (rfid.serNum[4]==108))
{Serial.println("Salut Nicu! Ai cartela de rezerva!");
Serial.println("---------");
lcd.setCursor(0, 1);
lcd.print("cheie secundara ");
digitalWrite(releu, HIGH); // relay is ON
delay(10000); //
}
}
}
rfid.halt();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite(releu, LOW); // relay is OFF
}
Filmuletul facut de Gzregorz este:
Postare de Grzegorz Ka.
Salut, am si eu acelasi sistem de RFID, mai putin partea de programare care nu este I2C si RFID PN532, si as vrea sa stiu daca stii cum pot face ca pentru fiecare cheie care activeaza sa se salveze in eeprom pe o limita de X zile.
RăspundețiȘtergereMultumesc.
poti, dar mai bine pui date pe card SD in format csv si apoi deschizi cu Excel..
ȘtergereBună ziua Nicu FLORICA,
RăspundețiȘtergereVă mulțumim pentru partajarea cunoștințele.
Sunt un student de electronice. Trebuie să fac pentru controlul meu de acces acasă pentru 6 persoane, am nevoie pentru fiecare card (etichete) un nume de 8 caractere asociate cu fiecare număr de card și folosind fiecare carte din 8 caractere pe LCD-ul este stocat în EEPROM, în cazul în care un card este pierdut poate șterge acest lucru, prin numele pe care îl avea de 8 caractere.
Mă poți ajuta ?.
Mulțumesc mult.
Salutări.
E-mailul meu: acatena_tym@terra.com
abia acum am vazut mesajul.... de ce vrei sa-l stochezi datele in eeprom, cand pot sta bine in program, pentru 6 cartele? daca te-ai apuca sa testezi fizic, ai rezolva problema.. dar eu nu pot testa pentru toti, sunt experimente care nu mai am toate modulele... oricum, mai e de actualitate? ai rezolvat?
ȘtergereBuna ziua,
ȘtergereDoresc sa utilizez modulul cu MFRC522 intr-o aplicatie de sistem de acces in locuinta dar bazata pe un microcontroler din seria PIC18FXXKXX. Sint in faza in care pot scrie registrii MFRC522, am raspunsul de OK scriere(xx03), fac antena_on si antena_off, dar nu reusesc sa scriu nimic pe card.
Puteti sa-mi sugerati o idee de cod pentru a scrie o data pe card.
Multumesc mult.
Prietene google e greu sa dai o cautare? "Proiectele" care vreti sa le faceti au fost faute cred ca de acum 2 ani.Invatati programare in principiu lucrarea cu registrii si protocoalele apoi conditii etc.
RăspundețiȘtergerePe tine cine te-a intrebat?
RăspundețiȘtergere