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.
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) - 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 != 0x 00 ) {
Serial. println ( "Status != 0x00" );
return ;
}
// 4.2. Command (active mode) must equals to 0xEE
const int command = response[ 2 ];
if (command != 0x EE ) {
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 §
VIDEO