Mục lục:

Đầu đọc RFID AVR / Arduino với mã UART trong C: 4 bước
Đầu đọc RFID AVR / Arduino với mã UART trong C: 4 bước

Video: Đầu đọc RFID AVR / Arduino với mã UART trong C: 4 bước

Video: Đầu đọc RFID AVR / Arduino với mã UART trong C: 4 bước
Video: [Lập Trình Arduino] Bài 5: Uart 2024, Tháng mười một
Anonim
Đầu đọc RFID AVR / Arduino với mã UART trong C
Đầu đọc RFID AVR / Arduino với mã UART trong C

RFID là cơn sốt, được tìm thấy ở khắp mọi nơi - từ hệ thống kiểm kê đến hệ thống ID huy hiệu. Nếu bạn đã từng đến một cửa hàng bách hóa và đi qua những thứ trông như máy dò kim loại ở các điểm vào / ra, thì bạn đã thấy RFID. Có một số nơi để tìm thông tin hữu ích về cách thiết lập RFID và tài liệu hướng dẫn này tập trung vào việc cài đặt đầu đọc Parallax RFID (TTL nối tiếp) trên AVR, nhấn mạnh vào mã C cần thiết để đọc đầu vào nối tiếp. Mã bằng C và không sử dụng bất kỳ thư viện bên ngoài nào. Trên thực tế, nó nói 2400 baud trực tiếp mà không cần sử dụng UART bằng cách đồng bộ hóa với tốc độ truyền của đầu đọc RFID và đọc chân kỹ thuật số mà nó được kết nối. Bị kích thích? Tôi cũng thế.

Bước 1: Nhận hàng

Nhận hàng hóa
Nhận hàng hóa

