65.9K
CodeProject 正在变化。 阅读更多。
Home

Wieganduino - 使用 Arduino 生成 Wiegand 码

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (6投票s)

2018年7月3日

CPOL

3分钟阅读

viewsIcon

40467

downloadIcon

1617

使用 Arduino Nano 生成 26 位 Wiegand 码。

Wiegand D0 and D1 wires

韦根数据线 D0 和 D1。

引言

本文展示了在 Arduino Nano 上实现韦根协议。

韦根协议

韦根协议虽然简单,但仍然被键盘(和读卡器)广泛应用于门禁系统。以下是简要描述。

物理层

这非常简单

  1. 3 根物理线,即 D0D1GROUND
  2. 在没有传输时,D0D1 都被拉高到 +5V
  3. 逻辑 0 发生在 D0 拉低(0V)而 D1 保持高电平时。另一方面,逻辑 1 发生在 D1 拉低而 D0 保持高电平时(参见上图)。
  4. 每个数据位(无论是 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 等待一个数字代码,后跟一个换行符(参见下图)。

Serial Monitor tool

串口监视器工具

成功接收到数字代码后,相应的韦根消息将在数字引脚 2, 3 上生成。

我可靠的 RIGOL 示波器捕获的一些模式

The 16777215 (0xFFFFFF) code

代码 16777215 (0xFFFFFF):黄色通道是韦根 D0,蓝色通道是 D1

The 0 code

代码 0:请注意,最后一个位设置为 1,以获得尾随奇奇偶校验。

The 11184810 (0xAAAAAA) code

代码 11184810 (0xAAAAAA) 反转了所有位。

The idle-to-data transition

这是 0xAAAAAA 模式的一部分,显示了通信线路的空闲到数据转换。

时序

为了满足韦根时序约束,使用了 Arduino delayMicroseconds 函数。虽然结果不尽人意,但满足了协议要求。

Data pulse timing

数据脉冲时序。

Interval pulse timing

间隔脉冲时序。

代码

代码简单且注释详尽。工作函数报告在下面的代码片段中

// 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 日 - 首次修订
© . All rights reserved.