Mục lục:

Biến Arduino của bạn thành đầu đọc thẻ từ!: 9 bước (có hình ảnh)
Biến Arduino của bạn thành đầu đọc thẻ từ!: 9 bước (có hình ảnh)

Video: Biến Arduino của bạn thành đầu đọc thẻ từ!: 9 bước (có hình ảnh)

Video: Biến Arduino của bạn thành đầu đọc thẻ từ!: 9 bước (có hình ảnh)
Video: 🔴 Arduino #25 | RFID RC522 - Đọc Dữ Liệu Thẻ Từ RFID RC522 Điều khiển Thiết Bị 2024, Tháng bảy
Anonim
Biến Arduino của bạn thành một đầu đọc thẻ từ!
Biến Arduino của bạn thành một đầu đọc thẻ từ!
Biến Arduino của bạn thành một đầu đọc thẻ từ!
Biến Arduino của bạn thành một đầu đọc thẻ từ!
Biến Arduino của bạn thành một đầu đọc thẻ từ!
Biến Arduino của bạn thành một đầu đọc thẻ từ!

Tôi tin rằng mọi người đều đã sử dụng đầu đọc thẻ từ. Ý tôi là, những ngày này ai mang tiền mặt? Chúng cũng không khó để bạn nhúng tay vào, và trong một chuyến đi đến cửa hàng điện tử địa phương yêu thích của tôi, tôi đã tìm thấy một thùng chứa đầy những thứ này. Vì vậy….tất nhiên, tôi đã chọn một cái và mang nó về nhà để xem tôi có thể làm gì với nó và một AVR.

Tài liệu hướng dẫn này sẽ chỉ cho bạn cách kết nối đầu đọc thẻ từ Magtek với AVR hoặc Arduino / bản sao và đọc dữ liệu từ bản nhạc đầu tiên của thẻ. Thắt dây an toàn cho chỗ ngồi của bạn; đầu đọc thẻ từ có tốc độ bit cao!

Bước 1: Danh sách thiết bị

Danh sách thiết bị
Danh sách thiết bị
Danh sách thiết bị
Danh sách thiết bị

Dưới đây là một số điều bạn cần để bắt đầu.

  • Đầu đọc thẻ từ (Của tôi là đầu đọc hai đầu Magetk 90mm. $ 5,00)
  • AVR, Arduino hoặc bản sao (ATmega328p ~ $ 4,30 từ Mouser.com
  • breadboard không hàn
  • một số dây
  • có thể là tiêu đề nếu bạn thích điều đó.
  • một cái gì đó để đọc cổng nối tiếp của bạn. Tôi sử dụng AVR Terminal từ BattleDroids.net

Đó là tất cả những gì bạn cần để bắt đầu. Tùy thuộc vào trình đọc thẻ từ mà bạn nhận được, bạn có thể phải sửa đổi các hướng dẫn này và chắc chắn nhất là mã, để hoạt động với trình đọc cụ thể của bạn. Tuy nhiên, mã mà tôi đã viết sẽ giúp bạn hiểu được khá xa, tôi hy vọng.

Bước 2: Đầu đọc thẻ từ tự kiểm tra đồng hồ

Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động
Đầu đọc thẻ từ tính tự động

Đầu đọc thẻ từ là "tự đồng hồ", có nghĩa là chúng cung cấp một đồng hồ được gọi là đồng hồ nhấp nháy, đồng hồ mà bộ vi điều khiển được kết nối có thể đồng bộ hóa. Đây là một lợi ích. Nó có nghĩa là bạn không phải lo lắng về việc tìm kiếm tín hiệu đồng hồ và định thời gian tín hiệu trung tâm trực tiếp trên xung đồng hồ, và không có sự dao động khó chịu vào điểm ngọt của tín hiệu đồng hồ. Điều này có ý nghĩa khi bạn nghĩ về thao tác quẹt thẻ: mọi người đều quẹt thẻ ở một tốc độ khác nhau, một số chậm hơn, một số nhanh hơn những người khác. Tính năng tự đồng hồ cho phép ngay cả bà ngoại của tôi cũng có thể sử dụng thẻ của mình mà không bị gãy cổ tay. Nhắc tôi về việc phải thay đổi cài đặt cho cô ấy để xác định thời gian hợp lệ giữa các lần nhấp chuột để đăng ký một lần nhấp đúp….

Dữ liệu của đầu đọc thẻ này có giá trị 1.0 us trước khi đèn nhấp nháy được đưa vào đường truyền, vì vậy bạn không cần phải lo lắng về việc trì hoãn để đưa mình vào "bit time". Đối với đầu đọc hai đầu, chẳng hạn như đầu đọc tôi đang sử dụng, có hai rãnh dữ liệu có sẵn để đọc. Trong 'ible này, tôi sẽ hiển thị việc đọc từ bản nhạc đầu tiên chính để giúp bạn bắt đầu. Có năm kết nối bạn sẽ cần thực hiện (bốn nếu bạn không ngại từ bỏ nhiều điều khiển tinh chỉnh hơn để sử dụng ít cổng I / O hơn). Kiểm tra các hình ảnh dưới đây. Dây màu đỏ nối vào + 5V trong khi dây màu đen nối đất. Dây màu xanh lá cây là / CARD_PRESENT; dây màu vàng là / STROBE và dây màu trắng là / DATA1. Dấu gạch chéo (/) có nghĩa là dữ liệu bị đảo ngược. Tín hiệu thấp (tức là 0) được đọc là tín hiệu cao hoặc tín hiệu cao. Các đầu nối khác có màu nâu cho / STROBE2 và màu cam cho / DATA2. Chúng tôi sẽ không sử dụng những thứ này. Nếu muốn, bạn có thể quên / CARD_PRESENT. Dòng dữ liệu này xuống thấp sau khoảng 17 lần quay thông lượng đầu để cho biết rằng thẻ đang có mặt (thay vì, giả sử, nhiễu ngẫu nhiên khiến đầu đọc của bạn gửi dữ liệu không có thật) và được sử dụng để xác thực rằng dữ liệu bạn nhận được là dữ liệu thẻ và không phải rác. Bạn có thể bỏ qua kết nối này nếu bạn kiểm tra trạm giám sát bắt đầu trên luồng dữ liệu. Thêm về điều đó sau. Như bạn có thể thấy bên dưới, tôi đã sử dụng một tiêu đề nam góc bên phải được kết nối với bảng mạch bánh mì và kết nối đầu đọc của tôi với đó. Tôi đã kết nối / STROBE với PIND2 (chân kỹ thuật số 2 trên Arduino), / CARD_PRESENT với PIND3 (cho mục đích minh họa) và / DATA1 với PIND4. Đảm bảo rằng bạn đã bật chức năng kéo lên trên các chân này để các chân của bạn không bị trôi. Tôi cũng đã đổi Arduino của mình để lấy AVR Bare Bones vì tôi thích cách nó phù hợp với breadboard.

Bước 3: Khái niệm cơ bản về thẻ từ

Kiến thức cơ bản về thẻ từ
Kiến thức cơ bản về thẻ từ

Các chức năng chính mà bạn cần làm để đọc thẻ từ là: 1. Phát hiện khi nào thẻ đã được quẹt 2. Đọc luồng dữ liệu 3. Phát hiện khi nào thẻ đã hết 4. Xử lý dữ liệu 5. Hiển thị data Trước tiên, tôi sẽ giới thiệu cho bạn một số điều cơ bản về thẻ từ mà bạn sẽ cần biết khi bắt đầu viết mã của riêng mình.

Tiêu chuẩn thẻ từ

Thẻ từ được tiêu chuẩn hóa bởi ISO trong các tài liệu sau: 7810 Đặc điểm vật lý của tài liệu kích thước thẻ tín dụng 7811-1 Dập nổi 7811-2 Vạch từ - lực kháng từ thấp 7811-3 Vị trí của các ký tự dập nổi 7811-4 Vị trí của các rãnh 1 & 2 7811- 5 Vị trí của rãnh 3 7811-6 Vạch từ - lực kháng từ cao 7813 Thẻ giao dịch tài chính Như bạn có thể thấy, thẻ tài chính được quy định trong một tài liệu riêng và thường có các định dạng khác với thẻ thực phẩm hoặc thẻ gọi điện thoại quốc tế của bạn. Bạn sẽ phải lập trình cho những khác biệt này. Tôi vừa có thẻ tín dụng và thẻ bảo hiểm, vì vậy tôi đã lập trình cho những loại này (cả hai đều có định dạng B).

Định dạng thẻ

Có một số định dạng khác nhau cho thẻ từ. Định dạng A và B là phổ biến, với B là định dạng phổ biến nhất mà tôi đã thấy và được hỗ trợ trong mã này. Tôi tin rằng các định dạng từ C đến M được ISO bảo lưu, trong khi từ N đến ?? được dành riêng cho việc sử dụng tùy chỉnh của tổ chức. Bản nhạc 1 Đối với thẻ tài chính, bản nhạc đầu tiên được ghi ở 210 bit / inch và là đường dẫn 0,110 "đầu tiên của thẻ từ trên xuống. Dữ liệu được mã hóa thành" dữ liệu thẻ "là 7 bit trên mỗi ký tự. Đó là 6 bit cho ký tự và một chút cho tính chẵn lẻ. Có ~ 79 ký tự chữ và số trên bản nhạc 1. Thứ tự vật lý là ngược lại. Tức là, dữ liệu là nhưng nó được viết ngược trên thẻ (và do đó, sẽ được phần mềm cơ sở của bạn đọc) là chẵn lẻ là số lẻ. Định dạng dữ liệu thẻ trông như thế này:

[SS] [FC] [Tài khoản chính #] [FS] [Tên] [FS] [Dữ liệu bổ sung] [FS] [ES] [LRC] trong đó:

SS Start sentinel FC Mã định dạng FS Dấu phân cách trường ES End sentinel LRC Kiểm tra dự phòng theo chiều dọc Ký tự Theo dõi một SS = '%', FC = một trong các định dạng (sẽ là B nhiều lần), FS thường là '', ES là '?' và ký tự LRC thường là '<' mặc dù nó không được chỉ định trong các tiêu chuẩn. Ngoài việc được ghi ngược trên thẻ, dữ liệu có một bit chẵn lẻ lẻ và là 0x20 từ ASCII. Chúng tôi sẽ xử lý điều này khi chúng tôi xử lý dữ liệu. Đường ray 2 Đường ray hai rộng 0,110 "và bắt đầu 0,110 từ đầu thẻ. Mật độ ghi của nó là 75 bit / inch. Dữ liệu là 5 bit / ký tự và chỉ bao gồm khoảng 40 ký hiệu số. Bạn sẽ không gặp phải bất kỳ ký tự nào các chữ cái trên bản nhạc này. Định dạng dữ liệu thẻ phải tuân theo cấu trúc này

[SS] [tài khoản chính #] [FS] [dữ liệu bổ sung | dữ liệu tùy ý] [ES] [LRC]

SS cho bản nhạc hai là dấu chấm phẩy: ';' và FS là '=' Với kiến thức thiêng liêng này của bạn, hãy tiếp tục sang các bước tiếp theo để xem mã thực hiện quy trình được nêu ở trên.

Bước 4: Phát hiện khi nào quẹt thẻ

Phát hiện khi thẻ được quẹt
Phát hiện khi thẻ được quẹt

1. Phát hiện khi nào một thẻ đã được quẹt Chính thức, người ta sẽ kiểm tra mã pin / CARD_PRESENT để xem nó có bị tụt xuống thấp hay không. May mắn thay, điều này không thực sự cần thiết. Chúng tôi sẽ kiểm tra thẻ hợp lệ sau. Ngoài ra, bạn có thể đọc mã ghim nhấp nháy của mình để xem khi nào các dải nhấp nháy đã được đưa vào ghim, tuy nhiên, điều này sẽ giúp bạn có rất nhiều số 0 đồng hồ. Người đọc sẽ gửi khoảng 60-70 số 0 đứng đầu để cho bạn biết rằng dữ liệu sắp được trình bày. Tuy nhiên, chúng ta sẽ sử dụng bản chất của dữ liệu nhị phân để xác định thời điểm bắt đầu ghi các bit. Điểm giám sát bắt đầu (SS) cho bản nhạc một là dấu phần trăm (%). Giá trị nhị phân của nó là 0010 0101 có nghĩa là nó sẽ được lưu trữ (và đọc) dưới dạng 1010 001 (nó là 7 bit nên bit thứ 8 không được truyền). Bây giờ, người đọc nhạy bén sẽ nhận thấy rằng mặc dù dữ liệu bị ngược nhưng nó không khớp với giá trị ASCII nhị phân. Đó là bởi vì nó là 0x20 trong số hex. Biểu tượng% là 0x25 và 0100 0101 là 0x05. Dữ liệu thẻ có giá trị bị trừ đi 0x20. Cái đó ở ngoài đó trong nibble cao là bit chẵn lẻ kỳ lạ. Nó được đặt ở đó để có một số lẻ "1" trong giá trị. Vì chúng tôi biết rằng một thẻ hợp lệ sẽ luôn bắt đầu với trạm giám sát bắt đầu này và vì bit chẵn lẻ là 1, nên khi chúng tôi phát hiện chuyển đổi CAO sang THẤP đầu tiên trên chân dữ liệu, thì chúng tôi biết rằng chúng tôi vừa bắt đầu nhận bắt đầu sentinel từ một thẻ. Bây giờ, điều này không phải lúc nào cũng đúng và một kế hoạch tuyệt vời sẽ là kiểm tra thẻ / CARD_PRESENT để xem nó có bị THẤP không. Cách đơn giản nhất để phát hiện sự bắt đầu của SS, là tạo một ngắt bên ngoài được kích hoạt trên cạnh xuống của / STROBE. Dữ liệu có giá trị 1,0 us trước cạnh rơi, vì vậy khi bạn lấy mẫu cạnh rơi, bạn biết rằng mình có thể đọc chân / DATA1 và nhận được giá trị hợp lệ. Đây là mã để tạo ngắt bên ngoài của bạn được kích hoạt trên một cạnh rơi.

voidInitInterrupt (void) {// Thiết lập ngắt BSET (EIMSK, INT0); // mặt nạ ngắt bên ngoài BSET (EICRA, ISC01); // cạnh rơi BCLR (EICRA, ISC00); // cạnh rơi BSET (SREG, 7); // I-bit trong SREG}

Trong điểm chung của tôi mà tôi đưa vào tất cả các chương trình của mình, bạn có thể tìm thấy các định nghĩa của BSET và BCLR. Tham khảo tệp đó nếu bạn có bất kỳ câu hỏi nào về cách đặt các bit. Bây giờ, khi ngắt được kích hoạt, chúng tôi muốn lấy mẫu / DATA1 (trong mã của tôi được định nghĩa là CARD_DATA) và đặt một bit trong thanh ghi IO mục đích chung. Nếu chúng ta đang ở bit thứ 7, hãy lưu sổ đăng ký dưới dạng ký tự trong bộ đệm chung của chúng ta. Tôi sử dụng đăng ký GPIOR0 vì nó có tốc độ truy cập nhanh. Mã giả là một cái gì đó như thế này:

Dừng bộ định thời 16 bit Xóa bộ định thời nếu DỮ LIỆU THẤP Đặt BIT = 1 trong ĐĂNG KÝ Giảm BIT Đặt cờ để chúng ta không bỏ qua thêm 0 nào khác DATA là CAO Đặt BIT = 0 trong ĐĂNG KÝ Giảm BIT Nếu BIT là 0 Thêm byte vào bộ đệm Chỉ số tăng Đặt lại BIT

Nếu bạn đang tự hỏi mình tại sao lại giảm thay vì tăng, hãy nhớ rằng dữ liệu bị ngược, vì vậy thay vì ghi lại các bit khi chúng ta lấy chúng từ LSB sang MSB, chúng ta lưu chúng từ MSB sang LSB để không phải đảo ngược các bit. sau này khi xử lý dữ liệu. Nếu bạn thực sự muốn, bạn cũng có thể thêm 0x20 hex ở đây, nhưng vì nó khoảng 5us trên những nhấp nháy này, tôi đang giữ quá trình xử lý trong quy trình dịch vụ gián đoạn này ở mức tối thiểu.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // nghịch đảo low = 1 {BSET (GPIOR0, bit); --chút; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --chút; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Nếu bạn đang băn khoăn không biết thời gian kinh doanh là gì, đó là bước xác định thời điểm thẻ rời khỏi đầu đọc.

Bước 5: Đọc Luồng dữ liệu

Đọc luồng dữ liệu

Chà, tôi đã chỉ cho bạn cách đọc dữ liệu, vì nó là một phần của Quy trình dịch vụ ngắt dành cho ngắt bên ngoài cạnh rơi của chúng tôi. Một phương pháp thay thế sẽ là đặt một cờ trong ISR, và trong vòng lặp chính, cờ thăm dò ý kiến và đọc dữ liệu theo cách đó, nhưng tôi tin rằng cách tôi đã trình bày rõ ràng hơn. Hãy là người đánh giá của chính bạn và viết bài của bạn nhưng MCU của bạn sẽ cho phép điều đó.

Bước 6: Phát hiện thẻ rời khỏi đầu đọc

Phát hiện thẻ rời khỏi đầu đọc
Phát hiện thẻ rời khỏi đầu đọc

Phát hiện khi thẻ đã biến mất

Về mặt hình thức, người ta sẽ lấy mẫu mã pin / CARD_PRESENT để xem liệu nó có tăng CAO trở lại hay không, nhưng chúng tôi không cần steenkin '/ CARD_PRESENT chiếm một cổng I / O khác. Đây là nơi các bộ hẹn giờ đó xuất hiện. Mỗi khi ngắt được gọi vì chúng tôi đã phát hiện thấy một cạnh giảm trên / STROBE, chúng tôi dừng bộ đếm thời gian, xóa giá trị bộ hẹn giờ và bắt đầu đọc. Khi chúng tôi đọc xong, chúng tôi bắt đầu lại bộ đếm thời gian. Lặp lại bảo tàng quảng cáo hoặc cho đến khi bộ đếm thời gian đạt đến một giá trị nhất định. Điều đó có nghĩa là ngắt cuối cùng đã được gọi và không có thêm dữ liệu nào được đưa vào, vì vậy chúng tôi giả định đó là nó và bắt đầu xử lý dữ liệu chúng tôi đã thu thập. Đối với bộ định thời, chúng tôi sử dụng TIMER1, tức là bộ định thời 16 bit. Tôi đang sử dụng bộ cộng hưởng 16 Mhz bên ngoài cho AVR của mình. Nếu bạn đang sử dụng arduino, thì có lẽ bạn cũng vậy. Vì vậy, tôi đã chọn giá trị bộ đếm trước là 1024 có nghĩa là cứ (16, 000, 000/1024) lần bộ đếm thời gian sẽ tăng lên. Có nghĩa là, nó sẽ 'tích tắc' 15, 625 lần một giây. / CARD_PRESENT sẽ ở mức CAO cho biết thẻ đã rời đầu đọc khoảng 150 mili giây sau bit dữ liệu cuối cùng. Biết được điều này, tôi chỉ quyết định kiểm tra khoảng 1/4 giây một lần. Nó sẽ trông giống như thế này:

(((F_CPU) / PRESCALER) / 4) hóa ra là khoảng 3900. Vì vậy, khi bộ đếm bộ đếm thời gian TCNT1 đạt mức 3900, thì tôi biết nó đã khoảng 300ms và tôi có thể kết luận khá an toàn rằng thẻ đã rời khỏi đầu đọc. Dễ

#define PRESCALER 1024 # define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 mili giây # xác định StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler # xác định StopTimer () BCLR (TCCR1B, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Bạn đã thấy trong ISR nơi bộ hẹn giờ được bắt đầu, dừng và xóa trên mỗi lần ngắt. Bây giờ, trong vòng lặp chính, chúng ta chỉ cần kiểm tra xem bộ đếm thời gian đã đạt đến giá trị mục tiêu của chúng ta chưa và nếu vậy, hãy bắt đầu xử lý dữ liệu

cho (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); Xử lý dữ liệu(); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Bây giờ có thể an toàn để xử lý dữ liệu

mã được định dạng bởi

Bước 7: Xử lý dữ liệu

Xử lý dữ liệu
Xử lý dữ liệu

Xử lý dữ liệu

Giai đoạn xử lý bao gồm:

  • kiểm tra một SS hợp lệ
  • kiểm tra tính chẵn lẻ
  • chuyển đổi sang ASCII
  • kiểm tra một ES hợp lệ
  • kiểm tra LRC

Ở đây, tôi không bận tâm với việc kiểm tra tính chẵn lẻ, vì tôi chỉ đặt bit đó thành 0. Tôi cũng không tính LRC cho hướng dẫn nhỏ này. Đó sẽ là điều mà một phần sụn được thực hiện đầy đủ hơn có thể muốn làm. Đây là đoạn mã để xử lý dữ liệu thực hiện các bước trên (không có phần đã đề cập trước đó). Tìm nó trong hình ảnh bên dưới. Nó được bình luận và khá tự giải thích. Một lưu ý đặc biệt về tính chẵn lẻ và ASCII: Tôi chỉ cần xóa bit chẵn lẻ (bit thứ 7… tức là số 1 với 6 số không phía sau) và để chuyển đổi từ "dữ liệu thẻ", bạn phải thêm 0x20 vào giá trị. Đó là về nó.

Bước 8: Hiển thị dữ liệu

Hiển thị dữ liệu
Hiển thị dữ liệu
Hiển thị dữ liệu
Hiển thị dữ liệu

Hiển thị dữ liệu

Màn hình chuyển đến một chương trình đầu cuối mà tôi đã viết riêng để kết nối với AVR qua RS232 hoặc USB. Chương trình được gọi là AVR Terminal. Phương thức ReadData () khá xấu và bạn được khuyến khích tìm một giải pháp sạch hơn phương thức tôi đã nghĩ ra. Ngoài ra còn có một đầu ra của hàm trong AVR Terminal. Đầu ra đầu tiên là thẻ bảo hiểm y tế và đầu ra thứ hai là thẻ VISA. Nhấp vào ở góc trên bên trái của ảnh và chọn ảnh gốc hoặc ảnh lớn để xem rõ hơn.

Bước 9: Tải xuống và kết thúc mã

Trong phần hướng dẫn này, tôi đã thảo luận một số điều cơ bản về đầu đọc thẻ từ và chỉ cho bạn một số mã để giúp bạn bắt đầu đúng hướng trong việc đọc dữ liệu từ thẻ từ. Có rất nhiều công việc có thể được thực hiện, chẳng hạn như đọc và giải mã bản nhạc thứ 2, tính LRC và tính chẵn lẻ trên mỗi byte. Mã nguồn đầy đủ có sẵn để tải xuống bên dưới. Nó được viết trong AVR Studio 4.17. Tôi hy vọng bạn thích tài liệu hướng dẫn này và, như mọi khi, tôi mong nhận được bất kỳ nhận xét hoặc đề xuất nào mà bạn có thể có.

Đề xuất: