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#