Arduino – Serial Arduino – SoftwareSerial Library pySerial GoSerial

Tutorial ini akan membahas cara menggunakan modul komunikasi RF 315MHz atau 433MHz. Pada prinsipnya kedua jenis modul tersebut bentuknya sama secara fisik, namun berbeda pada frekuensi kerjanya. Modul ini harganya cukup terjangkau sehingga cocok untuk digunakan untuk komunikasi menggunakan frekuensi radio (RF). Hal yang perlu diperhatikan jika menggunakan modul ini adalah kerentanannya terhadap noise yang dapat mengganggu komunikasi. Untuk tegangan, modul ini cukup fleksibel dan dapat bekerja pada rentang tegangan 3-12V sehingga dapat dengan mudah digunakan pada tegangan 5V sesuai dengan yang digunakan oleh arduino pada umumnya. Anda dapat menggunakan tegangan yang lebih tinggi jika ingin meningkatkan jangkauan modul ini, tentunya dengan tambahan beberapa komponen diskrit agar tidak merusak arduino yang Anda gunakan.

Modul RF315/433MHz yang umumnya beredar tidak dilengkapi dengan antenna sehingga jangkauannya hanya beberapa cm. Agar jangkauannya bisa jauh hingga ratusan meter, maka Anda perlu menyolder antenna ke modul tersebut. Anda dapat menggunakan kawat tembaga sebagai antenna. Adapun ukuran kawat yang digunakan untuk modul 315MHz adalah sekitar 23cm dan untuk modul 433MHz dapat menggunakan kawat dengan ukuran sekitar 17cm. Perlu diingat bahwa tutorial ini menggunakan 2 buah arduino, masing-masing untuk transmitter dan receiver. Jika Anda tidak memerlukan sesuatu yang kompleks, maka Anda dapat mengganti arduino dengan ATtiny85 atau yang lainnya. Sebelum melanjutkan ke proses implementasi, Anda terlebih dahulu harus mengenalipinout pada modul RF315/433MHz. Berikut ini adalah pinout pada modul transmitter dan receiver:

Arduino-rf433-pinout.jpg

Sedangkan tabel berikut ini merupakan tabel koneksi antara arduino dan modul RF315/433MHz (koneksi ini sama untuk modul transmitter dan receiver):

Arduino RF315/433MHz
GND GND
5v Vcc
Pin 10 Data

Contoh 1: Menggunakan Pustaka Manchester

Untuk implementasi pertama, akan digunakan pustaka manchester untuk mempermudah penggunaan modul RF315/433MHz. Pustaka manchester ini seperti namanya menggunakan manchester encoding untuk proses pengiriman data dan untuk menerjemahkan data yang diterima pada sisi receiver. Berikut ini adalah langkah-langkah untuk menggunakan pustaka ini:

  • Pindah ke sub direktori libraries pada direktori instalasi arduino dan lakukan kloning pustaka tersebut:
% git clone https://github.com/mchr3k/arduino-libs-manchester.git
  • Jalankan arduino IDE dan gunakan sketch berikut ini untuk arduino dan modul RF315/433 yang berfungsi sebagai transmitter (potongan kode ini merupakan modifikasi dari contoh yang terdapat pada pustaka manchester):
/**
 * Ini adalah sketch untuk transmitter. Hubungkan pin data pada
 * transmitter RF315/433 ke pin 2 pada arduino. Data yang akan
 * dikirim adalah string "hello world"
 */

#include <Manchester.h>                   // file header Manchester.h

#define TX_PIN    10                      // hubungkan pin 2 arduino ke pin data modul RF315/433
#define LED_PIN   13                      // LED pada board arduino berada pada pin 13
#define MSG_LEN   11                      // ukuran pesan yang akan dikirim

uint8_t stat = 1;                         // variabel untuk menyimpan status pengiriman data
uint8_t data[MSG_LEN] = {'h','e','l','l','o',' ','w','o','r','l','d'};   // variabel berisi data yang akan dikirim

void setup() {
  pinMode(LED_PIN, OUTPUT);               // atur pin 13 (LED pin) sebagai output
  man.setupTransmit(TX_PIN, MAN_1200);    // pengaturan pin arduino yang terhubung dengan modul RF315/433
}                                         // dan konstanta kecepatan pengiriman data

void loop() {
  man.transmitArray(MSG_LEN, data);       // lakukan pengiriman data dengan parameter berupa ukuran data
                                          // dan variabel yang berisi data yang akan dikirimkan.
  stat = ++stat % 2;                      // status pengiriman data akan digunakan untuk menyalakan atau
                                          // memadamkan LED pada arduino.
  digitalWrite(LED_PIN, stat);            // nyalakan atau padamkan LED pada arduino berdasarkan status
                                          // pengiriman data.
}
  • Selanjutnya, gunakan sketch berikut ini untuk sisi receiver:
/**
 * Ini adalah sketch untuk receiver. Hubungkan salah satu pin data pada
 * receiverRF315/433 ke pin 2 pada arduino. Data yang diterima akan
 * diteruskan ke serial monitor pada arduino.
 */

#include <Manchester.h>                     // file header Manchester.h

#define RX_PIN    10                        // hubungkan pin 2 arduino ke salah satu pin data modul RF315/433
#define LED_PIN   13                        // LED pada board arduino berada pada pin 13
#define BUF_LEN   11                        // ukuran variabel yang akan menerima pesan

uint8_t stat = 0;                           // variabel untuk menyimpan status penerimaan data
uint8_t data[BUF_LEN];                      // variabel yang akan menerima data yang dikirim

void setup() {
  pinMode(LED_PIN, OUTPUT);                 // atur pin 13 (LED pin) sebagai output
  digitalWrite(LED_PIN, stat);              // aktifkan pin LED sesuai dengan status pada variabel "stat"
  man.setupReceive(RX_PIN, MAN_1200);       // pengaturan pin arduino yang terhubung dengan modul RF315/433
                                            // dan konstanta kecepatan transmisi (penerimaan) data.
  man.beginReceiveArray(BUF_LEN, data);     // mulai lakukan penerimaan data dan simpan data yang diterima
                                            // pada variabel data sesuai dengan ukuran yang didefinisikan
                                            // pada BUF_LEN, yaitu 11 byte.
}

void loop() {
  if (man.receiveComplete())                // periksa apakah data telah selesai diterima
  {
      uint8_t receivedSize = 0;             //

      Serial.println((char *) data);        // tampilkan data yang diterima melalui serial yang dapat dilihat
                                            // pada serial monitor IDE arduino
      man.beginReceiveArray(BUF_LEN, data); // kembali menerima data selanjutnya.
      stat = ++stat % 2;                    // status penerimaan data akan digunakan untuk mengatur LED pada arduino
      digitalWrite(LED_PIN, stat);          // nyalakan atau padamkan LED pada arduino berdasarkan status penerimaan data
  }
}
  • Setelah mengunggah kedua sketch di atas ke arduino, letakkan arduino yang berfungsi sebagai transmitter pada lokasi yang agak jauh dan gunakan adapter atau baterai sebagai sumber tegangan. Sementara itu arduino yang berfungsi sebagai receiver Anda hubungkan ke komputer. Jalankan serial monitor pada IDE arduino untuk menerima pesan dari transmitter. Serial monitor akan menampilkan pesan hello world yang dikirimkan oleh transmitter seperti pada gambar di bawah ini:
Arduino-rf433-serial monitor.png

Contoh 2: Menggunakan Pustaka RadioHead

Pada contoh kedua ini, akan digunakan pustaka RadioHead yang merupakan pengembangan dari pustaka VirtualWire. Berikut ini adalah langkah-langkah untuk menggunakan pustaka ini:

  • Unduh terlebih dahulu pustaka RadioHead (ketika tutorial ini ditulis, versi terbaru adalah v1.53):
% wget -q http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.53.zip
  • Ekstrak arsip tersebut ke dalam sub direktori libraries pada direktori instalasi arduino (misalnya pada sub direktori ~/Arduino/libraries):
% unzip RadioHead-1.53.zip -d ~/Arduino/libraries
  • Jika menggunakan pustaka RadioHead, maka koneksi antara pin data pada modul transmitter dihubungkan dengan pin 12 pada arduino. Sedangkan pin data pada modul receiver dihubungkan dengan pin 11 pada arduino.
  • Berikut ini adalah contoh sketch untuk transmitter yang sama dengan contoh pertama di atas (sketch ini merupakan modifikasi dari contoh pada pustaka RadioHead):
#include <RH_ASK.h>                             // Header RadioHead menggunakan ASK (Amplitude Shift Keying)
#include <SPI.h>                                // Header SPI.h disertakan karena dibutuhkan oleh proses kompilasi

#define LED 13                                  // Definisi untuk pin LED pada arduino

RH_ASK driver;                                  // Inisialisasi driver pustaka RadioHead

void setup()
{
    pinMode(LED, OUTPUT);                       // Atur pin 13 (LED) pada arduino sebagai output
    Serial.begin(9600);                         // Untuk proses debugging
    if (!driver.init())                         // Jika proses inisialisasi gagal
         Serial.println("Inisialisasi gagal");  // Maka tampilkan pesan pada serial monitor
}

void loop()
{
    const char *msg = "hello world";            // Data/pesan yang akan dikirim

    digitalWrite(LED, HIGH);                    // Nyalakan LED sebagai tanda bahwa data akan dikirim
    driver.send((uint8_t *) msg, strlen(msg));  // Kirim data sesuai dengan ukurannya
    driver.waitPacketSent();                    // Tunggu hingga seluruh data terkirim
    digitalWrite(LED, LOW);                     // Padamkan LED sebagai tanda bahwa data telah terkirim
    delay(200);                                 // Tunggu selama 200 milidetik
}
  • Sedangkan sketch berikut ini adalah untuk receiver:
#include <RH_ASK.h>                           // Header RadioHead menggunakan ASK (Amplitude Shift Keying)
#include <SPI.h>                              // Header SPI.h disertakan karena dibutuhkan oleh proses kompilasi

#define LED 13                                // Definisi untuk pin LED pada arduino

RH_ASK driver;                                // Inisialisasi driver pustaka RadioHead

void setup()
{
  pinMode(LED, OUTPUT);                       // Atur pin 13 (LED) pada arduino sebagai output
  Serial.begin(9600);                         // Untuk proses debugging
  if (!driver.init())                         // Jika proses inisialisasi gagal
    Serial.println("Inisialisasi gagal");     // Maka tampilkan pesan pada serial monitor
}

void loop()
{
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];        // Variabel yang berfungsi untuk menyimpan data yang diterima
  uint8_t buflen = sizeof(buf);               // Variabel yang berfungsi untuk menyimpan ukuran data yang diterima

  if (driver.recv(buf, &buflen))              // Jika ada data yang diterima
  {
    digitalWrite(LED, HIGH);                  // Nyalakan LED sebagai indikasi data diterima
    driver.printBuffer("Data:", buf, buflen); // Maka tampilkan data yang diterima ke serial monitor dalam format heksadesimal
    digitalWrite(LED, LOW);                   // Padamkan LED setelah data dikirim ke serial monitor
  }
}
  • Berikut ini adalah data yang diterima pada sisi receiver dan ditampilkan pada serial monitor IDE arduino:
Arduino-rf433-radiohead ask.png

Kedua contoh di atas hanya sebagai pengantar penggunaan modul RF315/433MHz. Selanjutnya, Anda dapat mengembangkan tutorial ini misalnya dengan mengirimkan data dari sensor menggunakan modul RF315/433MHz.

Sekian tutorial kali ini, semoga bermanfaat. Selanjutnya, Anda dapat mengembangkan tutorial ini untuk sesuai dengan ide dan kreatifitas yang Anda miliki. Terima kasih kepada Tuhan Yang Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.

Referensi

 

Leave a comment