Anda di halaman 1dari 14

INTERFACING KOMPUTER DAN MIKROKONTROLER MENGGUNAKAN USART

(DENGAN KOMPONEN SERIAL PORT PADA C#)

I. TUJUAN
1. Mahasiswa mampu memahami struktur dasar dari protokol komunikasi sederhana
2. Mahasiswa mampu membuat program aplikasi komuniksi serial dengan protokol komunikasi
sederhana pada PC dan mikrokontroler
3. Mahasiswa mampu membuat program untuk mengakses digital I/O, ADC, dan PWM pada
mikrokontroler tipe AVR melalui PC

II. PERALATAN
1. Kabel data Serial
2. Konverter USB ke Serial RS-323 (optional)
3. Komputer dengan program CodeVisionAVR dan Khazama ISP Programmer
4. Program Visual Studio (C#)
5. USB ISP Programmer
6. Modul mikrokontroler AVR
7. Obeng Plus (untuk mengatur tegangan input ADC melalui VR)
8. Oscilloscope dan Probe (atau dengan volmeter)

III. DASAR TEORI


Pada Komunikasi serial, data yang dikirim bisa dalam bentuk karakter ASCII dan mode binary. Praktikum
ini merupakan kelanjutan dari praktikum ke-3, dimana format ASCII digunakan pada proses pengiriman
data. Kode ASCII merupakan kode alphanumeric yang paling popular yang dipakai dalam teknik
telekomunikasi. Untuk mencari kode biner dari tiap karakter ASCII dapat dipergunakan tabel ASCII,
sedangkan cara membaca tabel yaitu pada grafik kita ubah dulu menjadi bilangan biner, kemudian diubah
menjadi bilangan hexadecimal dan kita bandingkan bilangan hexa-decimal tersebut dengan tabel 1. Dari
tabel tersebut didapatkan bahwa untuk mengirimkan informasi dalam bentuk ASCII, sebenarnya kita bisa
manggunakan mode panjang data 7 bit, karena seperti yang kita lihat diatas, data yang digunakan pada
karakter ASCII tidak melebihi 7 Bit (maksimal = 127).

Teknik Pengantarmukaan – Mekatronika PENS - 1


Apabila data yang kita kirim melalui komunikasi serial jumlahnya lebih dari satu jenis data, maka
diperlukan sebuah mekanisme untuk membedakan data satu dengan yang lainnya. Dengan penambahan
protokol komunikasi, kita dapat memberikan informasi tambahan pada setiap data yang dikirim untuk
mengidentifikasi data satu dengan data yang lain sehingga bisa kita oleh lebih lanjut masing-masing data
tersebut.
Tabel 1. Tabel karakter ASCII

A. I/O pada modul mikrokontroler


Seperti pada praktikum sebelumnya, modul mikrokontroler AVR yang digunakan pada percobaan
ini terdapat 4 buah jenis data yang nanti akan dikomunikasikan dengan 2 bersifat tulis dan 2 data
bersifat baca, yaitu:
1. Delapan (8) bit data Digital Input yang berasal dari dip switch. Untuk mempersingkat
pembacaan data dari mikrokontroler, dilakukan proses konversi dari Bit (biner) kedalam
format desimal, sehingga data dapat direpresentasikan sebagai sebuah data desimal dengan
range (jangkauan) nilai 0 sampai dengan 255.
2. Delapan (8) bit data Digital Output yang nanti akan ditampilkan pada LED pada modul
mikrokontroler. Untuk mempersingkat pengiriman data dari PC, dilakukan proses konversi
dari Bit (biner) kedalam format desimal, sehingga data dapat direpresentasikan sebagai
sebuah data desimal dengan range nilai 0 sampai dengan 255.

Teknik Pengantarmukaan – Mekatronika PENS - 2


3. Delapan (8) buah data Analog Input yang berasal dari pembacaan ADC. Pada bagian ini kita
gunakan proses konversi data 8 bit, sehingga akan menghasilkan data dalam range 0 sampai
dengan 255.
4. Dua (2) bua h data Analog Output yang nantinya akan digunakan untuk mengatur duty cycle
dari sinyal PWM. Data PWM ini selanjutnya akan difilter dengan low pass filter (menggunakan
komponen filter RC), sehingga akan didapatkan tegangan DC yang sebanding dengan nilai
duty cycle dari sinyal PWM yang diberikan.

Analog cv Digital Output (8x LED)


Output

ISP
I/O PORT CONNECTOR

Switching
LCD 16x2
Regulator

Digital Input Analog Input (8 kanal)


(8 bit)

Gambar 1. Modul mikrokontroler ATMega8535

B. Protokol Komunikasi dengan PC


Proses komunikasi data dilakukan dengan konfigurasi yang menempatkan modul mikrokontroleer
sebagai server, yang akan diakses dari client (PC), sehingga inisiasi dari pembacaan atau penulisan
data diakses dari PC. Format komunikasi data yang akan digunakan menggunakan format data
ASCII. Untuk mengakomodasi keempat data pada modul mikrokontroler, dibutuhkan 4 buah

Teknik Pengantarmukaan – Mekatronika PENS - 3


Header data yang membedakan masing-masing data. Desain dari protokol yang digunakan untuk
proses komunikasi nya adalah sebagai berikut:
1. Digital Input (8 bit → 1 byte)
a. Ketika PC akan membaca data dip switch, maka PC akan mengirimkan request dengan
mengirimkan karakter ’!’ lalu diikuti dengan ’~’. ’!’ digunakan sebagai informasi
header 1.
b. Karena data yang akan digunakan untuk menginformasikan data dip s witch sudah
dikompresi menjadi data desimal pada mikrokontroler, maka cukup diperlukan 1 byte
data untuk mengakomodasi 8 bit data dari dip switch. Selanjutnya apabila
mikrokontroler menerima karakter ’!’ (request pembacaan data dip switch), maka
akan membalas dengan mengirimkan data dengan format sebegai berikut:
’!’ + (data dipswitch dalam string dari nilai desimal) + ’~’
2. Digital Output (8 bit → 1 byte)
a. Sebelum mengirimkan data ke LED, data kombinasi 8 bit yang dikirmkan dikompresi
menjadi satu data desimal tunggal pada PC, sehingga cukup diperlukan 1 byte data
untuk mengakomodasi 8 bit data untuk ditampilka pada LED. Kertika PC ingin menulis
ke LED, maka akan dikirimkan data dengan format:
’@’ + (data LED dalam string dari nilai desimal) + ’~’
b. Selanjutnya mikrokontroler akan menterjemahkan data tersebut. Dan jika data
berhasil diterjemahkan, maka mikrokontroler akan membalas dengan karakter ’@’,
dan akan membalas dengan karakter ’?’ apabila proses penterjemahan mengalami
kegagalan.
3. Analag Input (8 kanal)
a. Sebenarnya untuk Analog Input ada 2 mekanisme yang bisa digunakan, yaitu proses
pembacaan data per-kanal, dan yang kedua adalah pembacaan data dari semua
kanal.
b. Untuk pembacaan data perkanal, maka PC perlu mengirimkan data kanal yang akan
dibaca, dengan format sebagai berikut: ’#’ + (nomor kanal) + ’~’, dimana nomor kanal
adalah nomor dari kanal ADC dari mikrokontroler yang nilainya berkisar antara 0
sampai dengan 7.
c. Untuk pembacaan data semua kanal, maka PC tidak perlu mengirimkan data kanal
yang akan dibaca. Sehingga format data yang dikirim sebagai berikut: ’#’ + ’~’

Teknik Pengantarmukaan – Mekatronika PENS - 4


d. Selanjutnya mikrokontroler ketika mendapatkan pambacaan header yang ke-3 (’#’),
maka mikrokontroler akan mebaca karakter yang mengikutinya.
e. Apabila karakter yang mengikutinya adalah nomor kanal, maka setelah menerima
karakter tail (’~’) mikrokontoler akan mengirimkan data konversi ADC pada kanal yang
bersangkutan dengan format sebagai berikut: ’#’ + (data ADC kanal yang diinginkan)
+ ’~’. Sedangkan apabila tidak ada informasi kanal yang dikirim dari PC, maka
mikrokontroler akan mengirim data hasil konversi ADC dari semua kanal, berturut
turut dari kanal 0 sampai dengan kanal 7, dengan format:
’#’ + (data ADC kanal 0) + (data ADC kanal 1) + . . . + (data ADC kanal 7) + ’~’
4. Analog Output (2 kanal)
a. Sebenarnya untuk Analog Output juga bisa dilakukan 2 mekanisme yang bisa
digunakan, yaitu proses penulisan data per-kanal, dan yang kedua adalah penulisan
data ke semua kanal.
b. Untuk penulisan data perkanal, maka PC perlu mengirimkan data kanal yang akan
ditulis, dengan format sebagai berikut: ’$’ + (nomor kanal) + (data yang ditulis) + ’~’,
dimana nomor kanal adalah nomor dari PWM pada mikrokontroler yang nilainya
adalah 0 (OCR1A) atau 1 (OCR1B).
c. Untuk penulisan data ke semua kanal, maka PC tidak perlu mengirimkan data kanal
yang akan ditulisi. Sehingga format data yang dikirim langsung diikuti semua data
yang akan ditulis dengan asumsi data kanal 0 dikirim tersebih dahulu sebagai berikut:
’$’ + (data kanal 0) + (data kanal 1) + ’~’
d. Selanjutnya mikrokontroler akan menterjemahkan data dari PC. Apabila proses
penterjemahan sukses maka mikrokontroler dan menuliskan data pada kanal yang
dituju, dan selanjutnya akan mengirimkan karakter ’$’ sebagai tanda bahwa proses
berhasil. Apabila tidak maka mikrokontroler akan mengirimkan karakter ’?’ sebagai
tanda bahwa proses penterjemahan data gagal.

C. Proses Parsing Data pada mikrokontroler


Untuk memahami proses parsing data pada PC dapat dilihat flowchart dari prosesnya sebagai
berikut:

Teknik Pengantarmukaan – Mekatronika PENS - 5


Start

flagHeader = 0

X = dSerial = getchar ()

Y
FlagHeader = 1
T
T Index++
Status = true dSerial = ‘~’ (tail)
xData [Index] = X
Index = 0 X = ‘!’ or ‘#’’
Header = Y Y
xData[0] = T
dSerial xData[0]=’!’ Y

T Tampil data Kirim Data


Kirim Request Dipswitch LED (D0)
Analog Input X = ‘@’
Y
T

Kirim Request Y
Digital Input X = ‘$’ xData[0]=’#’
Y
T T Tampil data Kirim Data
ADC PWM (A))
Protokol Error X = ‘?’
Y
T
FlagHeader
=0

Stop

Gambar 2. Flowchart parsing data pada PC

III. PROSEDUR PERCOBAAN


A. Membuat Form dan komponen visulisasi dengan C#
1. Buka program Visual Studio pada komputer (PC / Notebook)
2. Pilih project : Windows Form Application dengan menggunakan Visual C#

Teknik Pengantarmukaan – Mekatronika PENS - 6


3. Set nama project dan lokasi dari penyimpanan project pada computer, lalu tekan tombol OK
4. Pada form tambahkan komponen antara lain label, button dan comboBox sebagai berikut:

5. Ubah Text label1 menjadi “Pilih Port”


6. Ubah Text label2 menjadi “Port Serial Belum terhubung”
7. Ubah Text label3 menjadi “Status : Ready”
8. Ubah Text button1 menjadi “Connect”
9. Ubah Text button1 menjadi “Start Komunikasi”
10. Hapus Text pada comboBox

11. Double click form, dan tambahkan kode pada:


private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = false; // kondisi awal timer timeout = tidak aktif
button2.Enabled = false; // tombol koneksi tidak aktif
// mencari comm port yang ada pada komputer
foreach (string s in SerialPort.GetPortNames())
{ comboBox1.Items.Add(s); // menampilkan port yang terdeteksi pada comboBox
}
comboBox1.Text = comboBox1.Items[0].ToString(); // set nilai aktif pada data
// data pertama
label4.Text = "Sampling : 0/s";
}

12. Tambahkan namespace pada bagian atas namespace dari project


using System.IO.Ports; // tambahkan untuk mengakses serial port yang ada pada computer

Teknik Pengantarmukaan – Mekatronika PENS - 7


13. Masuk ke kode public partial class Form1 : Form, tambahkan beberapa deklarasi
variable dan konstanta berikut:
// deklarasi konstanta
public const char Header1 = '!', Header2 = '@', Header3 = '#', Header4 = '$', HeaderError = '?';
public const char Tail = '~';
public const short MaxData = 100;
public const int spasi = 40, tinggi = 25, top = 45;

//deklarasi variabel
// index data serial yang masuk
int Index, DigitalOutData, counterSerial = 0, counterSerialTimeout = 0;
bool Status, StartKomunikasi = false; // status dari header
public byte[] dataSerial = new byte[MaxData]; // batasan data sraial dalam 1 paket

// deklarasi panel untuk group pada masing-masing komponen


private Panel DigitalOutBox = new Panel();
private Panel DigitalInBox = new Panel();
private Panel AnalogOutBox = new Panel();
private Panel AnalogInBox = new Panel();

// deklarasi komponen untuk akses data


public PictureBox[] myPicBox = new PictureBox[8]; // menampilkan data digital input
public CheckBox[] myCheckBox = new CheckBox[8]; // menuliskan data digital output
public ProgressBar[] myProgBar = new ProgressBar[8]; // menampilkan data analog input
public TrackBar[] myTrackBar = new TrackBar[2]; // menuliskan data analog ouput
public Label[] ProgBarLabel = new Label[8]; // menuliskan data analog input yg terbaca
public Label[] TrackBarLabel = new Label[2]; // menuliskan data analog ouput yg dikirim

14. Komponen pada Form1 ditambahkan dengan cara program manual (tidak secara visual) supaya
bisa diakses dengan menggunakan index (array). Untuk menambahkan beberapa komponen pada
Form1, ubah isi dari fungsi public Form1(), menjadi:
public Form1()
{
InitializeComponent();
// seting panel untuk grup data digital input
this.DigitalInBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.DigitalInBox.Size = new System.Drawing.Size(60, spasi * 8 + 20);
this.DigitalInBox.Location = new System.Drawing.Point(10, top );
this.Controls.Add(this.DigitalInBox);

// seting panel untuk grup data digital output


this.DigitalOutBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.DigitalOutBox.Size = new System.Drawing.Size(70, spasi * 8 + 20);
this.DigitalOutBox.Location = new System.Drawing.Point(75, top);
this.Controls.Add(this.DigitalOutBox);

// seting panel untuk grup data analog input


this.AnalogInBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.AnalogInBox.Size = new System.Drawing.Size(340, spasi * 8 + 20);
this.AnalogInBox.Location = new System.Drawing.Point(150, top );
this.Controls.Add(this.AnalogInBox);

// seting panel untuk grup data analog output


this.AnalogOutBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.AnalogOutBox.Size = new System.Drawing.Size(100, spasi * 8 + 20);
this.AnalogOutBox.Location = new System.Drawing.Point(500, top);
this.Controls.Add(this.AnalogOutBox);

// set lebar form


this.Width = this.AnalogOutBox.Left + this.AnalogOutBox.Width + 25;

short i;
for (i = 0; i < 8; i++) // looping 8x untuk data DI, DO, dan AI
{
// picture box (DI)
this.myPicBox[i] = new PictureBox();
this.myPicBox[i].BackColor = System.Drawing.Color.White;
this.myPicBox[i].BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.myPicBox[i].Size = new System.Drawing.Size(tinggi, tinggi);
this.myPicBox[i].Location = new System.Drawing.Point(15, 15 + (spasi * i));
this.myPicBox[i].BringToFront();
this.DigitalInBox.Controls.Add(this.myPicBox[i]);

//Checkbox (DO)

Teknik Pengantarmukaan – Mekatronika PENS - 8


this.myCheckBox[i] = new CheckBox();
this.myCheckBox[i].Location = new System.Drawing.Point(15, 15 + (spasi * i));
this.myCheckBox[i].Size = new System.Drawing.Size(60, tinggi);
this.myCheckBox[i].Text = "Bit-" + i.ToString();
this.DigitalOutBox.Controls.Add(this.myCheckBox[i]);
this.myCheckBox[i].CheckedChanged += new System.EventHandler(this.myCheckBox_CheckedChanged);

//progressbar (AI)
this.myProgBar[i] = new ProgressBar();
this.myProgBar[i].Location = new System.Drawing.Point(15, 15 + (spasi * i));
this.myProgBar[i].Size = new System.Drawing.Size(285, tinggi);
this.myProgBar[i].Minimum = 0;
this.myProgBar[i].Maximum = 255;
this.myProgBar[i].Style = System.Windows.Forms.ProgressBarStyle.Continuous;
this.AnalogInBox.Controls.Add(this.myProgBar[i]);

// label untuk progressbar (AI)


this.ProgBarLabel[i] = new Label();
this.ProgBarLabel[i].AutoSize = true;
this.ProgBarLabel[i].Location = new System.Drawing.Point(305, this.myProgBar[i].Top + 7);
this.ProgBarLabel[i].Size = new System.Drawing.Size(30, tinggi);
this.ProgBarLabel[i].Text = "100";// myProgBar[i].Value.ToString();
this.AnalogInBox.Controls.Add(this.ProgBarLabel[i]);

}
for (i = 0; i < 2; i++) // looping 2 x untuk data AO
{ //trackbar (AO)
this.myTrackBar[i] = new TrackBar();
this.myTrackBar[i].Location = new System.Drawing.Point(15 + (spasi * i), 10);
this.myTrackBar[i].Minimum = 0;
this.myTrackBar[i].Maximum = 255;
this.myTrackBar[i].Size = new System.Drawing.Size(spasi, 300);
this.myTrackBar[i].Scroll += new System.EventHandler(this.myTrackBar_Scroll);
this.myTrackBar[i].Orientation = Orientation.Vertical;
this.AnalogOutBox.Controls.Add(this.myTrackBar[i]);
// label untuk TrackBar (AO)
this.TrackBarLabel[i] = new Label();
this.TrackBarLabel[i].AutoSize = true;
this.TrackBarLabel[i].TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.TrackBarLabel[i].Location = new System.Drawing.Point(20 + (spasi * i),
this.myTrackBar[i].Height + this.myTrackBar[i].Top);
this.TrackBarLabel[i].Size = new System.Drawing.Size(30, tinggi);
this.TrackBarLabel[i].Text = myTrackBar[i].Value.ToString();
this.AnalogOutBox.Controls.Add(this.TrackBarLabel[i]);
}
}

15. Untuk menampilkan data dari trackBar pada label pada saat trackBar discroll, maka tambahkan
fungsi:
private void myTrackBar_Scroll(object sender, EventArgs e)
{
// mengambil index trackBar yang aktif
int index = Array.IndexOf(myTrackBar, sender);
// menampilkan nilai trackBar yang aktif pada komponen label
TrackBarLabel[index].Text = myTrackBar[index].Value.ToString();
}

16. Untuk mengkonversi data biner dari checkbox menjadi nilai decimal (0-255), maka dilakukan
proses looping sebanyak bit (jumlah checkBox). CheckBox yang aktif dianggap bernilai logika 1,
sedangkan yang tidak dianggap berlogika 0. Posisi bit menentukan bobot dari nilai desimalnya.
Bobot masing masing adalah 2^posisi bit. Nilai desimal adalah jumlah total dari bobot checkBox
yang aktif. Tambahkan fungsi berikut untuk melakukan proses konversinya:

private void myCheckBox_CheckedChanged(object sender, EventArgs e)


{
// fungsi mengubah dari nilai biner ke nilai desimal
int i, nilai = 0; // milai awal = 0
for (i = 0; i < 8; i++) // di cek nilai per bit (8 bit)
{ if (myCheckBox[i].Checked) nilai += +(1 << i); // jika nilai checkBox ke-i aktif

Teknik Pengantarmukaan – Mekatronika PENS - 9


} // hasil +=2^i
DigitalOutData = nilai; // simpan ke variabel yang akan
} // dikirim ke LED

17. Karena datayang dikirim mempunyai resolusi 8 bit, maka setiap data desimal yang akan dikirim
berkisar antara 0-255. Untuk mempermudahkan prose parsing, setiap nilai decimal diubah
menjadi string yang berisi karakter ASCII yang merepresentasikan nilai decimal tersebut dengan
panjang karakter tetap yaitu 3 karakter. Tambahkan fungsi berikut yang digunakan untuk
melakukan proses konversi dari nilai desimal menjadi string:
private string toFixString3(int x)
{ string s; // variabel untuk menyimpan hasil konversi
if (x < 10) // jika hanya 1 angka (satuan saja)
{ s = "00" + x.ToString(); // tambahkan 2 angka 0 di depannya
} else if (x < 100) // jika ada puluhan dan satuan
{ s = "0" + x.ToString(); // tambahkan 1 angka 0 di depannya
}
else
{ s = x.ToString(); // selain itu sudah lengkap 3 angka
}
return s; // return nilai string hasil konversi
}

B. Menambahkan Komponen dan Protokol Komunikasi


1. Kembali pada jendela Form1.cs[design], lalu melalui toolbox tambahkan komponen SerialPort
pada project.
2. Masuk ke properties dari SerialPort, pilih Events, lalu double click event DataReceived, dan
tambahkan kode berikut pada fungsi event DataReceived
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte buffer; string x; int i, j, k, nilai;
j = serialPort1.BytesToRead; // jumlah karakter yang masuk pada buffer serial
for (i = 0; i < j; i++) // looping sebanyak karakter yang masuk
{ buffer = (byte)serialPort1.ReadByte(); // ambil data per karakter (per byte)
if (Status == false) // jika status masih false (header belum ditemukan)
{ if (buffer == Header1 || buffer == Header3)
{ Status = true; // tanda bahwa header sudah ditemukan
Index = 0; // siap menyimpan karakter berikutnya
dataSerial[Index] = buffer; // simpan nilai header untuk pengecekan saan tail ditemukan
}
// header 2 hanya berupa acknowledgement bahwa data LED berhasil ditulis
else if(buffer == Header2)
{ // kirim protokol data ke-3 (mengirim Request data Analog In)
if (serialPort1.IsOpen && StartKomunikasi) serialPort1.Write(Header3.ToString() + Tail);
}
// header 2 hanya berupa acknowledgement bahwa data PWM berhasil ditulis
else if(buffer == Header4)
{ //kirim protokol data ke-1 (mengirim Request data Digital In --> Dipswitch)
if (serialPort1.IsOpen && StartKomunikasi) serialPort1.Write(Header1.ToString() + Tail);
// hitungan ditambah setiap event dataReceived tertrigger(ada aktivitas data)
counterSerial++;
}
// mikrokontroler mengirim tanda error apabila protokol gagal diterjemahkan
else if (buffer == HeaderError)
{ MessageBox.Show("Terjadi Error Protokol", "Komunikasi Serial <<PC-Mikrokontroler>>",
MessageBoxButtons.OK);
StartKomunikasi = false; // komunikasi dihentikan (request selanjutnya tidak dikirim)
this.Invoke((MethodInvoker)delegate()
{ button2.Text = "Start Komunikasi"; // menandai untuk dilakukan start lagi secara manual
label3.Text = "Status : Error !!!"; // menampilkan status Error
});
}
}
else // jika header sudah ditemukan
{ if (buffer == Tail) // jika ketemu tail dari packet
{ // mengubah dari byte array ke sreing dan disimpan ke variabel x

Teknik Pengantarmukaan – Mekatronika PENS - 10


x = System.Text.Encoding.Default.GetString(dataSerial);
switch ((char)dataSerial[0]) // cek nilai header yang disimpan saat header ditemukan
{ case Header1: // isi proses yang terjadi ketika menerima data header 1
this.Invoke((MethodInvoker)delegate()
{ // memastikan karakter yang diterima sebanyak 3 dan berisi angka
if (Index == 3 && (int.TryParse(x.Substring(1, 3), out nilai)))
{ // menampilkan data dipswitch
for (k = 0; k < 8; k++) // di lakukan looping 8x, karena data = 8 bit
{ if ((nilai & (1 << k)) != 0) // apakah bit ke-k = 1
{ // jika nilai bit ke-i = 1, maka ditampilkan dengan warna merah
myPicBox[k].BackColor = System.Drawing.Color.Red;
}
else
{ // jika tidak ditampilkan dengan warna putih
myPicBox[k].BackColor = System.Drawing.Color.White;
}
}
}
});
// kirim protokol data ke-2 (mengirim data Digital Out)
if (serialPort1.IsOpen && StartKomunikasi) serialPort1.Write(Header2 +
toFixString3(DigitalOutData) + Tail);
break;
case Header3: // isi proses yang terjadi ketika menerima data header 3
this.Invoke((MethodInvoker)delegate()
{ if (Index == 24) // menampilkan data ADC jika jumlah data = 3 x 8 kanal
{ for (k = 0; k < 8; k++) // di lakukan looping 8x, karena data = 8 bit
{
if (int.TryParse(x.Substring(1 + k * 3, 3), out nilai)) // konversi 3 karakter
{ myProgBar[k].Value = nilai; // menampilkan ke progressbar
ProgBarLabel[k].Text = nilai.ToString(); // menampilkan dalam bentuk angka
}
}
}
// kirim protokol data ke-4 (mengirim data Analog Out --> PWM1 dan PWM2)
if (serialPort1.IsOpen && StartKomunikasi) serialPort1.Write(Header4 +
toFixString3(myTrackBar[0].Value) + toFixString3(myTrackBar[1].Value) + Tail);
});
break;
}
Status = false; // setelah ketemu tail, status dikembalikan ke false (harus cari header baru)
}
else // selain data header dan tail berarti data payload
{ if (++Index > MaxData) // jika payload melebihi jumlah data maksimal yang ditentukan
{ Index = 0; // data overflow
Status = false; // jika ada overflow, maka harus cari header baru
}
else
{ dataSerial[Index] = buffer; // data payload disususun pada variabel dataSerial
}
}
}
}

3. Kembali pada jendela Form1.cs[design], lalu click kanan dan pilih Properties. Pada jendela
poperties pilih Events, lalu pilih dan double click FormClosing, dan tambahkan kode:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{ while (StartKomunikasi) // menunggu satu paket komunikasi selesai
{ Application.DoEvents();
StartKomunikasi = false;
}
if (serialPort1.IsOpen) // tutup kembali port komunikasi serial
{ StartKomunikasi = false;
serialPort1.Close();
}
}

4. Untuk keperluan koneksi pada port serial, perlu dilakukan proses pembukaan koneksi pada comm
port yang dipilih. Hal ini dilakukan dengan kembali pada jendela Form1.cs[design] terlebih dahulu,
lalu pilih dan double click button1, dan selanjutnya tambahkan kode:
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen == false) // jika port belum terbuka

