Paggawa ng RFID lock gamit ang Arduino. Pagbasa at pagsulat ng mga RFID tag. RC522 module para sa Arduino

Ngayon ay magsasalita ako tungkol sa RFID module RC522, batay sa MFRC522 chip. Power supply 3.3V, hanay ng detection hanggang 6cm. Idinisenyo para sa pagbabasa at pagsulat ng mga RFID tag na may dalas na 13.56 MHz. Dalas sa sa kasong ito ay napakahalaga, dahil ang mga RFID tag ay umiiral sa tatlong hanay ng dalas:


  • Mga marka ng hanay ng LF (125-134 kHz)

  • Mga tag ng HF band (13.56 MHz)

  • Mga UHF band tag (860-960 MHz)

Gumagana ang partikular na module na ito sa mga HF band tag, partikular sa MIFARE protocol.

Upang magtrabaho kasama ang module na maaari mong gamitin karaniwang aklatan Kasama ang RFID Arduino IDE, gayunpaman, may isa pang aklatan na partikular na isinulat para sa modyul na ito - MFRC522 (1 MB). Ang parehong mga aklatan ay medyo maginhawa, ngunit ang MFRC522 ay may higit pa mga espesyal na function, na nagpapahintulot na bawasan ang panghuling code ng programa hangga't maaari.

Koneksyon

Ang ilang mga tao ay makakaranas ng problema - ang pangalan ng mga pin sa karamihan ng mga aralin at gabay ay maaaring hindi tumugma sa pinout sa iyong module. Kung ang mga sketch ay nagpapahiwatig ng SS pin, ngunit ang iyong module ay wala nito, malamang na ito ay minarkahan bilang SDA. Sa ibaba ay magbibigay ako ng talahanayan ng koneksyon ng module para sa pinakakaraniwang mga board.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/Micro

Arduino Pro Micro
RST 9 5 D9 I-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.3V 3.3V 3.3V Stabilizer 3.3V Stabilizer 3.3V Stabilizer 3.3V
GND GND GND GND GND GND

Ang SS(SDA) at RST control pin ay tinukoy sa sketch, kaya kung ang iyong board ay iba sa gagamitin ko sa aking mga halimbawa, at gumagamit ako ng UNO R3, ipahiwatig ang mga pin mula sa talahanayan sa simula ng sketch :


#define SS_PIN 10 #define RST_PIN 9

Halimbawa Blg. 1: Pagbasa ng card number

Tingnan natin ang isang halimbawa mula sa RFID library - cardRead. Hindi ito nagpapakita ng data mula sa card, ngunit ang numero lamang nito, na kadalasang sapat para sa maraming gawain.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Ang data tungkol sa numero ng card ay naka-imbak sa 5 variable, tatandaan namin ang mga ito upang suriin kung nabasa na namin ang naturang card 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()) ( // Ihambing ang numero ng card sa numero ng nakaraang card kung (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * Kung bago ang card, basahin ang */ Serial.println("Nahanap ang card"); serNum0 = rfid.serNum; "); .print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print("Hex: "); .print(", "); Serial.print(rfid.serNum,HEX);


Serial.print(rfid.serNum,HEX);

Serial.print(", ");

Serial.print(rfid.serNum,HEX);


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Lumikha ng MFRC522 instance void setup() ( Serial.begin(9600); // Initialize ang serial port monitor habang (!Serial); // Walang gawin hanggang sa ito ay bukas (para sa Arduino sa ATMEGA32U4 chip) SPI.begin( ); // I-initialize ang SPI bus mfrc522.PCD_Init(); RFID module ShowReaderDetails(); // Print data tungkol sa MFRC522 module Serial.println(F("Scan PICC to see UID, type, and data blocks...")); ) void loop() ( // Hinahanap bagong mapa if (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // Pumili ng isa sa mga card kung (! mfrc522.PICC_ReadCardSerial()) ( return; ) // Output data mula sa card mfrc522.PICC_DumpToSerial(&(mfrc522.uid) ); ) void ShowReaderDetails() ( // Kunin ang module version number byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F("= v1.0")); else if (v == 0x92) Serial.print(F("= v2.0")); ")); Serial.println(""); // Kapag nakatanggap kami ng 0x00 o 0xFF, masira ang paghahatid ng data kung ((v == 0x00) || (v == 0xFF)) ( Serial.println( F(" BABALA: Kabiguan ng komunikasyon, maayos bang konektado ang MFRC522?"));

Kung ang nakaraang halimbawa ay gumana nang walang mga error, hindi rin ito dapat maging problema. Bagaman, ang metro pass, na nagbigay ng numero ng card nang walang anumang mga problema sa nakaraang halimbawa, ay naging isang hindi matukoy na uri ng data sa isang ito, at ang module ay walang mabasa maliban sa numero ng card.

Bilang resulta, pagkatapos basahin ang data mula sa card, nakukuha namin ang uri nito, identifier, at data mula sa 16 na sektor ng memorya. Dapat tandaan na ang MIFARE 1K standard card ay binubuo ng 16 na sektor, ang bawat sektor ay binubuo ng 4 na bloke, at ang bawat bloke ay naglalaman ng 16 na byte ng data.


Halimbawa Blg. 3: Pagsusulat ng bagong identifier sa card

Sa halimbawang ito, titingnan natin ang pagpapalit ng card identifier (UID). Mahalagang malaman na hindi lahat ng card ay sumusuporta sa pagpapalit ng ID. Ang card ay maaaring muling isulat, ngunit nangangahulugan lamang na ang data ay maaaring isulat muli. Sa kasamaang palad, ang mga card na nasa aking mga kamay ay hindi sumusuporta sa muling pagsulat ng UID, ngunit ibibigay ko ang sketch code dito kung sakali.


#include #include /* Magtakda ng bagong UID dito */ #define NEW_UID (0xDE, 0xAD, 0xBE, 0xEF) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Babala: inu-overwrite ng halimbawang ito ang UID ng iyong UID changeable card, gamitin nang may pag-iingat!")); para sa (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); }

Halimbawa Blg. 4: Pagsusulat ng data sa isang card

Narito na rin ang matagal na nating napupuntahan - ang pagre-record ng data sa card. Ang pinakamatamis na bahagi ng pagtatrabaho sa module ay ang kakayahang gumawa ng isang kopya ng isang umiiral na card, magdagdag o magbago ng isang bagay, ito ay mas kawili-wili kaysa sa simpleng pagbabasa nito.

Baguhin natin ang isa sa mga bloke ng data sa mapa:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Ihanda ang susi // gamitin ang key na FFFFFFFFFFFFh na siyang pamantayan para sa mga blangkong card para sa (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); } }

At bilang resulta, nakakakuha kami ng card na may binagong data block:


Ngayon, natutong magbasa at magsulat ng mga bloke ng data ng card, maaari kang mag-eksperimento sa mga tag na malamang na mayroon ka - mga pass, mga travel card pampublikong sasakyan. Subukang magbasa at magsulat ng data mula sa mga card na ito, hindi masakit ang ilang duplicate na pass, tama ba?)

Iyon lang, mag-subscribe at sundin ang mga publikasyon. Sa susunod sasabihin ko sa iyo at ipapakita ko sa iyo kung paano gumamit ng pamantayan pagpapakita ng karakter 1602 magdagdag ng mga custom na character, mahalagang magdagdag ng mga graphics sa display.

Gumagamit ang RFID (Radio Frequency Identification) ng mga electromagnetic field para awtomatikong kilalanin at subaybayan ang mga tag na nakakabit sa mga bagay. Ang mga tag ay naglalaman ng elektronikong nakaimbak na impormasyon. Ang mga passive tag ay nangongolekta ng enerhiya mula sa mga signal ng radyo mula sa isang malapit na RFID reader. Ang mga aktibong tag ay may lokal na pinagmumulan ng kuryente (tulad ng baterya) at maaaring gumana nang daan-daang metro mula sa mambabasa. Hindi tulad ng isang barcode, ang tag ay hindi kailangang nasa view ng device, kaya maaari itong i-embed sa object na sinusubaybayan. Ang RFID ay isa sa mga pamamaraan para sa awtomatikong pagkilala at pagkolekta ng data.

Aplikasyon

Ang mga RFID tag ay ginagamit sa maraming industriya. Halimbawa, ang isang RFID reader na nakakabit sa isang sasakyan sa panahon ng produksyon ay maaaring gamitin upang subaybayan ang pag-unlad sa isang linya ng pagpupulong. Maaaring masubaybayan ang mga may label na parmasyutiko sa pamamagitan ng mga bodega. Ang pagtatanim ng mga RFID microchip sa mga hayop ay nagpapahintulot sa mga hayop na makilala.

Dahil ang mga RFID tag ay maaaring ikabit sa pera, damit at ari-arian, o itanim sa mga hayop at tao, ang kakayahang magbasa personal na impormasyon mga tawag nang walang pahintulot ng user seryosong problema privacy. Ang mga panganib na ito ay humantong sa pagbuo ng mga karaniwang pagtutukoy na tumutugon sa mga isyu sa seguridad ng personal na data. Magagamit din ang mga tag sa mga tindahan upang mapabilis ang pag-checkout at maiwasan ang pagnanakaw.

Kwento

Noong 1945, naimbento ni Leon Theremin ang isang kagamitan sa pakikinig para sa Unyong Sobyet, na muling nag-transmit ng mga radio wave na may idinagdag na impormasyon sa audio. Naimpluwensyahan ng mga sound vibrations sa panahon ng vibration ang diaphragm, na bahagyang nagbago sa hugis ng resonator, na nagmo-modulate sa reflected radio frequency. Bagama't ang device na ito ay isang tago na eavesdropping device sa halip na isang ID tag, ito ay itinuturing na isang pasimula sa USB RFID reader dahil ito ay na-activate ng mga audio wave mula sa panlabas na pinagmulan. Ang mga transponder ay ginagamit pa rin ng karamihan sa mga sasakyang panghimpapawid. Dati, ang katulad na teknolohiya, tulad ng mga RFID tag reader, ay regular na ginagamit ng Allies at Germany noong World War II upang makilala ang sasakyang panghimpapawid.

Ang aparato ni Mario Cardullo, na na-patent noong Enero 23, 1973, ay ang unang tunay na hinalinhan ng modernong RFID, dahil ito ay isang passive radio receiver na may memorya. Ang orihinal na device ay passive, na pinapagana ng isang signal ng botohan. Ipinakita ito noong 1971 sa administrasyon ng New York City at iba pa mga potensyal na gumagamit at binubuo ng isang transponder na may 16-bit na memorya para magamit bilang bayad na aparato. Sinasaklaw ng pangunahing patent ni Cardullo ang paggamit ng mga frequency ng radyo, tunog at liwanag bilang media ng paghahatid.

Lugar ng paggamit

Ang orihinal na plano sa negosyo na ipinakita sa mga mamumuhunan noong 1969 ay nagpakita ng mga sumusunod na aplikasyon: RFID reader:

  • paggamit sa transportasyon (pagkilala sa sasakyan, awtomatikong sistema pagbabayad, elektronikong plaka ng lisensya, elektronikong manifest, pagruruta sasakyan, pagmamanman ng kahusayan ng sasakyan);
  • pagbabangko (electronic checkbook, electronic credit card);
  • tauhan, awtomatikong gate, pagsubaybay); industriyang medikal (pagkakakilanlan, kasaysayan ng pasyente).

Isang maagang pagpapakita ng nasasalamin na kapangyarihan (modulated backscatter) ng mga RFID tag, parehong passive at semi-passive, ay isinagawa nina Stephen Depp, Alfred Koelle at Robert Fryman sa Los Alamos National Laboratory noong 1973. Portable na sistema tumakbo sa 915 MHz at gumamit ng 12-bit na mga tag. Ang pamamaraang ito ay ginagamit ng karamihan sa mga modernong UHFID at microwave RFID readers. SA modernong buhay Ang mga naturang device ay may malaking pangangailangan.

Pagtutukoy

Gumagamit ang RFID ng mga tag na nakakabit sa mga makikilalang bagay. Kapag gumagawa ng sarili mong RFID reader, tandaan na ang mga two-way radio transmitter-receiver, na tinatawag na interrogator o reader, ay nagpapadala ng signal sa tag at basahin ang tugon nito. Ang mga RFID tag ay maaaring passive, active o passive. Ang aktibong tag ay may built-in na baterya at pana-panahong nagpapadala ng ID signal nito. Ang battery passive (BAP) ay may maliit na baterya na nakasakay at naisaaktibo sa pamamagitan ng pagkakaroon ng isang RFID reader. Ang passive tag ay mas mura at mas maliit dahil wala itong baterya. Sa halip, ang tag ay gumagamit ng radio wave na ipinadala ng mambabasa. Gayunpaman, para gumana ang isang passive tag, dapat itong iluminado sa antas ng kapangyarihan na humigit-kumulang isang libong beses na mas malakas kaysa sa pagpapadala ng signal. Nakakaapekto ito sa interference at irradiation.

  • Microcontroller programming
  • Tulad ng alam mo, maraming access system ang gumagamit ng RFID card ng EM-Marin standard na may dalas na 125 KHz. Ang intercom sa aking bahay ay walang pagbubukod. Isang problema - masarap matutunan kung paano kopyahin ang mga naturang card, dahil ang mga tag ng presyo para sa pagkopya sa mga ito ay hindi nakapagpapatibay. Mayroong, siyempre, medyo ilang mga copier scheme online (at ang mga Chinese ay nagbebenta ng kanilang mga copier para sa mga pennies - gayunpaman, madalas nilang ilagay ang kanilang password sa mga disc kapag kinokopya), ngunit bakit hindi bumuo ng iyong sariling copier? Iyan ang tungkol sa artikulo sa ibaba.

    Ito ay nagkakahalaga ng pagsisimula ng pagbuo ng isang copier sa pamamagitan ng pag-alam kung saan maaaring kopyahin ang mga naturang marka? Matapos basahin ang mga forum, maaari mong malaman na ang pinakakaraniwang mga blangko para sa pagkopya ay T5577, T5557, EM4305.

    Ngayon kailangan namin ng isang diagram. Kunin natin ang analog na bahagi ng naturang copier mula sa RECTO at ikonekta ito sa atmega8 microcontroller. Magdagdag tayo ng level converter para sa pagkonekta sa isang COM port batay sa max232 (ang mga nais ay maaaring gumamit ng ST232 o iba pa upang kumonekta sa pamamagitan ng USB, ngunit mayroon akong COM port sa aking computer, tulad ng dati. USB-COM adapter, kaya wala akong ganoong gawain).

    Makukuha mo ang diagram na ito:

    Ano siya? Dual emitter follower, oscillating circuit, detector at RC filter. Dahil sa ang katunayan na ang mga filter ng RC ay may iba't ibang mga constant ng oras, sa pamamagitan ng paghahambing ng mga antas ng boltahe sa pagitan ng mga yugto, posible na ihiwalay ang pagbabago sa signal ng RFID tag. Ang gawaing ito ay hahawakan ng comparator na binuo sa atmega8. Ang pagbuo ng isang 125 KHz signal ay ibibigay ng PWM controller na binuo sa atmega8.

    Ang kumbinasyon ng isang RFID tag at isang reader ay bumubuo ng isang transpormer, kung saan ang tag ay ang pangalawang paikot-ikot. Ang impormasyon ay ipinadala sa pamamagitan ng tag sa pamamagitan ng pagpapalit ng load ng pangalawang paikot-ikot. Bilang isang resulta, ang kasalukuyang sa reader coil (primary winding) ay nagbabago. Ang nasa itaas na analog na bahagi ng circuit ay may pananagutan sa paghihiwalay ng mga kasalukuyang pulso. Oscillatory circuit kailangang i-configure sa pinakamataas na boltahe V control point, halimbawa, paikot-ikot/paikot-ikot ang mga pagliko ng isang likid. Totoo, sinasabi nila na mas mahusay na magkaroon ng boltahe nang kaunti kaysa sa maximum - ito ay gumagana nang mas matatag. Mayroon akong halos 40 V sa aking punto ng pagsubok.

    Ang kinopyang marka ay gumagamit ng Manchester encoding. Upang i-decrypt ang code na ito, sapat na upang laktawan ang tatlong-kapat ng panahon ng bit slot para sa anumang pagbabago sa gilid ng signal at, batay sa pagbaba ng signal kasunod nito, upang ayusin ang halaga ng bit na tumutugma sa halaga ng signal pagkatapos ng pagbaba. Kapag nagde-decode, sulit na tukuyin ang isang window kung saan dapat mangyari ang pagbaba ng signal - hindi hihigit sa kalahati ng panahon ng bit slot.

    Paraan ng decryption Pag-encode ng Manchester at kinuha ko ang code para dito kay Shads. Siyempre, maaari mong isulat ang iyong sarili, ngunit nagmamadali akong ilunsad ang copier - Gusto kong tiyakin na gumagana ang circuit at tinatanggap ang mga tag. Kaya ang fragment na ito ay nanatili sa copier code. Ito rin ay lumabas na ang aking comparator ay na-configure nang inversely kaysa sa kung ano ang kailangan ng decoding code. Binago ito sa code. Kaya, nakakuha kami ng mga sequence ng mga zero at isa. Paano ko makukuha ang card code mula sa kanila?

    Ito ay napaka-simple. Ipagpalagay natin na ang numero ng card ayon sa mga nibbles ay may anyo AB CD EF GH IJ. Ipinapakita ito ng mapa:

    1) Siyam na yunit sa simula;
    2) Nibble A;
    3) Nibble parity A (1 bit);
    4) Nibble B;
    5) Nibble parity B (1 bit);

    16) Nibble I;
    17) Nibble parity I (1 bit);
    18) Nibble J;
    19) Nibble parity J (1 bit);
    20) Column parity nibble para sa mga nibbles A B C D E F G H I J;
    21) Bit 0.

    Binabasa namin ang lahat ng 64 bits, i-decrypt at kumuha ng 40 bits ng card code. Ito ay lohikal na kung kami mismo ang nag-isyu ng naturang code, na isinasara ang coil ng card na naka-attach sa reader, makakakuha kami ng isang card emulator. Pero ngayon hindi na kami interesado sa kanya.

    Natuto kaming magbasa ng mapa, ngunit paano namin mailipat ang data sa mapa? Upang gawin ito, kailangan mo lang i-on o i-off ang 125 KHz frequency alinsunod sa protocol ng komunikasyon sa card. Sa panahon ng "katahimikan" ng mambabasa, ang card ay pinapagana ng nakaimbak na enerhiya.

    Ang T5557/T5577 na mga blangko ay ganap na tugma sa isa't isa sa mga tuntunin ng pag-record ng mga protocol, gayunpaman, mayroon silang bahagyang naiibang minimum at maximum na beses pulses (sa kabutihang palad, ang mga oras ng T5557 ay nagsasapawan sa T5577). Ang EM4305 ay may ibang recording protocol.

    Upang i-record ang T5557 ginamit ko ang code na BolshoyK. Ipinapakita ng talahanayan sa ibaba ang mga parameter ng signal para sa T5557 key fob.

    Ang pagre-record ay nagsisimula sa StartGape signal - kailangan mong i-off ang 125 KHz signal para sa humigit-kumulang 300 µs. Ito ay isang senyales sa card na ang data ay magsisimula na ngayong ilipat dito. Susunod, dapat mong ilipat ang impormasyon sa blangko. Ang pag-encode ng ipinadalang data ay ang parehong Manchester.

    Ang mga blangko na T5557/T5577 at EM4305 ay multifunctional at maaari iba't ibang uri modulasyon, suporta sa mga password at marami pang iba. Ang bawat disc na nakasakay ay may set ng 32-bit na mga bloke. Iba ang layunin ng mga bloke na ito. Sa ilan, ang key code ay inisyu (ito ay tumatagal ng dalawang bloke). Sa iba pa - pagsasaayos. Pangatlo, ang identifier ng tagagawa. Gumagamit kami ng limitadong pag-andar, kaya ang mga nais na maunawaan kung ano ang ibig sabihin ng lahat ng mga piraso na ito ay maaaring tumingin sa dokumentasyon para sa mga blangko (na-attach ko ito sa archive).

    Ang mga bloke ay kinokolekta sa dalawang pahina (0 at 1).

    Sa zero page ay mayroong configuration block na may index 0. Ito ang itatakda natin. Para sa T5557/T5577 magkakaroon tayo ng sumusunod na configuration byte: 0x00.0x14.0x80.0x40 alinsunod sa talahanayan mula sa dokumentasyon (minarkahan ko ng pula ang mga mode na pinili ng isang bit):

    Kaya, napili namin ang: RF/64 data transmission frequency (125 KHz/64), Manchester type encoding, issuing blocks hanggang sa pangalawa (sa block 1 at 2 magkakaroon kami ng code na ibibigay ng card). Bago magsulat, dapat magpadala ng opcode (2 opcode bits) at isang latch bit (lockbit). Ang mga Opcode 10b at 11b ay nauuna sa pagsulat ng data para sa mga pahina 0 at 1 (ang hindi bababa sa makabuluhang bit ay tumutukoy sa numero ng pahina, ang pinaka makabuluhang bit ay tumutukoy sa pahina ng pagsulat ng code). Nag-isyu kami ng 10b para sa opcode (lahat ng trabaho ay tapos na sa zero page) at 0b para sa latch bit. Matapos ilipat ang lahat ng data na ito, kinakailangang ilipat ang tatlong-bit na address ng pahinang isusulat. Ang lahat ng paglilipat ng data para sa T5557/T5577 ay isinasagawa mula sa pinakamahalaga hanggang sa pinakamaliit.

    Sa pamamagitan ng pagtatakda ng card code sa block 1 at 2 at sa configuration sa block 0, makakakuha ka ng duplicate na RFID tag. Tulad ng nakikita mo, ang lahat ay simple.

    Ang susunod na uri ng mga blangko ay EM4305. Kaya kinailangan kong harapin ang pag-record ng blangko na ito sa aking sarili. Binubuo din ito ng mga bloke ng 32 bits, ngunit iba ang kanilang layunin.

    Ang pag-encode ng data na ipinadala sa card ay batay sa mga pagkakaiba sa isang agwat ng oras. Kung nagkaroon ng pagkakaiba sa pagitan ng oras, ito ay zero, at kung wala, ito ay isa. Ang configuration word ay naka-imbak sa byte 4 at para sa aking sarili ay tinukoy ko ito bilang mga sumusunod: 0x5F,0x80,0x01,0x00 (Manchester encoding, RF/64, output word 6). Sa mga salita 5 at 6 isinulat ko ang card code (ang parehong 64 bits na ginawa ng card). Kinakailangan ng EM4305 na ang paghahatid ay isakatuparan mula sa pinakamaliit na makabuluhang bit hanggang sa pinakamahalaga. Nauunawaan ng card na ang isang palitan ay nagsisimula dito pagkatapos bigyan ito ng kumbinasyon ng mga impulses:

    1. Pinapatay namin ang field sa 48 µs.
    2. Binuksan namin ang field para sa 96 μs.
    3. I-off ang field sa 320 µs.
    4. Binuksan namin ang field sa 136 μs.
    5. Huwag paganahin ang field hanggang sa susunod na command.
    Ang utos na magsulat ng isang bloke sa mapa ay ipinadala tulad ng sumusunod:
    1. Ipinapadala namin ang pagkakasunud-sunod ng mga impulses sa itaas.
    2. Nagpapadala kami ng 0b.
    3. Ipinapadala namin ang CC0-CC1 at ang kanilang parity P. (0101b para sa pag-record, tingnan ang mga talahanayan sa ibaba).
    4. Ipinapadala namin ang block address (tingnan ang talahanayan), dalawang trailing zero at ang parity ng address.
    5. Nagpapadala kami ng block data (32 bits).

    Format ng Utos


    Mga command code

    Format ng Block Address

    Itinatakda nito ang pagsasaayos ng blangko ng EM4305 at ang code nito.

    Sa totoo lang, hindi na kailangan ng isang simpleng copier.

    Gumawa ako ng ilang bersyon ng copier na may iba't ibang display. Halimbawa, narito ang isang copier na may 1602 display:

    At narito ang isang video ng copier na gumagana sa LPH9157-02 display.

    Ang proyektong ito ay ginawa sa kahilingan ng isang kaibigan na mai-install sa isang pinto sa isang silid ng imbakan. Kasunod nito, ilan pa ang ginawa sa kahilingan ng mga kaibigan at kakilala. Ang disenyo ay naging simple at maaasahan. Gumagana ang device na ito tulad nito: pinapayagan lamang nito ang mga RFID card na dati nang nakaimbak sa memorya ng device.

    Mga pangunahing katangian ng access controller:

    RFID card EMmarin 125kHz format

    Microcontroller ATtiny13

    Bilang ng mga card/key fobs - 10.
    Ang "OPEN" na buton ay karaniwang bukas at protektado mula sa dumikit.
    I-lock ang control output, mataas na kasalukuyang field effect transistor, latch operating mode (pansamantalang i-on).

    Kapangyarihan - 12v.
    Ang pagkonsumo sa standby mode ay 35 mA.
    Bilang ng mga access card/fobs - 10 pcs.
    Ang haba ng komunikasyon sa pindutang "OPEN" ay 10 metro.
    Uri ng output ng lock control - open drain (makapangyarihang field-effect transistor, kasalukuyang hanggang 2A).

    Schematic diagram ng isang access restriction controller sa RFID card 125KHz (Em-Marin) para sa 10 card (sa isang ATtiny13 microcontroller):

    Kung kailangan mong kontrolin ang isang electromagnetic lock, kailangan mong mag-install ng isang output relay na may kinakailangang contact group.

    Hitsura ng pinagsama-samang RFID validator:

    Pagtatakda ng Fuse bits sa PonyProg:

    Pagpapatakbo ng device, mag-download ng video na na-record ng may-akda.
    Ang isa sa mga mambabasa ay nag-publish din ng isang video ng naka-assemble na device sa pagkilos:

    Mga tagubilin sa programming

    Operating mode - kapag ang 12V ay ibinibigay sa controller, ang LED ay kumikislap ng 1Hz.
    Programming mode - LED flashes 2Hz.
    Kapag pinindot mo ang "OPEN" na buton, isang serye ng mga maikling beep ang magaganap habang ang lock ay nagbubukas.

    Mga signal ng tunog

    1 maikling signal - ang card o key fob ay nakasulat sa memorya ng controller.
    2 maikling beep - nakaimbak na ang card o key fob sa memorya ng controller.
    5 maikling beep - lumabas mula sa programming mode.
    1 mahabang beep- ang memorya ng key card ay mabubura mula sa controller.
    tuloy-tuloy maikling signal- puno na ang card/key memory, maximum na 10 pcs. (nangangailangan ng pag-off ng power sa controller).

    Pagre-record ng MASTER CARD at oras ng pagbubukas ng lock

    1 - I-off ang kapangyarihan ng controller.
    2 - Pindutin ang "OPEN" na buton
    3 - Habang hawak ang button, ikonekta ang power sa controller, pagkatapos ng 5 segundo. ang controller na "BEEPS", ang LED ay kukurap sa dalas na 2 Hz.
    4 - Bitawan ang pindutan.
    5 - Magdala ng card o key fob sa reading area, isang tunog ang tutunog beep, Ang master card o key fob ay RECORDED, at ang oras ng pagbubukas ng lock na 1 segundo ay itatala.

    6 - Hawakan ang card o key fob sa lugar ng pagbabasa at bilangin ang mga sound signal. Tinutukoy ng dami ang kinakailangang oras upang buksan ang lock, mga pagtaas ng 1 segundo, ngunit hindi hihigit sa 32 segundo.
    7 - I-off ang power sa controller o i-pause ng 30 segundo.

    Binura ang lahat ng memorya ng mga key fob card

    1 - Operating mode.
    2 - Pindutin ang "OPEN" button at hawakan ito, dalhin ang MASTER card o key fob sa reader at hawakan ito, pagkatapos ng 5 segundo ay tutunog ang mahabang beep - mabubura ang memorya ng mga card/key fob.
    3 - Bitawan ang button at alisin ang card o key fob.