Ανάγνωση και εγγραφή ετικετών RFID. Μονάδα RC522 για Arduino

Σύνδεση με το Arduino:

Πρώτα πρέπει να εγκαταστήσετε τη Βιβλιοθήκη RFID για το MFRC522.

Οι επαφές στη μονάδα RFID RC522 πρέπει να είναι συνδεδεμένες στο Arduino. Για σύνδεση είναι βολικό να χρησιμοποιείτε καλώδια αρσενικού-θηλυκού.


Περιγραφή επαφών για τη μονάδα RFID RC522:

  • VCC - Ισχύς. Απαιτεί 3,3V;
  • RST - Επαναφορά. Επαναφορά γραμμής. Σε καμία περίπτωση μην συνδέεστε στην καρφίτσα RESET στο CraftDuino! Αυτή η ακίδα συνδέεται σε μια ψηφιακή θύρα με PWM.
  • GND - Έδαφος. Γη
  • MISO - Master Input Slave Output - δεδομένα από slave σε master, SPI.
  • MOSI - Master Output Slave Input - δεδομένα από master σε slave, SPI.
  • SCK - Σειριακό ρολόι - σήμα ρολογιού, SPI;
  • NSS - Slave Select - επιλογή slave, SPI;
  • IRQ - γραμμή διακοπής.
MFRC522 Arduino Uno Arduino Mega Arduino Nano v3 Arduino Leonardo/Micro Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 Δ10 10 10
MOSI 11 (ICSP-4) 51 Δ11 ICSP-4 16
MISO 12 (ICSP-1) 50 Δ12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3,3V 3,3V 3,3V Σταθεροποιητής 3,3V Σταθεροποιητής 3,3V Σταθεροποιητής 3,3V
GND GND GND GND GND GND

Η μονάδα RFID-RC522 συνοδεύεται από δύο ετικέτες, η μία σε μορφή πλαστικής κάρτας και η δεύτερη σε μορφή μπρελόκ. Εάν είναι απαραίτητο, μπορούν να αγοραστούν χωριστά.

Αφού συνδεθούν όλα, η ένδειξη στη μονάδα θα ανάψει, αυτό υποδεικνύει ότι παρέχεται ρεύμα στο RFID . Είναι ώρα εκτελέστε ένα δοκιμαστικό σκίτσο που βρίσκεται στη βιβλιοθήκη που εγκαταστήσαμε.



Είναι απαραίτητο να ελέγξετε την ορθότητα των καθορισμένων σταθερών:

#define SS_PIN 10 #define RST_PIN 9 // Αυτές οι σταθερές αντιστοιχούν σε

Τώρα ανεβάστε το σκίτσο στο Arduino και ενεργοποιήστε το Παρακολούθηση σειριακής θύρας.

Φέρνουμε την ετικέτα στον αναγνώστη και η ενότητα διαβάζει όλα τα δεδομένα από αυτήν την ετικέτα, για παράδειγμα, το μοναδικό αναγνωριστικό του UID της ετικέτας.

Βίντεο λειτουργίας RFID-RC522:

Σήμερα θα μιλήσω για τη μονάδα RFID RC522, που βασίζεται στο τσιπ MFRC522. Τροφοδοτικό 3,3V, εύρος ανίχνευσης έως 6cm. Σχεδιασμένο για ανάγνωση και εγγραφή ετικετών RFID με συχνότητα 13,56 MHz. Η συχνότητα σε αυτή την περίπτωση είναι πολύ σημαντική, καθώς οι ετικέτες RFID υπάρχουν σε τρεις περιοχές συχνοτήτων:


  • Ενδείξεις εύρους LF (125-134 kHz)

  • Ετικέτες ζώνης HF (13,56 MHz)

  • Ετικέτες ζώνης UHF (860-960 MHz)

Η συγκεκριμένη ενότητα λειτουργεί με ετικέτες ζώνης HF, ιδιαίτερα με το πρωτόκολλο MIFARE.

Για να εργαστείτε με τη μονάδα, μπορείτε να χρησιμοποιήσετε την τυπική βιβλιοθήκη RFID που περιλαμβάνεται στο Arduino IDE, ωστόσο, υπάρχει μια άλλη βιβλιοθήκη γραμμένη ειδικά για αυτήν την ενότητα - MFRC522 (1 MB). Και οι δύο βιβλιοθήκες είναι αρκετά βολικές, αλλά το MFRC522 έχει περισσότερες ειδικές λειτουργίες που σας επιτρέπουν να μειώσετε τον τελικό κωδικό προγράμματος όσο το δυνατόν περισσότερο.

Σύνδεση

Μερικοί άνθρωποι θα αντιμετωπίσουν πρόβλημα - το όνομα των καρφιτσών στα περισσότερα μαθήματα και οδηγούς ενδέχεται να μην ταιριάζει με το pinout στη μονάδα σας. Εάν τα σκίτσα υποδεικνύουν την καρφίτσα SS, αλλά η μονάδα σας δεν την έχει, τότε πιθανότατα επισημαίνεται ως SDA. Παρακάτω θα παράσχω έναν πίνακα σύνδεσης μονάδων για τις πιο συνηθισμένες πλακέτες.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/Micro

Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 Δ10 10 10
MOSI 11 (ICSP-4) 51 Δ11 ICSP-4 16
MISO 12 (ICSP-1) 50 Δ12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3,3V 3,3V 3,3V Σταθεροποιητής 3,3V Σταθεροποιητής 3,3V Σταθεροποιητής 3,3V
GND GND GND GND GND GND

Οι ακίδες ελέγχου SS(SDA) και RST καθορίζονται στο σκίτσο, επομένως εάν η πλακέτα σας είναι διαφορετική από αυτή που θα χρησιμοποιήσω στα παραδείγματά μου και χρησιμοποιώ UNO R3, υποδείξτε τις ακίδες από τον πίνακα στην αρχή του σκίτσου :


#define SS_PIN 10 #define RST_PIN 9

Παράδειγμα Νο. 1: Ανάγνωση του αριθμού της κάρτας

Ας δούμε ένα παράδειγμα από τη βιβλιοθήκη RFID - cardRead. Δεν εμφανίζει δεδομένα από την κάρτα, αλλά μόνο τον αριθμό της, που συνήθως επαρκεί για πολλές εργασίες.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Τα δεδομένα σχετικά με τον αριθμό της κάρτας αποθηκεύονται σε 5 μεταβλητές, θα τις θυμόμαστε για να ελέγξουμε αν έχουμε ήδη διαβάσει μια τέτοια κάρτα int serNum0. int serNum1; int serNum2; int serNum3; int serNum4; void setup() ( Serial.begin(9600); SPI.begin(); rfid.init(); ) void loop() ( if (rfid.isCard()) ( if (rfid.readCardSerial()) ( // Συγκρίνετε τον αριθμό της κάρτας με τον αριθμό της προηγούμενης κάρτας εάν (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * Εάν η κάρτα είναι νέα, τότε διαβάστε */ Serial.println(" "); Serial.println("Βρέθηκε η κάρτα"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid .serNum; serNum4 = rfid.serNum; //Έξοδος του αριθμού κάρτας Serial.println("Cardnumber:"); Serial.print("Dec:"); Serial.print(rfid.serNum,DEC); Serial.print( )", "); Serial .print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print( rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.println(" "); Serial.print("Hex:"); Serial.print(rfid .serNum,HEX); Serial .print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.println(" "); ) else ( /* Εάν αυτή είναι ήδη μια αναγνωσμένη κάρτα, απλώς εκτυπώστε την τελεία */ Serial.print("."); ) ) ) rfid.halt(); )

Το σκίτσο έχει ανέβει, το LED τροφοδοσίας στη μονάδα ανάβει, αλλά η μονάδα δεν ανταποκρίνεται στην κάρτα; Δεν χρειάζεται να πανικοβληθείτε ή να τρέξετε να αναζητήσετε τα «σωστά» παραδείγματα εργασίας. Πιθανότατα, απλά δεν υπάρχει επαφή σε μία από τις ακίδες - οι τρύπες στην πλακέτα είναι ελαφρώς μεγαλύτερες από το πάχος του βραχυκυκλωτήρα, οπότε αξίζει να προσπαθήσετε να τις αναδιατάξετε. Δεν ανάβει το LED στην πλακέτα; Δοκιμάστε να αλλάξετε τον βραχυκυκλωτήρα που οδηγεί στα 3,3 V και βεβαιωθείτε ότι είναι συνδεδεμένος σε 3,3 V στην πλακέτα· η παροχή ρεύματος 5 V μπορεί εύκολα να σκοτώσει την πλακέτα σας.

Ας πούμε ότι όλα λειτουργούν για εσάς. Στη συνέχεια, διαβάζοντας τις ετικέτες RFID με τη μονάδα, θα δούμε τα εξής στην οθόνη σειριακής θύρας:


Εδώ διάβασα 3 διαφορετικές ετικέτες, και όπως μπορείτε να δείτε, διάβασε με επιτυχία και τις 3.

Παράδειγμα #2: Ανάγνωση δεδομένων από κάρτα

Ας εξετάσουμε μια πιο εξελιγμένη επιλογή - θα διαβάσει όχι μόνο τον αριθμό της κάρτας, αλλά και όλα τα διαθέσιμα δεδομένα για ανάγνωση. Αυτή τη φορά ας πάρουμε ένα παράδειγμα από τη βιβλιοθήκη MFRC522 - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Δημιουργία στιγμιότυπου MFRC522 void setup() ( Serial.begin(9600); // Ξεκινήστε την οθόνη σειριακής θύρας ενώ (!Serial); // Μην κάνετε τίποτα μέχρι να ανοίξει (για Arduino στο τσιπ ATMEGA32U4) SPI.begin( ). ..." )); ) void loop() ( // Ψάχνετε για νέα κάρτα εάν (! mfrc522.PICC_IsNewCardPresent()) (επιστροφή; ) // Επιλογή μιας από τις κάρτες εάν (! mfrc522.PICC_ReadCardSerial()) ( επιστροφή; ) // Έξοδος δεδομένων από την κάρτα mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); ) void ShowReaderDetails() ( // Λήψη του αριθμού έκδοσης της μονάδας byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg S); (F("Έκδοση λογισμικού MFRC522: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(" = v1.0")); αλλιώς εάν (v == 0x92) Serial.print(F(" = v2.0")); other Serial.print(F(" (άγνωστο)")); Serial.println(""); // Όταν λαμβάνουμε 0x00 ή 0xFF, η μετάδοση δεδομένων διακόπτεται εάν ((v == 0x00) || (v == 0xFF)) ( Serial.println(F("ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αποτυχία επικοινωνίας, είναι σωστά συνδεδεμένο το MFRC522;" )) ;))

Εάν το προηγούμενο παράδειγμα λειτούργησε χωρίς σφάλματα, τότε ούτε αυτό θα πρέπει να είναι πρόβλημα. Ωστόσο, το πάσο του μετρό, το οποίο έδωσε τον αριθμό της κάρτας χωρίς προβλήματα στο προηγούμενο παράδειγμα, αποδείχθηκε ότι είχε έναν μη ανιχνεύσιμο τύπο δεδομένων σε αυτό και η μονάδα δεν μπορούσε να διαβάσει τίποτα άλλο εκτός από τον αριθμό της κάρτας.

Ως αποτέλεσμα, έχοντας διαβάσει τα δεδομένα από την κάρτα, λαμβάνουμε τον τύπο, το αναγνωριστικό και τα δεδομένα από 16 τομείς μνήμης. Πρέπει να σημειωθεί ότι οι τυπικές κάρτες MIFARE 1K αποτελούνται από 16 τομείς, κάθε τομέας αποτελείται από 4 μπλοκ και κάθε μπλοκ περιέχει 16 byte δεδομένων.


Παράδειγμα Νο. 3: Γράψτε ένα νέο αναγνωριστικό στην κάρτα

Σε αυτό το παράδειγμα, θα εξετάσουμε την αλλαγή του αναγνωριστικού κάρτας (UID). Είναι σημαντικό να γνωρίζετε ότι δεν υποστηρίζουν όλες οι κάρτες την αλλαγή της ταυτότητας. Η κάρτα μπορεί να είναι επανεγγράψιμη, αλλά αυτό σημαίνει μόνο ότι τα δεδομένα είναι επανεγγράψιμα. Δυστυχώς, οι κάρτες που είχα στα χέρια μου δεν υποστήριζαν την επανεγγραφή UID, αλλά θα δώσω τον κώδικα σκίτσου εδώ για κάθε ενδεχόμενο.


#include #include /* Ορίστε ένα νέο UID εδώ */ #define NEW_UID (0xDE, 0xAD, 0xBE, 0xEF) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Κλειδί; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Προειδοποίηση: αυτό το παράδειγμα αντικαθιστά το UID της κάρτας με δυνατότητα αλλαγής UID, χρησιμοποιήστε με προσοχή!")); για (byte i = 0; i< 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { delay(50); return; } // Считываем текущий UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Записываем новый UID byte newUid = NEW_UID; if (mfrc522.MIFARE_SetUid(newUid, (byte)4, true)) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn"t get confused mfrc522.PICC_HaltA(); if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { return; } // Считываем данные с карты Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); }

Παράδειγμα Νο. 4: Εγγραφή δεδομένων σε κάρτα

Εδώ είναι επιτέλους αυτό στο οποίο καταφέραμε τόσο καιρό - καταγράφοντας δεδομένα στην κάρτα. Το πιο «γλυκό» μέρος της εργασίας με τη μονάδα είναι η δυνατότητα να δημιουργήσετε ένα αντίγραφο μιας υπάρχουσας κάρτας, να προσθέσετε ή να αλλάξετε κάτι, αυτό είναι πολύ πιο ενδιαφέρον από την απλή ανάγνωση.

Ας αλλάξουμε ένα από τα μπλοκ δεδομένων στον χάρτη:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Κλειδί; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Προετοιμάστε το κλειδί // χρησιμοποιήστε το κλειδί FFFFFFFFFFFFFFh που είναι το πρότυπο για κενές κάρτες για ( byte i = 0;i< 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); Serial.print(F("Using key (for A and B):")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); } void loop() { // Ждем новую карту if (! mfrc522.PICC_IsNewCardPresent()) return; // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) return; // Показываем подробности карты Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("PICC type: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Проверяем совместимость if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("This sample only works with MIFARE Classic cards.")); return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector = 1; byte blockAddr = 4; byte dataBlock = { // Данные, которые мы запишем на карту 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12, 0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16 }; byte trailerBlock = 7; byte status; byte buffer; byte size = sizeof(buffer); // Аутентификация Serial.println(F("Authenticating using key A...")); 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)); return; } // Показываем текущие данные сектора Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // Читаем данные из блока Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); // Аутентификация Serial.println(F("Authenticating again using key B...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Записываем данные в блок Serial.print(F("Writing data into block ")); Serial.print(blockAddr); Serial.println(F(" ...")); dump_byte_array(dataBlock, 16); Serial.println(); status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // Читаем данные снова, чтобы проверить, что запись прошла успешно Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(F("Checking result...")); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] == dataBlock[i]) count++; } Serial.print(F("Number of bytes that match = ")); Serial.println(count); if (count == 16) { Serial.println(F("Success:-)")); } else { Serial.println(F("Failure, no match:-(")); Serial.println(F(" perhaps the write didn"t work properly...")); } Serial.println(); // Выводим данные Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } }

Και ως αποτέλεσμα, λαμβάνουμε μια κάρτα με ένα τροποποιημένο μπλοκ δεδομένων:


Τώρα, έχοντας μάθει να διαβάζετε και να γράφετε μπλοκ δεδομένων καρτών, μπορείτε να πειραματιστείτε με τις ετικέτες που πιθανότατα έχετε - πάσο, κάρτες δημόσιας συγκοινωνίας. Δοκιμάστε να διαβάσετε και να γράψετε δεδομένα από αυτές τις κάρτες, μερικές διπλές κάρτες δεν βλάπτουν ποτέ, σωστά;)

Αυτό είναι όλο, εγγραφείτε και ακολουθήστε τις δημοσιεύσεις. Την επόμενη φορά θα σας εξηγήσω και θα σας δείξω πώς να προσθέσετε προσαρμοσμένους χαρακτήρες σε μια τυπική οθόνη 1602 χαρακτήρων, προσθέτοντας ουσιαστικά γραφικά στην οθόνη.

Επί του παρόντος, η χρήση της τεχνολογίας αναγνώρισης ραδιοσυχνοτήτων (RFID) γίνεται πολύ δημοφιλής. Πολλές εφαρμογές υλοποιούνται σε διάφορους τομείς της ζωής μας και χρησιμοποιούνται για διάφορους σκοπούς. Το RFID επιτρέπει την ασύρματη συλλογή δεδομένων χρησιμοποιώντας ηλεκτρονικές συσκευές ανάγνωσης ετικετών που είναι προσαρτημένες ή ενσωματωμένες σε αντικείμενα για αναγνώριση και άλλους σκοπούς. Αυτό το άρθρο περιγράφει πώς να δημιουργήσετε μια απλή, DIY συσκευή ελέγχου πρόσβασης RFID χρησιμοποιώντας ένα Arduino UNO και έναν αναγνώστη RFID (EM-18) για τον έλεγχο ενός LED και ενός ρελέ. Το ηλεκτρικό κύκλωμα και το σκίτσο του Arduino (πηγαίος κώδικας) παρουσιάζονται παρακάτω.

Όταν είναι ενεργοποιημένη, η συσκευή ανάγνωσης εκπέμπει ένα σήμα ραδιοσυχνότητας. Όταν μια ετικέτα RFID τοποθετείται κοντά σε μια συσκευή ανάγνωσης, λαμβάνει ένα σήμα ραδιοσυχνότητας μέσω μιας κεραίας μέσα στην ετικέτα. Το λαμβανόμενο σήμα RF θα μετατραπεί σε ηλεκτρική ενέργεια, η οποία είναι επαρκής για τη μετάδοση δεδομένων από την ετικέτα πίσω στη συσκευή ανάγνωσης RFID. Επιπλέον, ο αναγνώστης θα μεταδώσει το αναγνωριστικό ετικέτας σε μια εξωτερική συσκευή μέσω της σειριακής θύρας δεδομένων. Αυτή τη στιγμή είναι διαθέσιμο ένα ευρύ φάσμα μοντέλων αναγνώστη. Η πιο κοινή και βολική στη χρήση είναι η μονάδα EM-18. Αυτή η μονάδα διαβάζει παθητικές ετικέτες RFID και στέλνει το αναγνωριστικό ετικέτας στον μικροελεγκτή Arduino.

ΑΝΑΓΝΩΣΗΕτικέτες αναγνώρισης RFID

Για να ξεκινήσετε, κατεβάστε τον απλό κώδικα rfid1.inoστο Arduino Uno χρησιμοποιώντας το IDE.

Τώρα συναρμολογήστε το κύκλωμα όπως φαίνεται παρακάτω.

Ανοίξτε τη σειριακή οθόνη στο Arduino IDE, κρατήστε την ετικέτα RFID πολύ κοντά στο κέντρο της συσκευής ανάγνωσης RFID και σημειώστε το αναγνωριστικό ετικέτας που εμφανίζεται. Αυτό το μοναδικό αναγνωριστικό θα χρειαστεί στο επόμενο σκίτσο! (Η ετικέτα μας έχει ID 51005F46642C)

Έλεγχος πρόσβασης

Σε αυτό το σημείο, το σύστημα έχει ρυθμιστεί ώστε να συγκρίνει το μοναδικό αναγνωριστικό (η ετικέτα που χρησιμοποιείται) με το αναγνωριστικό οποιασδήποτε ετικέτας που πρόκειται να διαβαστεί.

Αποσυναρμολογήστε την υπάρχουσα σύνδεση και ανεβάστε ένα νέο σκίτσο rfid2.inoστον μικροελεγκτή Arduino

Επανασυνδέστε τα εξαρτήματα υλικού (με ορισμένες τροποποιήσεις) όπως φαίνεται στην παραπάνω εικόνα. Εδώ, η ακίδα D12 του μικροελεγκτή Arduino χρησιμοποιείται για την οδήγηση ενός τυπικού LED 5 mm. Ο ακροδέκτης D13 χρησιμοποιείται για τον έλεγχο του ηλεκτρομαγνητικού ρελέ μέσω ενός τρανζίστορ ελέγχου. Κάθε φορά που η ένδειξη ταιριάζει, εμφανίζεται ένα σήμα υψηλού ελέγχου στον ακροδέκτη D13 για 5 δευτερόλεπτα. Το ρελέ μπορεί να χρησιμοποιηθεί για τον έλεγχο ενός εξωτερικού φορτίου, όπως ένα στοπ πόρτας. Εάν οι τιμές της ετικέτας δεν ταιριάζουν, τότε ένα χαμηλό επίπεδο σήματος παραμένει στον ακροδέκτη D13, αλλά ένα υψηλό επίπεδο εμφανίζεται στον ακροδέκτη D12 για να ενεργοποιήσει το LED συναγερμού.

Γειά σου. Η σημερινή σειρά είναι η μονάδα RFID.

Αυτή η μονάδα χρησιμοποιείται για την ανάγνωση και εγγραφή δεδομένων που είναι αποθηκευμένα σε ετικέτες RFID. Μπορείτε να διαβάσετε περισσότερα για αυτήν την τεχνολογία, για παράδειγμα, στη Wikipedia. Κάνουμε εξάσκηση εδώ, οπότε ας ξεκινήσουμε.

Έχω τη μονάδα RFID-RC522. Συνοδεύεται από δύο κλειδιά διαφορετικών σχεδίων - μια κάρτα και ένα μπρελόκ. Δεν υπάρχει άμεση διαφορά στη δουλειά. Υπάρχει μια βιβλιοθήκη για τη λειτουργία της ενότητας· μπορείτε να την κατεβάσετε από τον σύνδεσμο στο τέλος του άρθρου.

Όταν ετοίμαζα αυτό το έργο, μελέτησα αρκετά άρθρα σχετικά με τη μονάδα RFID, με βάση τα δεδομένα που παρουσιάζονται εκεί (κυρίως http://robocraft.ru/blog/3004.html) έγραψα ένα σκίτσο.

Ενώ το κλειδί δεν είναι κοντά στον αισθητήρα, οι επαφές του ρελέ θα είναι ανοιχτές. Όταν φέρουμε το απαιτούμενο κλειδί στον δέκτη, η ομάδα επαφών του ρελέ ανάβει και παραμένει ενεργοποιημένη μέχρι να αφαιρεθεί το κλειδί. Ο δέκτης μου ακούει ετικέτες μέσω του κόντρα πλακέ - αυτό μου επιτρέπει να κάνω ένας μυστικός διακόπτης.

Εάν τοποθετήσετε τη συσκευή ανάγνωσης κρυφά (για παράδειγμα, κάτω από μια επιφάνεια εργασίας), μπορείτε εύκολα να εμποδίσετε την ενεργοποίηση του υπολογιστή ή του φωτισμού.

Η διαδικασία συναρμολόγησης αποτελείται από τα ακόλουθα βήματα:

  1. Συναρμολογήστε τη συσκευή σύμφωνα με το προτεινόμενο διάγραμμα.
  2. Γράψτε ένα σκίτσο στην πλακέτα του επεξεργαστή (σύνδεσμος στο τέλος του άρθρου).
  3. Συνδέστε τη διάταξη στον υπολογιστή και ενεργοποιήστε την οθόνη σειριακής θύρας.
  4. Φέρτε το κλειδί στον αναγνώστη.
  5. Επεξεργαστείτε τη γραμμή 20 του σκίτσου λαμβάνοντας υπόψη τον κωδικό κλειδιού που ήρθε στην οθόνη σειριακής θύρας.
  6. Γράψτε το επεξεργασμένο σκίτσο στον πίνακα.
  7. Αυτό είναι όλο - έχουμε ένα έτοιμο σύστημα ελέγχου πρόσβασης peer-to-peer.

Σε αυτό το μάθημα θα μάθουμε πώς να φτιάξουμε ένα απλό σύστημα που θα ξεκλειδώνει μια κλειδαριά χρησιμοποιώντας ένα ηλεκτρονικό κλειδί (Ετικέτα).

Στο μέλλον, μπορείτε να βελτιώσετε και να επεκτείνετε τη λειτουργικότητα. Για παράδειγμα, προσθέστε τη λειτουργία "προσθήκη νέων κλειδιών και αφαίρεση από τη μνήμη". Στη βασική περίπτωση, ας εξετάσουμε ένα απλό παράδειγμα όπου ένα μοναδικό αναγνωριστικό κλειδιού είναι προκαθορισμένο στον κώδικα του προγράμματος.

Σε αυτό το σεμινάριο θα χρειαστούμε:

Για να υλοποιήσουμε το έργο πρέπει να εγκαταστήσουμε τις βιβλιοθήκες:

2) Τώρα πρέπει να συνδέσετε έναν βομβητή, ο οποίος θα ηχήσει ένα σήμα εάν το κλειδί λειτουργεί και ανοίξει η κλειδαριά, και ένα δεύτερο σήμα όταν κλείνει η κλειδαριά.

Συνδέουμε το βομβητή με την ακόλουθη σειρά:

Arduino Βομβητής
5V VCC
GND GND
καρφίτσα 5 IO

3) Ένας σερβομηχανισμός θα χρησιμοποιηθεί ως μηχανισμός ξεκλειδώματος. Μπορείτε να επιλέξετε οποιαδήποτε μονάδα σερβομηχανισμού, ανάλογα με το μέγεθος που χρειάζεστε και τη δύναμη που δημιουργεί η μονάδα σερβομηχανισμού. Ο σερβομηχανισμός έχει 3 επαφές:

Μπορείτε να δείτε πιο καθαρά πώς συνδέσαμε όλες τις μονάδες στην παρακάτω εικόνα:

Τώρα, εάν όλα είναι συνδεδεμένα, μπορείτε να προχωρήσετε στον προγραμματισμό.

Σκίτσο:

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω // Βιβλιοθήκη "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); ανυπόγραφο long uidDec, uidDecTemp; // για αποθήκευση του αριθμού της ετικέτας σε δεκαδική μορφή Servo servo. void setup() ( Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // Αρχικοποίηση SPI / Δίαυλος Init SPI. mfrc522.PCD_Init(); // προετοιμασία MFRC522 / Εκκίνηση κάρτας MFRC522. servo.attach(6); servo.write(0); // ορίστε τον σερβο σε κλειστή κατάσταση ) void loop() ( // Αναζήτηση νέας ετικέτας εάν (! mfrc522.PICC_IsNewCardPresent() ) ( return; ) // Επιλέξτε μια ετικέτα εάν (! mfrc522.PICC_ReadCardSerial()) ( return; ) uidDec = 0; // Έκδοση του σειριακού αριθμού της ετικέτας. για (byte i = 0; i< mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }

Ας δούμε το σκίτσο πιο αναλυτικά:

Για να μάθετε το UID της κάρτας (Ετικέτα), πρέπει να γράψετε αυτό το σκίτσο στο arduino, να συναρμολογήσετε το κύκλωμα που περιγράφηκε παραπάνω και να ανοίξετε την Κονσόλα (Serial Port Monitoring). Όταν αγγίζετε την ετικέτα RFID, η κονσόλα θα εμφανίσει έναν αριθμό

Το UID που προκύπτει πρέπει να εισαχθεί στην ακόλουθη γραμμή:

Εάν (uidDec == 3763966293) // Συγκρίνετε το Uid της ετικέτας, εάν είναι ίσο με το δεδομένο, τότε ο σερβομηχανισμός ανοίγει τη βαλβίδα.

Κάθε κάρτα έχει ένα μοναδικό αναγνωριστικό και δεν επαναλαμβάνεται. Έτσι, όταν παρουσιάζετε την κάρτα της οποίας το αναγνωριστικό ορίσατε στο πρόγραμμα, το σύστημα θα ανοίξει την πρόσβαση χρησιμοποιώντας μια μονάδα σερβομηχανισμού.

Βίντεο: