เครื่องอ่าน AVR/Arduino RFID พร้อมรหัส UART ใน C: 4 ขั้นตอน
เครื่องอ่าน AVR/Arduino RFID พร้อมรหัส UART ใน C: 4 ขั้นตอน
Anonim

RFID เป็นความนิยมที่พบได้ทุกที่ ตั้งแต่ระบบสินค้าคงคลังไปจนถึงระบบ ID ป้าย หากคุณเคยไปที่ห้างสรรพสินค้าและเดินผ่านสิ่งที่ดูเหมือนเครื่องตรวจจับโลหะตรงจุดเข้า/ออก คุณคงเคยเห็น RFID แล้ว มีสถานที่หลายแห่งในการค้นหาข้อมูลที่ดีเกี่ยวกับการตั้งค่า RFID และคำแนะนำนี้จะเน้นที่การติดตั้งเครื่องอ่าน Parallax RFID reader (Serial TTL) บน AVR โดยเน้นที่รหัส C ที่จำเป็นในการอ่านอินพุตแบบอนุกรม รหัสอยู่ใน C และไม่ใช้ไลบรารีภายนอกใด ๆ ในความเป็นจริง มันพูด 2400 บอดโดยตรงโดยไม่ต้องใช้ UART โดยการซิงโครไนซ์กับอัตราบอดของเครื่องอ่าน RFID และอ่านพินดิจิทัลที่เชื่อมต่ออยู่ ตื่นเต้น? ฉันด้วย.

ขั้นตอนที่ 1: รับสินค้า

คุณจะต้องมีรายการชิ้นส่วนต่อไปนี้:

  • เครื่องอ่าน RFID (พารัลแลกซ์ #28140 $39.99)
  • แท็ก RFID (Parallax #32397 $0.99)
  • AVR หรือ Arduino clone (หากคุณใช้ AVR แบบสต็อก คุณจะต้องมีตัวเก็บประจุ max232, 5 x 1uF และขั้วต่อ DE9)
  • เขียงหั่นขนมไร้บัดกรี

ไม่จำเป็น

  • ส่วนหัว 4 ตำแหน่ง
  • ลวด

(และ max232 ฯลฯ สำหรับการสื่อสารข้อมูลแท็ก) คุณยังสามารถเชื่อมต่อหน้าจอ LCD ที่คุณชื่นชอบแทนการส่งข้อมูลแท็กผ่าน RS232

ขั้นตอนที่ 2: เชื่อมต่อชิ้นส่วน

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

  • Vcc
  • เปิดใช้งาน
  • ออก
  • Gnd

อย่างที่คุณอาจเดาได้ ให้เชื่อมต่อ Vcc กับ +5V และ Gnd กับกราวด์ เนื่องจากเครื่องอ่าน RFID ใช้พลังงานมาก คุณจึงสามารถกดพิน ENABLE เพื่อปิดและเปิดเครื่องตามช่วงเวลาต่างๆ ได้ ฉันเพียงแค่เลือกที่จะเก็บมันไว้ เนื่องจากเป็นกลับด้าน คุณดึง LOW เพื่อเปิดใช้งาน หรือคุณสามารถเชื่อมต่อกับกราวด์ ฉันเชื่อมต่อกับ PIND3 เพื่อให้ตัวเลือกในการเปิด/ปิดใช้งานหากฉันตัดสินใจ ขา OUT เป็นที่ที่เครื่องอ่านส่งข้อมูลอนุกรมหลังจากที่อ่านแท็กแล้ว ฉันเชื่อมต่อกับ PIND2. Note ใน Parallax Universe สีแดงหมายถึงไป กล่าวคือ ไฟ LED สีเขียวหมายความว่าเครื่องไม่ทำงานและไม่ได้ใช้งาน ขณะที่ LED สีแดงหมายถึงเครื่องทำงานอยู่ *ยักไหล่* คิดไปเอง

ขั้นตอนที่ 3: เขียนรหัส

ในการอ่านข้อมูลจากเครื่องอ่าน RFID คุณต้องทราบเมื่อมีการส่งแท็ก ดึงข้อมูลออกจากพอร์ตอนุกรม แล้วส่งข้อมูลไปที่ใดที่หนึ่ง

รูปแบบข้อมูลเครื่องอ่าน RFID

เครื่องอ่าน Parallax RFID จะส่งข้อมูลด้วยความเร็วคงที่ที่ 2400 บอด แท็ก RFID คือ 10 ไบต์ เพื่อให้สามารถตรวจจับ/แก้ไขข้อผิดพลาดได้ เนื่องจากเครื่องอ่านสามารถตั้งค่าให้ปิดเสียงแบบสุ่มได้ RFID ขนาด 10 ไบต์จึงถูกล้อมรอบไปด้วยยามเริ่มและหยุด ยามเริ่มต้นคือการป้อนบรรทัด (0x0A) และยามหยุดคือการขึ้นบรรทัดใหม่ (0x0D) ดูเหมือนว่านี้:

[เริ่ม Sentinel |ไบต์ 1|ไบต์ 2|ไบต์ 3|ไบต์ 4|ไบต์ 5|ไบต์ 6|ไบต์ 7|ไบต์ 8|ไบต์ 9|ไบต์ 10| หยุด Sentinel]นี่คือสามขั้นตอนหลัก

รู้ว่าเมื่อมีการส่งแท็ก

ฉันใช้ Pin Change Interrupt บน AVR ที่แจ้งเฟิร์มแวร์ว่ามีการเปลี่ยนแปลงบนพินที่ได้รับการตรวจสอบ การกำหนดค่า AVR สำหรับสิ่งนี้ทำได้ง่ายและต้องมีการตั้งค่าสถานะ บอก MCU ว่าคุณต้องการตรวจสอบพินใด และการตั้งค่าบิตขัดจังหวะทั่วโลก กำหนดค่า PCINT

BSET(PCICR, PCIE2); // พินเปลี่ยนการควบคุมการขัดจังหวะการลงทะเบียน pcie2 BSET (PCMSK2, PCINT18); // เปิดใช้งานการขัดจังหวะการเปลี่ยนพินสำหรับ PCINT18 (PD2) BSET(SREG, 7); // ตั้งค่า SREG I-bitเขียนรูทีนบริการอินเตอร์รัปต์ของคุณคุณต้องการให้ ISR ของคุณสั้น ดังนั้นในเวกเตอร์ขัดจังหวะของฉัน ฉันจะอ่านไบต์ทั้งหมด ทีละบิต และจัดเก็บไบต์ในอาร์เรย์อักขระผันแปรทั่วโลก ฉันทำสิ่งต่อไปนี้ทุกครั้งที่ขัดจังหวะ:

  • ตรวจสอบเพื่อให้แน่ใจว่าฉันกำลังเริ่มต้นบิต
  • จัดจังหวะเวลาให้อยู่ตรงกลางของพัลส์กลางที่ 2400 บอด (ความเร็วของเครื่องอ่าน RFID)
  • ข้ามบิตเริ่มต้นและหยุดกลางบิตถัดไป
  • อ่านแต่ละบิตเป็นจำนวนเต็มที่ไม่ได้ลงนาม
  • เมื่อฉันมี 8 บิต ให้ใส่ไบต์ลงในอาร์เรย์อักขระ
  • เมื่อฉันรวบรวม 12 ไบต์ ให้ MCU รู้ว่าแท็กถูกอ่านเพื่อตรวจหาข้อผิดพลาดแล้ว

ฉันแก้ไขโค้ด SoftSerial จาก Mikal Hart ผู้ซึ่งแก้ไขโค้ดจาก David Mellis สำหรับความล่าช้าที่กำหนดโดยการทดลองในรูทีนอนุกรม

แยกวิเคราะห์เอาต์พุต RS232

รูทีน PCINT มีโค้ดสำหรับอ่านเอาต์พุต RS232 จากเครื่องอ่าน RFID เมื่อฉันได้รับ 12 ไบต์ (10-byte RFID plus Sentinels) ฉันตั้งค่า bDataReady เป็น 1 และปล่อยให้ลูปหลักประมวลผลข้อมูลและแสดงข้อมูลนั้น

// นี่คือตัวจัดการการขัดจังหวะISR (PCINT2_vect){ if (BCHK(PIND, RFID_IN)) // บิตเริ่มต้นกลับคืนต่ำ uint8_t บิต = 0; TunedDelay(CENTER_DELAY); // เน้นที่บิตเริ่มต้นสำหรับ (uint8_t x = 0; x <8; x++) { TunedDelay (INTRABIT_DELAY); // ข้ามไปหน่อยพี่… if (BCHK(PIND, RFID_IN)) BSET(bit, x); BCLR(บิต, x); } TunedDelay(INTRABIT_DELAY); // ข้ามบิตหยุด RFID_tag[rxIdx] = บิต; ++rxIdx; ถ้า (rxIdx == 12) bDataReady = 1;}

แสดงแท็กของคุณ

ใน main() ระหว่างลูป for(ever) ฉันตรวจสอบเพื่อดูว่ามีการตั้งค่า bDataReady ไว้หรือไม่ โดยส่งสัญญาณว่าโครงสร้าง RFID ทั้งหมดถูกส่งไปแล้ว จากนั้นฉันตรวจสอบเพื่อดูว่าเป็นแท็กที่ถูกต้องหรือไม่ (เช่น อักขระเริ่มต้นและหยุดคือ 0x0A และ 0x0D ตามลำดับ) และถ้าเป็นเช่นนั้น ฉันจะส่งการเชื่อมต่อ RS232 ออกไป

สำหรับ (;;){ ถ้า (bDataReady) {#ifdef _DEBUG_ USART_tx_S("ไบต์เริ่มต้น: "); USART_tx_S(itoa(RFID_tag[0], &ibuff[0], 16)); ไอบัฟ[0] = 0; ไอบัฟ[1] = 0; USART_tx_S("\nหยุดไบต์: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nแท็ก RFID: "); สำหรับ (uint8_t x = 1; x < 11; x++) { USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); ถ้า (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}

ขั้นตอนที่ 4: รหัสและอำลา

หน้านี้ประกอบด้วยไฟล์ zip ที่มีรหัสที่เกี่ยวข้อง มันถูกเขียนใน AVR Studio 4.16 หากคุณใช้แผ่นจดบันทึก eclipse หรือ vi (หรืออย่างอื่น) ของโปรแกรมเมอร์ คุณจะต้องคัดลอก Makefile ที่เชื่อถือได้ลงในไดเร็กทอรีและเพิ่มไฟล์เหล่านี้ในบรรทัดต้นทาง นอกจากนี้ โปรดทราบด้วยว่าระยะเวลาสำหรับส่วนการอ่านแบบอนุกรมจะขึ้นอยู่กับ เอ็มซียู 16 เมกะเฮิรตซ์ หากคุณทำงานที่ความถี่สัญญาณนาฬิกาที่ต่างกัน คุณจะต้องทดลองกำหนดความล่าช้าที่ปรับแต่งแล้วเพื่อให้มีศูนย์กลางที่อัตราบอดของข้อมูล ฉันหวังว่าคำแนะนำนี้จะช่วยคุณในทางใดทางหนึ่ง หากคุณมีข้อเสนอแนะเกี่ยวกับวิธีการปรับปรุง อย่าลังเลที่จะแจ้งให้เราทราบ!