Bạn sẽ cần danh sách các bộ phận sau:

  • Đầu đọc RFID (Thị sai # 28140 $ 39,99)
  • Thẻ RFID (Thị sai # 32397 $ 0,99)
  • AVR hoặc bản sao Arduino (nếu bạn sử dụng AVR cổ phiếu, bạn cũng sẽ cần một tụ điện max232, 5 x 1uF và đầu nối DE9)
  • Breadboard không hàn

Không bắt buộc

  • Tiêu đề 4 vị trí
  • Dây điện

(và max232, v.v. để truyền thông tin thẻ) Bạn cũng có thể kết nối màn hình LCD yêu thích của mình thay cho việc gửi dữ liệu thẻ qua RS232.

Bước 2: Kết nối các bộ phận

Kết nối các bộ phận
Kết nối các bộ phận
Kết nối các bộ phận
Kết nối các bộ phận
Kết nối các bộ phận
Kết nối các bộ phận

Phần cứng của mọi thứ khá dễ dàng. Thay vì cắm đầu đọc RFID trực tiếp vào bảng mạch của mình, tôi đã chọn tạo một cáp nhanh để có thể di chuyển đầu đọc RFID xung quanh tốt hơn một chút. Đối với điều đó, tôi chỉ cần cắt bỏ 4 vị trí từ dải tiêu đề ổ cắm cái mà tôi đã đặt và hàn trên ba dây. Băng điện đã hoàn thành đầu nối khu ổ chuột. Đầu đọc RFID có 4 kết nối:

  • Vcc
  • CHO PHÉP
  • NGOÀI
  • Gnd

Như bạn có thể đoán ra, hãy kết nối Vcc với + 5V và Gnd với mặt đất. Vì đầu đọc RFID tiêu thụ rất nhiều điện năng, bạn có thể nhấn vào chân BẬT để tắt và bật nó trong các khoảng thời gian khác nhau. Tôi chỉ đơn giản là chọn để giữ nó trên. Bởi vì nó bị đảo ngược, bạn kéo nó THẤP để kích hoạt nó. Ngoài ra, bạn có thể kết nối nó với mặt đất. Tôi đã kết nối nó với PIND3 để cung cấp cho tôi các tùy chọn bật / tắt nếu tôi quyết định. Chân OUT là nơi đầu đọc gửi dữ liệu nối tiếp của nó sau khi nó đọc một thẻ. Tôi đã kết nối nó với PIND2. Lưu ý, trong Vũ trụ thị sai, màu đỏ có nghĩa là đi. Đó là, đèn LED màu xanh lá cây có nghĩa là thiết bị không hoạt động và không hoạt động, trong khi đèn LED màu đỏ có nghĩa là thiết bị đang hoạt động. * nhún vai * Đi hình.

Bước 3: Viết mã

Viết mã
Viết mã

Để đọc dữ liệu từ đầu đọc RFID, bạn phải biết khi nào một thẻ đã được gửi, kéo dữ liệu ra khỏi cổng nối tiếp, sau đó gửi nó đi đâu đó.

Định dạng dữ liệu đầu đọc RFID

Đầu đọc Parallax RFID gửi dữ liệu với tốc độ băng giá cố định là 2400 baud. Thẻ RFID là 10 byte. Để cho phép phát hiện / sửa lỗi, vì đầu đọc có thể được thiết lập khỏi nhiễu ngẫu nhiên, RFID 10 byte được giới hạn bởi một trạm giám sát bắt đầu và dừng. Trạm giám sát bắt đầu là nguồn cấp dữ liệu dòng (0x0A) và trạm giám sát dừng là giá trị xuống dòng (0x0D). Nó trông như thế này:

[Start Sentinel | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Stop Sentinel]Đây là ba bước chính.

Biết khi nào thẻ đã được gửi

Tôi đã sử dụng Ngắt thay đổi mã pin trên AVR để thông báo cho phần sụn rằng một thay đổi đã xảy ra trên một chân được giám sát. Việc định cấu hình AVR cho việc này rất dễ dàng và yêu cầu thiết lập cờ, cho MCU biết bạn muốn theo dõi chân nào và đặt bit ngắt toàn cục. Định cấu hình PCINT

BSET (PCICR, PCIE2); // thanh ghi điều khiển ngắt thay đổi chân pcie2 BSET (PCMSK2, PCINT18); // kích hoạt ngắt thay đổi chân cho PCINT18 (PD2) BSET (SREG, 7); // Đặt SREG I-bitViết quy trình dịch vụ ngắt của bạn Bạn muốn giữ ISR của mình ngắn nên trong vectơ ngắt của tôi, tôi đọc toàn bộ byte, từng chút một và lưu trữ byte trong một mảng ký tự biến động toàn cục. Tôi làm như sau ở mỗi lần ngắt:

  • Kiểm tra để đảm bảo tôi đang bắt đầu một chút
  • Căn giữa thời gian vào xung giữa ở 2400 baud (tốc độ của đầu đọc RFID)
  • Bỏ qua bit bắt đầu và tạm dừng ở giữa bit tiếp theo
  • Đọc từng bit thành một số nguyên không dấu
  • Khi tôi có 8 bit, hãy đặt byte vào một mảng ký tự
  • Khi tôi thu thập được 12 byte, hãy cho MCU biết thẻ đã được đọc để phát hiện lỗi.

Tôi đã sửa đổi mã SoftSerial từ Mikal Hart, người đã sửa đổi mã từ David Mellis vì sự chậm trễ được xác định bằng thực nghiệm trong các quy trình nối tiếp.

Phân tích cú pháp đầu ra RS232

Quy trình PCINT chứa mã để đọc đầu ra RS232 từ đầu đọc RFID. Khi tôi nhận được 12 byte (RFID 10 byte cộng với các khối vệ tinh), tôi đặt bDataReady thành 1 và để vòng lặp chính xử lý dữ liệu và hiển thị nó.

// đây là trình xử lý ngắt. ISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Bit bắt đầu trả về thấp; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // Căn giữa bit start for (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // bỏ qua một chút anh ơi… if (BCHK (PIND, RFID_IN)) BSET (bit, x); khác BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // bỏ qua bit dừng RFID_tag [rxIdx] = bit; ++ rxIdx; if (rxIdx == 12) bDataReady = 1;}

Hiển thị thẻ của bạn

Trong main (), trong suốt vòng lặp for (ever), tôi kiểm tra xem bDataReady đã được thiết lập hay chưa, báo hiệu rằng toàn bộ cấu trúc RFID đã được gửi đi. Sau đó, tôi kiểm tra xem đó có phải là thẻ hợp lệ hay không (nghĩa là các ký tự bắt đầu và dừng tương ứng là 0x0A và 0x0D), và nếu có, tôi gửi nó ra kết nối RS232 của mình.

for (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Byte bắt đầu:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ n Byte dừng:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16)); # endif if (ValidTag ()) {USART_tx_S ("\ nRFID Tag:"); for (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); if (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Bước 4: Mã và chia tay

Trang này chứa một tệp zip với mã có liên quan. Nó được viết trong AVR Studio 4.16. Nếu bạn sử dụng notepad, eclipse hoặc vi của lập trình viên (hoặc thứ gì đó khác), bạn sẽ cần sao chép Makefile đáng tin cậy vào thư mục và thêm các tệp này vào dòng nguồn. Ngoài ra, lưu ý, thời gian cho phần đọc nối tiếp dựa trên MCU 16MHz. Nếu bạn đang chạy ở một tần số xung nhịp khác, bạn sẽ cần phải thực nghiệm xác định độ trễ đã điều chỉnh để căn giữa các xung tốc độ truyền. Nếu bạn có bất kỳ đề xuất nào về cách nó có thể được cải thiện, đừng ngần ngại cho tôi biết!

Đề xuất: