HW-VX63 via Wiegand dengan Mikrokontroler

Wiegand Interface merupakan komunikasi standart yang populer pada tahun 1980-an, dengan menggunakan kabel yang masing-masing berperan sebagai ground, data high atau 1 dan data low atau 0. Pada HW-VX63 kabel yang dapat digunakan sebagai komunikasi Wiegand dapat dilihat pada bagian belakang alat seperti gambar di bawah ini.

Sinyal pada kabel data 1 maupun data 0 bersifat pull-up ke tegangan 5V sehingga untuk mikrokontroler pada umumnya dapat menerima sinyal dari Wiegand tanpa memerlukan konverter tambahan.

Persiapan

Sebelum masuk kebagian program perlu dilakukan penyesuaian pada software maupun hardware, untuk hardware yang digunakan pada tutorial ini adalah:

  • Arduino Mega2560 beserta USB-nya.
  • HW-VX63.
  • Konverter RS-232 ke USB serial

Arduino Mega dapat dibeli di: https://www.tokopedia.com/electron/microcontroller-mega-2560-r3-ch340g-atmega2560-arduino-clone-ch340-16u

HW-VX63 yang dapat digunakan pada tutorial ini dapat dibeli di:

Konverter RS-232 ke USB serial dapat dibeli di https://www.tokopedia.com/electron/usb-to-rs232-ch340-serial-port-db9-cable-com-port-adapter-ch-340-kabel

1. Persiapan Hardware dan Software

Koneksi antar Pin

HW-VX63Arduino
Light Blue (Data0)Pin 2 (D0)
Blue (Data1)Pin 3 (D1)
BlackGND
Pin 2 dan Pin 3 pada Arduino digunakan sebagai interrupt. Jika menggunakan Arduino Mega2560, pin lain yang dapat digunakan: 18, 19, 20 dan 21, detail dapat dibaca di https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Pada tutorial ini, pin 2 dan 3 diatur sebagai penerima data. Hal ini penting agar mikrokontroler dapat menerima data dari Wiegand tanpa gangguan. Pengiriman sinyal dari interface Wiegand memiliki durasi 1 – 255 µs per pulsa dan 1 – 255 ms dari bit terakhir ke output data.

Settings Reader

Hubungkan HW-VX63 ke komputer dan atur HW-VX63 menjadi seperti gambar di bawah ini:

  • Work Mode Parameter
    • Wiegand: Wiegand26
    • Wiegand output MSB first
    • Data output interval: 30*10ms
    • Pulse width: 10*10µs
    • Pulse interval: 15*100µs
  • Work Mode
    • Output: Weigand output
    • Storage area: EPC
    • First address Select: Word address
    • Work mode: Active mode
    • First word address: 02

Wiegand26: data yang diterima 26 bit, yang terbaca hanya 24 bit (3 bytes). Wiegand34: data yang diterima 34 bit, yang terbaca hanya 32 bit (4 bytes).

Sisa 2 bit sebagai tanda start & stop pada HW-VX63, biasa digunakan untuk parity check.

2. Persiapan Program

Program yang digunakan menggunakan bantuan library Wiegand , dapat diakses di link berikut: https://github.com/paulo-raca/YetAnotherArduinoWiegandLibrary

Untuk penggunaan library cukup buka bagian example pada library tersebut pada bagian https://github.com/paulo-raca/YetAnotherArduinoWiegandLibrary/blob/master/examples/interrupts/interrupts.ino

Jika dilihat pada bagian awal terdapat pin yang didefinisikan seperti di bawah ini.

// Deklarasi Pin
#define PIN_D0 2
#define PIN_D1 3

Untuk kode seperti berikut:

/*
 * Example on how to use the Wiegand reader library with interruptions.
 */
 
#include <Wiegand.h>
 
// These are the pins connected to the Wiegand D0 and D1 signals.
// Ensure your board supports external Interruptions on these pins
#define PIN_D0 2
#define PIN_D1 3
 
// The object that handles the wiegand protocol
Wiegand wiegand;
 
// Initialize Wiegand reader
void setup() {
  Serial.begin(9600);
 
  //Install listeners and initialize Wiegand reader
  wiegand.onReceive(receivedData, "Card readed: ");
  wiegand.onReceiveError(receivedDataError, "Card read error: ");
  wiegand.onStateChange(stateChanged, "State changed: ");
  wiegand.begin(Wiegand::LENGTH_ANY, true);
 
  //initialize pins as INPUT and attaches interruptions
  pinMode(PIN_D0, INPUT);
  pinMode(PIN_D1, INPUT);
  attachInterrupt(digitalPinToInterrupt(PIN_D0), pinStateChanged, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_D1), pinStateChanged, CHANGE);
 
  //Sends the initial pin state to the Wiegand library
  pinStateChanged();
}
 
// Every few milliseconds, check for pending messages on the wiegand reader
// This executes with interruptions disabled, since the Wiegand library is not thread-safe
void loop() {
  noInterrupts();
  wiegand.flush();
  interrupts();
  //Sleep a little -- this doesn't have to run very often.
  delay(100);
}
 
// When any of the pins have changed, update the state of the wiegand library
void pinStateChanged() {
  wiegand.setPin0State(digitalRead(PIN_D0));
  wiegand.setPin1State(digitalRead(PIN_D1));
}
 
// Notifies when a reader has been connected or disconnected.
// Instead of a message, the seconds parameter can be anything you want -- Whatever you specify on `wiegand.onStateChange()`
void stateChanged(bool plugged, const char* message) {
    Serial.print(message);
    Serial.println(plugged ? "CONNECTED" : "DISCONNECTED");
}
 
// Notifies when a card was read.
// Instead of a message, the seconds parameter can be anything you want -- Whatever you specify on `wiegand.onReceive()`
void receivedData(uint8_t* data, uint8_t bits, const char* message) {
    Serial.print(message);
    Serial.print(bits);
    Serial.print("bits / ");
    //Print value in HEX
    uint8_t bytes = (bits+7)/8;
    for (int i=0; i<bytes; i++) {
        Serial.print(data[i] >> 4, 16);
        Serial.print(data[i] & 0xF, 16);
    }
    Serial.println();
}
 
// Notifies when an invalid transmission is detected
void receivedDataError(Wiegand::DataError error, uint8_t* rawData, uint8_t rawBits, const char* message) {
    Serial.print(message);
    Serial.print(Wiegand::DataErrorStr(error));
    Serial.print(" - Raw data: ");
    Serial.print(rawBits);
    Serial.print("bits / ");
 
    //Print value in HEX
    uint8_t bytes = (rawBits+7)/8;
    for (int i=0; i<bytes; i++) {
        Serial.print(rawData[i] >> 4, 16);
        Serial.print(rawData[i] & 0xF, 16);
    }
    Serial.println();
}

Output:

// Wiegand26 (998877 adalah 3 bytes EPC)
10:19:51.164 -> Card readed: 24bits / 998877
10:19:51.564 -> Card readed: 24bits / 998877
10:19:51.965 -> Card readed: 24bits / 998877

// Wiegand34 (99887766 adalah 4 bytes EPC)
10:31:49.760 -> Card readed: 32bits / 99887766
10:31:50.357 -> Card readed: 32bits / 99887766
10:31:51.752 -> Card readed: 32bits / 99887766
10:31:52.151 -> Card readed: 32bits / 99887766
10:31:52.550 -> Card readed: 32bits / 99887766

Troubleshooting

Jika terdapat error seperti berikut pada Serial Monitor Arduino IDE Anda,

// Looping CONNECTED & DISCONNECTED
10:28:10.447 -> State changed: CONNECTED
10:28:10.550 -> State changed: DISCONNECTED
...
10:28:12.398 -> State changed: CONNECTED
10:28:12.454 -> State changed: DISCONNECTED

Maka pastikan koneksi Pin jumper sudah terpasang dengan baik, terutama pada jumper GND.

Video Tutorial