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:
- Electron HW-VX6330 & HW-VX6330K
- USB to RS232 CH340 (setting reader)
- Arduino Uno 16 MHz
- TTL Header Cable to RS232 Casing (Male)
- Dokumentasi protokol
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) - DCD | 3.3 V |
Orange (2) - TXD | 2 |
Red (3) - RXD | ~3 |
Brown (5) - GND | GND |
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