• Tidak ada hasil yang ditemukan

BAB V PENUTUP

5.2 Saran

Untuk penelitian sistem lebih lanjut kedepannya perlu ditambahkan beberapa saran sebagai berikut:

1. Dapat mengecilkan nilai error arah hadap robot (Theta).

2. Menambahkan persamaan orientasi rotasi pada mobile robot untuk menetapkan arah sumbu XY global pada sumbu XY lokal.

DAFTAR PUSTAKA

[1] Ridwan, “Pengendalian Kecepatan Motor DC Dengan PD-Logika Fuzzy Terhadap Gangguan Pengereman Berbasis Mikrokontroller”, Buku Tugas Akhir Diploma IV, Jurusan Mekatronika, Politeknik Negeri Batam, 2013.

[2] Cao Xu Wen, “Design and Control of an Omnidirectional Mobile Robot”, Intech Open, ____.

[3] Dewi Puspa, “Monitoring Robot Pemadam Api Barelang 3.3”, Buku Tugas Akhir Diploma III, Jurusan Elektronika, Politeknik Negeri Batam, 2014.

[4] Wikipedia. “Pemograman Berorientasi Objek”, Internet:

http://id.wikipedia.org/wiki/Pemrograman_berorientasi_objek, Desember. 19, 2014

BIOGRAFI PENULIS

Nama : Rian Syafi’i Harahap

Tempat/tanggal lahir : Batam, 28 Mei 1992

Agama : Islam

Alamat Rumah : Kamp. Rawasari RT 02 RW 04 NO. 107 Kel. Tg. Pinggir, Kec. Sekupang, Kawasan Industri Sekupang, Batam

Email : [email protected] Riwayat Pendidikan :

1. SMK Negeri 1 Batam 2. SMP Negeri 11 Batam

LAMPIRAN B PROGRAM C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; namespace WindowsFormsApplication2 {

public partial class Form1 : Form

{

public Form1() {

InitializeComponent(); }

int set = 20, errorY, errorX;

int pjgData = 300; //panjang garis kuning Graphics graph;

Bitmap bmp, sbitmap, init; Pen pena; Point[] titikArray; int countTitikArray = -1; Image pictObject; string dataSerial; // serial setting float dtA, dtB, dtC; int enc1, enc2, enc3;

private void Form1_Load(object sender, EventArgs e) {

//float b = (float)1.53; //int a = Convert.ToInt32(b);

comboBox1.Items.Clear();//mengkosongkan pilihan port serial

foreach (string item in SerialPort.GetPortNames())//menambah setiap serial yang ada di computer ke combo box

{ comboBox1.Items.Add(item);//menambahkan } //comboBox1.SelectedIndex = null; buttonConnect.Enabled = true; buttonDisconnect.Enabled = false;

chart1.Series[0].Points.Clear();//mengkosongkan data chart chart2.Series[0].Points.Clear();

chart3.Series[0].Points.Clear();

titikArray = new Point[pjgData + 1];//mendeklarasikan variabel Point array sebanyak pjgData+1

pena = new Pen(Color.Blue, 1);//mendeklarasikan variabel Pen untuk menggambar kotak-kotak

initial();//memanggil fungsi inisial

pictObject = Image.FromFile(Application.StartupPath +

"/icon.png");//mengambil gambar dari komputer }

private void serialPort_DataReceived(object sender,

SerialDataReceivedEventArgs e)//event serial

void olahData(object sender, EventArgs e) {

if (serialPort.BytesToRead > 0) {

char data = (char)serialPort.ReadChar(); dataSerial += data; if (data == '\n') { parsingData(); drawRobot(); DrawLineRobot(); showEnc(); //lb_a.Text = errorX.ToString()+";"+errorY.ToString(); //timer1.Enabled = true;

Invoke(new Action(() => dText.AppendText(dataSerial + "\r\n"))); Invoke(new Action(() => dText.SelectionStart=

dText.Text.Length));

Invoke(new Action(() => dText.ScrollToCaret())); dataSerial = "";

} } }

public void parsingData() {

char[] limiter = { 'A', 'B', 'C', 'D', 'E', 'F', '\r', '\n' };//karakter parsing

string[] hasilParsing = dataSerial.Split(limiter); //array string untuk hasil parsing

try

{

dtA = float.Parse(hasilParsing[1]); dtB = float.Parse(hasilParsing[2]); dtC = float.Parse(hasilParsing[3]); enc1 = int.Parse(hasilParsing[4]); enc2 = int.Parse(hasilParsing[5]); enc3 = int.Parse(hasilParsing[6]);

textBoxA.Text = dtA.ToString();//tampilkan ke textbox textBoxB.Text = dtB.ToString(); tb_angle.Text = dtC.ToString(); tb_enc1.Text = enc1.ToString(); tb_enc2.Text = enc2.ToString(); tb_enc3.Text = enc3.ToString(); //string dtC = hasilParsing[3]; }

catch (Exception error) {

} }

void showEnc() {

chart1.Series[0].Points.AddY(enc1);//menampilkan data di chart chart2.Series[0].Points.AddY(enc2);

chart3.Series[0].Points.AddY(enc3); }

void initial() {

bmp = new Bitmap(pn_draw.Width, pn_draw.Height);//mendeklarasikan variabel bitmap sesuai panjang dan lebar pn_draw

graph = Graphics.FromImage(bmp);//mendeklarasikan variable Graphics dari variable bmp

kotak();//memanggil fungsi savedrw();

}

void kotak() {

for (int a = 25; a <= pn_draw.Height; a += 25) {

graph.DrawLine(pena, a, 0, a, pn_draw.Height);//menggambar vertikal }

for (int a = 25; a <= pn_draw.Height; a += 25) {

graph.DrawLine(pena, 0, a, pn_draw.Height, a);//menggambar kotak horizontal

} }

void DrawLineRobot() {

if (errorY < set && errorY > -1 * set || errorX < set && errorX > -1 * set)

{

for (int a = 0; a < countTitikArray; a++) {

graph.DrawLine(new Pen(new SolidBrush(Color.Yellow), 5), titikArray[a], titikArray[a + 1]);//gambar garis

}

kotak(); savedrw(); }

}

Image rotateImage(Image pict, double angle) {

Bitmap rotatedImage = new Bitmap(pict.Width, pict.Height);//mendeklarasikan variable Bitmap

rotatedImage.SetResolution(pict.HorizontalResolution, pict.VerticalResolution);// mengatur resolusi gambar

Graphics g = Graphics.FromImage(rotatedImage);//mendeklarasikan variable graphic

g.TranslateTransform(pict.Width / 2, pict.Height / 2);//menentukan titik center rotate

g.RotateTransform((float)angle);//rotate gambar

g.TranslateTransform(-(pict.Width / 2), -(pict.Height / 2));//menentukan titik center rotate

g.DrawImage(pict, new PointF(0, 0));//menyimpan gambar yang telah di rotate ke variable rotateImage

return rotatedImage; }

void savedrw() {

sbitmap = bmp.Clone(new Rectangle(0, 0, pn_draw.Width, pn_draw.Height), bmp.PixelFormat);//mengkopi gambar sesuai panjang, lebar dan resolusi gambar satunya lagi

pn_draw.BackgroundImage = sbitmap;//mengeset background dari pn_draw dengan "sbitmap"

}

void drawRobot() {

errorY = titikArray[countTitikArray].Y - titikArray[countTitikArray - 1].Y;//menghitung selisih data yang baru diterima dengan data sebelumnya

errorX = titikArray[countTitikArray].X - titikArray[countTitikArray - 1].X;

if (errorY < set && errorY > -1 * set || errorX < set && errorX > -1 * set) //jika selisihnya tidak lebih besar dari "set" maka digambar

{

for (int a = 0; a < countTitikArray; a++) {

titikArray[a] = titikArray[a + 1];//menghapus garis sebelumnya

}

titikArray[countTitikArray].Y = Convert.ToInt32(dtB) * (-1) + (pn_draw.Height - (pn_draw.Height / 4));//menyimpan titik y posisi robot

titikArray[countTitikArray].X = Convert.ToInt32(dtA) + (pn_draw.Width / 4);//titik x

Image newImage = rotateImage(pictObject, Convert.ToInt32(dtC) - 90);//merotate gambar

graph.DrawImage(newImage, titikArray[pjgData - 1].X - (pictObject.Width / 2), titikArray[pjgData - 1].Y - (pictObject.Height / 2));//menggambar robot pada posisi x dan y robot

} } else

{

countTitikArray++;

titikArray[countTitikArray].Y = Convert.ToInt32(dtB) * (-1) + (pn_draw.Height - (pn_draw.Height / 4));

titikArray[countTitikArray].X = Convert.ToInt32(dtA) + (pn_draw.Width / 4);

Image newImage = rotateImage(pictObject, Convert.ToInt32(dtC) - 90);//

graph.DrawImage(newImage, titikArray[countTitikArray].X -

(pictObject.Width / 2), titikArray[countTitikArray].Y - (pictObject.Height / 2)); }

}

private void timer1_Tick(object sender, EventArgs e) {

drawRobot(); DrawLineRobot(); }

private void bt_save_Click(object sender, EventArgs e) {

saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";//filter extension gambar

saveFileDialog1.Title = "Simpan Karya Anda";//judul if (saveFileDialog1.ShowDialog() == DialogResult.OK) {

string file = saveFileDialog1.FileName;//mengambil filename dari gambar

bmp.Save(file);//menyimpan gambar robot dan lintasan yang dilalui ke komputer

} else

{

MessageBox.Show("Save was Cancelled"); }

}

private void pn_draw_MouseMove(object sender, MouseEventArgs e) {

bt_save.Visible = true;//memunculkan tombol save ketika mouse melewati pn_draw

bt_reset.Visible = true; }

private void Form1_MouseMove(object sender, MouseEventArgs e) {

bt_save.Visible = false;//menghilangkan tombol save ketika mouse keluar dari pn_draw

bt_reset.Visible = false; }

private void bt_reset_Click(object sender, EventArgs e) {

initial(); kotak(); savedrw(); }

private void buttonConnect_Click(object sender, EventArgs e) {

try

{

serialPort.PortName = comboBox1.Text;//mengeset Port yang digunakan serialPort.Open();//membuka komunikasi serial

chart1.Series[0].Points.Clear();//mengkosongkan data chart chart2.Series[0].Points.Clear();

chart3.Series[0].Points.Clear(); //timer1.Enabled = true;

}

catch (Exception error) {

MessageBox.Show(error.ToString());//menampilkan error ketika koneksi gagal } if (serialPort.IsOpen) { buttonDisconnect.Enabled = true; buttonConnect.Enabled = false; } }

private void buttonDisconnect_Click(object sender, EventArgs e) {

try

{

// serialPort.PortName = comboBox1.Text; serialPort.Close();//menutup komunikasi serial }

catch (Exception error) {

MessageBox.Show(error.ToString());//menampilkan error ketika koneksi gagal } if (!serialPort.IsOpen) { buttonDisconnect.Enabled = false; buttonConnect.Enabled = true; } } } }

LAMPIRAN C GAMBAR GUI PADA C#

Dokumen terkait