Pengetahuan Dasar Komunikasi serial pada Arduino

Untuk mengirim data dari arduino ke PC dan menerima data dari PC  kita bisa menggunakan berbagai cara salah satunya yg paling sederhana adalah komunikasi Serial yg terdapat pada setiap board Arduino.

Perlu kita ketahuai  pemrograman sketch arduino menggunakan gaya bahasa C tapi pada pembuatan  librarynya menggunakan C++  yg   menerapkan pemrograman Objek (Class). Untuk itu sy sarankan anda sebaiknya mengetahuai  sedikit dasar-dasar pemrograman berorientasi objek.

Pemrograman code  arduino (sketch) untuk komunikasi serial menjadi  mudah karena fungsi fungsi sudah tersedia  dlm class yg tersedia untuk komunikasi Serial . Instance  dari class  untuk komunikasi serial  (objek)  sudah dibuatkan namanya Serial . Untuk arduino yg mempunyai lebih dari 1 port serial misal arduino  mega256 nama objek untuk komunikasi serialnya  adalah  Serial1, Serial2, Serial3.

Penulisan objek  dan fungsi  pada library arduino adalah  :   namaobjek.namafungsi

contoh :  Serial.read()  , artinya  kita memanggil fungsi read() dari  objek bernama Serial .

Data yg dikirim  ke serial port  akan dikirim ke buffer pengirim (Tx buffer)  begitupun data yg diterima  adalah data yg diambil  dari  buffer penerima (RX buffer).

SERIAL BUFFER

 

Data yang dikirm dan diterima arduino  dalam bentuk ASCII. Misalnya  program arduino  mengirim huruf  A maka akan dikirim sebenarnya adalah 1 byte code ascii yaitu 65 .  Jika kita mengirim angka 123 maka sebetulnya yg dikirm adalah 3 byte data ascii yaitu 49, 48, dan 50 . Selengkapnya anda bisa lihat tabel ASCII berikut :

ascii

Karena data yg diterima arduino  juga  dlm bentuk ASCII (char)  maka kita tdk bisa langsung melakukan operasi matematika dari data ASCIIpada program sketch arduino.  Data ASCII dari buffer serial harus dirubah dulu ke bentuk numerik/bilangan (int).  misalkan kita menerima  data  ‘4’ dan ‘3’ maka jika kita langsung  jumlahkan   ‘3’ + ‘4’ = 103 ,  karena sebenarnya kita menjumlahkan code ascii  ‘3’ = 51  dancode ascii  ‘4’  =52    (lihat tabel ASCII).

Untuk merubah data ascii  ke data  numerik  dengan cara yg cukup sederhana yaitu :
-untuk  mendapatkan angka 0 dari ascii ‘0’  dgn cara   ‘0’- 48=0   (atau bisa juga ditulis  ‘0’-‘0’=0)
-untuk  mendapatkan angka 1 dari ascii  ‘1’  dgn cara   ‘1’- 48=1  (atau bisa juga ditulis  ‘1’-‘0’=1)
-dan seterusnya.

jadi kalau mau menjumlahkan data ascii  ‘3’ dan ‘4’  yg kita terima dari RX Bufer  maka code program seharusnya adalah    :

int hasil = (‘3’ – ‘0’) + (‘4’ – ‘0’)   atau

int hasil = (‘3’- 48) + (‘4’-48)   maka hasil berupa bilangan integer  7.

 

Fungsi fungsi  yg tersedia untuk komunikasi serial Arduino

  • if (Serial) : Untuk mengecek apakah Port sudah siap
  • Serial.available() : Untuk mengecek apakah data sudah ada di buffer penerima
  • Serial.begin() : untuk mengeset kecepatan transmisi data
  • serial.end() : Untuk menon-aktifkan pin rx dan tx sbg fungsi serial dan kembali sbg pin I/O
  • Serial.find() : mencari string dlm buffer data
  • Serial.findUntil(): mencari buffer data sampai data dgn panjang/terminator nya yg diberikan ditemukan
  • Serial.flush(): menunggu data terkirim semua
  • Serial.parseFloat(): mengambil data float pertama dari data di buffer serial.
  • serial.parseInt(): mengambil data integer pertama dari data di buffer serial.
  • Serial.peek(): mengambil data berikutnya di bufer penerima
  • Serial.print() : mengirim data ASCII
  • Serial.println() : mengirimdata ASCII + CR,LF (kode enter)
  • Serial.read(): membaca data yg diterima
  • Serial.readBytes(): membaca data byte yg diterima
  • Serial.readBytesUntil()
  • Serial.setTimeout(): mengeset batas maksimum waktu  tunggu(timeout)  transmisi data.
  • Serial.write() : mengirim data byte (numerik)
  • Serial.serialEvent(): fungsi ini akan dipanggil jika data datang/diterima.berlaku spt interupsi serial.

 

Sebelum kita memulai latihan  pemrograman serial arduino kita perlu tahu ttg menu serial Monitor yg tersedia spt tampak pada gambar dibawah ini:

serialmonitor1

Gambar 1. Menu Serial Monitor

Serial Monitor  digunakan untuk  mentransfer data dari PC ke  Arduino board  dan menerima data dari arduino board.

Selain dengan  tool serial monitor yg terdapat pada IDE arduino anda juga bisa menggunakan tool serial lainya seperti hyperterminal, putty dll  untuk mengirim dan menerima data pada PC Anda.

 

Langkah membuat program sketch komunikasi serial

1. set baud rate misal 9600 dgn fungsi serial.begin(9600)  dlm  fungsi void  setup().  Speed yg tersedia antara lain  300, 1200, 2400, 4800, 9600, 14400, 19200, 28800,38400, 57600, 115200 (liat dokumentasi tiap jenis arduino).

2. untuk menerima data cek apakah ada data  di Rx Buffer dgn fungsi  serial.avalable()
jika data tersedia  return value = true jika data kosong return value = false.

if( serial.available() > 0)

3.  mengambil data dari buffer penerima :     serial.read()  ,  return valuenya adalah 1 byte data pertama yg ada di RX Buffer .

misal   byte pertama RX buffer berisi char  2

maka         char data = serial.read();    //data = ‘2’   –> karakter

byte  data = serial.read();   // data = 50    –> numerik

4. Untuk mengirim data bisa menggunakan

serial.print(dataygdikirim)   :  mengirim  data ascii

serial.println(dataygdikirim) , ditambahkan kode enter (CR dan LF)

serial.write(dataygdikirim)   : mengirim data byte

Contoh   serial.print(‘A’)   akan mengirim huruf  A

serial.print(65)  akan mengirim 2 byte berisi code Ascii  ‘6’ dan ‘5’ (aktual yg dikirim 54 dan 53)

serial.write(65)  akan mengirim 1 byte  65  (aktual yg dikirim numerik 65)

serial.write(data)  adalah pengganti syntax Serial.print(data, BYTE) versi sebelumnya. Parameter data pada serial.write adalah angka  1 byte  ( 0-255)

contoh program sketch sederhana menerima data kemudian data dikirim kembali


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

void loop()
{
if ( Serial.available())
{
char datachar = Serial.read();
}
delay(1000)

serial.print(datachar)// data yg diterima dikirim kembali.

}

Beberapa Contoh yg akan kita buat antara lain:


-Mengirim data string/text    “apa kabar”
-Mengirim data bilangan/angka   :  123


int angkaint = 123;
float angkafloat 123.5;
char datachar = 123;

void setup()
{
Serial.begin(9600); // set baudrate = 9600
}

void loop()
{
Serial.print("apa kabar"); // kirim string/text
Serial.println(angkaint); // kirim angka type integer  123
Serial.println(angkafloat); // kirim angka type float 123.5
Serial.println(datachar); //   kirim code ascii 123 yaitu tanda kurung buka {
Serial.println(angkaint,HEX); // kirim angka dlm bentuk heksa , akan dikirim 7BH
Serial.println(angkaint,BIN); // kirim angka dlm bentuk biner , 0111 1011
}

-Menerima data bilangan ASCII misal data yg datang  misal “435”


* Cara Pertama
karakter ditampung di array dan dirubah menjadi string dgn menambahkan null 0 diakhir array( karena string adalah sebuah array type char yg diakhiri dgn null). kemudian array tsb /data string di konversi ke int dgn fungsi atoi.

char arraychar[4];
int i=1;

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

void loop()
{
if ( Serial.available())
{
char datachar = Serial.read();
if(i>4 && isdigit(datachar))   //jika datachar adalah ASCII  0-9
{   arraychar[i++]=datachar; }
else arraychar[i]=0;   // akhir dari sebauh string adalah null (0) 

int angka = atoi(arraychar);
}

}

* Cara kedua

mengggunakan loop sbb :

numerik = numerik * 10 + datachar;

karena datachar adalah kode ascii maka kita rubah ke int dgn cara 
datachar-48   atau  sama juga dgn datachar-'0' 

jadi rumusnya
numerik = numerik * 10 + (datachar-'0');

Contoh Proses loop  saat penerimaan data   “435” ,  spt tabel dibawah , jika  data berupa ‘/n  maka  loop selesai:

serialstep

 

Kode sketch nya sbb:


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

void loop()
{
int numerik = 0;
if (Serial.available())
{ char datachar = Serial.read(); 

while (datachar != '\n')
{
if(isdigit(datachar))
{
numerik = numerik * 10 + (datachar - '0');
}
datachar = Serial.read();
} 

int angkaditerima = numerik;
}

-Mengirim data berurutan ” A,123,B,456″


int bil1 = 123;
int bil2 = 456;

void setup()
{
Serial.begin(9600); // set baudrate = 9600
}

void loop()
{
Serial.print("A");
Serial.print(",");
Serial.print(123,DEC);
Serial.print(",");
Serial.println(345,DEC);
delay(1000);         //delay looping 1 detik}

 

-Menerima data berurutan : “123,456,789 /n”

Pada contoh ini kita akan menggunakan serial.parseint() untuk mengambil data berurutan yg dibatasi koma dan diakhiri ‘/n’

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

void loop()
{

while (Serial.available() > 0)
{
int data1 = Serial.parseInt();           // ambil data ke-1

int data2 = Serial.parseInt();          // ambil data ke-2:

int data3 = Serial.parseInt();        // ambil data ke-3:

if (Serial.read() == '\n')
   {
    int jumlah = data1 +data2 + data3;
   }
 }
}

Menambahkan port serial pada pin I/O

Jika arduino yg kita miliki hanya punya 1 port serial kita bisa merubah pin I/O yg manapun menjadi Port serial tambahan .dengan bantuan class SoftwareSerial  .  Tambahkan file header SoftwareSerial.h  pada sketch anda dan buat 1 buah  objek SoftwareSerial untuk penambahan 1 port, pada contoh dibawah ini kita buat 1 objek sofwareSerial dgn nama serialkedua.

Langsung saja kita lihat contohnya sbb:

#include <SoftwareSerial.h>  

SoftwareSerial Serialkedua(10, 11); // pin 10 untuk RX, pin 11 untuk TX  

void setup()
{

 Serial.begin(96600);
 Serialkedua.begin(9600);

}

void loop()
{

 if (Serial.available())
 serial.println("test dari port1");

 if (Serialkedua.available())
 Serialkedua.println("test dari port2");
}

Contoh kedua menggunakan 3 buah port : Serial, port1 dan port2


#include <SoftwareSerial.h>

SoftwareSerial port1(10,11); // software serial port1: TX = pin 10, RX = pin 11
SoftwareSerial port2(8,9); // software serial port2: TX = pin 8, RX = pin 9

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

void loop()
{

 port1.listen();
 while (port1.available() > 0)
 {
 char inByte = port1.read(); //baca port1 dan kirim ke serial
 Serial.write(inByte);
 }

 port2.listen();
 while (port2.available() > 0)
 {
 char inByte = port2.read(); //baca data port2 dan kirimke serial
 Serial.write(inByte);
 }

}

 

Menerima Data Serial dengan Interupsi

pada penerimaan serial secara interupsi, jika ada data yg datang maka otomatis fungsi serialEvent()  akan di eksekusi berikut contohnya :

String inputString = “”;
boolean stringComplete = false;

void setup() {
Serial.begin(9600);
inputString.reserve(200);
}

void loop() {
if (stringComplete) {
Serial.println(inputString);
inputString = “”;
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == ‘\n’) {
stringComplete = true;
}
}
}

referensi:

http://arduino.cc/en/Reference/Serial

https://learn.adafruit.com/category/learn-arduino

Beginning Arduino Programming

 

Advertisements

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis.

Posted on 28/06/2014, in Arduino. Bookmark the permalink. 7 Comments.

  1. Gan untuk membatasi penerimaan data ke arduino melalui komunikasi serial gimana caranya?

  2. Bang, coding ini “if(i>4 && isdigit(datachar)) ” artinya apa yah krnerror saat compile ??

  3. Wah jadi pengen belajar lebih banyak lagi kontrol arduino. Makasih infonya bang. :D

  4. gan kalo misalnya memasukan 2 kode #include gimana ??,udah di coba kaya gini#include ,#include “pitches.h” ga bisa, mohon infonya gan, Thank.

  5. bang kalo… misalnya ………… data yang dikirim …. misal dari delphi = 01001, dengan urutan angka pertama untuk led/pin 13, dan angka kedua untuk led/pin 12 dst… sampai angka ke lima…. untuk menentukan status lampu mati atau menyala (0 off & 1 on) cara potong stringnya gimana… yahhh… untuk masing masing pin …. [5] nubie nihh

Komentar ,Saran atau Pertanyaan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: