Chúng tôi biết ở các văn phòng, trung tâm mua sắm và nhiều nơi khác, chỉ người có thẻ ủy quyền mới được phép vào phòng. Các hệ thống này sử dụng hệ thống liên lạc RFID. RFID được sử dụng trong các trung tâm mua sắm để ngăn chặn hành vi trộm cắp vì các sản phẩm được gắn thẻ chip RFID và khi một người rời khỏi tòa nhà với chip RFID, báo động sẽ tự động được nâng lên. Thẻ RFID được thiết kế nhỏ như một phần cát. Hệ thống xác thực RFID dễ thiết kế và chi phí rẻ. Một số trường học và cao đẳng ngày nay sử dụng hệ thống điểm danh dựa trên RFID.
Trong dự án này, chúng tôi sẽ thiết kế một hệ thống thu phí dựa trên RFID cho các mục đích an ninh. Vì vậy, hệ thống này mở cổng và chỉ cho phép những người có thẻ RFID được phép. ID của chủ sở hữu thẻ được ủy quyền được lập trình trong Bộ vi điều khiển ATMEGA và chỉ những chủ sở hữu này mới được phép ra hoặc vào cơ sở.
Thành phần bắt buộc
Phần cứng: Bộ vi điều khiển ATmega32, nguồn điện (5v), Bộ lập trình AVR-ISP, JHD_162ALCD (mô-đun LCD 16x2), tụ điện 100uF (kết nối qua nguồn điện), nút, điện trở 10KΩ, tụ điện 100nF, đèn LED (hai mảnh), EM-18 (Mô-đun đọc RFID), IC điều khiển động cơ L293D, động cơ DC 5V.
Phần mềm: Atmel studio 6.1, progisp hoặc flash magic.
Sơ đồ mạch và giải thích hoạt động
Trong mạch hệ thống thu phí RFID ở trên, PORTA của ATMEGA32 được kết nối với cổng dữ liệu của LCD. Ở đây, chúng ta nên nhớ vô hiệu hóa giao tiếp JTAG trong PORTC thành ATMEGA bằng cách thay đổi các byte cầu chì, nếu chúng ta muốn sử dụng PORTC như một cổng giao tiếp thông thường. Trong LCD 16x2, có 16 chân trên tất cả nếu có đèn nền, nếu không có đèn nền sẽ có 14 chân. Chúng ta có thể cấp nguồn hoặc để lại các chân đèn phía sau. Bây giờ trong 14 chân có 8 dữ liệu ghim (7-14 hoặc D0-D7), 2 chân cung cấp điện (1 & 2 hoặc VSS & VDD hoặc GND & + 5V), 3 thứ pin cho điều khiển độ tương phản (VEE-điều khiển như thế nào dày ký tự sẽ được hiển thị), 3 chân điều khiển (RS & RW & E).
Trong mạch, bạn có thể quan sát thấy tôi chỉ lấy hai chân điều khiển. Điều này mang lại sự linh hoạt của sự hiểu biết tốt hơn. Bit tương phản và READ / WRITE không thường xuyên được sử dụng để chúng có thể được nối đất. Điều này đặt LCD ở chế độ đọc và độ tương phản cao nhất. Chúng ta chỉ cần điều khiển các chân ENABLE và RS để gửi các ký tự và dữ liệu cho phù hợp.
Các kết nối được tạo cho LCD, được đưa ra dưới đây:
PIN1 hoặc VSS để nối đất
PIN2 hoặc VDD hoặc VCC đến nguồn + 5v
PIN3 hoặc VEE nối đất (mang lại độ tương phản tối đa tốt nhất cho người mới bắt đầu)
PIN4 hoặc RS (Lựa chọn đăng ký) đến PD6 của MCU
PIN5 hoặc RW (Đọc / Ghi) nối đất (đặt màn hình LCD ở chế độ đọc giúp giảm bớt giao tiếp cho người dùng)
PIN6 hoặc E (Bật) đến PD5 của Vi điều khiển
PIN7 hoặc D0 đến PA0
PIN8 hoặc D1 đến PA1
PIN9 hoặc D2 đến PA2
PIN10 hoặc D3 đến PA3
PIN11 hoặc D4 đến PA4
PIN12 hoặc D5 đến PA5
PIN13 hoặc D6 đến PA6
PIN14 hoặc D7 đến PA7
Trong mạch, bạn có thể thấy chúng tôi đã sử dụng giao tiếp 8bit (D0-D7). Tuy nhiên đây không phải là điều bắt buộc và chúng ta có thể sử dụng giao tiếp 4bit (D4-D7) nhưng với giao tiếp 4 bit chương trình trở nên phức tạp một chút, vì vậy tôi thích giao tiếp 8 bit hơn.
Vì vậy, từ quan sát bảng trên, chúng ta đang kết nối 10 chân của LCD với bộ điều khiển trong đó 8 chân là chân dữ liệu và 2 chân để điều khiển.
Trước khi tiếp tục, chúng ta cần hiểu về giao tiếp nối tiếp. Mô-đun RFID ở đây gửi dữ liệu nối tiếp đến bộ điều khiển. Nó có phương thức giao tiếp khác nhưng để giao tiếp dễ dàng, chúng tôi chọn RS232. Chân RS232 của mô-đun được kết nối với chân RXD của ATMEGA.
Dữ liệu do mô-đun RFID gửi đi như sau:
Bây giờ đối với giao diện mô-đun RFID, các tính năng sau là bắt buộc:
1. Chân RXD (tính năng nhận dữ liệu) của bộ điều khiển phải được bật.
2. Vì giao tiếp là nối tiếp, chúng ta cần biết bất cứ khi nào nhận được dữ liệu tạm biệt, để chúng ta có thể dừng chương trình cho đến khi nhận được byte hoàn chỉnh. Điều này được thực hiện bằng cách cho phép ngắt hoàn toàn nhận dữ liệu.
3. RFID gửi dữ liệu đến bộ điều khiển ở chế độ 8bit. Vì vậy, hai ký tự sẽ được gửi đến bộ điều khiển tại một thời điểm. Điều này được thể hiện trong hình trên.
4. Từ hình trên, không có bit chẵn lẻ, một bit dừng trong dữ liệu được gửi bởi mô-đun.
Các tính năng trên được thiết lập trong thanh ghi bộ điều khiển; chúng ta sẽ thảo luận ngắn gọn về chúng,
RED (RXEN): Bit này đại diện cho tính năng nhận dữ liệu. Bit này phải được thiết lập để dữ liệu từ mô-đun được bộ điều khiển nhận. Nó cũng cho phép chân RXD của bộ điều khiển.
BROWN (RXCIE): Bit này phải được đặt để nhận ngắt sau khi nhận dữ liệu thành công. Bằng cách kích hoạt bit này, chúng ta sẽ biết, ngay sau khi nhận dữ liệu 8 bit.
PINK (URSEL): Bit này phải được đặt trước khi bật các bit khác trong UCSRC. Sau khi thiết lập, các bit cần thiết khác trong UCSRC, URSEL phải bị vô hiệu hóa hoặc đưa về 0.
VÀNG (UCSZ0, UCSZ1, UCSZ2): Ba bit này được sử dụng để chọn số lượng bit dữ liệu mà chúng tôi đang nhận hoặc gửi trong một lần.
Vì dữ liệu được gửi bởi mô-đun RFID là kiểu dữ liệu 8bit, chúng tôi phải đặt UCSZ0, UCSZ1 thành một và UCSZ2 thành không.
ORANGE (UMSEL): Bit này được thiết lập dựa trên việc hệ thống đang giao tiếp không đồng bộ (cả hai sử dụng đồng hồ khác nhau) hay đồng bộ (cả hai sử dụng cùng một đồng hồ).
Vì mô-đun và bộ điều khiển sử dụng xung nhịp khác nhau, nên bit này phải được đặt thành 0 hoặc để riêng vì chúng đều được đặt thành 0 theo mặc định.
GREEN (UPM1, UPM0): Hai bit này được điều chỉnh dựa trên tính chẵn lẻ của bit mà chúng ta đang sử dụng trong giao tiếp.
Vì mô-đun RFID gửi dữ liệu không có tính chẵn lẻ, chúng tôi đã đặt cả UPM1, UPM0 thành 0 hoặc chúng có thể được để một mình vì tất cả các bit trong bất kỳ thanh ghi nào được đặt thành 0 theo mặc định.
BLUE (USBS): Bit này được sử dụng để chọn số lượng bit dừng mà chúng tôi đang sử dụng trong quá trình giao tiếp.
Vì mô-đun RFID gửi dữ liệu với một bit dừng, chúng tôi chỉ cần để lại bit USBS.
Bây giờ cuối cùng chúng ta cần thiết lập tốc độ truyền, từ hình trên rõ ràng là mô-đun RFID gửi dữ liệu đến bộ điều khiển với tốc độ truyền là 9600bps (bit trên giây).
Tốc độ truyền được đặt trong bộ điều khiển bằng cách chọn UBRRH thích hợp.
Giá trị UBRRH được chọn bằng tốc độ truyền tham chiếu chéo và tần số tinh thể CPU, Vì vậy, giá trị UBRR tham chiếu chéo được xem là '6' và do đó tốc độ truyền được đặt.
Bây giờ như được hiển thị trong hình, hai chân từ bộ điều khiển đi đến L293D, là CẦU H dùng để điều khiển tốc độ và hướng quay cho động cơ DC công suất thấp.
L293D là IC H-BRIDGE được thiết kế để điều khiển động cơ DC công suất thấp và được thể hiện trong hình, IC này bao gồm hai cầu h và do đó nó có thể điều khiển hai động cơ DC. Vì vậy, IC này có thể được sử dụng để điều khiển động cơ robot từ các tín hiệu của vi điều khiển.
Bây giờ như đã thảo luận trước đó, IC này có khả năng thay đổi hướng quay của động cơ DC. Điều này đạt được bằng cách điều khiển các mức điện áp tại INPUT1 và INPUT2.
Bật ghim |
Đầu vào Pin 1 |
Đầu vào Pin 2 |
Hướng động cơ |
Cao |
Thấp |
Cao |
Rẽ phải |
Cao |
Cao |
Thấp |
Rẽ trái |
Cao |
Thấp |
Thấp |
Dừng lại |
Cao |
Cao |
Cao |
Dừng lại |
Vì vậy, như được hiển thị trong bảng trên, đối với đồng hồ thông minh vòng quay 2A nên cao và 1A nên thấp. Tương tự đối với ngược chiều kim đồng hồ, 1A nên cao và 2A nên thấp.
Bất cứ khi nào thẻ được ủy quyền được đưa đến gần mô-đun, động cơ được lập trình để di chuyển theo chiều kim đồng hồ trong một giây, để cho biết cổng thu phí được mở sau một giây nó quay lại, thông báo rằng cổng thu phí đã đóng. Hoạt động của trạm thu phí được giải thích rõ nhất theo từng bước của mã C đưa ra dưới đây.
Giải thích lập trình
Dưới đây là dòng giải thích cho mã của Hệ thống thu phí RFID. Bạn có thể hiểu khái niệm và hoạt động của dự án này bằng cách đọc đoạn mã bên dưới. Để tải xuống hoặc sao chép, bạn có thể tìm thấy mã hoàn chỉnh ở cuối trang.
#include // header để bật kiểm soát luồng dữ liệu qua các chân
#define F_CPU 1000000 // cho biết tần số tinh thể bộ điều khiển được đính kèm
#include
#define E 5 // đặt tên "enable" cho chân thứ 5 của PORTD, vì nó được kết nối với chân kích hoạt LCD
#define RS 6 // đặt tên "thanh ghi" cho chân thứ 6 của PORTD, vì nó được kết nối với chân LCD RS
void send_a_command (unsigned char command);
void send_a_character (ký tự char không dấu);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // đặt porta làm chân đầu ra
DDRD = 0b11111110;
_delay_ms (50); // có độ trễ 50ms
DDRB = 0b11110000; // Lấy một số chân portB làm đầu vào.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // đặt tốc độ truyền // Phần sau chứa ID của các thẻ, chúng phải được thay đổi cho các thẻ khác nhau, Chúng phải được cập nhật để dự án hoạt động
/ * Sau khi kết xuất chương trình trong bộ điều khiển, người ta phải lấy các thẻ phải được ủy quyền và lấy ID thẻ. Chúng có được bằng cách đặt thẻ gần mô-đun RFID và ID sẽ được hiển thị trên màn hình. Sau khi nhận được các ID, chương trình phải được cập nhật bằng cách thay thế các số ID bên dưới bằng các số ID mới.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Bây giờ ở trên, chúng tôi chỉ cho phép năm thẻ, chúng có thể được thay đổi thành bất kỳ số nào.
Ví dụ: hãy xem xét chương trình mặc định được kết xuất trong bộ điều khiển, lấy các thẻ cần được ủy quyền. Đặt lần lượt các mô-đun gần nhau, bạn sẽ nhận được ID cho từng cái là xxxxxxxx (907a4F87), Nếu chúng ta có 7 thẻ, thì chúng ta sẽ có 7 ID tám bit. * /
// bây giờ đối với bảy thẻ nó giống như // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // phân bổ bộ nhớ để hiển thị ID gửi theo mô-đun int i = 0; int phiếu bầu = 0; int k = 0; send_a_command (0x01); // Xóa màn hình 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // cho LCD biết chúng ta đang sử dụng lệnh / chế độ dữ liệu 8bit _delay_ms (50); send_a_command (0b00001111); // MÀN HÌNH LCD BẬT và bộ chuyển tiếp nhấp nháy char MEM; // phân bổ bộ nhớ để lưu ID đầy đủ của thẻ send_a_string ("SỐ RFID"); // gửi chuỗi send_a_command (0x80 + 0x40 + 0); // chuyển courser sang dòng thứ hai trong khi (1) { trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR lưu trữ dữ liệu tám bit nhận được và được đưa vào một số nguyên. MEM = COUNTA; // hai ký tự đầu tiên được cập nhật vào bộ nhớ itoa (COUNTA, SHOWA, 16); // lệnh để đặt số biến trong màn hình LCD (số biến, ký tự nào cần thay thế, cơ số nào là biến (ở đây là mười vì chúng ta đang đếm số trong cơ số 10)) send_a_string (SHOWA); // thông báo cho màn hình hiển thị ký tự (được thay thế bằng số biến) của người thứ hai sau khi định vị bộ ghép trên màn hình LCD trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ ba và thứ tư được cập nhật vào bộ nhớ trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ năm và thứ sáu được cập nhật vào bộ nhớ trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ bảy và tám được cập nhật vào bộ nhớ send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
cho (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// kiểm tra ủy quyền mua so sánh hai ký tự cùng một lúc với các ký tự trong bộ nhớ PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // độ trễ _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 <
} } void send_a_command (unsigned char command) { PORTA = lệnh; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (ký tự char không dấu) { PORTA = ký tự; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |