2015年7月24日 星期五

Arduino Weigand 26bit Decoder ---1

Arduino Weigand 26bit Decoder ---1
源自於
http://www.43577.com/show/850773.shtml

Wiegand協議是國際上統一的標準,是由摩托羅拉公司製定的一種通訊協議。它適用於涉及門禁控製係統的讀卡器和卡片的許多特性。 它有很多格式,標準的26-bit 應該是最常用的格式。此外,還有34-bit 、37-bit 等格式。 而標準26-bit 格式是一個開放式的格式,這就意味著任何人都可以購買某一特定格式的HID卡,並且這些特定格式的種類是公開可選的。26-Bit格式就是一個廣泛使用的工業標準,並且對所有HID的用戶開放。幾乎所有的門禁控製係統都接受標準的26-Bit格式。

1簡介

Wiegand協議是國際上統一的標準,有很多格式,標準的26-bit 應該是最常用的格式。此外,還有34-bit 、37-bit 等格式。格式的含義如下:當給出這一串數字,用戶並不知道這串數字的含義,但如果說這是一個電話號碼的時候,那麼你可能就會說:哦,028是成都的區號,而88888888是電話號碼。嗬嗬,不錯,這正是四川航空的服務熱線。但是安防行業並不願意把這些格式公開,而安防公司也常常變化這些格式來保證產品的保密性。
而標準26-bit 格式是一個開放式的格式,這就意味著任何人都可以購買某一特定格式的HID卡,並且這些特定格式的種類是公開可選的。26-Bit格式就是一個廣泛使用的工業標準,並且對所有HID的用戶開放。幾乎所有的門禁控製係統都接受標準的26-Bit格式。
Wiegand(韋根)協議是由摩托羅拉公司製定的一種通訊協議,它適用於涉及門禁控製係統的讀卡器和卡片的許多特性;其協議並沒有定義通訊的波特率、也沒有定義數據長度韋根格式主要定義是數據傳輸方式:Data0和Data1兩根數據線分別傳輸0和1.現在應用最多的是26bit,34bit,36bit,44bit等等。

2基本概念

韋根數據輸出由二根線組成,分別是DATA0 和 DATA1 ;二根線分別為「0」或「1」輸出。
輸出「0」時:DATA0線上出現負脈衝;
輸出「1」時:DATA1線上出現負脈衝;
負脈衝寬度TP=100微秒;周期TW=1600微秒;
具體時序如下:
例如:數據「01000」的時序如下:

3輸出格式

韋根26位輸出格式:
E XXXX XXXX XXXX XXXX XXXX XXXX O
前12BIT偶校驗前12位 後12位 後12BIT奇校驗
以上數據從左至右順序發送。高位在前。
如果電卡的地區碼位2個字符,即8位則可用那設置255個地區碼((15x16)+15=255);電子卡的卡
號位4個字符,即16位則可設置65535個卡號
((15x16x16x16)+(15x16x16)+(15x16)+15= 65,535)。
以電子卡為標準26位韋根格式為例,假設電子卡號碼為:
地區碼 :01 卡號:0001
韋根輸出為:
前12BIT偶校驗 前12位 後12位 後12BIT奇校驗
地區碼 卡號

426接收

韋根的接收對時間的實時性要求比較高,如果用查詢的方法接收會出現丟幀的現象:假設查詢到DATA0
為0時主程序正在指向其他任務,等主程序執行完該任務時DATA0已經變為1了,那麼這樣就導致了一
個0 bit丟了,這樣讀出的卡號肯定奇偶校驗通不過,所以表現出CPU接收不到ID模塊發送的卡號了。
唯一的辦法是在外部中斷裏接收每個bit。

韋根 接口定義:

Wiegand接口界麵由三條導線組成:
DATA0:暫定,蘭色,P2.5 (通常為綠色)。
DATA1:暫定,白色,P2.6 (通常為白色)。
GND:(通常為黑色),暫定信號地。
當安裝商拿到讀卡器時,他們希望在讀卡器和門禁控製麵板的連接點(終端)上都能夠看到這三個名稱。
當前所有的標準型讀卡器都提供可選擇的Wiegand接口。這三條線負責傳送Wiegand數據,也被稱為
Wiegand信號。

發送程序:

//功能:把數組封包成韋根26的格式,並發送出去
// 原理是把每個字節的低4位取出,來計算這個字節的值
//入口:str=要封包的數組,
//出口:DATA0P3.0;DATA1=P3.1
//設計:大鵬,大鵬艾迪,2006/4/11
void send_wiegand26(uchar *str)
{
//| wiegand[0] | wiegand[1] | wiegand[2] |
//| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)|
uchar data i;
static uchar data one_num; //計算1的個數
uchar data check_temp; //韋根包奇偶效驗中間暫存
bit data even; //韋根包前12位偶效驗
bit data odd; //韋根包後12位齊效驗
static uchar data wiegand[3]; //韋根包數據24位
//--------------------------------端口方向定義
P3M0 = 0x00; //普通I/O口
P3M1 = 0x00;
//================================數組到韋根包的轉化
wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每個字節的低4位取出,來計算這個字節的值
wiegand[0] = wiegand[0]|(*(str+1)&0x0f);
//--------------------------------計算前8位1的個數,為偶效驗用
check_temp = wiegand[0];
for(i = 0;i<8;i++)
{
if(check_temp&0x01) //(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
wiegand[1] = wiegand[1]|(*(str+2)<<4);
//-----------------------計算接下來的4位1的個數,為偶效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x80)
{
one_num++;
}
check_temp<<=1;
}
//---------------判斷1的個數
one_num%2 == 0 (even = 0):(even = 1);
one_num = 0;
wiegand[1] = wiegand[1]|(*(str+3)&0x0f);
//--------------------------------計算接下來的4位1的個數,為奇效驗用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp>>=1;
}
wiegand[2] = wiegand[2]|(*(str+4)<<4);
wiegand[2] = wiegand[2]|(*(str+5)&0x0f);
//--------------------------------計算接下來的8位1的個數,為奇效驗用
check_temp = wiegand[2];
for(i = 0;i<8;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
//--------------------------------判斷1的個數
one_num%2 == 0 (odd = 1):(odd = 0);
one_num = 0;
//================================啟動發送,用定時器做時間延時
//--------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
//--------------------------------發送偶效驗
if(even)
{
WG_DATA1 = 0;
//-------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//------------------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
//----------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1382)/256; //定時1500us
TL0 = (65536 - 1382)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
//-------------------------------發送24位數據
for(i = 0;i<24;i++)
{
//---------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if((wiegand[0])&0x80)
{
WG_DATA1 = 0;
//----------------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//---------------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
(*(long*)&wiegand[0]) <<= 1;
//-------------------------------延時一個發送周期
TR0 = 0;
TH0 = (65536 - 1382)/256; //定時1500us
TL0 = (65536 - 1382)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
}
//==============================發送奇效驗位
//------------------------------韋根 輸出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if(odd)
{
WG_DATA1 = 0;
//--------------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//-------------------------延時100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定時100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
}

5韋根接口

Wiegand接口通常由3根線組成,它們是:數據0(Data0),數據1(Data1)和 Data return。這3條線負責傳輸Wiegand信號。D0,D1在沒有數據輸出時都保持+5V高電平。若輸出為0,則D0拉低一段時間,若輸出為1,則D1拉低一段時間。
兩個電子卡韋根輸出之間的最小間隔為0.25秒。

6通訊協議

標準韋根輸出是由26位二進製數組成,每一位的含義如下:
1 2 9 10 25 26
X X X X X X X X X X X X X X X X X X X X X X X X X X 二進製
第1位為2—13位的偶校驗位
第2—9位對應與電子卡HID碼的低8位
第10-25位對應電子卡的PID號碼
第26位為14-25位的奇校驗位
這26位數據在讀出器的韋根輸出線D0,D1上輸出。

7HID和PID

HID號碼即Hidden ID code 隱含碼,PID號碼即Public ID code 公開碼。PID很容易在讀出器的輸出結果中找到,但HID在讀出器的輸出結果中部分或者全部隱掉。HID是一個非常重要的號碼,它不僅存在於卡中,也存在於讀卡器中。如果卡中的HID與讀卡器中的HID不同的話,那麼這張卡就無法在這個讀卡器上正常工作。

8硬件設計

可以將Wiegand接口的Data0和Data1兩個輸出接到MCU的兩個IO腳上,采用查詢的方式接收數據,但這樣接收並不可靠。比較好的方法是將Data0和Data1接到MCU的兩個中斷引腳上,采用中斷的方式接收數據。
韋根信號是兩根數據線傳輸二進製數據,在空閑時段,兩線的對0V的電源都為TTL電平的水平,也就是5V,一般通過5K電阻上拉,當有數據傳輸時,兩根線交替地發送400uS低脈衝,當Data0線發脈衝時,數據是0;當Data1發脈衝時,發送的數據是1,不能兩根線同時發脈衝。脈衝的間隔時間是1ms。

9韋根傳感器

韋根26是一種通訊協議,像MODBUS、TCP/IP等通訊協議一樣.
韋根傳感器是由一根雙穩態磁敏感功能合金絲和纏繞其外的感應線圈組成的。它的工作原理是:在交變磁場中,當平行於敏感絲的某極性(例如n極)磁場達到觸發磁感應強度時,敏感絲中的磁疇受到激勵會發生運動,磁化方向瞬間轉向同一方向,同時在敏感絲周圍空間磁場也發生瞬間變化,由此在感應線圈中感生出一個電脈衝。此後若該磁場減弱,敏感絲磁化方向將保持穩定不變,感應線圈也無電脈衝輸出;但當相反極性(s極)磁場增強觸發磁感應強度時,敏感絲磁化方向又瞬間發生翻轉,並在感應線圈中感生出一個方向相反的電脈衝。如此反複,韋根傳感器便將交變磁場的磁信號轉換成交變電信號。

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...