RFID ტეგების კითხვა და წერა. RC522 მოდული Arduino-სთვის

კავშირი Arduino-სთან:

ჯერ უნდა დააინსტალიროთ RFID ბიბლიოთეკა MFRC522-ისთვის.

RC522 RFID მოდულის კონტაქტები უნდა იყოს დაკავშირებული 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 selection, SPI;
  • IRQ - შეწყვეტის ხაზი;
MFRC522 არდუინო უნო არდუინო მეგა Arduino Nano v3 არდუინო ლეონარდო/მიკრო Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3.3 ვ 3.3 ვ 3.3 ვ სტაბილიზატორი 3.3 ვ სტაბილიზატორი 3.3 ვ სტაბილიზატორი 3.3 ვ
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.3 ვ, ამოცნობის დიაპაზონი 6 სმ-მდე. შექმნილია RFID ტეგების წასაკითხად და ჩასაწერად 13,56 MHz სიხშირით. სიხშირე ამ შემთხვევაში ძალიან მნიშვნელოვანია, რადგან RFID ტეგები არსებობს სამი სიხშირის დიაპაზონში:


  • LF დიაპაზონის ნიშნები (125-134 kHz)

  • HF დიაპაზონის ტეგები (13,56 MHz)

  • UHF დიაპაზონის ტეგები (860-960 MHz)

ეს კონკრეტული მოდული მუშაობს HF band tags, კერძოდ MIFARE პროტოკოლით.

მოდულთან მუშაობისთვის შეგიძლიათ გამოიყენოთ სტანდარტული RFID ბიბლიოთეკა, რომელიც შედის Arduino IDE-ში, თუმცა არის კიდევ ერთი ბიბლიოთეკა დაწერილი სპეციალურად ამ მოდულისთვის - MFRC522 (1 MB). ორივე ბიბლიოთეკა საკმაოდ მოსახერხებელია, მაგრამ MFRC522-ს აქვს მეტი სპეციალური ფუნქციები, რაც საშუალებას გაძლევთ მაქსიმალურად შეამციროთ პროგრამის საბოლოო კოდი.

კავშირი

ზოგიერთ ადამიანს შეექმნება პრობლემა - უმეტეს გაკვეთილებსა და სახელმძღვანელოებში ქინძისთავების დასახელება შეიძლება არ ემთხვეოდეს თქვენს მოდულზე არსებულ პინიტს. თუ ესკიზები მიუთითებს SS პინზე, მაგრამ თქვენს მოდულს არ აქვს ის, მაშინ, სავარაუდოდ, იგი აღინიშნება როგორც SDA. ქვემოთ მე შემოგთავაზებთ მოდულის შეერთების ცხრილს ყველაზე გავრცელებული დაფებისთვის.

MFRC522 არდუინო უნო არდუინო მეგა Arduino Nano v3

არდუინო ლეონარდო/მიკრო

Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3.3 ვ 3.3 ვ 3.3 ვ სტაბილიზატორი 3.3 ვ სტაბილიზატორი 3.3 ვ სტაბილიზატორი 3.3 ვ
GND GND GND GND GND GND

SS(SDA) და RST საკონტროლო ქინძისთავები მითითებულია ჩანახატში, ასე რომ, თუ თქვენი დაფა განსხვავდება იმ დაფისგან, რომელსაც გამოვიყენებ ჩემს მაგალითებში და ვიყენებ UNO R3-ს, მიუთითეთ ცხრილის ქინძისთავები ესკიზის დასაწყისში. :


#define SS_PIN 10 #define RST_PIN 9

მაგალითი No1: ბარათის ნომრის წაკითხვა

მოდით შევხედოთ მაგალითს 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("ბარათის ნომერი:"); Serial.print("Dec:"); Serial.print(rfid.serNum,DEC); Serial.print( )", "); სერიული .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 ვ-მდე და დარწმუნდით, რომ ის დაკავშირებულია დაფაზე 3.3 ვოლტთან; 5 ვ დენის მიწოდებამ შეიძლება ადვილად გაანადგუროს თქვენი დაფა.

ვთქვათ, ყველაფერი მუშაობს თქვენთვის. შემდეგ, მოდულით RFID ტეგების წაკითხვისას, სერიული პორტის მონიტორზე ვნახავთ შემდეგს:


აქ წავიკითხე 3 განსხვავებული ტეგი და როგორც ხედავთ მან წარმატებით წაიკითხა სამივე.

მაგალითი #2: ბარათიდან მონაცემების წაკითხვა

განვიხილოთ უფრო დახვეწილი ვარიანტი - ის წაიკითხავს არა მხოლოდ ბარათის ნომერს, არამედ წასაკითხად არსებულ ყველა მონაცემს. ამჯერად ავიღოთ მაგალითი MFRC522 ბიბლიოთეკიდან - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); ( ) ; // SPI ავტობუსის ინიციალიზაცია mfrc522.PCD_Init(); // RFID მოდულის ინიციალიზაცია ShowReaderDetails(); // მონაცემების ჩვენება MFRC522 მოდულის Serial.println(F("PICC-ის სკანირება UID-ის, ტიპისა და მონაცემთა ბლოკების სანახავად ..." )); ) void loop() ( // ვეძებ ახალ ბარათს, თუ (! mfrc522.PICC_IsNewCardPresent()) ( დაბრუნება; ) // ერთ-ერთი ბარათის არჩევა, თუ (! mfrc522.PICC_ReadCardSerial()) ( დაბრუნება; ) // მონაცემთა გამოტანა ბარათიდან mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); ) void ShowReaderDetails() ( // მიიღეთ მოდულის ვერსიის ნომერი ბაიტი 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")); else Serial.print(F("(უცნობი)")); Serial.println(""); // როდესაც ვიღებთ 0x00 ან 0xFF, მონაცემთა გადაცემა წყდება, თუ ((v == 0x00) || (v == 0xFF)) ( Serial.println(F("WARNING: კომუნიკაციის შეცდომა, არის თუ არა MFRC522 სწორად დაკავშირებული?" )) ;))

თუ წინა მაგალითი მუშაობდა შეცდომების გარეშე, მაშინ არც ეს უნდა იყოს პრობლემა. თუმცა, მეტროს უღელტეხილზე, რომელიც წინა მაგალითში უპრობლემოდ აძლევდა ბარათის ნომერს, აღმოჩნდა, რომ მასში ამოუცნობი მონაცემთა ტიპი იყო და მოდული ბარათის ნომრის გარდა ვერაფერს წაიკითხავდა.

შედეგად, ბარათიდან მონაცემების წაკითხვის შემდეგ, ვიღებთ მის ტიპს, იდენტიფიკატორს და მონაცემებს მეხსიერების 16 სექტორიდან. აღსანიშნავია, რომ MIFARE 1K სტანდარტული ბარათები შედგება 16 სექტორისგან, თითოეული სექტორი შედგება 4 ბლოკისგან, ხოლო თითოეული ბლოკი შეიცავს 16 ბაიტიან მონაცემს.


მაგალითი No3: ბარათზე ახალი იდენტიფიკატორის ჩაწერა

ამ მაგალითში ჩვენ განვიხილავთ ბარათის იდენტიფიკატორის (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_Key გასაღები; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("გაფრთხილება: ეს მაგალითი გადაწერს თქვენი UID ცვალებადი ბარათის UID-ს, გამოიყენეთ სიფრთხილით!")); for (ბაიტი 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); }

მაგალითი No4: ბარათზე მონაცემების ჩაწერა

აი, ბოლოს და ბოლოს, რას მივაღწიეთ ამდენი ხნის განმავლობაში - ბარათზე მონაცემების ჩაწერა. მოდულთან მუშაობის "ყველაზე ტკბილი" ნაწილი არის არსებული ბარათის ასლის გადაღების შესაძლებლობა, რაიმეს დამატება ან შეცვლა, ეს ბევრად უფრო საინტერესოა, ვიდრე უბრალოდ მისი წაკითხვა.

მოდით შევცვალოთ ერთ-ერთი მონაცემთა ბლოკი რუკაზე:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key გასაღები; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // მოამზადეთ გასაღები // გამოიყენეთ გასაღები FFFFFFFFFFFFFFh, რომელიც არის სტანდარტი ცარიელი ბარათებისთვის ( ბაიტი 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-ისა და რელეს სამართავად. ელექტრული წრე და არდუინოს ესკიზი (წყარო კოდი) წარმოდგენილია ქვემოთ.

ჩართვისას მკითხველი გადასცემს რადიოსიხშირის სიგნალს. როდესაც RFID ტეგი მოთავსებულია მკითხველთან ახლოს, ის იღებს რადიოსიხშირულ სიგნალს ტეგის შიგნით არსებული ანტენის მეშვეობით. მიღებული RF სიგნალი გარდაიქმნება ელექტრო ენერგიად, რაც საკმარისია ტეგიდან მონაცემების გადასაცემად RFID მკითხველზე. გარდა ამისა, მკითხველი გადასცემს ტეგის ID-ს გარე მოწყობილობას სერიული მონაცემთა პორტის საშუალებით. ამჟამად ხელმისაწვდომია მკითხველის მოდელების ფართო სპექტრი. ყველაზე გავრცელებული და მოსახერხებელი გამოსაყენებელია EM-18 მოდული. ეს მოდული კითხულობს RFID პასიურ ტეგებს და აგზავნის ტეგის ID-ს Arduino მიკროკონტროლერს.

ᲙითხვაRFID იდენტიფიკატორის ტეგები

დასაწყებად, ჩამოტვირთეთ მარტივი კოდი rfid1.ino Arduino Uno-ში IDE-ის გამოყენებით.

ახლა შეკრიბეთ წრე, როგორც ნაჩვენებია ქვემოთ.

გახსენით სერიული მონიტორი Arduino IDE-ში, დაიჭირეთ RFID ტეგი ძალიან ახლოს RFID წამკითხველის ცენტრთან და ჩანიშნეთ ნაჩვენები ტეგის ID. ეს უნიკალური იდენტიფიკატორი დაგჭირდებათ შემდეგ ჩანახატში! (ჩვენს ტეგს აქვს ID 51005F46642C)

წვდომის კონტროლი

ამ ეტაპზე, სისტემა კონფიგურირებულია იმისათვის, რომ შეადაროს უნიკალური იდენტიფიკატორი (გამოყენებული ტეგი) ნებისმიერი წასაკითხი ტეგის იდენტიფიკატორთან.

დაშალეთ არსებული კავშირი და ატვირთეთ ახალი ესკიზი rfid2.ino Arduino მიკროკონტროლერამდე

გადააერთეთ აპარატურის კომპონენტები (გარკვეული ცვლილებებით), როგორც ნაჩვენებია ზემოთ სურათზე. აქ Arduino მიკროკონტროლერის პინი D12 გამოიყენება სტანდარტული 5 მმ LED-ის დასაყენებლად. პინი D13 გამოიყენება ელექტრომაგნიტური რელეს გასაკონტროლებლად საკონტროლო ტრანზისტორის მეშვეობით. ყოველ ჯერზე, როდესაც ნიშანი ემთხვევა, მაღალი კონტროლის სიგნალი გამოჩნდება პინ D13-ზე 5 წამის განმავლობაში. რელე შეიძლება გამოყენებულ იქნას გარე დატვირთვის გასაკონტროლებლად, როგორიცაა კარის გაჩერება. თუ ეტიკეტის მნიშვნელობები არ ემთხვევა, მაშინ სიგნალის დაბალი დონე რჩება D13-ზე, მაგრამ მაღალი დონე ჩნდება პინ D12-ზე განგაშის LED-ის გასააქტიურებლად.

გამარჯობა. დღევანდელი ჯერია RFID მოდული.

ეს მოდული გამოიყენება RFID ტეგებში შენახული მონაცემების წასაკითხად და ჩასაწერად. ამ ტექნოლოგიის შესახებ მეტი შეგიძლიათ წაიკითხოთ, მაგალითად, ვიკიპედიაში. ჩვენ აქ ვვარჯიშობთ, ამიტომ დავიწყოთ.

მე მაქვს RFID-RC522 მოდული. მას მოყვება სხვადასხვა დიზაინის ორი გასაღები - ბარათი და გასაღებები. სამუშაოში პირდაპირი განსხვავება არ არის. მოდულის მუშაობისთვის არის ბიბლიოთეკა, რომლის ჩამოტვირთვა შესაძლებელია სტატიის ბოლოს მოცემული ბმულიდან.

როდესაც ამ პროექტს ვამზადებდი, შევისწავლე რამდენიმე სტატია RFID მოდულის შესახებ, იქ წარმოდგენილი მონაცემების საფუძველზე (ძირითადად http://robocraft.ru/blog/3004.html) დავწერე ესკიზი.

სანამ გასაღები არ არის სენსორთან ახლოს, სარელეო კონტაქტები ღია იქნება. როცა საჭირო გასაღებს მივაქვთ მიმღებთან, რელეს საკონტაქტო ჯგუფი ირთვება და რჩება ჩართული გასაღების ამოღებამდე. ჩემი მიმღები ისმენს ტეგებს პლაივუდის საშუალებით - ეს არის ის, რისი უფლებაც მაძლევს საიდუმლო გადამრთველს.

თუ მკითხველს ფარულად დაამონტაჟებთ (მაგალითად, მაგიდის ქვეშ), შეგიძლიათ მარტივად დაბლოკოთ კომპიუტერის ან განათების ჩართვა.

შეკრების პროცესი შედგება შემდეგი ნაბიჯებისგან:

  1. აკრიფეთ მოწყობილობა შემოთავაზებული სქემის მიხედვით.
  2. დაწერეთ ესკიზი პროცესორის დაფაზე (ბმული სტატიის ბოლოს).
  3. შეაერთეთ ასამბლეა კომპიუტერთან და ჩართეთ სერიული პორტის მონიტორი.
  4. გასაღები მიუტანე მკითხველს.
  5. დაარედაქტირეთ ესკიზის მე-20 სტრიქონი სერიული პორტის მონიტორზე მოხვედრილი გასაღების კოდის გათვალისწინებით.
  6. ჩაწერეთ რედაქტირებული ესკიზი დაფაზე.
  7. სულ ეს არის - ჩვენ გვაქვს მზა წვდომის კონტროლის სისტემა თანატოლებთან.

ამ გაკვეთილზე ჩვენ ვისწავლით თუ როგორ უნდა გავაკეთოთ მარტივი სისტემა, რომელიც განბლოკავს საკეტს ელექტრონული გასაღების გამოყენებით (Tag).

მომავალში, თქვენ შეგიძლიათ დახვეწოთ და გააფართოვოთ ფუნქციონირება. მაგალითად, დაამატეთ ფუნქცია „ახალი კლავიშების დამატება და მეხსიერებიდან მათი ამოღება“. საბაზისო შემთხვევაში, მოდით განვიხილოთ მარტივი მაგალითი, სადაც უნიკალური გასაღების იდენტიფიკატორი წინასწარ არის დაყენებული პროგრამის კოდში.

ამ გაკვეთილზე დაგვჭირდება:

პროექტის განსახორციელებლად ჩვენ უნდა დავაყენოთ ბიბლიოთეკები:

2) ახლა თქვენ უნდა დააკავშიროთ Buzzer, რომელიც გასცემს სიგნალს, თუ გასაღები მუშაობს და საკეტი გაიხსნება, და მეორე სიგნალი, როდესაც საკეტი დაიხურება.

ჩვენ ვაკავშირებთ ზუმერს შემდეგი თანმიმდევრობით:

არდუინო ზუმერი
5 ვ VCC
GND GND
პინი 5 IO

3) განბლოკვის მექანიზმად გამოყენებული იქნება სერვო დისკი. ნებისმიერი სერვო დისკის არჩევა შესაძლებელია, რაც დამოკიდებულია თქვენთვის საჭირო ზომაზე და ძალაზე, რომელსაც ქმნის სერვო დისკი. სერვოს აქვს 3 კონტაქტი:

თქვენ უფრო ნათლად ხედავთ, თუ როგორ დავაკავშირეთ ყველა მოდული ქვემოთ მოცემულ სურათზე:

ახლა, თუ ყველაფერი დაკავშირებულია, შეგიძლიათ გააგრძელოთ პროგრამირება.

ესკიზი:

#შეიცავს #შეიცავს #შეიცავს // "RFID" ბიბლიოთეკა. #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); ხელმოუწერელი გრძელი uidDec, uidDecTemp; // ტეგის ნომრის ათობითი ფორმატში Servo servo შესანახად; void setup() ( Serial.begin(9600); Serial.println("ბარათის მოლოდინში..."); SPI.begin(); // SPI ინიციალიზაცია / Init SPI ავტობუსი. mfrc522.PCD_Init(); // ინიციალიზაცია MFRC522 / ჩასვით MFRC522 ბარათი. servo.attach(6); servo.write(0); // დააყენეთ სერვო დახურულ მდგომარეობაში ) void loop() ( // მოძებნეთ ახალი ლეიბლი, თუ (! mfrc522.PICC_IsNewCardPresent() ) ( დაბრუნების< 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-ის (Tag) გასარკვევად, თქვენ უნდა ჩაწეროთ ეს ჩანახატი arduino-ში, ააწყოთ ზემოთ მოყვანილი წრე და გახსნათ კონსოლი (სერიული პორტის მონიტორინგი). როდესაც თქვენ შეეხებით RFID ტეგს, კონსოლში გამოჩნდება ნომერი

შედეგად UID უნდა შეიყვანოთ შემდეგ სტრიქონში:

თუ (uidDec == 3763966293) // შეადარეთ ტეგის Uid, თუ იგი მოცემულის ტოლია, მაშინ სერვო დრაივერი ხსნის სარქველს.

თითოეულ ბარათს აქვს უნიკალური იდენტიფიკატორი და არ მეორდება. ამრიგად, როდესაც წარადგენთ ბარათს, რომლის იდენტიფიკატორიც დააყენეთ პროგრამაში, სისტემა გახსნის წვდომას სერვო დისკის გამოყენებით.

ვიდეო: