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) - 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