Teknik Pengantarmukaan – Mekatronika PENS - 11


{
serialPort1.PortName = comboBox1.Text; // set port yg dipilih pada comboBox
serialPort1.Open(); // coba buka port yg dipilih tadi
if (serialPort1.IsOpen == true) // jika port berhasil dibuka
{ button1.Text = "Disconnect"; // aktifkan tombol untuk proses disconnnect
label2.Text = "Serial terhubung pada " + serialPort1.PortName + ":" + serialPort1.BaudRate
+ " bps, " + serialPort1.DataBits + " bit, " + serialPort1.Parity + " parity, " +
serialPort1.StopBits + " stop bit";
button2.Enabled = true; // aktifkan tombol untuk memulai proses komunikasi
}
}
else
{
serialPort1.Close(); // tutup port komunikasi
button1.Text = "Connect"; // aktifkan tombol untuk koneksi ulang
label2.Text = "Port serial tidak terhubung"; // tuliskan status bahwa port tidak terhubung
StartKomunikasi = false; // flag komunikasi start dinonaktifkan
button2.Enabled = false; // tombol start komunikasi dinonaktifkan
}
}

5. Untuk memulai atau mengakhiri proses komunikasi serial, perlu dilakukan proses start dan stop
komunikasi. Tombol ini melakukan perubahan status pada variable StartKomunikasi. Hal ini
dilakukan dengan kembali pada jendela Form1.cs[design] terlebih dahulu,lalu pilih dan double
click button2, dan selanjutnya tambahkan kode pada fungsi private void button2_Click:
private void button2_Click(object sender, EventArgs e)
{
if(button2.Text == "Start Komunikasi")
{
if (serialPort1.IsOpen)
{
serialPort1.Write(Header1.ToString() + Tail);
button2.Text = "Stop Komunikasi";
StartKomunikasi = true;
timer1.Enabled = true; // start timeout timer
label3.Text = "Status : Komunikasi Berlangsung";
button2.BackColor = Color.GreenYellow;
}
}
else
{ button2.Text = "Start Komunikasi";
StartKomunikasi = false;
timer1.Enabled = false; // start timeout timer
label3.Text = "Status : Komunikasi Terhenti";
button2.BackColor = Color.OrangeRed;
}
}

6. Untuk mendeteksi komunikasi yang terputus perlu ditambahkan timer untuk menghitung waktu
timeout dari proses komunikasi. Apabila pada waktu yang ditentukan tidak terjadi aktifitas
komunikasi, maka kondisi timeout akan aktif. Penambahan timer dilakukan dengan cara kembali
pada jendela Form1.cs[design]. Timer dari toolBox, lalu click kanan dan pilih Properties dari
timer1 yang telah ditambahkan. Pada jendela poperties pilih Events, lalu pilih dan double click
Tick, dan tambahkan kode pada fungsi private void timer1_Tick:
private void timer1_Tick(object sender, EventArgs e)
{
int dataRate = counterSerial - counterSerialTimeout; // menghitung jumlah data yang tersamnpling
counterSerialTimeout = counterSerial; // update isi counterSerialTimeout
if (dataRate==0) // jika jumlah sampling=0, berarti tidak ada aktivitas data
{ button2_Click(sender, e); // memanggil fungsi penekanan tombol start komunikasi secara
// software
}
// menampilkan jumlah sampling per detiknya
label4.Text = "Sampling : " + dataRate.ToString() + "/s";
}

Teknik Pengantarmukaan – Mekatronika PENS - 12


C. Testing Protokol Komunikasi
1. Hubungkan converter USB to serial ke PORT USB dari computer dan port Serial dari
mikrokontroler.

Port Serial
(null modem)

2. Pastikan driver USB to Serial Converter terinstal pada komputer (dapat dilihat statusnya pada
Device Manager dari komputer).
3. Hubungkan juga ISP programmer pada port USB pada computer dengan ISP konektor pada board
mikrokontroler untuk keperluan memberikan supply ke mikrokontroler.
4. Upload program komunikasi serial yang dilaksanakan pada percobaan sebelumnya (percobaan 3)
pada mikrokontroler dengan menggunakan Khazama AVR Programmer.
5. Test project yang dibuat dengan menekan tombol Start pada panel IDE

6. Perbaiki program sampai tidak muncul kesalahan saat program dijalankan

Teknik Pengantarmukaan – Mekatronika PENS - 13


Pemilihan Port yang
terhubung ke USB to serial
converter

7. Pilih Port Serial yang terhubung ke USB to Serial Converter, lalu tekan tombol Connect.
8. Selanjutnya setelah port terkoneksi, tekan tombol Start Komunikasi.
9. Seharusnya apabila program sudah benas semua, maka form akan menampilkan data Digital Input
dari mikrokontroler pada pictureBox, dan juga Analog Input dari mikrokontroler pada
progressBar.
10. Ubah data pada dip switch pada mikrokontroler, dan amati perubahan tampilannya pada
komputer.
11. Ubah data pada checkBox pada komputer, dan amati perubahan tampilan LED pada
mikrokontroler.
12. Ubah data pada trimpot pada mikrokontroler, dan amati perubahan tampilannya pada komputer.
13. Ubah data pada trackBar pada komputer, dan amati perubahan tegangan analog output pada
mikrokontroler dengan menggunakan voltmeter.

IV. TUGAS
1. Ubah baudrate komunikasi serial baik di mikrokontroler dan juga komputer menjadi 115200 bps,
dan amati kecepatan sampling dari proses komunikasi.

Teknik Pengantarmukaan – Mekatronika PENS - 14

Anda mungkin juga menyukai