HW-VX63 via RS232 dengan Arduino Uno

Electron HW-VX6330 & 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.

TTL Header Cable to
RS232 Casing (Male)
Arduino Uno
Yellow (1) - DCD3.3 V
Orange (2) - TXD2
Red (3) - RXD~3
Brown (5) - GNDGND

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

Video