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

Pada tutorial kali ini, reader berjalan di mode Active Mode (baca: Jenis Work Mode UHF Reader), silahkan koneksikan terlebih dulu reader dengan laptop/PC menggunakan USB to RS232 untuk mengatur work mode.

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