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

Untuk persiapan pada hardware cukup hubungkan kabel data0 dan data1 pada HW-VX ke pin digital Arduino yang dapat digunakan sebagai interrupt, pada tutorial ini mikrokontroler yang digunakan adalah Arduino Mega2560, sehingga pin yang dapat digunakan adalah pin 2, 3, 18, 19, 20 dan 21 untuk daftar pin jenis mikrokontroler Arduino yang lain dapat dicek di https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Pada tutorial kali ini diatur pin 2 dan pin 3 sebagai penerima data, hal ini sangat penting agar ketika Wiegand mulai mengirimkan data, mikrokontroler dapat menerima datanya secara langsung tanpa terinterupsi karena jika lihat gambar di bawah ini, pengiriman sinyal dari interface Wiegand dapat diatur dari 1 – 255 uS pada tiap pulse dari wiegand dan 1 – 255 mS dari bit terakhir ke output data.

Setelah itu untuk persiapan software hubungkan dahulu HW-VX63 ke komputer dan atur HW-VX63 menjadi mode aktif dan data yang dikirimkan ke Wiegand seperti pada gambar di bawah ini pada bagian “Work Mode Parameter”.

Pilih Wiegand yang ingin digunakan, jika dilihat pada tanda biru di gambar, terdapat pilihan Wiegand26 dan Wiegand34 yang berarti data yang diterima oleh Arduino Mega2560 berjumlah 26bit atau 34bit, namun ketika dibaca nilai bit yang terbaca adalah 24bit atau 32bit, 2 bit yang hilang ini berfungsi sebagai tanda start dan stop pada HW-VX63, umumnya digunakan sebagai parity check.

Setelah itu atur output yang digunakan oleh mode aktif HW-VX ke Wiegand output dan pilih data yang ingin dibaca pada bagian berwarna hijau.

Terakhir cukup ubah Work Mode pada bagian warna kuning ke mode aktif dan pilih first word addressnya 2 jika yang dibaca memori EPC (agar langsung membaca ke bagian EPC).

2. Persiapan Program

di sini Program yang digunakan menggunakan bantuan library Wiegand yang 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

Pastikan pin yang digunakan dapat melakukan interupt sehingga ketika Arduino melakukan aktifitas lain data dari Wiegand yang diterima tidak rusak ataupun terpotong, pada bagian lain cukup ikuti sesuai contoh program, untuk program penuh dapat dilihat di bawah ini.

/*
 * 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();
}

Video Tutorial