i
REALISASI LENGAN ROBOT BERBASIS
MIKROKONTROLER ATMEGA16
Disusun oleh:
Dicky Fernando
0422038
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha,
Jl. Prof. Drg. Suria Sumanti, MPH No.65, Bandung, Indonesia,
E-mail : oranganehgila@yahoo.com
ABSTRAK
Peran robot sebagai pelaksana suatu pekerjaan telah menggeser fungsi
manusia kepada pengawas dan pemberi perintah pada saat-saat tertentu saja. Hal
ini semakin terasa pada pekerjaan-pekerjaan rutin dan berat, karena tenaga robot
akan lebih efisien bila dibandingkan dengan tenaga manusia.
Dalam Tugas Akhir telah direalisasikan lengan robot dengan lima derajat
kebebasan yang menggunakan motor DC dan motor servo sebagai penggeraknya.
Mikrokontroler ATMEGA16 digunakan sebagai pengendali, dan program
user-interface
dibuat dengan VisualBasic6 untuk memudahkan user
dalam
mengendalikan lengan robot.
Pengujian dengan acuan sudut menghasilkan error pada sendi dasar
sebesar 2.7%, sendi pertama sebesar
3.1%, sendi kedua sebesar
4.7% dan sendi
ketiga sebesar
5.6%. Pengujian kedua dilakukan untuk menentukan beban
maksimal yang dapat diangkat lengan, yaitu sebesar 40gram. Pengujian ketiga
dilakukan untuk mendapatkan tingkat akurasi dari lengan dalam mencapai posisi
tertentu dengan error pada sumbu x sebesar 2%, pada sumbu y sebesar 2.8% dan
pada sumbu z sebesar 3.5%. Pengujian terakhir, yaitu pada simulasi pick and
place berhasil dengan baik. Lengan robot dapat mengambil barang pada tempat
ii
REALIZATION OF ROBOTIC ARM BASED ON
MICROCONTROLLER ATMEGA16
Composed by:
Dicky Fernando
0422038
Electrical Engineering, Maranatha Chirstian University,
Jl. Prof. Drg. Suria Sumanti, MPH No.65, Bandung, Indonesia,
E-mail : oranganehgila@yahoo.com
ABSTRACT
Robot’s role as an executor in a job have made human’s function shifting
to an observer and an instructor in such situations. This things can be felt more
clearly in repeating and heavy works, beca
use robot’s power will be much more
ef
ficient compared to human’s.
In this Last Assignment, a robotic arm with five degrees of freedom which
uses DC motor and servos as its actuators has been realized. Microcontroller
ATMEGA16 is used as controller, and a user-interface is made on VisualBasic6
to simplify things for user in controlling the arm.
Tests have been done. The first one uses degrees as its reference, with
error on base-joint 2.7%, first-joint is
3.1%, second-joint is
4.7% and third-joint is
5.6%. Second test is about power. This test is used to measured how much this
v
DAFTAR ISI
Halaman
ABSTRAK ... i
ABSTRACT ... ii
KATA PENGANTAR... iii
DAFTAR ISI... v
DAFTAR TABEL ... vii
DAFTAR GAMBAR... viii
BAB I
PENDAHULUAN
I.1
Latar Belakang ... 1
I.2
Identifikasi Masalah... 1
I.3
Tujuan ... 1
I.4
Pembatasan Masalah ... 2
I.5
Spesifikasi Alat ... 2
I.6
Sistematika Penulisan ... 2
BAB II
LANDASAN TEORI
II.1
Motor DC ... 4
II.2
Motor Servo ... 5
II.3
Mikrokontroler ... 7
II.4
Pengenalan Visual Basic... 9
II.4.1
Variabel, Data, Operator ... 9
II.4.2
Conditional Statement dan Looping Statement... 10
vi
BAB III
PERANCANGAN DAN REALISASI LENGAN ROBOT
BESERTA PENGENDALINYA
III.1
Lengan Robot... 14
III.2
Pengendali Lengan Robot ... 18
III.2.1
Mikrokontroler ATMEGA16... 19
III.2.2
User Interface ... 27
BAB IV
PENGUJIAN DAN ANALISA
IV.1
Pengujian dengan Acuan Sudut ... 34
IV.1.1
Sendi Dasar (Motor DC) ... 34
IV.1.2
Sendi Pertama (servo1 dan servo2)... 35
IV.1.3
Sendi Kedua (servo3)... 36
IV.1.4
Sendi Ketiga (servo4) ... 37
IV.2
Pengujian dengan Acuan Beban ... 37
IV.3
Pengujian Tingkat Akurasi ... 39
IV.4
Pengujian Program AoS... 39
IV.4.1
Pengujian TRAINING Mode... 40
IV.4.2
Pengujian PICK and PLACE Simulation... 43
BAB V
KESIMPULAN DAN SARAN
V.1
Kesimpulan ... 46
V.2
Saran ... 47
DAFTAR PUSTAKA
LAMPIRAN
–
A Instruksi Mikrokontroler
LAMPIRAN
–
B Instruksi Program AoS
vii
DAFTAR TABEL
Halaman
1. Tabel 4.1 Pengujian Sendi Dasar ... 34
2. Tabel 4.1 Pengujian Sendi Dasar (sambungan) ... 35
3. Tabel 4.2 Pengujian Sendi Pertama ... 35
4. Tabel 4.3 Pengujian Sendi Kedua ... 36
5. Tabel 4.4 Pengujian Sendi Ketiga... 37
6. Tabel 4.5 Pengujian dengan Acuan Beban ... 38
viii
DAFTAR GAMBAR
Halaman
1. Gambar 2.1 (a) Armature, (b) Stator... 4
2. Gambar 2.2 Prinsip Kerja Motor DC ... 5
3. Gambar 2.3 Motor Servo yang Dibongkar... 6
4. Gambar 2.4 Diagram pin ATMEGA16-PDIP ... 9
5. Gambar 3.1 Lengan Robor lynxmotion.com ... 14
6. Gambar 3.2 Sketsa Awal Lengan Robot... 15
7. Gambar 3.3 Gripper... 16
8. Gambar 3.4 Sketsa Pemasangan Pegas ... 17
9. Gambar 3.5 Posisi Menjangkau Maksimum (a) Horizontal, (b) Vertikal... 18
10. Gambar 3.6 Blok Diagram ... 19
11. Gambar 3.7 Diagram Skematik Mikrokontroler ATMEGA16... 20
12. Gambar 3.8 Diagram Alir Mikrokontroler... 21
13.
Gambar 3.9 Diagram Alir ’servo1’
... 22
14.
Gambar 3.10 Diagram Alir ’servo2’
... 23
15.
Gambar 3.11 Diagram Alir ’servo3’
... 24
16.
Gambar 3.12 Diagram Alir ’svrocr’
... 25
17.
Gambar 3.13 Diagram Alir ’dcmtrcw’
... 26
18.
Gambar 3.14 Diagram Alir ’dcmtrccw’
... 27
19. Gambar 3.15 Diagram Alir AoS v3.2 ... 28
20. Gambar 3.16 Tampilan AoS v3.2 ... 28
21. Gambar 3.17 Diagram Alir TRAINING ... 30
22. Gambar 3.18 TRAINING Mode... 31
23. Gambar 3.19 Diagram Alir PICK and PLACE Simulation... 32
24. Gambar 3.20 PICK and PLACE Simulation ... 33
25. Gambar 4.1 TRAINING 1... 41
ix
27. Gambar 4.3 TRAINING 2... 42
28. Gambar 4.4 Posisi Lengan Robot 2 ... 42
29. Gambar 4.5 TRAINING 3... 43
30. Gambar 4.6 Posisi Lengan Robot 3 ... 43
31. Gambar 4.7 PICK and PLACE, Tahap 1 ... 44
32. Gambar 4.8 PICK and PLACE, Tahap 2 ... 45
LAMPIRAN - A
#include <mega16.h> #include <stdio.h> #include <delay.h> bit kirim;
char temp,temp1=6,temp2=15,temp3=6,temp4=0,temp5=0;
#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)
// USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter; #else
unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif
// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) {
char status,data; 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; };
};kirim=1; }
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_
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];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter; #else
unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif
// USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) {
if (tx_counter) {
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; };
}
#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>
void servo (char delay1, char delay2, char delay3) {
char i; PORTA.0=1; for(i=0;i<delay1;i++) {delay_us(100);} PORTA.0=0; PORTA.1=1; for(i=0;i<delay2;i++) {delay_us(100);} PORTA.1=0; PORTA.2=1; for(i=0;i<delay3;i++) {delay_us(100);} PORTA.2=0; return; }
void dccw (char delay4) {
char icw,iicw; PORTC.0=1;
for(icw=0;icw<delay4;icw++) {for(iicw=0;iicw<8;iicw++) {servo(temp1,temp2,temp3); delay_ms(15);}
}
PORTC.0=0; return;}
void dcccw (char delay5) {
char iccw,iiccw; PORTC.1=1;
for(iccw=0;iccw<delay5;iccw++) {for(iiccw=0;iiccw<8;iiccw++) {servo(temp1,temp2,temp3); delay_ms(15);}
}
PORTC.1=0; return;}
void main(void) {
// Declare your local variables here
// Input/Output Ports initialization // Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00; DDRA=0xFF;
// Port B initialization
PORTB=0x00; DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00; DDRD=0xFF;
// 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: 1500.000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1 // OC1A output: Non-Inv.
// OC1B output: Non-Inv. // Noise Canceler: Off
// Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA0; TCCR1B=0x12; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x3A; ICR1L=0x98; OCR1AH=0x01; OCR1AL=0xC2; OCR1BH=0x01; OCR1BL=0xC2;
// 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;
// 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: 9600 UCSRA=0x00;
UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x4D;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts #asm("sei")
while (1)
{OCR1A=1198;OCR1B=1198; awal:
if(kirim==1) {kirim=0; temp=getchar(); switch(temp) {
case '0':PORTA=0;OCR1A=1198;OCR1B=1198;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break; }}
servo(temp1,temp2,temp3); delay_ms(15);
goto awal;
dcmtrcw: if(kirim==1) {kirim=0; temp=getchar(); switch(temp) {
case 'b':temp4=4;break; case 'c':temp4=6;break; case 'd':temp4=8;break; case 'e':temp4=10;break; case 'f':temp4=12;break; case 'g':temp4=14;break; case 'h':temp4=16;break; case 'i':temp4=18;break; case 'j':temp4=20;break; case 'k':temp4=22;break; case 'l':temp4=24;break; case 'm':temp4=26;break; case 'n':temp4=28;break; case 'o':temp4=30;break; case 'p':temp4=32;break; case 'q':temp4=34;break; case 'r':temp4=36;break; case '0':PORTA=1;OCR1A=600;OCR1B=600;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break; }} servo(temp1,temp2,temp3); delay_ms(15); dcccw(temp5); temp5=0; goto dcmtrccw; srvocr: if(kirim==1) {kirim=0; temp=getchar(); switch(temp) { case 'a':OCR1A=550;OCR1B=550;break; case 'b':OCR1A=622;OCR1B=622;break; case 'c':OCR1A=694;OCR1B=694;break; case 'd':OCR1A=766;OCR1B=766;break; case 'e':OCR1A=838;OCR1B=838;break; case 'f':OCR1A=910;OCR1B=910;break; case 'g':OCR1A=982;OCR1B=982;break; case 'h':OCR1A=1054;OCR1B=1054;break; case 'i':OCR1A=1126;OCR1B=1126;break; case 'j':OCR1A=1198;OCR1B=1198;break; case '0':PORTA=0;OCR1A=550;OCR1B=550;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break;
case 'l':temp1=17;break; case 'm':temp1=18;break; case 'n':temp1=19;break; case 'o':temp1=20;break; case 'p':temp1=21;break; case 'q':temp1=22;break; case 'r':temp1=23;break; case 's':temp1=24;break; case '0':PORTA=0;OCR1A=600;OCR1B=600;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break;
}} servo(temp1,temp2,temp3); delay_ms(15); goto servo1; servo2: if(kirim==1) {kirim=0; temp=getchar(); switch(temp) { case 'a':temp2=6;break; case 'b':temp2=7;break; case 'c':temp2=8;break; case 'd':temp2=9;break; case 'e':temp2=10;break; case 'f':temp2=11;break; case 'g':temp2=12;break; case 'h':temp2=13;break; case 'i':temp2=14;break; case 'j':temp2=15;break; case 'k':temp2=16;break; case 'l':temp2=17;break; case 'm':temp2=18;break; case 'n':temp2=19;break; case 'o':temp2=20;break; case 'p':temp2=21;break; case 'q':temp2=22;break; case 'r':temp2=23;break; case 's':temp2=24;break; case '0':PORTA=0;OCR1A=600;OCR1B=600;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break;
}}
servo(temp1,temp2,temp3); delay_ms(15);
servo3:
if(kirim==1) {kirim=0; temp=getchar(); switch(temp) {
case 'a':temp3=6;break; case 'b':temp3=7;break; case 'c':temp3=8;break; case 'd':temp3=9;break; case 'e':temp3=10;break; case 'f':temp3=11;break; case 'g':temp3=12;break; case 'h':temp3=13;break; case 'i':temp3=14;break; case 'j':temp3=15;break; case 'k':temp3=16;break; case 'l':temp3=17;break; case 'm':temp3=18;break; case 'n':temp3=19;break; case 'o':temp3=20;break; case 'p':temp3=21;break; case 'q':temp3=22;break; case 'r':temp3=23;break; case 's':temp3=24;break;
case '0':PORTA=0;OCR1A=600;OCR1B=600;temp1=6;temp2=6;temp3=6;break; case '1':PORTA=0;PORTA.7=1;goto servo1;break;
case '2':PORTA=0;PORTA.6=1;goto servo2;break; case '3':PORTA=0;PORTA.5=1;goto servo3;break; case '4':PORTA=0;PORTA.4=1;goto srvocr;break; case '5':PORTA=0xf0;goto dcmtrcw;break; case '6':PORTA=0xf0;goto dcmtrccw;break;
}}
servo(temp1,temp2,temp3); delay_ms(15);
LAMPIRAN - B
Dim srv1, srv2, srv3, srv4, dc, ctr As Integer
Private Sub Command1_Click() Label1.Caption = "TRAINING MODE" Label1.Visible = True
HScroll1.Visible = True HScroll2.Visible = True HScroll3(0).Visible = True HScroll3(1).Visible = True Command1.Visible = False Command2.Visible = False Command3.Visible = True Command4.Visible = True Command5.Visible = True Command7.Visible = True Command8.Visible = True Command9.Visible = True Text1.Visible = True Text2.Visible = True Text3.Visible = True Text4.Visible = True Line1.Visible = True Line2.Visible = True Line3.Visible = True Line4.Visible = True Line5.Visible = True Line6.Visible = True Line7.Visible = True Timer1.Enabled = True End Sub
Private Sub Command2_Click()
Label1.Caption = "PICK and PLACE simulation" Label1.Visible = True
Label2.Visible = True Text5.Visible = True Command1.Visible = False Command2.Visible = False Command5.Visible = True
cdc1 = InputBox("clockwise/counter-clockwise (0/1) :", "PICK input", 0) dc1 = InputBox("dc motor (0-180) :", "'PICK' input", 0)
s11 = InputBox("servo1&2 (30-90) :", "'PICK' input", 30) s21 = InputBox("servo3 (50-120) :", "'PICK' input", 50) s31 = InputBox("servo4 (0-180) :", "'PICK' input", 0)
cdc2 = InputBox("clockwise/counter-clockwise (0/1) :", "'PLACE' input", 0) dc2 = InputBox("dc motor (0-180) :", "'PLACE' input", 0)
s12 = InputBox("servo1&2 (30-90) :", "'PLACE' input", 30) s22 = InputBox("servo3 (50-120) :", "'PLACE' input", 50) s32 = InputBox("servo4 (0-180) :", "'PLACE' input", 0)
ctr = InputBox("pengulangan :", "input counter", 1) ctr2 = 0
MSComm1.Output = "j" Call Pause(1)
For i = 0 To ctr Text5.Text = ctr2
If cdc1 = 0 Then MSComm1.Output = "5" ElseIf cdc1 = 1 Then MSComm1.Output = "6" End If
Call Pause(1) Select Case (dc1)
Case "10": MSComm1.Output = "a" Case "20": MSComm1.Output = "b" Case "30": MSComm1.Output = "c" Case "40": MSComm1.Output = "d" Case "50": MSComm1.Output = "e" Case "60": MSComm1.Output = "f" Case "70": MSComm1.Output = "g" Case "80": MSComm1.Output = "h" Case "90": MSComm1.Output = "i" Case "100": MSComm1.Output = "j" Case "110": MSComm1.Output = "k" Case "120": MSComm1.Output = "l" Case "130": MSComm1.Output = "m" Case "140": MSComm1.Output = "n" Case "150": MSComm1.Output = "o" Case "160": MSComm1.Output = "p" Case "170": MSComm1.Output = "q" Case "180": MSComm1.Output = "r" End Select
Call Pause(1)
MSComm1.Output = "4" Call Pause(1)
Select Case (s11)
Case "30": MSComm1.Output = "b" Case "40": MSComm1.Output = "c" Case "50": MSComm1.Output = "d" Case "60": MSComm1.Output = "e" Case "70": MSComm1.Output = "f" Case "80": MSComm1.Output = "g" Case "90": MSComm1.Output = "h" End Select
Call Pause(1)
MSComm1.Output = "1" Call Pause(1)
Select Case (s21)
End Select Call Pause(1)
MSComm1.Output = "2" Call Pause(1)
Select Case (s31)
Case "0": MSComm1.Output = "a" Case "10": MSComm1.Output = "b" Case "20": MSComm1.Output = "c" Case "30": MSComm1.Output = "d" Case "40": MSComm1.Output = "e" Case "50": MSComm1.Output = "f" Case "60": MSComm1.Output = "g" Case "70": MSComm1.Output = "h" Case "80": MSComm1.Output = "i" Case "90": MSComm1.Output = "j" Case "100": MSComm1.Output = "k" Case "110": MSComm1.Output = "l" Case "120": MSComm1.Output = "m" Case "130": MSComm1.Output = "n" Case "140": MSComm1.Output = "o" Case "150": MSComm1.Output = "p" Case "160": MSComm1.Output = "q" Case "170": MSComm1.Output = "r" Case "180": MSComm1.Output = "s" End Select
Call Pause(1)
MSComm1.Output = "3" Call Pause(1)
MSComm1.Output = "a" Call Pause(1)
If cdc1 = 0 Then MSComm1.Output = "6" ElseIf cdc1 = 1 Then MSComm1.Output = "5" End If
Call Pause(1) Select Case (dc1)
End Select Call Pause(1)
If cdc2 = 0 Then MSComm1.Output = "5" ElseIf cdc2 = 1 Then MSComm1.Output = "6" End If
Call Pause(1) Select Case (dc2)
Case "10": MSComm1.Output = "a" Case "20": MSComm1.Output = "b" Case "30": MSComm1.Output = "c" Case "40": MSComm1.Output = "d" Case "50": MSComm1.Output = "e" Case "60": MSComm1.Output = "f" Case "70": MSComm1.Output = "g" Case "80": MSComm1.Output = "h" Case "90": MSComm1.Output = "i" Case "100": MSComm1.Output = "j" Case "110": MSComm1.Output = "k" Case "120": MSComm1.Output = "l" Case "130": MSComm1.Output = "m" Case "140": MSComm1.Output = "n" Case "150": MSComm1.Output = "o" Case "160": MSComm1.Output = "p" Case "170": MSComm1.Output = "q" Case "180": MSComm1.Output = "r" End Select
Call Pause(1)
MSComm1.Output = "4" Call Pause(1)
Select Case (s12)
Case "30": MSComm1.Output = "b" Case "40": MSComm1.Output = "c" Case "50": MSComm1.Output = "d" Case "60": MSComm1.Output = "e" Case "70": MSComm1.Output = "f" Case "80": MSComm1.Output = "g" Case "90": MSComm1.Output = "h" End Select
Call Pause(1)
MSComm1.Output = "1" Call Pause(1)
Select Case (s22)
Case "50": MSComm1.Output = "f" Case "60": MSComm1.Output = "g" Case "70": MSComm1.Output = "h" Case "80": MSComm1.Output = "i" Case "90": MSComm1.Output = "j" Case "100": MSComm1.Output = "k" Case "110": MSComm1.Output = "l" Case "120": MSComm1.Output = "m" End Select
MSComm1.Output = "2" Call Pause(1)
Select Case (s32)
Case "0": MSComm1.Output = "a" Case "10": MSComm1.Output = "b" Case "20": MSComm1.Output = "c" Case "30": MSComm1.Output = "d" Case "40": MSComm1.Output = "e" Case "50": MSComm1.Output = "f" Case "60": MSComm1.Output = "g" Case "70": MSComm1.Output = "h" Case "80": MSComm1.Output = "i" Case "90": MSComm1.Output = "j" Case "100": MSComm1.Output = "k" Case "110": MSComm1.Output = "l" Case "120": MSComm1.Output = "m" Case "130": MSComm1.Output = "n" Case "140": MSComm1.Output = "o" Case "150": MSComm1.Output = "p" Case "160": MSComm1.Output = "q" Case "170": MSComm1.Output = "r" Case "180": MSComm1.Output = "s" End Select
Call Pause(1)
MSComm1.Output = "3" Call Pause(1)
MSComm1.Output = "j" Call Pause(1)
If cdc2 = 0 Then MSComm1.Output = "6" ElseIf cdc2 = 1 Then MSComm1.Output = "5" End If
Call Pause(1) Select Case (dc2)
Case "10": MSComm1.Output = "a" Case "20": MSComm1.Output = "b" Case "30": MSComm1.Output = "c" Case "40": MSComm1.Output = "d" Case "50": MSComm1.Output = "e" Case "60": MSComm1.Output = "f" Case "70": MSComm1.Output = "g" Case "80": MSComm1.Output = "h" Case "90": MSComm1.Output = "i" Case "100": MSComm1.Output = "j" Case "110": MSComm1.Output = "k" Case "120": MSComm1.Output = "l" Case "130": MSComm1.Output = "m" Case "140": MSComm1.Output = "n" Case "150": MSComm1.Output = "o" Case "160": MSComm1.Output = "p" Case "170": MSComm1.Output = "q" Case "180": MSComm1.Output = "r" End Select
ctr2 = ctr2 + 1 Next
End Sub
Private Sub Command3_Click() srv4 = 0
Command3.Enabled = False Command4.Enabled = True End Sub
Private Sub Command4_Click() srv4 = 90
Command4.Enabled = False Command3.Enabled = True End Sub
Private Sub Command5_Click() MSComm1.Output = "0"
Label1.Caption = "CHOOSE A MODE" Label1.Visible = True
Label2.Visible = False HScroll1.Visible = False HScroll2.Visible = False HScroll3(0).Visible = False HScroll3(1).Visible = False Command1.Visible = True Command2.Visible = True Command3.Visible = False Command4.Visible = False Command5.Visible = False Command7.Visible = False Command8.Visible = False Command9.Visible = False Text1.Visible = False Text2.Visible = False Text3.Visible = False Text4.Visible = False Text5.Visible = False Line1.Visible = False Line2.Visible = False Line3.Visible = False Line4.Visible = False Line5.Visible = False Line6.Visible = False Line7.Visible = False Timer1.Enabled = False HScroll1.Value = 0 HScroll2.Value = 30 HScroll3(0).Value = 50 HScroll3(1).Value = 0 End Sub
Private Sub Command6_Click() End
End Sub
If dc = 0 Then dc = dc
ElseIf dc <> 0 Then MSComm1.Output = "5" Call Pause(1)
If dc = 10 Then
MSComm1.Output = "a" ElseIf dc = 20 Then MSComm1.Output = "b" ElseIf dc = 30 Then MSComm1.Output = "c" ElseIf dc = 40 Then MSComm1.Output = "d" ElseIf dc = 50 Then MSComm1.Output = "e" ElseIf dc = 60 Then MSComm1.Output = "f" ElseIf dc = 70 Then MSComm1.Output = "g" ElseIf dc = 80 Then MSComm1.Output = "h" ElseIf dc = 90 Then MSComm1.Output = "i" ElseIf dc = 100 Then MSComm1.Output = "j" ElseIf dc = 110 Then MSComm1.Output = "k" ElseIf dc = 120 Then MSComm1.Output = "l" ElseIf dc = 130 Then MSComm1.Output = "m" ElseIf dc = 140 Then MSComm1.Output = "n" ElseIf dc = 150 Then MSComm1.Output = "o" ElseIf dc = 160 Then MSComm1.Output = "p" ElseIf dc = 170 Then MSComm1.Output = "q" ElseIf dc = 180 Then MSComm1.Output = "r" End If
End If
Timer1.Enabled = True End Sub
Private Sub Command8_Click() Timer1.Enabled = False If dc = 0 Then
dc = dc
ElseIf dc <> 0 Then MSComm1.Output = "6" Call Pause(1)
If dc = 10 Then
MSComm1.Output = "c" ElseIf dc = 40 Then MSComm1.Output = "d" ElseIf dc = 50 Then MSComm1.Output = "e" ElseIf dc = 60 Then MSComm1.Output = "f" ElseIf dc = 70 Then MSComm1.Output = "g" ElseIf dc = 80 Then MSComm1.Output = "h" ElseIf dc = 90 Then MSComm1.Output = "i" ElseIf dc = 100 Then MSComm1.Output = "j" ElseIf dc = 110 Then MSComm1.Output = "k" ElseIf dc = 120 Then MSComm1.Output = "l" ElseIf dc = 130 Then MSComm1.Output = "m" ElseIf dc = 140 Then MSComm1.Output = "n" ElseIf dc = 150 Then MSComm1.Output = "o" ElseIf dc = 160 Then MSComm1.Output = "p" ElseIf dc = 170 Then MSComm1.Output = "q" ElseIf dc = 180 Then MSComm1.Output = "r" End If
End If
Timer1.Enabled = True End Sub
Private Sub Command9_Click() MSComm1.Output = "4" Call Pause(1)
MSComm1.Output = "j" End If
Call Pause(1)
For i = 0 To 1 x = HScroll3(i).Value If i = 0 Then
MSComm1.Output = "1" ElseIf i = 1 Then MSComm1.Output = "2" End If
Call Pause(1) If x = 0 Then
MSComm1.Output = "a" ElseIf x = 10 Then MSComm1.Output = "b" ElseIf x = 20 Then MSComm1.Output = "c" ElseIf x = 30 Then MSComm1.Output = "d" ElseIf x = 40 Then MSComm1.Output = "e" ElseIf x = 50 Then MSComm1.Output = "f" ElseIf x = 60 Then MSComm1.Output = "g" ElseIf x = 70 Then MSComm1.Output = "h" ElseIf x = 80 Then MSComm1.Output = "i" ElseIf x = 90 Then MSComm1.Output = "j" ElseIf x = 100 Then MSComm1.Output = "k" ElseIf x = 110 Then MSComm1.Output = "l" ElseIf x = 120 Then MSComm1.Output = "m" ElseIf x = 130 Then MSComm1.Output = "n" ElseIf x = 140 Then MSComm1.Output = "o" ElseIf x = 150 Then MSComm1.Output = "p" ElseIf x = 160 Then MSComm1.Output = "q" ElseIf x = 170 Then MSComm1.Output = "r" ElseIf x = 180 Then MSComm1.Output = "s" End If
Call Pause(1) Next
MSComm1.Output = "3" Call Pause(1)
MSComm1.Output = "a" ElseIf srv4 = 90 Then MSComm1.Output = "j" End If
End Sub
Private Sub Form_Load() MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1" MSComm1.InputLen = 0
MSComm1.PortOpen = True srv1 = 0
srv2 = 0 srv3 = 0 srv4 = 0 dc = o
Timer1.Enabled = False Command3.Enabled = False Command5.Visible = False
Label1.Caption = "CHOOSE A MODE" Label1.Visible = True
End Sub
Private Sub Timer1_Timer() i1 = HScroll1.Value i1 = i1 \ 10
HScroll1.Value = i1 * 10 Text1.Text = HScroll1.Value dc = HScroll1.Value
i1 = HScroll2.Value i1 = i1 \ 10
HScroll2.Value = i1 * 10 Text2.Text = HScroll2.Value srv1 = HScroll2.Value
i1 = HScroll3(0).Value i1 = i1 \ 10
HScroll3(0).Value = i1 * 10 Text3.Text = HScroll3(0).Value
i1 = HScroll3(1).Value i1 = i1 \ 10
HScroll3(1).Value = i1 * 10 Text4.Text = HScroll3(1).Value End Sub
Sub Pause(ByVal nSecond As Single) Dim t0 As Single
t0 = Timer
Do While Timer - t0 < nSecond Dim dummy As Integer dummy = DoEvents() Loop
LAMPIRAN
–
C
Sejarah Singkat Program AoS
Program AoS v1.0 dibuat pada bulan November 2007. Program ini cukup
sederhana, yaitu hanya mengendalikan lengan secara manual saja. Pengiriman data
dilakukan secara real-time dengan menggunakan sebuah timer. Namun program ini
memiliki kendala besar, yaitu data yang dikirimkan sering tidak dapat diterima oleh
mikrokontroler, sehingga pengaturan lengan menjadi salah.
Kemudian AoS dikembangkan pada AoS v2.0 pada awal bulan Desember
2007. terdapat perubahan yang cukup besar, yaitu mengganti proses pengiriman
secara real-time dengan sebuah tombol SEND. Tombol SEND ini akan mengirimkan
data yang bersangkutan dengan sendi-sendi pada lengan, dengan delay sebesar satu
detik pada tiap pengirimannya. Pada AoS v2.0 ini, pengiriman data pengendali
lengan telah berfungsi dengan baik, dimana data yang dikirimkan diterima
mikrokontroler dan dapat mengendalikan lengan secara akurat.
AoS v2.0 kemudian dikembangkan lagi menjadi AoS v3.0 pada awal bulan
Januari 2008. Pada AoS v3.0 ini, ditambahkan tombol CW dan CCW untuk
mengendalikan motor DC (searah dan berlawanan arah jam) yang sebelumnya hanya
dapat mengendalikan motor DC searah jam saja, dan penambahan menu awal
(sehingga menu pengendali pada program AoS sebelumnya dinamai TRAINING
mode). Pada versi ini juga ditambahkan menu PICK and PLACE simulation.
Terdapat beberapa pengembangan minor seperti perubahan gambar dan penambahan
garis untuk memperbaiki penampilan program AoS. Dan pada akir bulan Januari
2008, diselesaikanlah AoS v3.2 yang digunakan dalam Tugas Akhir ini. AoS v3.2
merupakan versi final dari program pengendali lengan robot.
1
BAB I
PENDAHULUAN
Pada bab ini dibahas mengenai latar belakang, identifikasi masalah, tujuan,
pembatasan masalah, spesifikasi alat dan sistematika pembahasan.
I.1
Latar Belakang
Robotika merupakan bidang teknologi yang sedang berkembang pesat. Hal
ini terlihat dalam meningkatnya kebutuhan otomasi dalam berbagai bidang seperti
dalam bidang industri, lengan robot digunakan untuk melakukan aktifitas pick and
place.
Otomasi menggunakan lengan robot dapat meningkatkan efisiensi kerja.
Karena dengan menggunakan robot sebagai pengganti tenaga manusia,
kepresisian dapat terus dipertahankan walaupun pekerjaan dilakukan secara
berulang dan terus menerus. Selain itu lengan robot juga dapat digunakan dalam
jangka waktu yang lama tanpa memerlukan istirahat seperti layaknya manusia,
sehingga waktu yang digunakan menjadi lebih efisien.
Atas dasar inilah pembelajaran terhadap robotika dirasa penting. Lengan
robot yang dikendalikan oleh sebuah mikrokontroler menjadi topik yang diambil
dalam Tugas Akhir ini. Realisasi lengan robot dibuat menyerupai lengan robot
yang umum digunakan dalam bidang industri untuk aktifitas pick and place, dan
mikrokontroler AT MEGA 16 digunakan sebagai pengendalinya.
I.2
Identifikasi Masalah
Identifikasi masalah Tugas Akhir ini adalah bagaimana cara
merealisasikan lengan robot dan mengendalikan lengan robot menggunakan
mikrokontroler AT MEGA 16.
I.3
Tujuan
Bab I Pendahuluan
2
I.4
Pembatasan Masalah
Pembuatan lengan robot terbatas pada beberapa hal, yaitu:
1. Lengan robot memiliki lima derajat kebebasan.
2. Pergerakan maksimal pada sendi dasar sebesar 180
o(0
o- 180
o).
3. Pergerakan maksimal pada sendi pertama sebesar 60
o(30
o- 90
o).
4. Pergerakan maksimal pada sendi kedua sebesar 40
o(30
o- 70
o).
5. Pergerakan maksimal pada sendi ketiga sebesar 180
o(0
o- 180
o).
6. Gerakan untuk gripper adalah mencengkram (grip) dan melepas (release).
7. Kemampuan mengangkat lengan maksimal adalah 40gram.
8. Sistem yang digunakan adalah open loop.
9. Realisasi lengan robot diutamakan pada tingkat akurasi (respon dan kecepatan
tidak ditekankan).
I.5
Spesifikasi Alat
Alat-alat yang digunakan dalam merealisasikan lengan robot dan
pengendalinya adalah:
1. Motor DC, 12V, satu buah
2. Motor servo HITEC HS-475HB DELUXE, tiga buah.
3. Motor servo HITEC HS-425BB DELUXE, satu buah.
4. Motor servo HITEC HS-325HB STANDARD, satu buah.
5. Mikrokontroler ATMEGA16 dengan serial port, driver motor dan led test.
6. Rangkaian penyearah dan trafo untuk menghasilkan sumber tegangan 12V
7. Baterai AA 1.2V, 2500mAh, POWEREX 2700 rechargeable, empat buah.
8. Lengan robot lima derajat kebebasan, dibuat dengan bahan dasar aluminium
2.6mm.
9. Program pengendali sebagai user-interface dibuat menggunakan VisualBasic6.
I.6
Sistematika Penulisan
BAB I
Pendahuluan
Bab I Pendahuluan
3
BAB II
Teori Penunjang
Bab ini berisikan teori yang menunjang Tugas Akhir ini, yaitu: motor DC, motor
servo, mikrokontroler ATMEGA16, Visual Basic6 dan dasar robotik.
BAB III Perancangan dan Realisasi Lengan Robot Beserta Pengendalinya
Bab ini membahas perancangan dan realisasi lengan robot dengan lima derajat
kebebasan beserta pengendalinya yang terdiri dari mikrokontroler dan program
user-interface (yang dinamai AoS).
BAB IV Pengujian dan Analisa
Bab ini membahas pengujian lengan robot terhadap kesalahan sudut dan beban
maksimal. Kemudian menguji program yang dibuat untuk mengendalikan lengan
robot.
BAB V
Kesimpulan dan Saran
46
BAB V
KESIMPULAN DAN SARAN
Bab ini merupakan penutup dari laporan Tugas Akhir ini. Bab ini berisikan
kesimpulan akhir dari Tugas Akhir, sekaligus beberapa saran yang dirasa perlu
dan bermanfaat untuk pengembangan lebih lanjut dari realisasi lengan robot
berbasis mikrokontroler ATMEGA16.
V.1
Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab
sebelumnya, dapat disimpulakn beberapa hal di bawah ini:
1. Lengan robot dengan lima derajat kebebasan terealisasi dengan batasan
perputaran sendi dasar dari 0
osampai dengan 180
o, sendi pertama dari 30
osampai dengan 90
o, sendi kedua dari 50
osampai dengan 120
o, sendi ketiga
dari 0
osampai dengan 180
odan gripper melakukan gerakan grip dan release.
2. Penambahan sistem pegas pada lengan robot diperlukan untuk mengantisipasi
kurangnya daya angkat motor pada sendi-sendi tertentu.
3. Error pada pengujian dengan acuan sudut pada sendi dasar sebesar 2.7%,
sendi pertama sebesar
3.1%, sendi kedua sebesar
4.7% dan sendi ketiga sebesar
5.6%.
4. Error pada pengujian tingkat akurasi pada sumbu x sebesar 2%, pada sumbu y
sebesar 2.8% dan pada sumbu z sebesar 3.5%. Sehingga disimpulkan tingkat
akurasi lengan robot lebih besar dari 95%.
Bab V Kesimpulan dan Saran
47
V.2
Saran
Saran-saran yang dapat diberikan untuk perbaikan dan pengembangan dari
realisasi lengan robot berbasis mikrokontroler ATMEGA16 adalah sebagai
berikut:
1. Penambahan satu derajat kebebasan (menjadi enam derajat kebebasan) pada
bagian gripper, agar gripper mampu berputar dan memegang secara vertikal.
Hal ini akan membuat lengan robot semakin menyerupai lengan manusia.
2. Menghilangkan sistem pegas. Cara yang dapat dilakukan adalah dengan
DAFTAR PUSTAKA
Budiharto, Widodo., Perancangan Sistem dan Aplikasi Mikrokontroler, PT Elex
Media Komputindo, Jakarta, 2005
Budiharto, Widodo., Belajar Sendiri Membuat Robot Cerdas, PT Elex Media
Komputindo, Jakarta, 2006
Wardhana, Lingga., Belajar Sendiri Mikrokontroler AVR Seri ATMega8535
Simulasi, Hardware dan Aplikasi, Penerbit Andi, Yogyakarta, 2006
http://en.wikipedia.org
http://www.atmel.com
http://www.elektroindonesia.com
http://www.innovativeelectronics.com
http://www.hitecrcd.com