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).
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 :
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.
-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:
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.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
-Mengirim data bilangan/angka : 123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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:
Kode
sketch nya sbb:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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″
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#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);
}
}
|
referensi:
Tidak ada komentar:
Posting Komentar