HW-VX6330K merupakan salah satu UHF reader middle range yang dapat melakukan read maupun write terhadap tag. Komunikasi dengan reader dapat menggunakan laptop/PC ataupun dengan microcontroller.

Pada tutorial kali ini kami mencoba komunikasikan reader dengan Arduino Uno pemrograman C++ menggunakan protokol (tidak menggunakan SDK), koneksi dari interface Serial RS232 menggunakan Max3232.

Persiapan

Berikut beberapa barang yang diperlukan:

Setting reader

Koneksikan reader dengan laptop/PC menggunakan USB to RS232 CH340 untuk mengatur inventory mode. Untuk tutorial kali ini kami menggunakan inventory Active Mode, dengan beberapa parameter tambahan seperti berikut.

Setting reader Jika sudah di “Set”, cabut USB to RS232 CH340 dan hubungkan RS232 reader ke Max3232.

Koneksi antar Pin

Adapun koneksi antar Pin seperti pada gambar berikut.

Koneksi antar Pin

Max3232Arduino Uno
VCC3.3 V
TXD~3
RXD2
GNDGND

Kabel jumper dari TXD (Max3232) ➜ ~3 (Arduino Uno) bersifat optional, karena Arduino Uno tidak mengirim data apapun ke Reader, mode Active Mode akan mengirim terus menerus dari Reader ke Arduino Uno ketika terdeteksi adanya tag.

Dikarenakan pada tutorial kali ini menggunakan Max3232 Female, maka kita memerlukan kabel DB9 Serial RS232 Male to Male (serial 2-3 Cross Connect). Untuk terhubung ke Max3232 Female ➜ RS232 Female Reader.

Kode

Penjelasan blok/tiap byte command/response dapat dilihat di dokumentasi protokol.

1. hw-vx6330k.ino

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(2, 3); // RX, TX
 
void setup() {
  Serial.begin(57600);
  // Default baud rate HW-VX6330K (57.600 BPS)
  mySerial.begin(57600);
}
 
void loop() {
  if (!mySerial.available()) return;
 
  // 1. Get length of data
  uint8_t length[1];
  readBytesFromSerial(length, 1);
 
  ///////////////////////////
 
  // 2. Get data
  const int dataLength = length[0];
  uint8_t data[dataLength];
  readBytesFromSerial(data, dataLength);
 
  ///////////////////////////
 
  // 3. Complete response
  const int responseLength = 1 + dataLength;
  uint8_t response[responseLength];
 
  memcpy(response, length, 1);
  memcpy(response + 1, data, dataLength);
 
  ///////////////////////////
 
  // 4. Validation response
  // 4.1. Status must equals to 0x00
  const int status = response[3];
  if (status != 0x00) {
    Serial.println("Status != 0x00");
    return;
  }
 
  // 4.2. Command (active mode) must equals to 0xEE
  const int command = response[2];
  if (command != 0xEE) {
    Serial.println("Command != 0xEE");
    return;
  }
 
  ///////////////////////////
 
  // 5. Get data tag
  const int tagLength = responseLength - 2 - 4; // 2: Checksum length, 4: header (length data, reader address, command, status)
  uint8_t tag[tagLength];
 
  memcpy(tag, & response[4], tagLength);
 
  ///////////////////////////
 
  // 6. Print tag
  // Serial.print("Response-> ");
  // printResponse(response, responseLength);
 
  Serial.print("Tag-> ");
  printResponse(tag, tagLength);
}
 
void readBytesFromSerial(uint8_t data[], int length) {
  unsigned long startMillis = millis();
  for (int i = 0; i < length; i++) {
    // Wait for data with a timeout
    while (!mySerial.available()) {
      // Check for timeout
      if (millis() - startMillis > 100) { // Adjust the timeout value as needed
        Serial.println("Timeout waiting for data");
        return;
      }
    }
    // Read a byte from Serial
    data[i] = mySerial.read();
  }
}
 
void printResponse(byte data[], int size) {
  for (int i = 0; i < size; i++) {
    if (data[i] < 16) Serial.print("0");
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
 
  Serial.println();
}

Hasil

Jika buka Serial Monitor (57600 bps) akan tampil seperti berikut:

17:33:48.458 -> Tag-> E2 80 69 95 00 00 40 00 7F 13 05 08 
17:33:48.491 -> Tag-> E2 00 00 1D 44 03 01 24 05 90 60 3A 
17:33:48.528 -> Tag-> E2 80 69 95 00 00 40 00 7F 13 05 08 
17:33:48.528 -> Tag-> E2 00 00 1D 44 03 01 24 05 90 60 3A 
17:33:48.528 -> Tag-> E2 80 69 95 00 00 40 00 7F 13 05 08 
17:33:48.560 -> Tag-> E2 00 00 1D 44 03 01 24 05 90 60 3A