Arduino Basics: Komunikasi Serial

From Indonesian Research And Development Center
Jump to: navigation, search

Teori Komunikasi Serial

Tutorial ini akan membahas mengenai komunikasi serial yang dapat dilakukan menggunakan arduino. Komunikasi serial di sini adalah komunikasi menggunakan protokol UART/USART (Universal Synchronous/Asynchronous Receiver Transmitter). Protokol ini dapat digunakan sebagai antarmuka antara arduino dan perangkat lainnya. Protokol komunikasi serial (UART) itu sendiri menggunakan dua buah jalur sinyal untuk berkomunikasi, yaitu jalur sinyal Rx (receiver) untuk menerima data dan jalur sinyal Tx (transmitter) untuk mengirimkan data. Setiap development board arduino memiliki setidaknya satu buah port serial untuk melakukan komunikasi menggunakan protokol UART dan bekerja pada tegangan 5V (kecuali arduino Due yang bekerja pada tegangan 3.3V) sehingga Anda tidak dapat langsung menghubungkan serial port pada arduino ke serial port RS232 pada komputer karena serial port RS232 pada komputer bekerja pada tegangan 12V sehingga dapat merusak arduino jika dihubungkan secara langsung. Berikut ini adalah beberapa jenis arduino yang memiliki lebih dari 1 buah serial port:

Arduino Leonardo memiliki 1 buah port serial tambahan, yaitu:

  • Serial1 yang menggunakan pin 0 untuk Rx dan pin 1 untuk Tx.

Arduino Mega memiliki 3 buah port serial tambahan, yaitu:

  • Serial1 yang menggunakan pin 19 untuk Rx dan pin 18 untuk Tx.
  • Serial2 yang menggunakan pin 17 untuk Rx dan pin 16 untuk Tx.
  • Serial3 yang menggunakan pin 15 untuk Rx dan pin 14 untuk Tx.

Arduino Due memiliki 3 buah port serial tambahan yang beroperasi pada tegangan sinyal 3.3V dengan urutan sebagai berikut:

  • Serial1 yang menggunakan pin 19 untuk Rx dan pin 18 untuk Tx.
  • Serial2 yang menggunakan pin 17 untuk Rx dan pin 16 untuk Tx.
  • Serial3 yang menggunakan pin 15 untuk Rx dan pin 14 untuk Tx.

Selain memanfaatkan pin yang mendukung komunikasi serial pada arduino (hardware serial), Anda juga dapat mengimplementasikan komunikasi serial melalui piranti lunak (software), salah satunya dengan memanfaatkan pustaka SoftwareSerial. Dengan menggunakan pustaka tersebut, Anda dapat melakukan komunikasi serial menggunakan pin digital yang Anda inginkan pada arduino. Namun demikian, pustaka SoftwareSerial memiliki keterbatasan, yaitu:

  • Jika menggunakan lebih dari satu serial port melalui pustaka SoftwareSerial, maka hanya ada 1 yang dapat menerima data pada satu saat (tidak bisa bersamaan).
  • Tidak semua pin pada arduino Mega dan arduino Mega2560 mendukung interupsi change interrupts, jadi pin untuk menerima data (Rx) hanya dapat digunakan pada pin 10 hingga pin 15, pin 50 hingga 53, pin A8 (62) hingga pin A15 (69).
  • Tidak semua pin pada arduino Leonardo dan arduino Micro mendukung interupsi change interrupts, jadi pin untuk menerima data (Rx) hanya dapat digunakan pada pin 8 hingga pin 11, 14(MISO), 15 (SCK) dan 16 (MOSI).

Kecepatan komunikasi serial diukur dengan satuan baud rate per detik atau biasa disingkat bps dan arduino dapat melakukan komunikasi serial hingga kecepatan 115200 bps.


Implementasi

Untuk memulai komunikasi serial pada arduino, terlebih dahulu lakukan inisialisasi serial yang akan digunakan dan kecepatan yang diinginkan. Pastikan bahwa kecepatan yang digunakan sama dengan kecepatan perangkat yang akan terhubung dengan arduino. Caranya melakukan inisialisasi serial port adalah dengan memanggil fungsi Serial.begin() dengan memasukkan parameter kecepatan komunikasi serial yang diinginkan pada fungsi setup() seperti ini:

void setup()
{
    Serial.begin(9600);     // inisialisasi komunikasi serial dengan kecepatan 9600bps
}

Anda dapat mengubah Serial pada potongan kode di atas sesuai dengan serial port yang ingin Anda gunakan. Misalnya jika Anda menggunakan arduino Leonardo, maka untuk komunikasi serial dengan memanfaatkan serial port hardware (Serial1), maka kodenya seperti ini:

void setup()
{
    Serial1.begin(9600);    // inisialisasi serial port Serial1 dengan kecepatan 9600bps
}

Setelah proses inisialisasi selesai, Anda dapat melakukan komunikasi serial dengan menggunakan beberapa fungsi yang tersedia dan memanggil fungsi yang akan digunakan di dalam fungsi loop() pada sketch. Berikut ini adalah contoh memanfaatkan fungsi Serial.available() untuk memeriksa apakah ada data yang diterima oleh arduino:

void loop()
{
    if (Serial.available() > 0)     // Serial.available() adalah fungsi untuk memeriksa apakah ada data yang diterima
    {
        char s = Serial.read();     // Serial.read() adalah fungsi untuk membaca karakter yang diterima
        Serial.print(s);            // Serial.print() adalah fungsi yang digunakan untuk mengirimkan karakter/kalimat (string)
                                    // jika ingin menambahkan baris baru, maka gunakan fungsi Serial.println()
    }
}

Untuk berinteraksi dengan arduino, Anda dapat menggunakan fitur Serial Monitor pada IDE arduino. Berikut ini adalah letak tombol Serial Monitor pada arduino:


Arduino-serial-00.png


Tekan tombol tersebut untuk menampilkan jendela Serial Monitor dan Anda dapat melakukan komunikasi dengan arduino. Jangan lupa untuk memilih port yang sesuai. Pada gambar berikut ini bisa terlihat bahwa komunikasi serial dengan arduino dilakukan melalui port /dev/ttyACM0:


Arduino-serial-01.png


  • Selain menggunakan serial monitor, Anda dapat pula menggunakan scripting atau membuat aplikasi yang dapat berkomunikasi dengan arduino menggunakan protokol serial (UART). Berikut ini adalah langkah-langkah yang dapat dilakukan untuk berkomunikasi dengan arduino melalui serial port menggunakan bahasa pemrograman python, golang dan PHP.

Python

  • Salah satu cara untuk melakukan komunikasi melalui serial menggunakan python adalah dengan menggunakan modul pyserial. Jika modul tersebut belum ada pada sistem operasi yang Anda gunakan, maka terlebih dahulu lakukan proses instalasi menggunakan pip dengan perintah seperti ini:
# pip install pyserial
  • Setelah proses instalasi berhasil, Anda dapat melanjutkan dengan membuat script sederhana untuk berkomunikasi dengan arduino. Pada contoh berikut ini serial port terdapat pada /dev/ttyACM0 dan Anda perlu menyesuaikannya dengan serial port pada sistem operasi yang Anda gunakan:
#!/bin/env python
import serial
from time import sleep

try:
    print "[*] Opening serial connection."
    s = serial.Serial('/dev/ttyACM0', 115200, timeout=0)

    while True:
        s.write(raw_input("[+] Enter command: "))
        sleep(1.5)
        print "[+] Received: " + s.read(24),

except KeyboardInterrupt:
    pass

finally:
    print "\n[*] Closing serial connection."
    s.close()
  • Simpan kode di atas dengan nama file sesuai dengan keinginan Anda dan untuk memudahkan, atur agar script tersebut bersifat executable. Berikut ini adalah contoh output ketika script di atas dijalankan pada terminal:
% ./arduinoserial.py
[*] Opening serial connection.
[+] Enter command: 0
[+] Received: LED Off
[+] Enter command: 1
[+] Received: LED On
[+] Enter command: 0
[+] Received: LED Off
[+] Enter command: 1
[+] Received: LED On
[+] Enter command: 9
[+] Received: Hanya ada 0 atau 1
[+] Enter command: 0
[+] Received: LED Off
[+] Enter command: ^C
[*] Closing serial connection.
  • Selanjutnya, Anda dapat mengembangkan script sederhana di atas, misalnya dengan menambahkan tampilan berupa web interface sederhana menggunakan modul SumpleHTTPServer, tornado atau yang lainnya.


Golang

  • goSerial adalah library yang dapat memudahkan dalam mengakses serial port pada bahasa pemrograman go. Untuk melakukan instalasi library goSerial, gunakan perintah berikut ini:
% go get github.com/tarm/goserial
  • Berikut ini adalah contoh penggunakan goSerial untuk berkomunikasi dengan arduino melalui serial port. Contoh ini merupakan modifikasi dari dokumentasi yang terdapat pada goSerial:
package main

import (
    "fmt"
    "github.com/tarm/goserial"
    "log"
    "time"
)

func main() {
    c := &serial.Config{Name: "/dev/ttyACM0", Baud: 115200} // inisialisasi serial
    s, err := serial.OpenPort(c)                            // buka serial port
    if err != nil {                                         // jika terjadi kesalahan
        log.Fatal(err)                                      // maka tampilkan pesan kesalahan
    }

    for {                                                   // inifinite loop
        var cmd []byte                                      // variabel untuk menampung perintah
        fmt.Print("Enter command: ")                        // tampilkan prompt untuk perintah
        fmt.Scanf("%s", &cmd)                               // simpan perintah pada variabel cmd

        n, err := s.Write(cmd)                              // kirim perintah ke serial port
        if err != nil {                                     // jika terjadi kesalahan
            log.Fatal(err)                                  // maka tampilkan pesan kesalahan
        }

        time.Sleep(1500 * time.Millisecond)                 // tunggu selama 1.5 detik

        buf := make([]byte, 24)                             // variabel untuk menampung data yang diterima
        n, err = s.Read(buf)                                // ambil data dari serial port
        if err != nil {                                     // jika terjadi kesalahan
            log.Fatal(err)                                  // maka tampilkan pesan kesalahan
        }
        fmt.Printf("Received: %s", buf[:n])                 // tampilkan data yang diterima dari serial port
    }
}
  • Selanjutnya simpan source code di atas sesuai dengan nama yang Anda inginkan (misalnya ichi.go) lalu jalankan dengan menggunakan perintah seperti ini:
% go run ichi.go
  • Output dari program di atas adalah sebagai berikut:
% go run ichi.go
Enter command: 1
Received: LED On
Enter command: 0
Received: LED Off
Enter command: 1
Received: LED On
Enter command: 0
Received: LED Off
Enter command: 9
Received: Hanya ada 0 atau 1
Enter command: ^C
exit status 2


PHP

  • Untuk berkomunikasi dengan arduino menggunakan serial port pada PHP, dapat ditempuh dengan mengakses device dimana serial port berada. Namun cara tersebut memiliki kekurangan, yaitu script yang dieksekusi harus memiliki permission untuk mengakses serial port.
  • Berikut ini adalah contoh script PHP yang dapat digunakan untuk mengakses arduino melalui serial port. Perlu diperhatikan, bahwa script ini sifatnya minimalis dan sama sekali tidak memiliki fitur keamanan karena tujuannya hanya sebagai referensi:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Arduino Serial</title>
</head>
<body>
<?php
$cmd = $_POST['t'];
if (!empty($cmd))
{
  $fp = fopen('/dev/ttyACM0', 'w+');
  fwrite($fp, ($cmd == 'LED Off') ? '0' : '1');
  fclose($fp);
  $f = ($cmd == 'LED Off') ? 'LED On' : 'LED Off';
} else {
  $f = 'LED On';
}
?>
Contoh komunikasi arduino dan PHP.
<form method="post" action="index.php">
    <input type="submit" name="t" value='<?php echo "$f"; ?>' />
</form>
</body>
</html>
  • Simpan script di atas dengan nama index.php. Jalankan terminal dan pindah ke direktori dimana script tersebut berada, dan jalankan PHP menggunakan opsi -S agar PHP menggunakan built-in web server seperti berikut ini:
% php -S localhost:8000
  • Perintah di atas akan menjalanakan built-in web server PHP pada port 8000. Selanjutnya, jalankan browser dan buka alamat http://localhost:8000/.
  • Anda dapat menekan tombol LED On untuk menyalakan LED pada arduino, dan ketika LED pada arduino telah menyala, maka Anda dapat memadamkannya dengan menekan tombol LED Off.


Berikut ini adalah sketch yang digunakan pada arduino (Leonardo) untuk pengujian di atas:

#define LED 13                                            // definisi LED pada arduino

void setup()                                              // inisialisasi arduino
{
  Serial.begin(115200);                                   // inisialisasi komunikasi serial menggunakan baud rate 115200
  while (!Serial) ;                                       // khusus untuk arduino leonardo
  pinMode(LED, OUTPUT);                                   // atur PIN untuk LED sebagai output
}

void loop()                                               // fungsi yang akan dijalankan terus-menerus
{
  while (Serial.available() > 0) {                        // periksa apakah data pada serial tersedia

    switch (int i = Serial.parseInt()) {                  // konversi bilangan yang diterima menjadi tipe integer lalu periksa nilainya
      case 0 ... 1:                                       // jika nilai yang diterima adalah 0 atau 1
        digitalWrite(LED, (i == 0) ? LOW : HIGH);         // jika 0, maka padamkan LED dan jika 1, maka nyalakan LED
        Serial.println((i == 0) ? "LED off" : "LED on");  // jika 0, maka kirim pesan "LED off" dan jika 1, maka kirim pesan "LED on"
        break;                                            // lanjutkan perintah di luar operasi "switch"

      default:                                            // jika angka yang diterima bukan 0 atau 1, maka
        Serial.println("Hanya ada 0 atau 1");             // tampilkan pesan "Hanya ada 0 atau 1"
        break;                                            // lanjutkan perintah di luar operasi "switch"
    }
  }
  delay(10);                                              // delay selama 10 milidetik
}

Sebagai tambahan, Anda dapat pula membaca contoh implementasi komunikasi serial arduino pada contoh berikut ini:

Penutup

Dengan mengetahui mekanisme komunikasi serial pada arduino, maka Anda dapat memanfaatkannya untuk banyak hal selain yang telah dituliskan pada bagian implementasi di atas. Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.


Referensi