NFC (Near-Field Communication) este un subset din familia RFID ce este prezent peste tot in jurul nostru, de la smartphone-uri pana la noile carduri bancare care au optiunea de plata contactless; toate dispozitivele moderne integreaza un tip de RFID.
Ce este RFID?
RFID (IDentificarea prin Radiofrecventa) este un sistem de identificare automata asemanator tehnologiei cu cod de bare, dar care actioneaza prin proximitate, fara contact direct.
Cele 2 componente ale acestui sistem sunt:
- Etichetele RFID (numite si RFID Tags) care la randul lor sunt compuse dintr-o antena si un circuit integrat pentru stocarea si prelucrarea de informatii;
- Transmitatorul RFID. Aceasta componenta este responsabila de a oferi energie electrica prin unde radio tag-ului RFID; acesta primeste, prelucreaza si transmite date catre etichetele RFID.
RFID si Arduino
Pentru a comunica cu etichete RFID exista o multime de module compatibile cu Arduino. In acest articol vom folosi modulul MFRC522. Acesta comunica cu orice microcontroler cu ajutorul interfatei SPI (Serial Peripheral Interface).
Pentru a face codul necesar mai simplu, voi folosi libraria : https://github.com/miguelbalboa/rfid
Pentru a conecta modulul MFRC522 la placa de dezvoltare Arduino este necesara realizarea urmatoarelor conexiuni:
Descriere conexiuni hardware intre modul MFRC522 – Arduino Uno:
- VCC – 3.3V
- GND – GND
- RST – 9
- SDA(SS) – 10
- MOSI – 11
- MISO – 12
- SCK – 13
Dupa care, trebuie sa gasim codul UID al cardului RFID care doriti sa actioneze servomotorul. Pentru a face ascest lucru incarcati pe placa Arduino UNO urmatorul cod:
#include „SPI.h”
#include „MFRC522.h”
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance;
unsigned long getID(){
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return -1;
}
unsigned long hex_num;
hex_num = mfrc522.uid.uidByte[0] << 24;
hex_num += mfrc522.uid.uidByte[1] << 16;
hex_num += mfrc522.uid.uidByte[2] << 8;
hex_num += mfrc522.uid.uidByte[3];
mfrc522.PICC_HaltA(); // Stop reading
return hex_num;
}
void setup()
{
Serial.begin(9600);
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println(„Board was initialised”);
}
void loop(){
if(mfrc522.PICC_IsNewCardPresent()) {
unsigned long uid = getID();
if(uid != -1){
Serial.print(„Card detected, UID: „);
Serial.println(uid);
}
}
}
Dupa scrierea codului, apropiati cartela RFID de modulul RFID conectat la placa de dezvoltare. Daca toate conexiunile dintre placa de dezvoltare si modulul RFID au fost facute corect, in „Serial Monitor” ar trebui sa primiti un cod. Acest cod UID este valabil numai pentru cartela RFID pe care ati apropiato anterior de modulul MFRC522.
Cum functioneaza un Servomotor?
Un servomotor este construit dintr-un motor de curent continu caruia i s-a atasat un reductor de turatie. Pe langa acest reductor, in constructia sa, servomotorul mai are si un potentiometru ce citeste pozitia axului de iesire, iar astfel controlerul din interior poate ajusta pozitia axului de iesire in functie de semnalul de intrare.
Semnalul de intrare trebuie sa fie un semnal PWM cu durata de 20ms si cu duty cycle-ul intre 1 – 2ms (5-10%), unde „1ms” reprezinta pozitia de -90* a axului servomotorului, si „2ms” reprezinta pozitia de 90*.
Pentru a minimiza complexitatea codului, in Arduino IDE exista o librarie destinata controlului servomotoarelor.
Cod incuietoare RFID
#include „SPI.h”
#include „MFRC522.h”
#include „Servo.h”
#include „SPI.h”
#include „MFRC522.h”
#include „Servo.h”
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5 //define green LED pin
#define LED_R 4 //define red LED
#define RELAY 3 //relay pin
#define BUZZER 2 //buzzer pin
#define ACCESS_DELAY 2000
#define DENIED_DELAY 1000
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
Servo incuietoare;
void setup()
{
incuietoare.attach(2);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
Serial.println(„Put your card to the reader…”);
Serial.println();
}
void loop()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print(„UID tag :”);
String content= „”;
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” „);
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” „));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print(„Message : „);
content.toUpperCase();
if (content.substring(1) == „XXXXXXX”) //change here the UID of the card/cards that you want to give access; mai precis in locul „XXXXXXX”, introduceti adresa UID primita din codul anterior;
{
Serial.println(„Authorized access”);
Serial.println();
delay(500);
incuietoare.position(0);
digitalWrite(LED_G, HIGH);
delay(ACCESS_DELAY);
incuietoare.position(180);
digitalWrite(LED_G, LOW);
}
else {
Serial.println(” Access denied”);
digitalWrite(LED_R, HIGH);
delay(DENIED_DELAY);
digitalWrite(LED_R, LOW);
}
}
Descriere conexiuni hardware intre Servomotor si Arduino Uno:
- Rosu – 5V
- Galben – 2
- Maro – GND
Pentru folosirea unui servomotor cu un consum mai mare decat specificatiile Arduino pentru pinul de 5V, este recomandat sa-l alimentati de la o sursa separata de 5V (GND-ul sursei externe trebuie sa fie conectat la GND-ul placii de dezvoltare).
Surse: