Wieganduino - 使用 Arduino 生成 Wiegand 码
使用 Arduino Nano 生成 26 位 Wiegand 码。
韦根数据线 D0 和 D1。
引言
本文展示了在 Arduino Nano 上实现韦根协议。
韦根协议
韦根协议虽然简单,但仍然被键盘(和读卡器)广泛应用于门禁系统。以下是简要描述。
物理层
这非常简单
- 有
3
根物理线,即D0
、D1
和GROUND
。 - 在没有传输时,
D0
和D1
都被拉高到+5V
。 - 逻辑
0
发生在D0
拉低(0V
)而D1
保持高电平时。另一方面,逻辑1
发生在D1
拉低而D0
保持高电平时(参见上图)。 - 每个数据位(无论是
0
还是1
)都必须跟随一个暂停间隔。数据脉冲和暂停间隔都有时序要求(有关详细信息和参考,请参阅 韦根接口维基百科页面)。
在我的设置中,物理层由 Nano 数字引脚 2
(D0
)、3
(D1
) 和 GROUND
表示。我使用它来实现 26
位协议。
26 位协议
韦根“消息”只是一个 24
位数字代码,前后分别加上两个奇偶校验位。
PXXXXXXXXXXXXXXXXXXXXXXXXQ
前导奇偶校验位 P
被添加到最左边的 12
位(MSB)组中,以获得偶奇偶校验。 类似地,尾随奇偶校验位 Q
被添加到最右边的组中,以获得奇奇偶校验。
例如,假设数字代码是 16777215
,即 0xFFFFFF
(全 1)。
P111111111111111111111111Q
为了使最左边的位组获得偶奇偶校验,我们必须设置 P=0
。另一方面,为了使最右边的位组获得奇奇偶校验,我们必须设置 Q=1
。
因此最终的 26
位代码是
01111111111111111111111111
使用草图
打开串口监视器工具:Arduino 等待一个数字代码,后跟一个换行符(参见下图)。
串口监视器工具
成功接收到数字代码后,相应的韦根消息将在数字引脚 2, 3
上生成。
我可靠的 RIGOL 示波器捕获的一些模式
代码 16777215 (0xFFFFFF):黄色通道是韦根 D0,蓝色通道是 D1
代码 0:请注意,最后一个位设置为 1,以获得尾随奇奇偶校验。
代码 11184810 (0xAAAAAA) 反转了所有位。
这是 0xAAAAAA 模式的一部分,显示了通信线路的空闲到数据转换。
时序
为了满足韦根时序约束,使用了 Arduino delayMicroseconds
函数。虽然结果不尽人意,但满足了协议要求。
数据脉冲时序。
间隔脉冲时序。
代码
代码简单且注释详尽。工作函数报告在下面的代码片段中
// outputs ONE Wiegand bit
void outwiegbit(unsigned int b)
{
int sel = b == 0 ? W_D0 : W_D1;
digitalWrite(sel, 0);
delayMicroseconds(80);
digitalWrite(sel, 1);
delayMicroseconds(240);
}
outwiegbit
简单地以正确的时序在韦根输出上输出一个位
// outputs a 26 bit Wiegand code
// u32 is actually the 24-bit numeric code
void outwieg26(uint32_t u32)
{
uint32_t tmp = u32;
unsigned int p_even = 0;
unsigned int p_odd = 1;
// compute parity on trailing group of bits
for (int n=0; n<12; ++n)
{
p_odd ^= (tmp & 1);
tmp >>= 1;
}
// compute parity on heading group of bits
for (int n=12; n<24; ++n)
{
p_even ^= (tmp & 1);
tmp >>= 1;
}
// now output data bits framed by parity ones
outwiegbit(p_even);
for (int n=0; n<24; ++n)
{
outwiegbit((u32 >> (23-n)) & 1);
}
outwiegbit(p_odd);
}
outwieg26
输出一个 26 位代码。前导(偶)和尾随(奇)奇偶校验位首先在实际的 24 位代码上计算。
关注点
在 Arduino 上构建韦根代码生成器非常快。
另一个步骤可以是添加一个键盘,以便创建一个真正的独立控制访问设备。
历史
- 2018 年 7 月 2 日 - 首次修订