2014年10月27日 星期一

{ HZ1050 @ Arduino @ WIEGAND 模式 } 125KHz RFID 讀卡器使用說明

HZ-1050 125KHz RFID 讀卡器模組學習套件可至露天賣場訂購:
詳細的介紹,請上露天賣場。




延續上一篇 "{ HZ1050 @ Arduino @ UART 模式 } 125KHz RFID 讀卡器使用說明",這篇網頁主要用來說明在 Arduino 開發環境 中,使用兩支 IO 接腳以中斷的方式接收來自來自 HZ-1050 125KHz RFID 讀卡器 ( 文中簡稱 HZ1050 ) 回傳 RFID 卡號 ( 因為 HZ1050 主要是針對 EM4100 以及 EM4001 RFID 卡,因此以下在文中簡稱 EM 卡 ),並且將卡號輸出到 Serial Monitor 中。

Wiegand ( 文中稱為韋根 ) 26 / 34 的格式說明,請參考 "{ HZ1050 } WIEGAND ( 韋根 ) 26 / 34 介紹";電路佈線請參考上一篇的電路圖。

本篇是 Arduino 控制 HZ1050 系列的第二篇,這三篇依其接收方式不同有:
  1. UART
  2. Wiegand 26 / 34
  3. UART + Wiegand 26 / 34

前兩篇會將結果直接回傳到 Arduino 的 Serial Monitor 中;最後一篇則是另外再將結果顯示在 { 5V0 } 整合型 LCD 上。

函式庫安裝:

在雲端硬碟 {HZ1050}/codes/Arduino/library/ 目錄下有一個 wiegand.zip 的壓縮檔,請將其解壓縮到 {Arduino}/libraries/ 目錄下 ( 若不清楚 Arduino 函式庫的安裝方法,看這網頁中的說明 )。


程式碼說明:

開啟 Arduino IDE, 點選 File -> Sketchbook -> HZ1050 -> Wiegand 打開 RFID_Demo_Wiegand.ino,完整的程式碼如下:

RFID_Demo_Wiegand.ino, line 7 - 47
 7 //
 8 #include <Wiegand.h>
 9 
10 WIEGAND wg;
11 
12 // 要比對的 RFID Tag ID;可以更改為
13 long decTagID = 2262506;            // 2262506 = 0x2285EA
14 long hexTagID = 0x2285EA;
15 
16 void setup() {
17  Serial.begin(9600);  
18  wg.begin();
19 }
20 
21 void loop() {
22  if(wg.available())
23  {
24   Serial.print("Wiegand HEX = 0x");
25   Serial.print(wg.getCode(),HEX);
26   Serial.print(", DECIMAL = ");
27   Serial.print(wg.getCode());
28   Serial.print(", Type W");
29   Serial.println(wg.getWiegandType());
30   if( wg.getCode() == decTagID )
31   {
32    Serial.println( "DEC Compare OK !");
33    /*
34     增加比對成功的處理碼在這邊
35     ...   
36    */
37   }
38   if( wg.getCode() == hexTagID )
39   {
40    Serial.println( "HEX Compare OK !");
41    /*
42     增加比對成功的處理碼在這邊
43     ...   
44    */
45   }
46  }
47 }

wiegand 函式庫使用兩根中斷接腳作為接收 HZ1050 D0 與 D1 的位元 ( BIT ) 訊號,預設是使用 INT0 ( D2 ) 和 INT1 ( D3 ),不要接錯了 !!!

使用 wiegand 函式庫非常簡單 ! 先在檔案開頭處加入函式庫的標頭檔 ( line 8 ),接著宣告一個實體 ( line 10 ),再在 setup() 函式裡啟動它 ( line 18 )。

我在這邊將要比對的 EM 卡號以 10 進位與 16 進位整數宣告在  ( line 13, line 14 ),這有點多此一舉 ! 但這這邊是舉例,尤其當瞭解了 EM 卡號的換算之後,要怎麼做比對與換算都可以,目的都是一樣的。

WIEGAND 類別可讓使用者用到的函數只有下面這幾個。EM 卡號由 getCode() 函式傳回;韋根格式由 getWiegandType() 函式傳回;available() 函式,讓程式設計師可以知道資料接收是否已經完成?是否可以開始處理?
wiegand.h, line 12 - 21
12 
13 
14 class WIEGAND {
15 
16 public:
17  WIEGAND();
18  void begin();
19  bool available();
20  unsigned long getCode();
21  int getWiegandType();

繼續回到 loop() 函式,就不難了解,就是直接使用剛剛所講的 WIEGAND 類別裡面的函式取得 EM 卡號以及韋根格式並輸出到 Serial Monitor 上。

不難吧 ! 很容易使用的 Arduino 函式庫,使用上也很直覺 !


測試結果:

測試之前,請先使用跳線帽在 HZ1050 板子的上方選擇好要使用的韋根碼格式 ( 這裡是選 Wiegand 26 )。開啟 Arduino 電源並開啟 Serial Monitor,使用套件中的鑰匙卡在線圈上面停一下,Serial Monitor 就會顯示出鑰匙卡的卡號以及韋根格式 ( W24 ),如下圖所示。

改一下跳線帽的位置到 W34 的位置,再用鑰匙卡在線圈上面停一下,這時韋根格式就會變成 W34,表示現在使用韋根 34 的格式編解碼 ,其他則維持不變。
HZ1050, Arduino Serial Monitor 輸出畫面


結論:

wiegand 函式庫使用 Arduino 中斷處理,因此也限定了必須使用 INT0 ( D2 ) 和 INT1 ( D3 ) 兩之接腳。不過 ATMega328 晶片還有一種中斷:PCINT,使用這方式產生的中斷可以多於兩個,所以可以利用這方式改掉 wiegand 函示庫並使用其他接腳作為中斷的需求;不過這部分我還未試過,如果有興趣嘗試這樣做的話,可以參考下面這連結中的說明進行修改。

PinChangeInt Library


而此同時,根據 Arduino 的 wiegand 函式庫裡的程式碼,我將其移植到樹莓派中做使用,所以在使用上幾乎與上面的 Arduino 程式碼幾乎相同,網頁連結在最下面。

同樣的電路,但是使用不同的編解碼方式來獲得 EM 卡的卡號,目的是為了讓使用者能循序漸進的了解 HZ1050 如何的使用。

接著最後一篇 Arduino 與 HZ1050 的使用說明,我們將結合 UART 以及 Wiegand 兩個程式碼,並且將原本輸出到 Serial Monitor 的文字,再另外顯示在 { 5V0 } 整合型 LCD 上。這也是我們第一次展示使用 Arduino 控制整合型 LCD 的程式碼,手邊有的不容錯過 !!!



<< 部落格 HZ-1050,125KHz RFID 讀卡器模組相關網頁連結 >>

沒有留言:

張貼留言