Petunjuk Singkat Komunikasi Wireless Arduino dengan XBee S2


Artikel ini hanya mencakup programming Arduino dengan XBee S2, tidak mencakup setting konfigurasi X-CTU.

Table of Contents




XBee S2


XBee S2 menggunakan protocol Zigbee dengan spesifikasi sebagai berikut.
  • Operating voltage: 2.1 up to 3.6 volts
  • Operating current: 40 mA at 3.3 volts
  • Range: 40 meters (indoor), 120 meters (Line of Sight)
  • Max analog pin reading: 1.2 volts
  • Digital I/O pins: 11
  • Analog input pins: 4
  • Frequency: ISM 2.4 GHz
  • RF data rate: 250 kbps
  • Mesh routable
Berdasarkan Digi selaku pembuatnya, XBee dapat digunakan sebagai Coordinator, Router, maupun End Point Device.



Coordinator
Dalam setiap jaringan wajib memiliki satu buah Coordinator yang harus selalu online. Coordinator (sesuai dengan namanya) berperan mengatur koordinasi jaringan.

Router
Router tidak wajib ada dalam jaringan, namun dalam suatu jaringan diizinkan untuk memiliki banyak Router. Router sendiri dapat berfungsi sebagai relay signal, sama seperti Coordinator XBee yang berperan sebagai Router harus selalu online.

End Point Device
End Point Device (EPD) tidak wajib ada dalam suatu jaringan, namun dalam suatu jaringan diizinkan untuk memiliki banyak EPD. EPD tidak dapat digunakan untuk relay signal, namun dapat offline (sleep mode) untuk menghemat daya.

Berikut ini adalah gambar packet data byte XBee API format untuk request data.



Berikut ini adalah gambar API format packet data byte yang diterima oleh XBee.



Dengan memahami gambar packet data yang diterima tersebut, memudahkan bagi para developer untuk mengembangkan aplikasi dengan XBee.

Arduino


Berikut sedikit penjelasan dan contoh integrasi XBee dengan Arduino.
Data yang dikirimkan oleh Arduino dengan Serial.print() akan diteruskan ke pin TX dari Arduino yang mana dihubungkan dengan pin RX dari XBee. Jika XBee berada dalam AT mode, XBee akan mengirimkan data tersebut secara wireless. Data yang diterima oleh XBee akan diolah oleh Serial dari Arduino.

Arduino Connectivity:
  • Arduino TX hubungkan dengan data input RX dari XBee
  • Arduino RX hubungkan dengan data output TX dari XBee


Contoh Pembacaan Packet Data


Berikut ini ialah source code (sketch) Arduino untuk membaca packet data yang diterima.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 21)
  {
    for (int j = 0; j < 23; j++)
    {
      Serial.print(Serial.read(), HEX);
      Serial.print(", ");
    }
    Serial.println();
  }
}


Pada setup() baud rate yang digunakan untuk komunikasi serial 9600. Pada main program, dilakukan pemeriksaan panjang packet data yang diterima, bila panjang packet data kurang dari 22 byte, packet data tersebut akan diabaikan. Bila packet data yang diterima sesuai kriteria (lebih dari 21 byte) maka akan dilanjutkan ke langkah selanjutnya.
Dengan mengacu pada gambar sebelumnya yakni packet data yang diterima XBee, maka ada setidaknya 24 byte data yang hendak ditampilkan. Dalam hal ini digunakan perulangan untuk menampilkan data tersebut. Serial.read() digunakan untuk membaca satu byte data, karena ada 24 byte data maka pembacaan serial tersebut dimasukkan dalam perulangan sebanyak 24 kali. Dalam program data yang terbaca tersebut diubah terlebih dahulu dalam format hexadecimal, sebelum kemudian ditampilkan.

Contoh Pembacaan Data Digital


Berikut ini ialah source code (sketch) Arduino untuk membaca nilai digital yang diterima.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 21)
  {
    if (Serial.read() == 0x7E)
    {
     
      for (int j = 0; j < 19; j++)
      {
        byte discard = Serial.read();
      }
      data = Serial.read();
      if (data == 0)
      {
        Serial.println("Data low");
      }
      else if (data == 16)
      {
        Serial.println("Data high");
      }
    }
  }
}


Pada setup() baud rate yang digunakan untuk komunikasi serial 9600. Pada main program, dilakukan pemeriksaan panjang packet data yang diterima, bila panjang packet data kurang dari 22 byte, packet data tersebut akan diabaikan. Bila packet data yang diterima sesuai kriteria (lebih dari 21 byte) maka akan dilanjutkan ke langkah selanjutnya.
Dengan menggunakan sebuah switch untuk memberikan nilai high maupun low pada XBee transmitter (Router atau EPD), yang kemudian nilainya akan diteruskan ke XBee receiver (Coordinator), untuk kemudian mengenali isi packet data tersebut. Untuk switch digital yang digunakan hanya pada pin D4 XBee, sehingga byte 17 akan bernilai 0x10H.
Nilai 0x10H diperoleh karena hanya pin D4 XBee yang terhubung dengan switch, sedangkan pin D0 hingga D7 tidak terhubung dengan apapun, tidak digunakan sama sekali.
Sedangkan untuk nilai digital yang terbaca apakah high atau low dapat diamati dari byte 20. Bila byte 20 bernilai 0x10H maka kondisinya ialah high, sedangkan bila nilainya 0x00H kondisinya low. Untuk nilai 0x10H sama dengan 16 desimal. Sehingga pada Arduino byte data yang harus dibaca ialah byte 20.
Dengan mengacu pada gambar sebelumnya yakni packet data yang diterima XBee, untuk memastikan packet data yang diterima tersebut itu sesuai, perlu dilakukan tahap authentication, yakni dengan membaca start byte 0 yakni 0x7EH dengan Serial.read(). Bila start byte 0 yang terbaca bukan 0x7EH, maka packet data tersebut akan diabaikan.
Untuk mengetahui kondisi switch high atau low, yang harus dibaca ialah byte 20. Sementara byte 1 hingga 19 akan diabaikan. Digunakan perulangan sebanyak 19 kali, dan dalam setiap cycle dilakukan discard data byte 1 hingga byte 19.
Variable data digunakan untuk menampung nilai pembacaan Serial.read() dari byte 20. Bila nilai data ialah 0 maka kondisi switch ialah low, sedangkan bila nilai data ialah 16 maka kondisi switch ialah high. Serial.read() digunakan untuk membaca satu byte data serial.

Contoh Pembacaan Data Analog


Berikut ini ialah source code (sketch) Arduino untuk membaca nilai analog yang diterima.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() >= 21)
  {
    if (Serial.read() == 0x7E)
    {
      for (int i = 0; i < 20; i++)
      {
        byte discard = Serial.read();
      }
      int analogMSB = Serial.read();
      int analogLSB = Serial.read();
      int analogReading = analogLSB + (analogMSB * 256);
      Serial.println(analogReading);
    }
  }
}


Pada setup() baud rate yang digunakan untuk komunikasi serial 9600. Pada main program, dilakukan pemeriksaan panjang packet data yang diterima, bila panjang packet data kurang dari 22 byte, packet data tersebut akan diabaikan. Bila packet data yang diterima sesuai kriteria (lebih dari 21 byte) maka akan dilanjutkan ke langkah selanjutnya.
Dengan menggunakan sebuah sensor analog pada XBee transmitter (Router atau EPD), yang kemudian nilainya akan diteruskan ke XBee receiver (Coordinator), untuk kemudian mengenali isi packet data tersebut.
Dengan mengacu pada gambar sebelumnya yakni packet data yang diterima XBee, untuk memastikan packet data yang diterima tersebut itu sesuai, perlu dilakukan tahap authentication, yakni dengan membaca start byte 0 yakni 0x7EH dengan Serial.read(). Bila start byte 0 yang terbaca bukan 0x7EH, maka packet data tersebut akan diabaikan.
Untuk mengetahui nilai pembacaan analog ADC, yang harus dibaca ialah byte 21 dan byte 22. Sementara byte 1 hingga 20 akan diabaikan. Digunakan perulangan sebanyak 20 kali, dan dalam setiap cycle dilakukan discard data byte 1 hingga byte 20.
Data byte 21 disimpan ke analogMSB (Most Significant Bit) ADC sedangkan byte 22 disimpan ke analogLSB (Least Significant Bit) ADC.
Nilai analogMSB diperoleh dengan pembacaan Serial.read(), setelah discard sebanyak 20 kali, maka data serial yang akan dibaca ialah byte 21. Nilai byte 21 inilah yang disimpan di variable analogMSB. Data byte 21 telah dibaca, maka selanjutnya data byte 22 yang akan dibaca dengan Serial.read(), yang mana akan disimpan di variable analogLSB.
Untuk mendapatkan nilai pembacaan ADC yang sebenarnya, maka perlu dilakukan penyesuaian nilai analogMSB dan analogLSB. Nilai analogMSB harus dikalikan dengan 256 terlebih dahulu, hal itu dikarenakan analogMSB dan analogLSB dianggap sebagai satu-kesatuan. Dengan analogLSB sebagai 8 bit low, sedangkan analogMSB sebagai 8 bit high. Karena dianggap sebagai satu-kesatuan, maka nilai bit high (1) terkecil dari analogMSB bernilai 29 atau 256. Itulah alasan mengapa nilai analogMSB dikalikan dengan 256.
Nilai analogReadding merupakan hasil penjumlahan antara nilai analogLSB ditambah nilai analogMSB yang dikalikan dengan 256 terlebih dahulu.

Kesimpulan


Berikut beberapa ringkasan kesimpulan artikel ini.
  • Komunikasi Arduino dengan XBee S2 dilakukan secara serial
  • Start byte 0 pada packet data XBee bernilai 0x7EH digunakan untuk authentication
  • Beberapa byte data yang tidak digunakan oleh Arduino dapat diabaikan, discarded
  • Serial.read() digunakan untuk membaca satu byte data serial secara berturut-turut
  • Nilai data digital tersimpan di data byte 19 dan 20
  • Nilai data analog tersimpan di data byte 21 MSB dan 22 LSB