2014年10月28日 星期二

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

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

HZ1050 韋根 34 讀取

本篇是整個 HZ-1050, 125KHz RFID 讀卡器套件 ( 本文簡稱 HZ1050 ) 使用說明的最後一篇。在這一篇中,將使用自己移植自 Arduino 的 wiegand 函式庫來完成跟 Arduino 一樣的讀取功能。



檔案下載、編譯與執行:

dropbox

或是在行在樹莓派中創建一目錄,輸入下面命令下載並解壓縮

wget -O - http://goo.gl/gWi711 | tar zxvf -

目錄中會出現下面幾個檔案:
pi@raspberrypi ~/codes/hz1050/raspi_wiegand $  wget -O - http://goo.gl/gWi711 | tar zxvf -
...<< 過程省略 >>...
pi@raspberrypi ~/codes/hz1050/raspi_wiegand $ ls -l
total 32
-rwxr-xr-x 1 pi pi 11934 Oct 29 11:39 hz1050_wieganddemo
-rw-r--r-- 1 pi pi  4481 Oct 22 15:30 HZ1050_WiegandDemo.cpp
-rw-r--r-- 1 pi pi   637 Oct 22 15:30 wiegand.h
-rw-r--r-- 1 pi pi  4696 Oct 29 11:39 wiegand.o
pi@raspberrypi ~/codes/hz1050/raspi_wiegand $


編譯時請輸入下面指令:

sudo gcc wiegand.o HZ1050_WiegandDemo.cpp -lwiringPi -o hz1050_wieganddemo


執行時,輸入:

sudo ./hz1050_wieganddemo


電路圖接線:

HZ1050, UART 模式下, Raspberry Pi 測試電路圖
韋根碼的電路與 UART 的電路差異只在與電壓準位模組連接的接腳不同而已,其餘電路都是一樣的,可以很快地做變換。

接好電路之後,就可以直接使用程式碼測試,或是先看看下面程式碼的說明。


程式碼說明:

HZ1050_WiegandDemo.cpp 程式主要分為兩個部分:整合型 LCD 的初始化和字元顯示的操作方式,以及 WIEGAND Code ( 本文稱為韋根碼  ) 的解碼程式。

Note: 韋根碼 26 / 34 解碼部分,只提供樹莓派程式設計所需的標頭檔和 OBJ 檔,原始 Arduino 程式碼列在 "{ HZ1050 @ Arduino @ Wiegand 模式 } 125KHz RFID 讀卡器使用說明" 網頁中,可自行參考。

HZ1050_WiegandDemo.cpp, line 83 - 148
 83 //******************************************************************************
 84 //******************************************************************************
 85 //#define DEBUG       // if DEBUG
 86 
 87 int main()
 88 {
 89     int i;
 90 
 91     // 初始化 wiringPi,並使用 BCM_GPIO 的接腳號碼
 92     if (wiringPiSetupGpio() == -1)
 93     {
 94         fprintf (stderr, "Unable to setup wiringPi GPIO, errno: %s\n", strerror (errno)) ;
 95         exit(1);
 96     }
 97     
 98     // 取得存取 LCD IIC 的 FD
 99     if((pIIC_LCD = wiringPiI2CSetup(LCD_I2C_ADDR)) == -1)
100     {
101         fprintf (stderr, "Unable to get file handle of IIC (LCD), errno: %s\n", strerror (errno)) ;
102         exit(1) ;
103     }
104         
105     lcd_init();
106     delay(100);
107     lcd_Clear();
108     delay(100);
109     
110     // 開始 Wiegand 辨識
111     wg.begin();
112     
113     for(;;)
114     {
115         if( wg.available() )
116         {
117             #ifdef DEBUG
118                 printf( "Wiegand HEX = 0x%8lX", wg.getCode() );
119                 printf( ", DECIMAL = %10lu", wg.getCode() );
120                 printf( ", Type W%2d", wg.getWiegandType() );
121             #endif
122             
123             // 顯示資料在 LCD 上
124             char lcdbuf[17];
125             sprintf( lcdbuf, "HEX%8lX, W%d", wg.getCode(), wg.getWiegandType() );
126             lcd_DisplayCharAt( 1, 1, lcdbuf, 16 );
127             sprintf( lcdbuf, "DEC%10lu,", wg.getCode(), 14 );
128             lcd_DisplayCharAt( 2, 1, lcdbuf, 14 );
129             if( (wg.getCode()) == decTagID )
130             {
131                printf( "DEC Compare OK !");
132                fflush(stdout);
133                lcd_DisplayCharAt( 2, 15, "OK", 2 );
134               /*
135                  增加比對成功的處理碼在這邊
136                  ...   
137               */
138             }
139             else
140             {
141                printf( "DEC Compare NG !");
142                fflush(stdout);
143                lcd_DisplayCharAt( 2, 15, "NG", 2 );
144             }
145         }
146     }
147     return 0;
148 }

line 85:移除前面的雙斜線就會開啟 line 117 - 121,在程式執行時就會將資料回傳到命令列下,否則就只會在比對成功時輸出比對成功或是失敗的字串。所以若是沒有整合型 LCD 也沒關係,就將 line 85 前面的雙斜線取消掉就好。

Main() 裡面的程式碼跟我們在 "{ HZ1050 @ Arduino @ Wiegand 模式 } 125KHz RFID 讀卡器使用說明" 差不多,多個處理顯示在 LCD 上的字串處理而已,請直接參考連結網頁的說明。


HZ1050_WiegandDemo.cpp, line 19 -82
 19 #include <stdio.h>
 20 #include <stdlib.h>         // exit
 21 #include <unistd.h>         // usleep
 22 #include <errno.h>
 23 #include <string.h>         // strcnimp
 24 #include <wiringPi.h>
 25 #include <wiringPiI2C.h>
 26 #include "wiegand.h"
 27 
 28 //******************************************************************************
 29 // LCD
 30 //******************************************************************************
 31 #define LCD_I2C_ADDR        0x3C
 32 #define IIC_REG_COMMAND     0x80
 33 #define IIC_REG_WRITEDATA   0x40
 34 
 35 int pIIC_LCD;
 36 
 37 void lcd_init()
 38 {
 39     // Fucntion set
 40     //  D0 = 1, 4-bit interface; 0: 8-bit interface
 41     //  N  = 1, 2-line display
 42     //  F  = 0, 5x8 font-size
 43     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, 0x3c );
 44     // Display ON/OFF
 45     //  D = 1, display on
 46     //  C = 0, cursor off
 47     //  B = 0, blick  off
 48     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, 0x0c );
 49     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, 0x01 );   // Clear display
 50     // Entry Mode
 51     //  I/D = 1, increment
 52     //  S   = 0, shift of entire display is not perform.
 53     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, 0x06 );   // Extry Mode    
 54 }
 55 
 56 void lcd_Clear()
 57 {
 58     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, 0x01 );
 59 }
 60 
 61 /*在指定行和列位置顯示指定的字母、數字(5*7點陣的)*/
 62 void lcd_DisplayCharAt(int line, int column, const char dp[], int len)
 63 {
 64     int i;
 65     wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_COMMAND, (0x80 + ( line - 1) * 0x40 + ( column - 1 )))  ;
 66     for(i = 0; i < len; i++)
 67         wiringPiI2CWriteReg8( pIIC_LCD, IIC_REG_WRITEDATA, dp[i] );
 68 }
 69 //******************************************************************************
 70 // WIEGAND
 71 //******************************************************************************
 72 
 73 // 要比對的 RFID Tag ID;可以更改為
 74 //char hexTagID[11] = "0x002285EA";  // 一定要 8 個 16 進位,不足的前方補 0
 75 long decTagID     = 2262506;            // 2262506 = 0x2285EA
 76 
 77 // 設定與 HZ-1050 板子上面的 D0 與 D1 與樹莓派何接腳相接
 78 int WIEGAND::_pinD0 = 23;
 79 int WIEGAND::_pinD1 = 24;
 80 
 81 WIEGAND wg;
 82  

line 19 - 26:檔案中會使用到的標頭檔宣告。
line 31 - 33:整合型 LCD 使用的 I2C 通訊相關資料。
line 35:I2C handle。
line 31 - 68:整合型 LCD 的初始化與螢幕清除,以及設定字元顯示在整合型 LCD 螢幕的位置。

line 74 - 75:設定要比對的 EM 卡號資料。因為 wiegand 函式庫回傳 long 整數,所以在這程式預設是使用 long 整數型態做比對;若要使用字串做比對,程式要自行修改 getCode() 回傳的 long 整數型態為字串格式 (參考另一網頁中的 Arduino 的程式碼 )。
line 78 - 79:程式中必須使用到兩根樹莓派接腳來做為接收 HZ1050 ( D0 和 D1 ) 的韋根碼,所以只要是樹莓派中的可用接腳,就可以指定給 WIEGAND::_pinD0WIEGAND::_pinD1 這兩個函式庫會用到的變數。
line 80:宣告程式會用到的 WIEGAND 實體。


程式測試:

線路接好並確認沒問題之後就可以開機準備測試 ! 下指令 sudo ./hz1050_wieganddemo 執行程式,拿出套件中的鑰匙卡在線圈上面停留一下,就會看到整合型 LCD 的螢幕上面出現鑰匙卡的卡號,並且在第一行最後面顯示韋根編碼的格式。若是設定的卡號與鑰匙卡的卡號相同,在第二行的最後面就會出現 OK,否則就出現 NG。

如下,為接收韋根 26 的編碼,解碼之後的輸出。
HZ1050 @ 韋根 26,使用樹莓派解碼之後的輸出

在執行的同時,可以直接使用跳線帽設定 HZ1050 不同的韋根輸出格式,如下為韋根 34 的編碼,解碼之後的輸出。
HZ1050 @ 韋根 34,使用樹莓派解碼之後的輸出

結論:

與 Arduino 接線箱比,使用樹莓派連接 HZ1050 要在訊號傳輸接腳需要做電壓準位轉換,但是在整合型 LCD 接線上卻是相對簡化 !

程式方面,樹莓派的程式大多是從 Arduino 移植過來,程式架構七、八成類似。若對於 Arduino 程式不陌生的話,可以比較兩者之間的差異,可做為之後若是有 Arduino 程式要移植過還樹莓派時可做個參考。



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


      <<樹莓派編輯環境設置系列文章>>

      沒有留言:

      張貼留言