4.1. Perangkat Keras Percobaan
Perangkat keras yang dipakai dalam penelitian adalah:
1. Silinder pneumatik linear tanpa batang Nomor seri : DGP-18-PPV-A-B Produsen : Festo AG & Co.
Panjang langkah : 500 mm Diameter piston : 18 mm
Tekanan kerja : 2 – 8 bar (0.2 – 0.8 MPa) Operasi : langkah ganda
2. Katup elektronik Proportional 5/3,
Tipe : MPYE-5-1/8-HF-420-B
Produsen : Festo AG & Co.
Tekanan kerja : -0.9 – 8 bar Fungsi valve : 5/3
Tegangan kerja : 5-6 bar dengan arus 12 mA pada posisi tengah Media kerja : udara
3. Displacement Encoder, Linear potentiometer Nomor seri : MLO-POT-500-TLF Produsen : Festo AG & Co.
Resistansi : 5 kOhm Panjang langkah : 500 mm Kecepatan maks : 10 m/s Tegangan minimal : 8 volt DC Tegangan maksimal : 42 volt DC 4. Mikro kontroler DT-AVR
Spesifikasi DT-AVR adalah sebagai berikut:
• Mikro kontroler Atmega 8535 yang mempunyai 8 kb Flash memori dan 8 channel ADC dengan resolusi 10 bit.
• Memilki jalur input atau output higga 35 pin.
• Terdapat eksternal brown out detector sebagai rangkaian reset.
• Konfigurasi jumper untuk melakukan pemilihan beberapa model pengambilan tegangan referensi.
• Frekuensi osilator sebesar 4MHz.
• Tersedia jalur komunikasi serial UART RS-232.
• Tegangan input power supply 9-12 VDC dan output tegangan 5 VDC 5. Operational amplifiers (VIC)
6. Kabel USB RS-232 merupakan kabel penghubung USB PC dengan serial port pada mikrokontroller. Yang berguna untuk mengontrol kontroller dari PC.
7. Komputer Intel Pentium Centrino. Kapasitas harddisk 40 GB. Memori 256 MB.
Sistim operasi, Microsoft Windows XP. Dilengkapi dengan keyboard dan mouse.
Komponen-komponen perangkat keras di atas disusun seperti gambar di bawah ini:
Gambar 4.1. Susunan komponen-komponen percobaan 2
3 1
7 4
6 5
Keterangan nomor:
1. Silinder linear rodless 500 mm 2. Potensiometer linear 5 kOhm 500 mm 3. Katup elektronik Proportional 5/3 4. proportional amplifiers
5. Mikro kontroler ATmega 8535 6. Power supply adaptor ± 12 volt
7. Power supply katup proporsional 24 volt
4.1.1. Unit Sensor Posisi
Sensor posisi terdiri dari sebuah linear potensiometer sepanjang 500 mm, 5 Kohm. Terbagi menjadi 1006 posisi dengan ketelitian 0,49 mm tiap beda posisinya.
Gambar 4.2. Potensiometer linear
Sumber : http://www.festo.com/INetDomino/31171c.htm
4.1.2. Unit Pneumatik /Penggerak
Komponen yang menajdi unit pneumatik adalah silinder pneumatik rodless sepanjang 500 mm, sebuah katup proporsional 5/3, sebuah pressure regulator dan dua buah check valve (katup pencekik) aliran satu arah.
Gambar 4.3. Unit pneumatik
4.1.3. Unit Mikro Kontroler dan Opertional Amplifiers
Unit mikro kontroler terdiri dari sebuah minimum sistim mikro kontroler DT-Basic Mini System, dan operational amplifiers yang berfungsi mengubah tegangan dari mikrokontroller menjadi arus untuk menggerakkan katup proporsional.
Gambar 4.4. Unit mikro kontroler dan operatonal amplifiers
4.1.4. Unit interface Data Input dan Output
Untuk interface data inputan digunakan laptop. Dalam melakukan interface, mikro kontroler dihubungkan dengan komputer menggunakan kabel data serial RS232 melalui USB port pada PC, ke port serial yang dihubungkan pada mikro kontroler. Kabel dongle digunakan untuk mendownload program pada CodeVisionAVR pada mikroprosesor Atmega 8535.
Gambar 4.5 Kabel Dongle dan Kabel Serial RS232
4.1.5. Unit Power Supply
Unit power supply terdiri dari beberapa power supply, yaitu: power supply tegangan 8 volt DC untuk unit sensor posisi yang didapat dari operational
amplifiers, power supply tegangan 9 volt DC untuk mikro kontroler yang didapat dari operational amplifiers, power supply 24 volt DC untuk katup proporsional, power supply tegangan 12 volt untuk operational amplifiers.
Gambar 4.6. Power supply untuk operational amplifiers
Gambar 4.7. Power supply untuk katup proporsional
4.2. Pemograman Mikro Kontroller
Perangkat lunak yang dipakai dalam percobaan adalah program Code Vision AVR dengan menggunakan bahasa pemograman C dan Delphi 7 sebagai interface (tampilan) pada PC.
Program editor berfungsi untuk membuat program kontroler yang kemudian didownload ke dalam mikro kontroler. Di dalam Code Vision AVR editor ini, kita menuliskan program menggunakan perintah-perintah dalam bahasa yang khusus untuk mikro kontroler Atmega 8535.
Program Code Vision AVR yang didown load ke dalam mikro kontroler adalah program dengan kontroler feeback posisi. Algoritma dan listing programnya yaitu:
*********************************************
This program was produced by the CodeWizardAVR V1.24.0 Standard Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.
http://www.hpinfotech.ro e-mail:[email protected] Chip type : ATmega8535 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 128
*********************************************/
#include <mega8535.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
unsigned int hasil, input,input1;
unsigned int trima[2];
int error;
int ke;
char masukkan;
int temp;
int bedaposisi;
int sebelum;
int beda[7];
// USART Receiver buffer
#define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine
#pragma savereg-
interrupt [USART_RXC] void usart_rx_isr(void) {
char status,data;
#asm push r26 push r27 push r30 push r31 in r26,sreg push r26
#endasm status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE) {
rx_counter=0;
rx_buffer_overflow=1;
};
};
#asm pop r26 out sreg,r26 pop r31 pop r30 pop r27 pop r26
#endasm }
#pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void) {
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei") return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;
// USART Transmitter interrupt service routine
#pragma savereg-
interrupt [USART_TXC] void usart_tx_isr(void) {
#asm push r26 push r27 push r30 push r31 in r26,sreg push r26
#endasm if (tx_counter) {
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
#asm pop r26 out sreg,r26 pop r31
pop r30 pop r27 pop r26
#endasm }
#pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c) {
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) {
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
} else UDR=c;
#asm("sei") }
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
unsigned int adc_data;
#define ADC_VREF_TYPE 0x00 // ADC interrupt service routine
#pragma savereg-
interrupt [ADC_INT] void adc_isr(void) {
#asm push r30 push r31
#endasm
// Read the AD conversion result adc_data=ADCW;
#asm pop r31 pop r30
#endasm }
#pragma savereg+
// Read the AD conversion result // with noise canceling
unsigned int read_adc(unsigned char adc_input) {
ADMUX=adc_input|ADC_VREF_TYPE;
#asm
in r30,mcucr cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red out mcucr,r30
sleep
cbr r30,__se_bit out mcucr,r30
#endasm return adc_data;
}
void baca_adc(void) {
read_adc(0);
delay_ms(1);
hasil = adc_data;
}
// Declare your global variables here void main(void)
{
// Declare your local variables here // Input/Output Ports initialization // Port A initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0 PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On
// USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 19200 UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: On
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8D;
SFIOR&=0xEF;
SFIOR|=0x10;
// Global enable interrupts
#asm("sei") ke = 0;
bedaposisi = 0;
putchar('s');
delay_ms(1);
baca_adc();
temp = hasil / 256;
putchar(temp);
delay_ms(1);
temp = hasil % 256;
putchar(temp);
delay_ms(1);
sebelum = hasil;
beda[0] = -10;
beda[1] = -5;
beda[2] = -2;
beda[3] = 0;
beda[4] = 2;
beda[5] = 5;
beda[6] = 10;
while (1) {
// Place your code here baca_adc();
// Cek perbedaan posisi bedaposisi = sebelum - hasil;
sebelum = hasil;
// Ambil Inputan if (ke < 2) {
input1 = getchar();
delay_ms(1);
if (ke == 1) {
// simpan ke dalam trima 2 dan langsung geser trima[1] = input1;
// gabungkan if (trima[1]==0)
{input = 0 + trima[0];}
if (trima[1]==1)
{input = 254 + trima[0];}
if (trima[1]==2)
{input = 511 + trima[0];}
if (trima[1]==3)
{input = 767 + trima[0];}
ke = 2;
if (input == 100) {putchar('b');
delay_ms(1);}
// isi dengan default bukaan valve // kiri = ??
// Kanan = ??
}
if (ke == 0) {
// simpan ke dalam trima 1 trima[0] = input1;
ke = 1;
putchar('a');
delay_ms(1);
} } if (ke == 2) {
// if (hasil < input) // {
// putchar('n');
// delay_ms(1);
// error = input - hasil;
// PORTC = 0x66;
// geserkanan();
// }
// if (hasil > input) // {
// putchar('i');
// delay_ms(1);
// error = hasil - input;
// PORTC = 0xCA;
// geserkiri();
// }
error = input - hasil;
// Rule baris 1
if ((error <= -410) && (bedaposisi <= beda[0])) {
PORTC = PORTC;
}
if ((error <= -410) && (bedaposisi > beda[0]) && (bedaposisi <= beda[1])) {
PORTC = PORTC + 1;
}
if ((error <= -410) && (bedaposisi > beda[1]) && (bedaposisi <= beda[2]))
{
PORTC = PORTC + 2;
}
if ((error <= -410) && (bedaposisi > beda[2])) {
PORTC = PORTC + 3;
}
// Rule baris 2
if ((error <= -102) && (error > -410) && (bedaposisi <= beda[0])) {
PORTC = PORTC - 1;
}
if ((error <= -102) && (error > -410) && (bedaposisi > beda[0]) &&
(bedaposisi <= beda[1])) {
PORTC = PORTC;
}
if ((error <= -102) && (error > -410) && (bedaposisi > beda[1]) &&
(bedaposisi <= beda[2])) {
PORTC = PORTC + 1;
}
if ((error <= -102) && (error > -410) && (bedaposisi > beda[2]) &&
(bedaposisi <= beda[3])) {
PORTC = PORTC + 2;
}
if ((error <= -102) && (error > -410) && (bedaposisi > beda[0])) {
PORTC = PORTC + 3;
}
// Rule baris 3
if ((error <= -1) && (error > -102) && (bedaposisi <= beda[0])) {
PORTC = PORTC - 2;
}
if ((error <= -1) && (error > -102) && (bedaposisi > beda[0]) && (bedaposisi
<= beda[1])) {
PORTC = PORTC - 1;
}
if ((error <= -1) && (error > -102) && (bedaposisi > beda[1]) && (bedaposisi
<= beda[2])) {
PORTC = PORTC;
}
if ((error <= -1) && (error > -102) && (bedaposisi > beda[2]) && (bedaposisi
<= beda[3])) {
PORTC = PORTC + 1;
}
if ((error <= -1) && (error > -102) && (bedaposisi > beda[0])) {
PORTC = PORTC + 3;
}
// Rule baris 5
if ((error >= 1) && (error < 102) && (bedaposisi >= beda[6])) {
PORTC = PORTC + 2;
}
if ((error >= 1) && (error < 102) && (bedaposisi < beda[6]) && (bedaposisi
>= beda[5])) {
PORTC = PORTC + 1;
}
if ((error >= 1) && (error < 102) && (bedaposisi < beda[5]) && (bedaposisi
>= beda[4])) {
PORTC = PORTC;
}
if ((error >= 1) && (error < 102) && (bedaposisi < beda[4]) && (bedaposisi
>= beda[3])) {
PORTC = PORTC - 1;
}
if ((error >= 1) && (error < 102) && (bedaposisi < beda[3])) {
PORTC = PORTC - 3;
}
// Rule baris 6
if ((error >= 103) && (error < 410) && (bedaposisi >= beda[6])) {
PORTC = PORTC + 1;
}
if ((error >= 103) && (error < 410) && (bedaposisi < beda[6]) &&
(bedaposisi >= beda[5])) {
PORTC = PORTC;
}
if ((error >= 103) && (error < 410) && (bedaposisi < beda[5]) &&
(bedaposisi >= beda[4])) {
PORTC = PORTC - 1;
}
if ((error >= 103) && (error < 410) && (bedaposisi < beda[4]) &&
(bedaposisi >= beda[3]))
{
PORTC = PORTC - 2;
}
if ((error >= 103) && (error < 410) && (bedaposisi < beda[3])) {
PORTC = PORTC - 3;
}
// Rule baris 7
if ((error >= 410) && (bedaposisi >= beda[6])) {
PORTC = PORTC;
}
if ((error >= 410) && (bedaposisi < beda[6]) && (bedaposisi >= beda[5])) {
PORTC = PORTC - 1;
}
if ((error >= 410) && (bedaposisi < beda[5]) && (bedaposisi >= beda[4])) {
PORTC = PORTC - 2;
}
if ((error >= 410) && (bedaposisi < beda[4])) {
PORTC = PORTC - 3;
}
// Rule Baris 4
if ((hasil == input) || ((hasil + 1) == input) || ((hasil + 2) == input) || ((hasil - 1)
== input)|| ((hasil - 2) == input)) {
PORTC = 0x96;
if (hasil == input) {
ke = 0;
putchar('s');
PORTC = 0x96;
delay_ms(1);
// Kirim Posisi temp = hasil / 256;
putchar(temp);
delay_ms(1);
temp = hasil % 256;
putchar(temp);
delay_ms(1);
} } } };
}
Untuk interfacenya yaitu program Delphi 7 adalah sebagai berikut:
unit Unit1;
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CPort, ExtCtrls;
type
TForm1 = class(TForm) Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Button2: TButton;
Label3: TLabel;
Label4: TLabel;
Edit2: TEdit;
Label5: TLabel;
Button3: TButton;
Button4: TButton;
Label6: TLabel;
Button5: TButton;
Button6: TButton;
Label8: TLabel;
Edit3: TEdit;
Label9: TLabel;
ComPort1: TComPort;
Memo1: TMemo;
Timer1: TTimer;
procedure Kirim();
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure ComPort1RxChar(Sender: TObject; Count: Integer);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
posisi : integer;//untuk menyimpan posisi terakhir
result1 : Integer;
DC : real;
ke1,ke2 : byte;
status1 : String;
jarak1,awal1 : real;
ms1 : real;
implementation {$R *.dfm}
procedure TForm1.Kirim();
var
temp : integer;
begin
if result1 = 0 then result1 := 1;
ms1 := 0;
awal1 := StrToFloat(Edit2.Text);
// 00 1111 1111 = 255 ke1 := (result1 - 1) and 255;
// 11 0000 0000 = 768 temp := (result1 - 1) and 768;
ke2 := temp shr 8;
//ShowMessage(inttostr(ke2) + '-' + inttostr(ke1));
Edit2.Text := inttostr(ke2) + '-' + inttostr(ke1);
// Kirim ke1 dan ke2
comport1.writestr(char(ke1));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
temp : real;
begin
temp := StrToFloat(Edit1.Text);
result1 := round((temp * 10) / dc);
// kirim result
Label2.Caption := IntToStr(result1);
Kirim;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Dc := 500 / 996;
if not(ComPort1.Connected) then begin
ComPort1.Open;
Status1 := 'None';
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
temp : integer;
begin
temp := StrToInt(Edit3.Text);
result1 := posisi - round((temp * 10) / dc);
// Kirim result Kirim;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
temp : integer;
begin
temp := StrToInt(Edit3.Text);
result1 := posisi + round((temp * 10) / dc);
// Kirim result Kirim;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
result1 := 1;
// Kirim result Kirim;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
result1 := round((50 * 10) / dc);
// Kirim result Kirim;
end;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
str : String;
begin
comport1.readstr(str,count);
// ShowMessage(str);
// Memo1.Lines.Add(str);
if status1 = 'Posisi1' then begin
posisi := posisi + ord(str[1]);
Edit2.Text := FloatToStr(posisi*DC/10);
if Timer1.Enabled then
begin
Timer1.Enabled := False;
Memo1.Lines.Add('Posisi : ' + edit2.Text);
Memo1.Lines.Add('Waktu : ' + Floattostr(ms1) + ' ms');
if awal1 < StrToFloat(Edit2.Text) then Jarak1 := StrToFloat(Edit2.Text) - awal1 else
Jarak1 := awal1 - StrToFloat(Edit2.Text);
Memo1.Lines.Add('Jarak : ' + FloatToStr(Jarak1));
Memo1.Lines.Add('Kecepatan : ' + FloatToStr(jarak1/ms1) +' cm / ms');
end else
Memo1.Lines.Add('Reset');
status1 := 'None';
end;
if status1 = 'Posisi' then begin
posisi := ord(str[1]) * 256;
status1 := 'Posisi1';
end;
if status1 = 'None' then begin
if str = 'a' then begin
Timer1.Enabled := True;
memo1.Lines.Add('***********************************');
Memo1.Lines.Add('Posisi Awal : ' + FloatToStr(awal1));
comport1.writestr(char(ke2));
Button1.Enabled := false;
Button2.Enabled := false;
Button3.Enabled := false;
Button4.Enabled := false;
Button5.Enabled := false;
Button6.Enabled := false;
end;
if str = 's' then begin
Button1.Enabled := true;
Button2.Enabled := true;
Button3.Enabled := true;
Button4.Enabled := true;
Button5.Enabled := true;
Button6.Enabled := true;
Status1 := 'Posisi';
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ComPort1.Close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ms1 := ms1 + 1;
end;
end.
Dari program delphi 7 diatas maka tampilannya seperti ini:
Gambar 4.8. Tampilan Menggunakan Delphi Keterangan Gambar:
1. kotak penunjuk posisi piston saat ini
2. tempat input tujuan atau tempat memberikan perintah posisi piston 3. tombol membatalkan perintah
4. tempat input besar pergerseran untuk tombol 6 dan 10 5. tombol untuk menggerakkan piston ke posisi 50 Cm 6. tombol untuk menggerakkan piston ke arah kanan 7. tampilan
8. tombol untuk melaksanakan perintah
9. tombol untuk menggerakkan piston ke posisi 0 Cm 10. tombol untuk menggerakkan piston ke arah kiri
Input berupa data digital dari delphi akan ditransfer ke Code Vision AVR menggunakan komponen dari delphi yaitu Comport. Sehingga data tersebut dapat diproses di Code Vision AVR, dari hasil perhitungan mikrokontroller akan menghasilkan tegangan tertentu. Tegangan tersebut diubah menjadi arus dengan
1 2
4 5
7 9
3
6 8
10
operational amplifiers sehingga dapat mengatur besar bukaan katup untuk membuka, menutup dan mengalirkan udara bertekanan ke dalam silinder, sehingga piston bergerak dan dapat tiba pada titik posisi yang diinginkan. Setelah piston berhenti pada posisi yang diinginkan potensiometer memberikan data posisi pada mikrokontroller. Data tersebut akan ditransfer ke Delphi sehingga posisi piston dapat terbaca pada tampilan.
Percobaan dilakukan dengan prosedur sebagai berikut : 1. Mempersiapkan perangkat keras:
• Memasang selang udara pada port supply udara dari kompresor.
• Membuka katup supply udara dari kompresor.
• Mengatur pressure regulator hingga tekanan mencapai 5-6 Bar.
• Memasang sumber tegangan yang sesuai pada masing-masing komponen yaitu katup dan operational amplifiersnya.
• Memasang kabel data RS232 pada USB port komputer dan serial port mikro kontroler.
2. Melakukan reset pada mikrokontroller hingga ada tampilan di kotak posisi piston di program delphi
3. Menjalankan program dan mengisi data berupa titik set poin, pada program.
4. Melihat kerja sistim yaitu ketepatan piston berhenti pada titik yang ditentukan.
5. Mencatat data berupa selisih dari set poin yang diberikan dan posisi akhir piston.
4.3. Hasil Uji Coba 4.3.1. Uji Coba I
Uji coba pertama dilakukan dengan memberikan set poin yang sama, dilakukan sebanyak 5 kali, dengan tekanan sebesar 5-6 Bar pada set poin 50 cm dan dimulai dari posisi 0 cm. Hasil percobaan adalah sebagai berikut:
Tabel 4.1. Hasil Uji Coba I Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 49.899 cm 3,78 s 49.899 cm 13,2 cm/s -0.101 cm 2 0 49.899cm 3,80 s 49.899 cm 13,1 cm/s -0.101 cm 3 0 49.899 cm 3,57 s 49.899 cm 13,9 cm/s -0.101 cm 4 0 49.899 cm 3,72 s 49.899 cm 13,4 cm/s -0.101 cm 5 0 49.899 cm 3,61 s 49.899 cm 13,8 cm/s -0.101 cm
Dari 5 kali percobaan dengan posisi 0 cm ke 50 cm menunjukkan bahwa posisi piston tidak dapat sampai pada posisi 50 cm, memiliki waktu tempuh yang berbeda dan memiliki keakuratan yang cukup tinggi.
4.3.2. Uji Coba ke II
Uji coba kedua dilakukan dengan memberikan set poin yang sama, dilakukan sebanyak 5 kali, dengan tekanan sebesar 5-6 Bar pada set poin 0 cm dan dimulai dari posisi 50 cm. Hasil percobaan adalah sebagai berikut:
Tabel 4.2. Hasil Uji Coba II Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 49.899 cm 0 cm 1,67 s 49.899 cm 29,8 cm/s -0.101 cm 2 49.899 cm 0 cm 1,64 s 49.899 cm 30,4 cm/s -0.101 cm 3 49.899 cm 0 cm 1,72 s 49.899 cm 29,0 cm/s -0.101 cm 4 49.899 cm 0 cm 1,67 s 49.899 cm 13,4 cm/s -0.101 cm 5 49.899 cm 0 cm 1,66 s 49.899 cm 29,8 cm/s -0.101 cm
Dari 5 kali percobaan dengan posisi 50 cm ke 0 cm memiliki beda waktu dan kecepatan yang cukup jauh jika dibandingkan dengan perpindahan dari 0 cm ke 50 cm.
4.3.3. Uji Coba ke III
Uji coba ketiga dilakukan dengan melakukan pergeseran sebesar 1 cm ke kiri dan ke kanan. Hasil percobaan adalah sebagai berikut:
Tabel 4.3. Hasil Uji Coba III ke kiri Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 24.84 cm 25.75 cm 1,14 s 0.903 cm 0,7 cm/s -0,097 cm 2 24.59 cm 25.45 cm 1,00 s 0.853 cm 0,8 cm/s -0,147 cm 3 24.29 cm 25.15 cm 0,96 s 0.853 cm 0,8 cm/s -0,147 cm 4 24.84 cm 25.75 cm 0,75 s 0.903 cm 1,2 cm/s -0,097 cm 5 24.59 cm 25.45 cm 0,72 s 0.853 cm 1,1 cm/s -0,147 cm
Tabel 4.4. Hasil Uji Coba III ke kanan Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 25.75 cm 24.59 cm 0,38 s 1.154 cm 3 cm/s +0.154 cm 2 25.45 cm 24.29 cm 0,38 s 1.154 cm 3 cm/s +0.154 cm 3 25.15 cm 23.99 cm 0,47 s 1.154 cm 2,4 cm/s +0.154 cm 4 25.75 cm 24.59 cm 0,36 s 1.154 cm 3,2 cm/s +0.154 cm 5 25.45 cm 24.29 cm 0,40 s 1.154 cm 2,8 cm/s +0.154 cm
Begitu juga terlihat pada uji coba ketiga ini jika dibandingkan antara jarak perpindahannya pada waktu piston ke kiri tidak pernah sampai 1 cm tetapi kebalikan dari perpindahan piston ke arah kanan jarak perpindahannya lebih dari 1 cm. Waktu dan kecepatan antara ke kiri dan ke kanan juga jauh berbeda.
Kepresisian pada saat berpindah dengan jarak 1 cm juga tidak akurat.
4.3.4. Uji Coba ke IV
Uji coba keempat dilakukan dengan melakukan pergeseran ke kiri. Posisi dan Hasil percobaan adalah sebagai berikut:
Tabel 4.5. Hasil Uji Coba dari posisi 0 ke 10 Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 cm 9.939 cm 4,2 s 9.939 cm 2,3 cm/s -0.061 cm 2 0 cm 9.939 cm 3,49 s 9.939 cm 2,8 cm/s -0.061 cm 3 0 cm 9.939 cm 3,43 s 9.939 cm 2,8 cm/s -0.061 cm
Tabel 4.6. Hasil Uji Coba dari posisi 0 ke 20 Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 cm 19.829 cm 5,17 s 19.829 cm 3,8 cm/s -0.171 cm 2 0 cm 19.829 cm 4,63 s 19.829 cm 4,2 cm/s -0.171 cm 3 0 cm 19.829 cm 4,74 s 19.829 cm 4,1 cm/s -0.171 cm
Tabel 4.7. Hasil Uji Coba dari posisi 0 ke 30 Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 cm 29.919 cm 4,44 s 29.919 cm 6,7 cm/s -0.081 cm 2 0 cm 29.919 cm 4,03 s 29.919 cm 7,4 cm/s -0.081 cm 3 0 cm 29.919 cm 4,24 s 29.919 cm 7,0 cm/s -0.081 cm
Tabel 4.8. Hasil Uji Coba dari posisi 0 ke 40 Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 cm 39.909 cm 4,89 s 39.909 cm 8,1 cm/s -0.061 cm 2 0 cm 39.909 cm 3,92 s 39.909 cm 10,1 cm/s -0.061 cm 3 0 cm 39.909 cm 4,05 s 39.909 cm 9,8 cm/s -0.061 cm
Tabel 4.9. Hasil Uji Coba dari posisi 0 ke 50 Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 0 cm 49.899 cm 5,42 s 49.899 cm 9,2 cm/s -0.101 cm 2 0 cm 49.899 cm 4,79 s 49.899 cm 10,4 cm/s -0.101 cm 3 0 cm 49.899 cm 4,42 s 49.899 cm 11,2 cm/s -0.101 cm
Dari hasil uji coba diatas piston dapat berhenti pada posisi yang akurat meskipun jarak perpindahannya semakin jauh akan tetapi kepresisian perhentian piston tetap stabil. Juga dapat dilihat semakin jauh jarak perpindahannya semakin besar pula kecepatan gerak piston.
4.3.5. Uji coba V
Pada uji coba yang ke lima dilakukan pergeseran ke kanan sebesar 10 cm dimulai dari posisi 50 cm dan diberi beban kurang lebih 1 kg. Uji coba kali ini bertujuan untuk mengetahui apakah kecepatan dan gerakan piston relatif stabil meskipun diberi beban. Berikut hasil uji coba ke lima:
Tabel 4.10. Hasil Uji Coba posisi 50 cm ke 40 cm Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 49.89 cm 39.909 cm 1,53 s 9.989 cm 6,5 cm/s -0.011 cm 2 49.89 cm 39.909 cm 1,53 s 9.989 cm 6,5 cm/s -0.011 cm 3 49.89 cm 39.909 cm 1,54 s 9.989 cm 6,4 cm/s -0.011 cm
Tabel 4.11. Hasil Uji Coba posisi 40 cm ke 30 cm Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 39.909 cm 29.919 cm 1,50 s 9.989 cm 6,6 cm/s -0.011 cm 2 39.909 cm 29.919 cm 1,41 s 9.989 cm 7,0 cm/s -0.011 cm 3 39.909 cm 29.919 cm 1,34 s 9.989 cm 7,4 cm/s -0.011 cm
Tabel 4.12. Hasil Uji Coba posisi 30 cm ke 20 cm Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 29.91 cm 19.829 cm 1,47 s 10.090 cm 6,8 cm/s +0.09 cm 2 29.91 cm 19.829 cm 1,38 s 10.090 cm 7,3 cm/s +0.09 cm 3 29.91 cm 19.829 cm 1,28 s 10.090 cm 7,8 cm/s +0.09 cm
Tabel 4.13. Hasil Uji Coba posisi 20 cm ke 10 cm Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 19.82 cm 9.939 cm 1,36 s 9.889 cm 7,2 cm/s -0.111 cm 2 19.82 cm 9.939 cm 1,33 s 9.889 cm 7,4 cm/s -0.111 cm 3 19.82 cm 9.939 cm 1,32 s 9.889 cm 7,4 cm/s -0.111 cm
Tabel 4.14. Hasil Uji Coba posisi 10 cm ke 0 cm Uji
Coba
Posisi Awal
Posisi Akhir
Waktu Jarak Perpindahan
Kecepatan Error
1 9.93 cm 0 cm 7,03 s 9.939 cm 1,4 cm/s -0.061 cm 2 9.93 cm 0 cm 1,63 s 9.939 cm 6,0 cm/s -0.061 cm 3 49.89 cm 0 cm 1,57 s 9.939 cm 6,3 cm/s -0.061 cm
Dari uji coba di atas dengan jarak perpindahan sebesar 10 cm dapat disimpulkan bahwa mesikipun diberi beban sebesar kurang lebih 1 kg piston masih mampu bergerak dan kecepatannya relatif stabil begitu juga dengan waktu tempuhnya.
Tetapi pada uji coba 1 dari posisi 10 cm ke 0 cm. Piston lama untuk mencapai posisi 0 cm sampai membutuhkan waktu 703 ms. Hal ini dikarenakan terjadi error pada kontroler sehingga piston susah untuk mencapai target.
4.4. Analisa Uji Coba
Dari uji coba I, II dan III, terlihat jika piston pindah dengan jarak perpindahan yang besar atau jauh seperti pada uji coba I dan II dengan jarak perpindahan sebesar 50 cm. Maka piston dapat berhenti pada posisi yang tepat atau lebih presisi. Tetapi pada uji coba ke III yang dengan jarak perpindahan sebesar 1 cm. Posisi berhenti piston menjadi tidak akurat dan tidak stabil. Hal lain yang muncul dalam beberapa kali uji coba alat adalah perbedaan kecepatan rata- rata gerak piston. Kecepatan rata-rata gerak piston ke kanan lebih besar daripada kecepatan gerak piston ke kiri. Dari uji coba diatas didapatkan kecepatan gerak piston ke kanan 2 kali lebih besar dari kecepatan gerak piston ke kiri. Meskipun belum didapatkan kecepatan yang konstan dari alat ini, dari uji coba I dan II dengan jarak perpindahan sebesar 50 cm. Didapatkan bahwa piston berhenti dengan perpindahan jarak yang relatif stabil. Kestabilan itu dapat dilihat dari uji coba I dan II dengan jarak perpindahan sebesar 49.899 cm dan cenderung tidak berubah ubah besarnya.
Dari uji coba V dengan jarak perpindahan sebesar 10 cm dan diberi beban sebesar kurang lebih 1 kg, dapat diketahui bahwa perpindahan piston tetap stabil meskipun pada jarak yang berbeda-beda. Dengan jarak perpindahan sebesar 10 cm kecepatan piston relatif sama dan piston dapat berhenti pada posisi yang akurat.
Sistim pneumatik jenis ini dengan tekanan udara sebesar 5-6 bar mampu memindahkan beban tersebut dengan cepat dan akurat.
Berdasarkan pada uji coba yang telah dilakukan, sistim pneumatik ini dapat diaplikasikan untuk material handling. Misalnya untuk memindahkan barang-barang elektronik yang tidak berat, membutuhkan waktu yang cepat dan presisi.
Kecepatan pergerakan piston ke arah kanan dan ke arah kiri tidak sama besar. Hal ini disebabkan karena susahnya mengetahui besar bukaan pada katup proporsional. Besar bukaan katup ini susah diperhitungkan karena banyaknya faktor seperti besar tekanan udara pada kompressor juga arus yang sampai pada katup. Besar Arus tidak 100% dapat tersampaikan di katup karena terhambat atau hilang karena panjang kabel dan bahan kabel yang digunakan.