การสร้างล็อค RFID โดยใช้ Arduino การอ่านและเขียนแท็ก RFID โมดูล RC522 สำหรับ Arduino

วันนี้ฉันจะพูดเกี่ยวกับโมดูล RFID RC522 ที่ใช้ชิป MFRC522 แหล่งจ่ายไฟ 3.3V ระยะการตรวจจับสูงสุด 6 ซม. ออกแบบมาสำหรับการอ่านและเขียนแท็ก RFID ด้วยความถี่ 13.56 MHz ความถี่ใน ในกรณีนี้มีความสำคัญมาก เนื่องจากแท็ก RFID มีอยู่ในช่วงความถี่สามช่วง:


  • เครื่องหมายช่วง LF (125-134 kHz)

  • แท็กวง HF (13.56 MHz)

  • แท็กวง UHF (860-960 MHz)

โมดูลเฉพาะนี้ทำงานร่วมกับแท็กแบนด์ HF โดยเฉพาะอย่างยิ่งกับโปรโตคอล MIFARE

คุณสามารถใช้โมดูลเพื่อทำงานกับโมดูลได้ ห้องสมุดมาตรฐานรวม RFID อาร์ดูโน่ IDEอย่างไรก็ตาม มีอีกไลบรารีหนึ่งที่เขียนขึ้นสำหรับโมดูลนี้โดยเฉพาะ - MFRC522 (1 MB) ห้องสมุดทั้งสองแห่งค่อนข้างสะดวก แต่ MFRC522 มีมากกว่านั้น ฟังก์ชั่นพิเศษทำให้สามารถลดโค้ดโปรแกรมสุดท้ายลงได้มากที่สุด

การเชื่อมต่อ

บางคนอาจประสบปัญหา - ชื่อของหมุดในบทช่วยสอนและคำแนะนำส่วนใหญ่อาจไม่ตรงกับหมุดในโมดูลของคุณ หากภาพร่างระบุพิน SS แต่โมดูลของคุณไม่มี เป็นไปได้มากว่าจะมีการทำเครื่องหมายเป็น SDA ด้านล่างนี้ฉันจะจัดเตรียมตารางการเชื่อมต่อโมดูลสำหรับบอร์ดทั่วไป

MFRC522 อาร์ดูโน่ อูโน่ อาร์ดูโน่ เมก้า อาร์ดูโน่ นาโน v3

Arduino เลโอนาร์โด/ไมโคร

อาร์ดูโน่ โปร ไมโคร
พ.ศ 9 5 D9 รีเซ็ต/ICSP-5 พ.ศ
เอสดีเอ(เอสเอส) 10 53 D10 10 10
โมซี่ 11 (ไอซีเอสพี-4) 51 D11 ไอซีเอสพี-4 16
มิโซะ 12 (ไอซีเอสพี-1) 50 D12 ICSP-1 14
เอสซีเค 13 (ไอซีเอสพี-3) 52 D13 ICSP-3 15
3.3V 3.3V 3.3V โคลง 3.3V โคลง 3.3V โคลง 3.3V
จีเอ็นดี จีเอ็นดี จีเอ็นดี จีเอ็นดี จีเอ็นดี จีเอ็นดี

พินควบคุม SS(SDA) และ RST ได้รับการระบุไว้ในแบบร่าง ดังนั้นหากบอร์ดของคุณแตกต่างจากที่ฉันจะใช้ในตัวอย่างของฉัน และฉันใช้ UNO R3 ให้ระบุพินจากตารางที่จุดเริ่มต้นของการร่างภาพ : :


#กำหนด SS_PIN 10 #กำหนด RST_PIN 9

ตัวอย่างที่ 1: การอ่านหมายเลขบัตร

ลองดูตัวอย่างจากห้องสมุด RFID - cardRead มันไม่แสดงข้อมูลจากการ์ด แต่จะแสดงเฉพาะหมายเลขเท่านั้นซึ่งโดยปกติจะเพียงพอสำหรับงานหลายอย่าง


#รวม #รวม #กำหนด SS_PIN 10 #กำหนด RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // ข้อมูลเกี่ยวกับหมายเลขการ์ดถูกเก็บไว้ใน 5 ตัวแปร เราจะจดจำไว้เพื่อตรวจสอบว่าเราได้อ่านการ์ดดังกล่าวแล้ว int serNum0;

int serNum1;

int serNum2; int serNum3; int serNum4; การตั้งค่าเป็นโมฆะ () ( Serial.begin (9600); SPI.begin (); rfid.init (); ) void loop () ( ถ้า (rfid.isCard ()) ( ถ้า (rfid.readCardSerial ()) ( // เปรียบเทียบหมายเลขบัตรกับหมายเลขของบัตรก่อนหน้า ถ้า (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) ( / * หากเป็นการ์ดใหม่ ให้อ่าน */ Serial.println("Card found"); serNum0 = rfid.serNum; serNum2 = rfid.serNum; //พิมพ์หมายเลขการ์ด Serial.println("Cardnumber: "); .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.พิมพ์(rfid.serNum,HEX);

Serial.print(", ");

Serial.พิมพ์(rfid.serNum,HEX);


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // สร้างการตั้งค่าโมฆะของอินสแตนซ์ MFRC522() ( Serial.begin(9600); // เตรียมใช้งานมอนิเตอร์พอร์ตอนุกรมในขณะที่ (!Serial); // ไม่ทำอะไรเลยจนกว่าจะเปิด (สำหรับ Arduino บนชิป ATMEGA32U4) SPI.begin( ) ; // เริ่มต้นบัส SPI mfrc522.PCD_Init(); // เตรียมใช้งาน โมดูลอาร์เอฟไอดี ShowReaderรายละเอียด(); // พิมพ์ข้อมูลเกี่ยวกับโมดูล MFRC522 Serial.println(F("สแกน PICC เพื่อดู UID ประเภท และบล็อกข้อมูล...")); ) void loop() ( // กำลังค้นหา แผนที่ใหม่ if (! mfrc522.PICC_IsNewCardPresent()) ( return; ) // เลือกหนึ่งในการ์ด if (! mfrc522.PICC_ReadCardSerial()) ( return; ) // ส่งข้อมูลออกจากการ์ด mfrc522.PICC_DumpToSerial(&(mfrc522.uid) ); ) โมฆะ ShowReaderDetails() ( // รับหมายเลขเวอร์ชันของโมดูล byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); ถ้า (v == 0x91) Serial.print(F(" = v1.0")); อื่น ๆ ถ้า (v == 0x92) Serial.print(F(" = v2.0")); ")); Serial.println(""); // เมื่อเราได้รับ 0x00 หรือ 0xFF การส่งข้อมูลจะเสียหายหาก ((v == 0x00) || (v == 0xFF)) ( Serial.println( F(" คำเตือน: การสื่อสารล้มเหลว MFRC522 เชื่อมต่ออย่างถูกต้องหรือไม่?"));

หากตัวอย่างก่อนหน้านี้ทำงานได้โดยไม่มีข้อผิดพลาด ก็ไม่น่าจะมีปัญหาเช่นกัน แม้ว่าบัตรโดยสารรถไฟใต้ดินซึ่งให้หมายเลขบัตรโดยไม่มีปัญหาใดๆ ในตัวอย่างก่อนหน้านี้ กลับกลายเป็นประเภทข้อมูลที่ตรวจไม่พบในบัตรนี้ และโมดูลก็ไม่สามารถอ่านสิ่งอื่นใดนอกจากหมายเลขบัตรได้

ด้วยเหตุนี้เมื่ออ่านข้อมูลจากการ์ดแล้ว เราจึงได้รับประเภท ตัวระบุ และข้อมูลจากเซกเตอร์หน่วยความจำ 16 ส่วน ควรสังเกตว่าการ์ดมาตรฐาน MIFARE 1K ประกอบด้วย 16 ส่วน แต่ละส่วนประกอบด้วย 4 บล็อก และแต่ละบล็อกประกอบด้วยข้อมูล 16 ไบต์


ตัวอย่างหมายเลข 3: การเขียนตัวระบุใหม่ลงในการ์ด

ในตัวอย่างนี้ เราจะดูที่การเปลี่ยนตัวระบุบัตร (UID) สิ่งสำคัญคือต้องทราบว่าการ์ดบางใบไม่รองรับการเปลี่ยน ID การ์ดอาจเขียนซ้ำได้ แต่นั่นหมายความว่าข้อมูลสามารถเขียนใหม่ได้เท่านั้น น่าเสียดายที่การ์ดที่ฉันมีในมือไม่รองรับการเขียน 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; การตั้งค่าเป็นโมฆะ() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("คำเตือน: ตัวอย่างนี้จะเขียนทับ UID ของการ์ด UID ที่เปลี่ยนแปลงได้ของคุณ, ใช้ด้วยความระมัดระวัง!")); สำหรับ (ไบต์ 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: การเขียนข้อมูลลงในการ์ด

ในที่สุดนี่คือสิ่งที่เราทำมาเป็นเวลานาน - การบันทึกข้อมูลลงในการ์ด ส่วนที่หอมหวานที่สุดในการทำงานกับโมดูลคือความสามารถในการทำสำเนาการ์ดที่มีอยู่ เพิ่มหรือเปลี่ยนแปลงบางสิ่ง ซึ่งน่าสนใจมากกว่าการอ่านเพียงอย่างเดียว

มาเปลี่ยนบล็อกข้อมูลอันใดอันหนึ่งบนแผนที่:


#รวม #รวม #กำหนด RST_PIN 9 #กำหนด SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::คีย์ MIFARE_Key; void setup() ( Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // เตรียมคีย์ // ใช้คีย์ FFFFFFFFFFFFh ซึ่งเป็นมาตรฐานสำหรับ บัตรเปล่าสำหรับ (ไบต์ 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 ในบริเวณใกล้เคียง แท็กที่ใช้งานอยู่มีแหล่งพลังงานในพื้นที่ (เช่น แบตเตอรี่) และสามารถทำงานได้ในระยะหลายร้อยเมตรจากเครื่องอ่าน แท็กไม่จำเป็นต้องอยู่ในสายตาของอุปกรณ์ต่างจากบาร์โค้ด จึงสามารถฝังไว้ในวัตถุที่กำลังติดตามได้ RFID เป็นหนึ่งในวิธีการในการระบุตัวตนและการรวบรวมข้อมูลโดยอัตโนมัติ

แอปพลิเคชัน

แท็ก RFID ใช้ในหลายอุตสาหกรรม ตัวอย่างเช่น เครื่องอ่าน RFID ที่ติดอยู่กับยานพาหนะระหว่างการผลิตสามารถใช้เพื่อติดตามความคืบหน้าในสายการผลิตได้ สามารถติดตามเภสัชภัณฑ์ที่มีฉลากผ่านคลังสินค้าได้ การฝังไมโครชิป RFID เข้าไปในปศุสัตว์ช่วยให้สามารถระบุสัตว์ได้

เนื่องจากแท็ก RFID สามารถติดไว้กับเงิน เสื้อผ้า และทรัพย์สิน หรือฝังไว้ในสัตว์และคนได้ ความสามารถในการอ่าน ข้อมูลส่วนบุคคลโทรโดยไม่ได้รับความยินยอมจากผู้ใช้ ปัญหาร้ายแรงความเป็นส่วนตัว. ความเสี่ยงเหล่านี้นำไปสู่การพัฒนาข้อกำหนดมาตรฐานที่จัดการกับปัญหาความปลอดภัยของข้อมูลส่วนบุคคล แท็กยังสามารถนำมาใช้ในร้านค้าเพื่อเพิ่มความเร็วในการชำระเงินและป้องกันการโจรกรรม

เรื่องราว

ในปี 1945 Leon Theremin ได้คิดค้นอุปกรณ์การฟังสำหรับ สหภาพโซเวียตซึ่งส่งคลื่นวิทยุอีกครั้งพร้อมข้อมูลเสียงเพิ่มเติม การสั่นสะเทือนของเสียงระหว่างการสั่นสะเทือนส่งผลต่อไดอะแฟรม ซึ่งเปลี่ยนรูปร่างของเครื่องสะท้อนเสียงเล็กน้อย โดยปรับความถี่วิทยุที่สะท้อน แม้ว่าอุปกรณ์นี้จะเป็นอุปกรณ์ดักฟังแอบแฝงแทนที่จะเป็นแท็ก ID แต่ก็ถือเป็นบรรพบุรุษของเครื่องอ่าน USB RFID เนื่องจากถูกเปิดใช้งานโดยคลื่นเสียงจาก แหล่งภายนอก- ดาวเทียมยังคงใช้อยู่ในเครื่องบินปฏิบัติการส่วนใหญ่ ก่อนหน้านี้ เทคโนโลยีที่คล้ายกัน เช่น เครื่องอ่านแท็ก RFID ถูกใช้เป็นประจำโดยฝ่ายสัมพันธมิตรและเยอรมนีในสงครามโลกครั้งที่สองเพื่อระบุเครื่องบิน

อุปกรณ์ของ Mario Cardullo ซึ่งได้รับการจดสิทธิบัตรเมื่อวันที่ 23 มกราคม พ.ศ. 2516 เป็นอุปกรณ์รุ่นแรกที่แท้จริงของ RFID สมัยใหม่ เนื่องจากเป็นเครื่องรับวิทยุแบบพาสซีฟที่มีหน่วยความจำ อุปกรณ์ดั้งเดิมเป็นแบบพาสซีฟ ซึ่งขับเคลื่อนโดยสัญญาณโพล ได้รับการสาธิตในปี 1971 ต่อฝ่ายบริหารของนครนิวยอร์กและหน่วยงานอื่นๆ ผู้ใช้ที่มีศักยภาพและประกอบด้วยทรานสปอนเดอร์ที่มีหน่วยความจำขนาด 16 บิตเพื่อใช้เป็น อุปกรณ์ที่ต้องชำระเงิน- สิทธิบัตรหลักของ Cardullo ครอบคลุมถึงการใช้ความถี่วิทยุ เสียง และแสงเป็นสื่อในการส่งสัญญาณ

พื้นที่ใช้งาน

แผนธุรกิจเดิมที่นำเสนอแก่นักลงทุนในปี พ.ศ. 2512 แสดงให้เห็นการใช้งานดังต่อไปนี้: เครื่องอ่านอาร์เอฟไอดี:

  • ใช้ในการขนส่ง (การระบุยานพาหนะ ระบบอัตโนมัติการชำระเงิน ป้ายทะเบียนอิเล็กทรอนิกส์ รายการอิเล็กทรอนิกส์ การกำหนดเส้นทาง ยานพาหนะ, การตรวจสอบประสิทธิภาพของยานพาหนะ);
  • การธนาคาร (สมุดเช็คอิเล็กทรอนิกส์, อิเล็กทรอนิกส์ บัตรเครดิต);
  • บุคลากร ประตูอัตโนมัติ กล้องวงจรปิด); อุตสาหกรรมการแพทย์ (การระบุตัวตน ประวัติผู้ป่วย)

การสาธิตพลังการสะท้อนในช่วงแรก (การกระจายกลับแบบมอดูเลต) ของแท็ก RFID ทั้งแบบพาสซีฟและกึ่งพาสซีฟ ดำเนินการโดย Stephen Depp, Alfred Koelle และ Robert Fryman ที่ห้องปฏิบัติการแห่งชาติ Los Alamos ในปี 1973 ระบบพกพาวิ่งที่ 915 MHz และใช้แท็ก 12 บิต วิธีการนี้ใช้โดยเครื่องอ่าน UHFID และไมโครเวฟ RFID ที่ทันสมัยที่สุด ใน ชีวิตสมัยใหม่อุปกรณ์ดังกล่าวเป็นที่ต้องการอย่างมาก

ข้อมูลจำเพาะ

RFID ใช้แท็กที่แนบมากับวัตถุที่ระบุตัวได้ เมื่อสร้างเครื่องอ่าน RFID ของคุณเอง โปรดจำไว้ว่าเครื่องรับส่งสัญญาณวิทยุแบบสองทางที่เรียกว่าผู้สอบสวนหรือเครื่องอ่าน จะส่งสัญญาณไปยังแท็กและอ่านการตอบสนอง แท็ก RFID อาจเป็นแบบพาสซีฟ แอคทีฟ หรือพาสซีฟ แท็กที่ใช้งานอยู่มีแบตเตอรี่ในตัวและส่งสัญญาณ ID เป็นระยะ แบตเตอรี่แบบพาสซีฟ (BAP) มีแบตเตอรี่ขนาดเล็กอยู่บนเครื่อง และเปิดใช้งานได้เมื่อมีเครื่องอ่าน RFID แท็กแบบพาสซีฟมีราคาถูกกว่าและเล็กกว่าเนื่องจากไม่มีแบตเตอรี่ แท็กจะใช้คลื่นวิทยุที่ส่งโดยผู้อ่านแทน อย่างไรก็ตาม เพื่อให้แท็กพาสซีฟทำงานได้ จะต้องได้รับแสงสว่างที่ระดับพลังงานที่แรงกว่าการส่งสัญญาณประมาณหนึ่งพันเท่า สิ่งนี้ส่งผลต่อการรบกวนและการฉายรังสี

  • การเขียนโปรแกรมไมโครคอนโทรลเลอร์
  • ดังที่คุณทราบ ระบบการเข้าถึงจำนวนมากใช้การ์ด RFID ของมาตรฐาน EM-Marin ที่มีความถี่ 125 KHz อินเตอร์คอมที่บ้านฉันก็ไม่มีข้อยกเว้น ปัญหาหนึ่ง - เป็นการดีที่จะเรียนรู้วิธีคัดลอกการ์ดดังกล่าวเนื่องจากป้ายราคาสำหรับการคัดลอกการ์ดไม่สนับสนุน แน่นอนว่ามีแผนเครื่องถ่ายเอกสารอยู่บ้างทางออนไลน์ (และชาวจีนขายเครื่องถ่ายเอกสารเป็นเพนนี - อย่างไรก็ตามพวกเขามักจะใส่รหัสผ่านบนแผ่นดิสก์เมื่อทำการคัดลอก) แต่ทำไมไม่สร้างเครื่องถ่ายเอกสารของคุณเองล่ะ นั่นคือสิ่งที่บทความด้านล่างเป็นเรื่องเกี่ยวกับ

    การเริ่มต้นพัฒนาเครื่องถ่ายเอกสารนั้นคุ้มค่าโดยการค้นหาว่าเครื่องหมายดังกล่าวสามารถคัดลอกไปที่ใดได้บ้าง หลังจากอ่านฟอรัมแล้วคุณจะพบว่าช่องว่างที่พบบ่อยที่สุดสำหรับการคัดลอกคือ T5577, T5557, EM4305

    ตอนนี้เราต้องการไดอะแกรม ลองใช้ส่วนอะนาล็อกของเครื่องถ่ายเอกสารจาก RECTO แล้วเชื่อมต่อกับไมโครคอนโทรลเลอร์ atmega8 มาเพิ่มตัวแปลงระดับสำหรับการเชื่อมต่อกับพอร์ต COM ที่ใช้ max232 (ผู้ที่ต้องการสามารถใช้ ST232 หรืออย่างอื่นเพื่อเชื่อมต่อผ่าน USB ได้ แต่ฉันมีพอร์ต COM บนคอมพิวเตอร์ของฉันเหมือนเดิม อะแดปเตอร์ USB-COMฉันก็เลยไม่มีงานแบบนั้น)

    คุณจะได้แผนภาพนี้:

    เธอเป็นยังไงบ้าง? ตัวติดตามตัวส่งสัญญาณคู่ วงจรการสั่น ตัวตรวจจับ และตัวกรอง RC เนื่องจากตัวกรอง RC มีค่าคงที่เวลาที่แตกต่างกัน โดยการเปรียบเทียบระดับแรงดันไฟฟ้าระหว่างขั้นตอน จึงเป็นไปได้ที่จะแยกการเปลี่ยนแปลงในสัญญาณแท็ก RFID ได้ งานนี้จะได้รับการจัดการโดยตัวเปรียบเทียบที่สร้างไว้ใน atmega8 การสร้างสัญญาณ 125 KHz จะมาจากตัวควบคุม PWM ที่ติดตั้งอยู่ใน atmega8

    การรวมกันของแท็ก RFID และเครื่องอ่านจะทำให้เกิดหม้อแปลงไฟฟ้า โดยที่แท็กจะเป็นขดลวดทุติยภูมิ ข้อมูลจะถูกส่งโดยแท็กโดยการเปลี่ยนภาระของขดลวดทุติยภูมิ เป็นผลให้กระแสในคอยล์เครื่องอ่าน (ขดลวดปฐมภูมิ) เปลี่ยนแปลงไป ส่วนอะนาล็อกด้านบนของวงจรมีหน้าที่แยกพัลส์กระแสเหล่านี้ วงจรการสั่นจำเป็นต้องกำหนดค่าเป็น แรงดันไฟฟ้าสูงสุดวี จุดควบคุมเช่น การพัน/การพันรอบขดลวด จริงอยู่พวกเขาบอกว่าควรมีแรงดันไฟฟ้าน้อยกว่าค่าสูงสุดเล็กน้อย - มันทำงานได้เสถียรกว่า ฉันมีประมาณ 40 V ที่จุดทดสอบ

    เครื่องหมายที่คัดลอกใช้การเข้ารหัสแมนเชสเตอร์ เพื่อที่จะถอดรหัส รหัสนี้ก็เพียงพอที่จะข้ามสามในสี่ของช่วงบิตสล็อตสำหรับการเปลี่ยนแปลงใดๆ ในขอบสัญญาณ และขึ้นอยู่กับสัญญาณที่ลดลงตามมา เพื่อแก้ไขค่าบิตที่จะสอดคล้องกับค่าสัญญาณหลังจากการลดลง เมื่อถอดรหัสควรตั้งค่าหน้าต่างที่ควรเกิดสัญญาณตก - ไม่เกินครึ่งหนึ่งของช่วงบิต

    วิธีการถอดรหัส การเข้ารหัสแมนเชสเตอร์และฉันก็รับรหัสนี้มาจาก Shads แน่นอนว่าเป็นไปได้ที่จะเขียนของคุณเอง แต่ฉันก็รีบเปิดตัวเครื่องถ่ายเอกสาร - ฉันต้องการให้แน่ใจว่าวงจรใช้งานได้และแท็กได้รับการยอมรับแล้ว ดังนั้นส่วนนี้จึงยังคงอยู่ในรหัสเครื่องถ่ายเอกสาร ปรากฎว่าตัวเปรียบเทียบของฉันได้รับการกำหนดค่าผกผันกับความต้องการโค้ดถอดรหัส เปลี่ยนในโค้ดแล้ว เราได้ลำดับของเลขศูนย์และเลขหนึ่ง ฉันจะรับรหัสบัตรจากพวกเขาได้อย่างไร?

    และมันง่ายมาก ให้เราถือว่าหมายเลขบัตรตามแทะมีแบบฟอร์ม AB ซีดี EF GH IJ- แผนที่แสดงสิ่งนี้:

    1) เก้าหน่วยที่จุดเริ่มต้น;
    2) แทะ A;
    3) Nibble parity A (1 บิต);
    4) แทะ B;
    5) Nibble parity B (1 บิต);

    16) แทะฉัน;
    17) Nibble parity I (1 บิต);
    18) แทะเจ;
    19) Nibble parity J (1 บิต);
    20) คอลัมน์พาริตี้แทะสำหรับแทะ A B C D E F G H I J;
    21) บิต 0

    เราอ่านทั้งหมด 64 บิต ถอดรหัส และรับรหัสการ์ด 40 บิต มีเหตุผลว่าหากเราออกรหัสดังกล่าวเองโดยปิดคอยล์ของการ์ดที่แนบกับเครื่องอ่านเราจะได้ตัวจำลองการ์ด แต่ตอนนี้เราไม่สนใจเขาแล้ว

    เราเรียนรู้ที่จะอ่านแผนที่แล้ว แต่เราจะถ่ายโอนข้อมูลไปยังแผนที่ได้อย่างไร ในการดำเนินการนี้คุณเพียงแค่ต้องเปิดหรือปิดความถี่ 125 KHz ตามโปรโตคอลการสื่อสารกับการ์ด ในช่วง “ความเงียบ” ของเครื่องอ่าน การ์ดจะได้รับพลังงานจากพลังงานที่เก็บไว้

    ช่อง T5557/T5577 สามารถใช้งานร่วมกันได้อย่างสมบูรณ์ในแง่ของโปรโตคอลการบันทึก อย่างไรก็ตาม ช่องเหล่านี้มีค่าขั้นต่ำและ ครั้งสูงสุดพัลส์ (โชคดีที่เวลาของ T5557 ทับซ้อนกับ T5577) EM4305 มีโปรโตคอลการบันทึกที่แตกต่างกัน

    ในการบันทึก T5557 ฉันใช้รหัส BolshoyK ตารางด้านล่างแสดงพารามิเตอร์สัญญาณสำหรับพวงกุญแจ T5557

    การบันทึกเริ่มต้นด้วยสัญญาณ StartGape - คุณต้องปิดสัญญาณ 125 KHz เป็นเวลาประมาณ 300 µs นี่เป็นสัญญาณไปยังการ์ดว่าข้อมูลจะเริ่มถ่ายโอนไปยังการ์ดแล้ว ถัดไปคุณควรถ่ายโอนข้อมูลไปยังช่องว่าง การเข้ารหัสข้อมูลที่ส่งจะเหมือนกันกับแมนเชสเตอร์

    ช่องเปล่า T5557/T5577 และ EM4305 เป็นแบบมัลติฟังก์ชั่นและสามารถใช้งานได้ ประเภทต่างๆการปรับรหัสผ่านที่รองรับและอื่น ๆ อีกมากมาย แต่ละดิสก์บนบอร์ดมีชุดบล็อก 32 บิต จุดประสงค์ของการบล็อกเหล่านี้แตกต่างออกไป ในบางรหัสจะมีการออกรหัส (ใช้เวลาสองช่วงตึก) ในส่วนอื่น ๆ - การกำหนดค่า ประการที่สาม ตัวระบุของผู้ผลิต เราจะใช้ฟังก์ชันการทำงานที่จำกัด ดังนั้นผู้ที่ต้องการทำความเข้าใจว่าบิตเหล่านี้หมายถึงอะไร สามารถดูเอกสารประกอบสำหรับช่องว่างได้ (ฉันได้แนบไปกับไฟล์เก็บถาวรแล้ว)

    บล็อกจะถูกรวบรวมเป็นสองหน้า (0 และ 1)

    ในหน้าศูนย์จะมีบล็อกการกำหนดค่าที่มีดัชนี 0 นี่คือสิ่งที่เราจะตั้งค่า สำหรับ T5557/T5577 เราจะมีไบต์การกำหนดค่าต่อไปนี้: 0x00.0x14.0x80.0x40 ตามตารางจากเอกสารประกอบ (ฉันทำเครื่องหมายโหมดที่เลือกไว้หนึ่งบิตเป็นสีแดง):

    ดังนั้นเราจึงเลือก: ความถี่ในการส่งข้อมูล RF/64 (125 KHz/64), การเข้ารหัสประเภทแมนเชสเตอร์, การออกบล็อกจนถึงวินาที (ในบล็อก 1 และ 2 เราจะมีรหัสที่ออกโดยการ์ด) ก่อนที่จะเขียน จะต้องส่งโค้ดการดำเนินการ (opcode 2 บิต) และบิตสลัก (lockbit) หนึ่งบิต Opcodes 10b และ 11b นำหน้าการเขียนข้อมูลสำหรับหน้า 0 และ 1 (บิตที่มีนัยสำคัญน้อยที่สุดระบุหมายเลขหน้า บิตที่สำคัญที่สุดระบุโค้ดการเขียนหน้า) เราออก 10b สำหรับ opcode (งานทั้งหมดเสร็จสิ้นด้วยหน้าศูนย์) และ 0b สำหรับ latch bit หลังจากถ่ายโอนข้อมูลทั้งหมดนี้แล้ว จำเป็นต้องถ่ายโอนที่อยู่สามบิตของเพจที่จะเขียน การถ่ายโอนข้อมูลทั้งหมดสำหรับ T5557/T5577 จะดำเนินการจากบิตที่มีนัยสำคัญที่สุดไปยังบิตที่มีนัยสำคัญน้อยที่สุด

    ด้วยการตั้งค่ารหัสการ์ดในบล็อก 1 และ 2 และการกำหนดค่าในบล็อก 0 คุณจะได้รับแท็ก RFID ที่ซ้ำกัน อย่างที่คุณเห็นทุกอย่างเรียบง่าย

    ช่องว่างประเภทถัดไปคือ EM4305 ดังนั้นฉันจึงต้องจัดการกับการบันทึกที่ว่างเปล่านี้ด้วยตัวเอง นอกจากนี้ยังประกอบด้วยบล็อกขนาด 32 บิต แต่จุดประสงค์แตกต่างกัน

    การเข้ารหัสข้อมูลที่ส่งไปยังการ์ดจะขึ้นอยู่กับความแตกต่างในช่วงเวลาหนึ่ง หากมีความแตกต่างในช่วงเวลานั้น ค่าดังกล่าวจะเป็นศูนย์ และหากไม่มี ค่าดังกล่าวจะเป็นค่าหนึ่ง คำการกำหนดค่าถูกเก็บไว้ในไบต์ 4 และสำหรับตัวฉันเองฉันกำหนดไว้ดังนี้: 0x5F,0x80,0x01,0x00 (การเข้ารหัสแมนเชสเตอร์, RF/64, คำเอาท์พุต 6) ในคำที่ 5 และ 6 ฉันเขียนรหัสการ์ด (64 บิตเดียวกับที่การ์ดผลิต) EM4305 ต้องการให้ดำเนินการส่งจากบิตที่มีนัยสำคัญน้อยที่สุดไปยังบิตที่สำคัญที่สุด บัตรเข้าใจว่าการแลกเปลี่ยนเริ่มต้นด้วยหลังจากให้แรงกระตุ้นหลายอย่างรวมกัน:

    1. เราปิดสนามที่ 48 µs
    2. เราเปิดสนามเป็นเวลา 96 μs
    3. ปิดสนามที่ 320 µs
    4. เราเปิดสนามที่ 136 μs
    5. ปิดการใช้งานฟิลด์จนกว่าจะถึงคำสั่งถัดไป
    คำสั่งในการเขียนบล็อกลงบนแผนที่จะถูกส่งดังนี้:
    1. เราส่งลำดับแรงกระตุ้นข้างต้น
    2. เราส่ง 0b
    3. เราส่ง CC0-CC1 และพาริตี P. (0101b สำหรับการบันทึก ดูตารางด้านล่าง)
    4. เราส่งที่อยู่บล็อก (ดูตาราง) ศูนย์สองตัวต่อท้ายและความเท่าเทียมกันของที่อยู่
    5. เราส่งข้อมูลบล็อก (32 บิต)

    รูปแบบคำสั่ง


    รหัสคำสั่ง

    รูปแบบที่อยู่บล็อก

    นี่เป็นการตั้งค่าการกำหนดค่าของ EM4305 ว่างและรหัสของมัน

    จริงๆ แล้ว เครื่องถ่ายเอกสารธรรมดาไม่ต้องการอะไรอีกแล้ว

    ฉันสร้างเครื่องถ่ายเอกสารหลายเวอร์ชันพร้อมจอแสดงผลที่แตกต่างกัน ตัวอย่างเช่น นี่คือเครื่องถ่ายเอกสารที่มีจอแสดงผล 1602:

    และนี่คือวิดีโอของเครื่องถ่ายเอกสารที่ทำงานบนจอแสดงผล LPH9157-02

    โปรเจ็กต์นี้สร้างขึ้นตามคำร้องขอของเพื่อนที่จะติดตั้งไว้ที่ประตูห้องเก็บของ ต่อจากนั้นก็มีการทำเพิ่มอีกหลายอย่างตามคำร้องขอของเพื่อนและคนรู้จัก การออกแบบดูเรียบง่ายและเชื่อถือได้ ได้ผล อุปกรณ์นี้เช่นนี้: อนุญาตเฉพาะการ์ด RFID ที่เคยจัดเก็บไว้ในหน่วยความจำของอุปกรณ์เท่านั้น

    ลักษณะสำคัญของตัวควบคุมการเข้าถึง:

    บัตร RFID EMmarin รูปแบบ 125kHz

    ไมโครคอนโทรลเลอร์ ATtiny13

    จำนวนการ์ด/พวงกุญแจ - 10.
    ปกติปุ่ม "OPEN" จะเปิดและป้องกันไม่ให้ติด
    ล็อคเอาต์พุตควบคุมกระแสสูง ทรานซิสเตอร์สนามผล, โหมดการทำงานของสลัก (เปิดชั่วคราว)

    กำลังไฟ - 12v.
    การบริโภคในโหมดสแตนด์บายคือ 35 mA
    จำนวนบัตรเข้า/กุญแจ - 10 ชิ้น
    ความยาวการสื่อสารด้วยปุ่ม "OPEN" คือ 10 เมตร
    ประเภทเอาต์พุตควบคุมการล็อค - เดรนแบบเปิด (ทรานซิสเตอร์เอฟเฟกต์สนามอันทรงพลัง กระแสสูงถึง 2A)

    แผนผังของตัวควบคุมการจำกัดการเข้าถึงบนการ์ด RFID 125KHz (Em-Marin) สำหรับการ์ด 10 ใบ (บนไมโครคอนโทรลเลอร์ ATtiny13):

    หากคุณต้องการควบคุมล็อคแม่เหล็กไฟฟ้า คุณต้องติดตั้งรีเลย์เอาต์พุตพร้อมกับกลุ่มผู้ติดต่อที่ต้องการ

    ลักษณะที่ปรากฏของตัวตรวจสอบ RFID ที่ประกอบ:

    การตั้งค่าบิตฟิวส์ใน PonyProg:

    การทำงานของอุปกรณ์ดาวน์โหลดวิดีโอที่บันทึกโดยผู้เขียน
    ผู้อ่านรายหนึ่งยังได้เผยแพร่วิดีโอเกี่ยวกับการทำงานของอุปกรณ์ที่ประกอบขึ้นด้วย:

    คำแนะนำในการเขียนโปรแกรม

    โหมดการทำงาน - เมื่อจ่ายไฟ 12V ให้กับคอนโทรลเลอร์ LED จะกะพริบ 1Hz
    โหมดการเขียนโปรแกรม - LED กะพริบ 2Hz
    เมื่อคุณกดปุ่ม "OPEN" จะมีเสียงบี๊บสั้น ๆ ดังขึ้นในขณะที่ล็อคกำลังเปิดอยู่

    สัญญาณเสียง

    1 สัญญาณสั้น ๆ - การ์ดหรือปุ่มกดถูกเขียนลงในหน่วยความจำของคอนโทรลเลอร์
    เสียงบี๊บสั้น ๆ 2 ครั้ง - การ์ดหรือพวงกุญแจถูกจัดเก็บไว้ในหน่วยความจำของคอนโทรลเลอร์แล้ว
    เสียงบี๊บสั้น ๆ 5 ครั้ง - ออกจากโหมดการเขียนโปรแกรม
    1 เสียงบี๊บยาว- หน่วยความจำคีย์การ์ดถูกลบออกจากคอนโทรลเลอร์
    ต่อเนื่อง สัญญาณสั้น- หน่วยความจำการ์ด/กุญแจเต็ม สูงสุด 10 ชิ้น (ต้องปิดไฟไปที่คอนโทรลเลอร์)

    บันทึก MASTER CARD และล็อคเวลาเปิด

    1 - ปิดสวิตช์ควบคุม
    2 - กดปุ่ม "เปิด"
    3 - ขณะกดปุ่มค้างไว้ ให้เชื่อมต่อสายไฟเข้ากับคอนโทรลเลอร์หลังจากผ่านไป 5 วินาที เมื่อตัวควบคุม “BEEPS” ไฟ LED จะกระพริบที่ความถี่ 2 Hz
    4 - ปล่อยปุ่ม
    5 - นำการ์ดหรือกุญแจมาไว้ในบริเวณอ่านหนังสือ จะมีเสียงหนึ่งเสียงดังขึ้น บี๊บ, มาสเตอร์การ์ดหรือกุญแจรีโมทจะถูกบันทึก และเวลาเปิดล็อค 1 วินาทีจะถูกบันทึก

    6 - ถือการ์ดหรือพวงกุญแจไว้ในบริเวณอ่านหนังสือแล้วนับสัญญาณเสียง ปริมาณกำหนดเวลาที่ต้องการในการเปิดล็อค เพิ่มขึ้นครั้งละ 1 วินาที แต่ไม่เกิน 32 วินาที
    7 - ปิดสวิตช์ของตัวควบคุมหรือหยุดชั่วคราวเป็นเวลา 30 วินาที

    การลบหน่วยความจำทั้งหมดของการ์ดกุญแจ

    1 - โหมดการทำงาน
    2 - กดปุ่ม "OPEN" และในขณะที่กดค้างไว้ ให้นำการ์ด MASTER หรือพวงกุญแจไปที่เครื่องอ่านค้างไว้ หลังจากผ่านไป 5 วินาที เสียงบี๊บยาวจะดังขึ้น - หน่วยความจำของการ์ด/พวงกุญแจจะถูกลบ
    3 - ปล่อยปุ่มแล้วนำการ์ดหรือพวงกุญแจออกไป