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)
ISP
I/O PORT CONNECTOR
Switching
LCD 16x2
Regulator
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
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
//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
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);
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)
//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]);
}
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:
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
}
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
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";
}
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
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.