本篇網頁中所使用到的零件可到下面商品網址訂購:
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 測試電路圖 |
接好電路之後,就可以直接使用程式碼測試,或是先看看下面程式碼的說明。
程式碼說明:
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::_pinD0 和 WIEGAND::_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 讀卡器模組相關網頁連結 >>
- { HZ1050 } WIEGAND ( 韋根 ) 26 / 34 介紹
- { HZ1050 @ Arduino @ UART 模式 } 125KHz RFID 讀卡器使用說明
- { HZ1050 @ Raspberry Pi @ UART 模式 } 125KHz RFID 讀卡器使用說明
- { HZ1050 @ Arduino @ Wiegand 模式 } 125KHz RFID 讀卡器使用說明
- { HZ1050 @ Arduino + 整合型 LCD } 125KHz RFID 讀卡器使用說明
- { HZ1050 @ Raspberry Pi @ WIEGAND 模式 } 125KHz RFID 讀卡器使用說明
<<樹莓派編輯環境設置系列文章>>
- 在 Windows 設置 Raspberry Pi (樹莓派) 遠端編輯環境 [第一發] 工欲善其事,必先利其器
- 把 Windows 桌面當作是 Raspberry Pi (樹莓派) 的螢幕 [第二發] 工欲善其事,必先利其器
- 遠端桌面 - VNC [第三發] 工欲善其事,必先利其器
Sublime Text 2 與遠端 (樹莓派) 資料夾連線畫面 |
MobaXterm: Windows 作業系統下開啟樹莓派作業系統的 LXDE 桌面 |
VNC |
沒有留言:
張貼留言
留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!
發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?
不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !