เรารู้จักในสำนักงานห้างสรรพสินค้าและสถานที่อื่น ๆ อีกมากมายที่อนุญาตให้เฉพาะบุคคลที่มีบัตรอนุญาตเข้าห้องเท่านั้น ระบบเหล่านี้ใช้ระบบสื่อสาร RFID RFID ใช้ในห้างสรรพสินค้าเพื่อหยุดการโจรกรรมเนื่องจากผลิตภัณฑ์ถูกติดแท็กด้วยชิป RFID และเมื่อบุคคลออกจากอาคารด้วยชิป RFID สัญญาณเตือนจะดังขึ้นโดยอัตโนมัติ แท็ก RFID ได้รับการออกแบบให้มีขนาดเล็กเท่าส่วนของทราย ระบบตรวจสอบความถูกต้องของ RFID นั้นออกแบบได้ง่ายและมีราคาถูก โรงเรียนและวิทยาลัยในปัจจุบันบางคนใช้RFID ที่ใช้ระบบการเข้าร่วมประชุม
ในโครงการนี้เราจะออกแบบระบบเก็บค่าผ่านทาง RFID ตามวัตถุประสงค์ด้านความปลอดภัย ดังนั้นระบบนี้จึงเปิดประตูและอนุญาตเฉพาะผู้ที่มีแท็ก RFID ที่ได้รับอนุญาตเท่านั้น ID ผู้ถือแท็กที่ได้รับอนุญาตถูกตั้งโปรแกรมไว้ในไมโครคอนโทรลเลอร์ ATMEGA และอนุญาตให้ผู้ถือเหล่านั้นออกจากหรือเข้าสู่สถานที่
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์:ไมโครคอนโทรลเลอร์ ATmega32, แหล่งจ่ายไฟ (5v), โปรแกรมเมอร์ AVR-ISP, JHD_162ALCD (โมดูล LCD 16x2), ตัวเก็บประจุ 100uF (เชื่อมต่อกับแหล่งจ่ายไฟ), ปุ่ม, ตัวต้านทาน10KΩ, ตัวเก็บประจุ 100nF, LED (สองชิ้น), EM-18 (โมดูลเครื่องอ่าน RFID), IC ไดรเวอร์มอเตอร์ L293D, มอเตอร์ 5V DC
ซอฟต์แวร์: Atmel studio 6.1, progisp หรือ flash magic
แผนภาพวงจรและคำอธิบายการทำงาน
ในวงจรระบบเก็บค่าผ่านทาง RFID ที่แสดงด้านบน PORTA ของ ATMEGA32 เชื่อมต่อกับพอร์ตข้อมูลของ LCD ที่นี่เราควรจำไว้ว่าให้ปิดการใช้งานการสื่อสาร JTAG ใน PORTC เป็น ATMEGA โดยการเปลี่ยนฟิวส์ไบต์หากเราต้องการใช้ PORTC เป็นพอร์ตการสื่อสารปกติ ในจอ LCD 16x2 จะมีหมุดทั้งหมด 16 พินหากมีไฟด้านหลังหากไม่มีไฟส่องหลังจะมี 14 พิน เราสามารถจ่ายไฟหรือปล่อยหมุดไฟหลัง ตอนนี้ใน 14 ขามี 8 ข้อมูลหมุด (7-14 หรือ D0-D7) 2 หมุดแหล่งจ่ายไฟ (1 & 2 หรือ VSS & VDD หรือ GND & + 5V) 3 ถพินสำหรับการควบคุมความคมชัด (วีควบคุมวิธีการที่หนา ควรแสดงอักขระ), 3 พินควบคุม (RS & RW & E)
ในวงจรคุณสามารถสังเกตได้ว่าฉันใช้หมุดควบคุมเพียงสองตัว สิ่งนี้ทำให้เกิดความยืดหยุ่นในการทำความเข้าใจที่ดีขึ้น ไม่ได้ใช้บิตคอนทราสต์และ READ / WRITE บ่อยนักดังนั้นจึงสามารถย่อลงมาที่พื้นได้ ทำให้ LCD มีคอนทราสต์สูงสุดและโหมดอ่าน เราต้องควบคุมพิน ENABLE และ RS เพื่อส่งอักขระและข้อมูลตามนั้น
การเชื่อมต่อที่สร้างขึ้นสำหรับ LCD มีดังต่อไปนี้:
PIN1 หรือ VSS ลงกราวด์
PIN2 หรือ VDD หรือ VCC ถึง + 5v
PIN3 หรือ VEE กับพื้น (ให้ความเปรียบต่างสูงสุดที่ดีที่สุดสำหรับผู้เริ่มต้น)
PIN4 หรือ RS (Register Selection) ถึง PD6 ของ MCU
PIN5 หรือ RW (อ่าน / เขียน) ลงกราวด์ (ทำให้ LCD อยู่ในโหมดอ่านช่วยให้การสื่อสารสำหรับผู้ใช้ง่ายขึ้น)
PIN6 หรือ E (เปิดใช้งาน) ถึง PD5 ของไมโครคอนโทรลเลอร์
PIN7 หรือ D0 ถึง PA0
PIN8 หรือ D1 ถึง PA1
PIN9 หรือ D2 ถึง PA2
PIN10 หรือ D3 ถึง PA3
PIN11 หรือ D4 ถึง PA4
PIN12 หรือ D5 ถึง PA5
PIN13 หรือ D6 ถึง PA6
PIN14 หรือ D7 ถึง PA7
ในวงจรคุณจะเห็นว่าเราใช้การสื่อสารแบบ 8 บิต (D0-D7) อย่างไรก็ตามนี่ไม่ใช่ภาคบังคับและเราสามารถใช้การสื่อสาร 4 บิต (D4-D7) ได้ แต่ด้วยโปรแกรมการสื่อสาร 4 บิตจะซับซ้อนเล็กน้อยดังนั้นฉันจึงชอบการสื่อสารแบบ 8 บิต
ดังนั้นจากการสังเกตเพียงตารางด้านบนเรากำลังเชื่อมต่อ 10 พินของ LCD เข้ากับคอนโทรลเลอร์ซึ่ง 8 พินเป็นพินข้อมูลและ 2 พินสำหรับควบคุม
ก่อนที่จะดำเนินการต่อเราต้องเข้าใจเกี่ยวกับการสื่อสารแบบอนุกรม โมดูล RFID ที่นี่จะส่งข้อมูลไปยังคอนโทรลเลอร์แบบอนุกรม มีโหมดการสื่อสารอื่น ๆ แต่เพื่อการสื่อสารที่ง่ายเราเลือก RS232 พิน RS232 ของโมดูลเชื่อมต่อกับพิน RXD ของ ATMEGA
ข้อมูลที่ส่งโดยโมดูล RFID จะเป็น:
ตอนนี้สำหรับอินเทอร์เฟซโมดูล RFIDจำเป็นต้องใช้คุณสมบัติต่อไปนี้:
1. ต้องเปิดใช้งานพิน RXD (คุณสมบัติการรับข้อมูล) ของคอนโทรลเลอร์
2. เนื่องจากการสื่อสารเป็นแบบอนุกรมเราจึงจำเป็นต้องทราบเมื่อใดก็ตามที่ได้รับข้อมูลเพื่อที่เราจะสามารถหยุดโปรแกรมได้จนกว่าจะได้รับไบต์ที่สมบูรณ์ ซึ่งทำได้โดยการเปิดใช้งานการรับข้อมูลขัดจังหวะโดยสมบูรณ์
3. RFID ส่งข้อมูลไปยังคอนโทรลเลอร์ในโหมด 8 บิต ดังนั้นสองตัวอักษรจะถูกส่งไปยังคอนโทรลเลอร์พร้อมกัน ดังแสดงในรูปด้านบน
4. จากรูปด้านบนไม่มีบิตพาริตีบิตหยุดหนึ่งบิตในข้อมูลที่ส่งโดยโมดูล
คุณสมบัติข้างต้นถูกตั้งค่าในรีจิสเตอร์คอนโทรลเลอร์ เราจะพูดถึงพวกเขาสั้น ๆ
RED (RXEN): บิตนี้แสดงถึงคุณสมบัติการรับข้อมูล ต้องตั้งค่าบิตนี้เพื่อให้ข้อมูลจากโมดูลได้รับโดยคอนโทรลเลอร์ นอกจากนี้ยังเปิดใช้งานพิน RXD ของคอนโทรลเลอร์
BROWN (RXCIE): ต้องตั้งค่าบิตนี้สำหรับการขัดจังหวะหลังจากการรับข้อมูลสำเร็จ เมื่อเปิดใช้งานบิตนี้เราจะได้รับรู้ทันทีหลังจากได้รับข้อมูล 8 บิต
PINK (URSEL): ต้องตั้งค่าบิตนี้ก่อนเปิดใช้งานบิตอื่นใน UCSRC หลังจากตั้งค่าแล้วบิตอื่น ๆ ที่จำเป็นใน UCSRC จะต้องปิดใช้งาน URSEL หรือทำให้เป็นศูนย์
สีเหลือง (UCSZ0, UCSZ1, UCSZ2): บิตทั้งสามนี้ใช้สำหรับเลือกจำนวนบิตข้อมูลที่เรากำลังรับหรือส่งในครั้งเดียว
เนื่องจากข้อมูลที่ส่งโดยโมดูล RFID เป็นประเภทข้อมูล 8 บิตเราจึงต้องตั้งค่า UCSZ0, UCSZ1 เป็นหนึ่งและ UCSZ2 เป็นศูนย์
สีส้ม (UMSEL): บิตนี้ถูกตั้งค่าตามว่าระบบกำลังสื่อสารแบบอะซิงโครนัส (ทั้งคู่ใช้นาฬิกาต่างกัน) หรือซิงโครนัส (ทั้งคู่ใช้นาฬิกาเดียวกัน)
เนื่องจากโมดูลและคอนโทรลเลอร์ใช้นาฬิกาที่แตกต่างกันบิตนี้จึงต้องตั้งค่าเป็นศูนย์หรือปล่อยให้อยู่คนเดียวเนื่องจากทั้งหมดถูกตั้งค่าเป็นศูนย์ตามค่าเริ่มต้น
สีเขียว (UPM1, UPM0): สองบิตนี้ได้รับการปรับตามความเท่าเทียมกันของบิตที่เราใช้ในการสื่อสาร
เนื่องจากโมดูล RFID ส่งข้อมูลโดยไม่มีความเท่าเทียมกันเราจึงตั้งค่าทั้ง UPM1, UPM0 เป็นศูนย์หรือสามารถปล่อยให้อยู่คนเดียวได้เนื่องจากบิตทั้งหมดในรีจิสเตอร์ใด ๆ จะถูกตั้งค่าเป็นศูนย์ตามค่าเริ่มต้น
BLUE (USBS): บิตนี้ใช้สำหรับเลือกจำนวนบิตหยุดที่เราใช้ระหว่างการสื่อสาร
เนื่องจากโมดูล RFID ส่งข้อมูลด้วยบิตสต็อปบิตเราจึงต้องปล่อยบิต USBS ไว้เพียงอย่างเดียว
ในที่สุดเราต้องกำหนดอัตราการรับส่งข้อมูลจากรูปด้านบนเป็นที่ชัดเจนว่าโมดูล RFID ส่งข้อมูลไปยังตัวควบคุมด้วยอัตราการส่งข้อมูลที่ 9600bps (บิตต่อวินาที)
อัตราการรับส่งข้อมูลถูกกำหนดไว้ในตัวควบคุมโดยเลือก UBRRH ที่เหมาะสม
ค่า UBRRH ถูกเลือกโดยอัตราการอ้างอิงข้ามและความถี่คริสตัลของ CPU ดังนั้นโดยค่า UBRR การอ้างอิงข้ามจะเห็นเป็น '6' ดังนั้นจึงกำหนดอัตรารับส่งข้อมูล
ตอนนี้ดังแสดงในรูปหมุดสองตัวจากคอนโทรลเลอร์ไปที่ L293D ซึ่งเป็น H-BRIDGE ที่ใช้ควบคุมความเร็วและทิศทางการหมุนของมอเตอร์กระแสตรงกำลังต่ำ
L293D เป็น H-BRIDGE IC ที่ออกแบบมาสำหรับการขับเคลื่อนมอเตอร์กระแสตรงพลังงานต่ำและแสดงในรูป IC นี้ประกอบด้วยสะพาน h สองตัวจึงสามารถขับเคลื่อนมอเตอร์กระแสตรงสองตัว ดังนั้นจึงสามารถใช้ IC นี้เพื่อขับเคลื่อนมอเตอร์หุ่นยนต์จากสัญญาณของไมโครคอนโทรลเลอร์
ตามที่กล่าวไว้ก่อนหน้านี้ IC มีความสามารถในการเปลี่ยนทิศทางการหมุนของมอเตอร์กระแสตรง ทำได้โดยการควบคุมระดับแรงดันไฟฟ้าที่ INPUT1 และ INPUT2
เปิดใช้งาน PIN |
ขาเข้า 1 |
ขาเข้า 2 |
ทิศทางมอเตอร์ |
สูง |
ต่ำ |
สูง |
เลี้ยวขวา |
สูง |
สูง |
ต่ำ |
เลี้ยวซ้าย |
สูง |
ต่ำ |
ต่ำ |
หยุด |
สูง |
สูง |
สูง |
หยุด |
ดังที่แสดงในตารางด้านบนสำหรับการหมุนนาฬิกาที่ชาญฉลาด 2A ควรสูงและ 1A ควรต่ำ ในทำนองเดียวกันสำหรับ 1A ทวนเข็มนาฬิกาควรสูงและ 2A ควรต่ำ
เมื่อใดก็ตามที่นำบัตรที่ได้รับอนุญาตเข้าใกล้โมดูลมอเตอร์จะถูกตั้งโปรแกรมให้เคลื่อนที่ตามเข็มนาฬิกาเป็นเวลาหนึ่งวินาทีเพื่อแสดงให้เห็นว่าประตูเก็บค่าผ่านทางเปิดอยู่หลังจากผ่านไปหนึ่งวินาทีซึ่งจะบอกว่าประตูเก็บค่าธรรมเนียมปิด การทำงานของด่านเก็บค่าผ่านทางอธิบายได้ดีที่สุดตามขั้นตอนของรหัส C ด้านล่าง
คำอธิบายการเขียนโปรแกรม
ด้านล่างเป็นเส้นบรรทัดคำอธิบายสำหรับรหัสของRFID โทรระบบการจัดเก็บ คุณสามารถเข้าใจแนวคิดและการทำงานของโครงการนี้ได้โดยอ่านโค้ดด้านล่าง หากต้องการดาวน์โหลดหรือคัดลอกคุณสามารถดูรหัสทั้งหมดได้ที่ด้านล่างของหน้า
#include // header เพื่อเปิดใช้งานการควบคุมโฟลว์ข้อมูลผ่านพิน
#define F_CPU 1000000 // บอกความถี่คริสตัลคอนโทรลเลอร์ที่แนบมา
# รวม
#define E 5 // ให้ชื่อ“เปิดใช้งาน” 5 THขา PORTD เพราะมันจะเชื่อมต่อกับจอแอลซีดีเปิดใช้งานขา
# กำหนดหมายเลข 6 // ให้ชื่อ“registerselection” ถึง 6 THขา PORTD เพราะมันจะเชื่อมต่อกับจอแอลซีดีอาร์เอสพิน
โมฆะ send_a_command (คำสั่ง char ที่ไม่ได้ลงชื่อ);
โมฆะ send_a_character (อักขระถ่านที่ไม่ได้ลงชื่อ);
โมฆะ send_a_string (ถ่าน * string_of_characters);
int หลัก (โมฆะ)
{
DDRA = 0xFF; // วาง porta เป็นพินเอาต์พุต
DDRD = 0b11111110;
_delay_ms (50); // ให้ดีเลย์ 50ms
DDRB = 0b11110000; // รับพิน portB เป็นอินพุต
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // การตั้งค่าอัตราการรับส่งข้อมูล // ต่อไปนี้มี ID ของแท็กซึ่งจะต้องมีการเปลี่ยนแปลงสำหรับแท็กอื่นต้องอัปเดตเพื่อให้โครงการทำงาน
/ * หลังจากทิ้งโปรแกรมในคอนโทรลเลอร์เราต้องใช้การ์ดที่ต้องได้รับอนุญาตและรับรหัสแท็ก สิ่งเหล่านี้ได้มาจากการวางแท็กใกล้กับโมดูล RFID และ ID จะแสดงบนหน้าจอ หลังจากได้รับ ID แล้วโปรแกรมจะต้องได้รับการอัปเดตโดยแทนที่หมายเลข ID ด้านล่างด้วยหมายเลข ID ใหม่
ถ่าน ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
ตอนนี้เราให้สิทธิ์การ์ดเพียงห้าใบเท่านั้นซึ่งสามารถเปลี่ยนเป็นหมายเลขใดก็ได้
ตัวอย่างเช่นพิจารณาว่าโปรแกรมเริ่มต้นถูกทิ้งในคอนโทรลเลอร์รับการ์ดที่ควรได้รับอนุญาต วางทีละโมดูลใกล้ ๆ คุณจะได้รับรหัสสำหรับแต่ละโมดูลเป็น xxxxxxxx (907a4F87)
หากเรามี 7 แท็กเราจะมี 7 แปดบิต ID * /
// ตอนนี้สำหรับไพ่เจ็ดใบจะเป็น // ถ่าน ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // จัดสรรหน่วยความจำสำหรับแสดง ID ที่ส่งโดยโมดูล int ผม = 0; int โหวต = 0; int k = 0; send_a_command (0x01); // ล้างหน้าจอ 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // บอก LCD ว่าเรากำลังใช้โหมดคำสั่ง / ข้อมูล 8 บิต _delay_ms (50); send_a_command (0b00001111); // เปิดหน้าจอ LCD และไฟกะพริบ ถ่าน MEM; // การจัดสรรหน่วยความจำเพื่อจัดเก็บ ID ของแท็กที่สมบูรณ์ send_a_string ("หมายเลข RFID"); // ส่งสตริง send_a_command (0x80 + 0x40 + 0); // ย้าย Courser ไปยังบรรทัดที่สอง ในขณะที่ (1) { ในขณะที่ (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR เก็บข้อมูลแปดบิตที่ได้รับและนำมาเป็นจำนวนเต็ม MEM = COUNTA; // อักขระสองตัวแรกถูกอัปเดตเป็นหน่วยความจำ อิโตอา (COUNTA, SHOWA, 16); // คำสั่งสำหรับใส่หมายเลขตัวแปรใน LCD (หมายเลขตัวแปรอักขระที่จะแทนที่ฐานใดเป็นตัวแปร (สิบในที่นี้ขณะที่เรากำลังนับจำนวนในฐาน 10) send_a_string (SHOWA); // บอกให้จอแสดงผลแสดงอักขระ (แทนที่ด้วยหมายเลขตัวแปร) ของบุคคลที่สองหลังจากวางตำแหน่ง Courser บน LCD ในขณะที่ (! (UCSRA & (1 <
{ } COUNTA = UDR; อิโตอา (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // อักขระที่สามและสี่ถูกอัปเดตเป็นหน่วยความจำ ในขณะที่ (! (UCSRA & (1 <
{ } COUNTA = UDR; อิโตอา (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // อักขระที่ห้าและหกถูกอัปเดตเป็นหน่วยความจำ ในขณะที่ (! (UCSRA & (1 <
{ } COUNTA = UDR; อิโตอา (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // อักขระที่เจ็ดและแปดถูกอัปเดตเป็นหน่วยความจำ send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
สำหรับ (i = 0; i <5; i ++) { ถ้า ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// การตรวจสอบการอนุญาตซื้อโดยเปรียบเทียบสองอักขระพร้อมกันกับอักขระในหน่วยความจำ PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // ล่าช้า _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } โมฆะ send_a_command (คำสั่ง char ที่ไม่ได้ลงชื่อ) { PORTA = คำสั่ง; PORTD & = ~ (1 <
พอร์ต - = 1 <
_delay_ms (50); พอร์ต & = ~ 1 <
ปอร์ตา = 0; } โมฆะ send_a_character (อักขระถ่านที่ไม่ได้ลงชื่อ) { PORTA = ตัวละคร; พอร์ต - = 1 <
พอร์ต - = 1 <
_delay_ms (50); พอร์ต & = ~ 1 <
ปอร์ตา = 0; } โมฆะ send_a_string (ถ่าน * string_of_characters) { ในขณะที่ (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |