Realisasi Robot Pemain Bola Untuk KRCI 2010 Divisi Battle.
U nive rsit a s K rist e n M a ra na t ha
i
REALISASI ROBOT PEMAIN BOLA
UNTUK KRCI 2010 DIVISI
BATTLE
Disusun Oleh :
Nama : William
Nrp
: 0622018
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha,
Jl. Prof.Drg.Suria Sumantri, MPH no.65, Bandung, Indonesia.
Email : [email protected]
ABSTRAK
Kontes Robot Cerdas Indonesia (KRCI) Divisi
Battle
tahun 2010
memperlombakan robot dengan kemampuan pengenalan citra
(image)
melalui
kamera, karena objek yang diperebutkan adalah bola-bola berwarna tertentu yang
diletakkan di tempat-tempat tertentu. Selain itu robot harus dapat mengenali
goal
atau gawangnya sendiri agar tidak salah memasukkan bola.
Pada Tugas Akhir ini, robot mobil pemain bola dibuat dengan
menggunakan bahan besi untuk membuat rangka robot. Sistem gerak robot
menggunakan
differensial drive
dengan aktuator berupa dua buah motor DC 7.5V
100rpm, selain itu pada robot diberi suatu
gripper
yang digerakan oleh dua buah
motor servo dan satu buah motor dc untuk mengambil bola. Sensor-sensor yang
digunakan adalah sensor jarak ultrasonik untuk mengukur jarak robot dengan
lingkungan sekitarnya dan sensor kamera CMUCam2+ untuk mendeteksi warna
bola. Robot dikontrol menggunakan pengontrol mikro ATmega32 dan
Attiny2313.
Algoritma yang digunakan yaitu robot akan berjalan menyusuri
maze
.
Selama robot berjalan dalam
maze
, robot akan mengoreksi posisinya agar tidak
menabrak dinding. Kemudian robot akan bergerak menuju posisi masing-masing
bola yang letaknya sudah tetap. Setelah bola ditemukan, bola akan diambil dan
disimpan. Lalu robot akan mencari bola yang lainnya, mengambil dan kemudian
akan memasukkannya ke
goal.
Berdasarkan percobaan yang dilakukan dapat dikatakan bahwa robot
mobil dapat bermanuver menelusuri
maze
, mendeteksi warna dan koordinat bola
dengan menggunakan bantuan CMUCam2+ dan robot dapat mengambil serta
memasukkan bola ke
goal
untuk konfigurasi lapangan yang tetap.
Kata Kunci : KRCI-2010, Sensor Kamera CMUCam2+, Sensor Jarak Ultrasonik,
Pengontrol Mikro Atmega32, Pengontrol Mikro Attiny2313
(2)
U nive rsit a s K rist e n M a ra na t ha
ii
REALIZATION OF SOCCER PLAYER ROBOT
FOR KRCI 2010 BATTLE DIVISION
Composed by :
Name : William
Nrp
: 0622018
Electrical Engineering, Maranatha Cristian University,
Jl. Prof.Drg.Suria Sumantri, MPH no.65, Bandung, Indonesia.
Email : [email protected]
ABSTRACT
Indonesia Smart Robot Contest (KRCI) Battle Division robot race in 2010
with the ability of image recognition through the camera, because the contested
object is a specific colored balls which placed in certain place. In addition, the
robot must be able to recognize it’s own goal in order not to insert the ball in a
wrong goal.
At this Final Project, the car robot of soccer player made of the iron
framework of a robot. Robot movement using the differensial drive system with
actuator form two 7.5V DC 100rpm motor, in addition to the robot gripper is
given a movement by two servo motors and one dc motor to pick up the ball.
Sensors used are ultrasonic distance sensor to measure the distance a robot with
the environment and CMUCam2 + camera sensor to detect the ball's color. Robot
is controlled using the ATmega32 micro-controller and Attiny2313.
Algorithm used in the robot is the robot will move in maze. During the
robot’s moving in the maze, the robot will correct it’s position in order not to hit
the wall. Then the robot will move toward the position of each ball which position
has been fixed. After the ball was found, the ball will be put and stored. Then the
robot will search for another ball, take and then put it into the goal.
Based on experiments that can be said that the car robot maneuver through
the maze, to detect the ball’s color and coordinate using the assistance CMUCam2
+ and the robot can take and put the ball into the goal for a fixed field
configuration.
Key word : KRCI-2010, CMUCam2+ Camera Censor, Ultrasonic Distance
Censor, Microcontroller Atmega32, Microcontroller Attiny2313
(3)
U nive rsit a s K rist e n M a ra na t ha
v
DAFTAR ISI
Halaman
ABSTRAK ...
i
ABSTRACT ...
ii
KATA PENGANTAR ...
iii
DAFTAR ISI ...
v
DAFTAR TABEL ...
viii
DAFTAR GAMBAR ...
ix
BAB I
PENDAHULUAN
I.1 Latar Belakang ...
1
I.2 Identifikasi Masalah ...
2
I.3 Perumusan Masalah ...
2
I.4 Tujuan ...
2
I.5 Pembatasan Masalah ...
2
I.6 Spesifikasi Alat ...
3
I.7 Sistematika Penulisan ...
3
BAB II
LANDASAN TEORI
II.1 Penjelasan KRCI 2010 ...
5
II.2 Pengantar Robotika ...
8
II.2.1 Sistem Kontrol Robot ...
8
II.2.2 Teknik Manuver ...
9
II.3
Gripper
...
11
II.4 Sensor ...
14
II.4.1 Sensor Jarak Ultrasonik (SRF05) ...
14
II.4.2 Sensor Kamera CMUCam2+
...
18
II.4.2.1 Perintah Dasar pada CMUCam2+ ...
20
(4)
U nive rsit a s K rist e n M a ra na t ha
vi
II.5 Pengontrol Mikro ...
23
II.5.1 Pengenalan ATMEL AVR RISC ...
23
II.5.2 Pengontrol Mikro ATmega32...
24
II.5.2.1 Fitur ATmega32 ...
24
II.5.2.2 Konfigurasi Pin ATmega32 ...
25
II.5.2.3 Diagram Blok ATmega32 ...
28
II.5.2.4
General Purpose Register
ATmega32 ...
30
II.5.2.5 Peta Memori ATmega32 ...
30
II.5.2.6 PWM (
Pulse Width Modulation
) ATmega32 ...
32
II.5.2.7 Pin
Input/Output
ATmega32 ...
34
II.5.2.8 I2C(
Inter-Integrated Circuit
) ATmega32 ...
34
II.5.2.9 USART (
The Universal Synchronous and Asynchronous
Serial Receiver and Transmitter
) ATmega32 ...
35
II.5.3 Pengontrol Mikro Attiny2313 ...
37
II.5.3.1 Fitur Attiny2313 ...
37
II.5.3.2 Konfigurasi Pin Attiny2313 ...
38
II.5.3.3
Register
dan Memori Attiny2313 ...
41
II.5.3.4
Port
Input/Output
Attiny2313 ...
41
BAB III PERANCANGAN DAN REALISASI
III.1 Perancangan Sistem Robot Pemain Bola ...
43
III.2 Perancangan dan Realisasi Robot Pemain Bola ...
44
III.2.1 Bentuk Robot ...
44
III.2.2 Peletakan Sensor-Sensor ...
45
III.3 Rangkaian Sensor dan Pengontrol ...
48
III.3.1 Sensor ...
48
III.3.1.1 Sensor Jarak Ultrasonik (SRF05) ...
48
III.3.1.2 Sensor Kamera CMUCam2+ ...
49
III.3.1.2.1 Pemilihan
Baud Rate
...
50
III.3.1.2.2 Komunikasi Serial CMUCam2+ dengan Komputer ...
51
III.3.1.2.3 Realisasi Penggunaan CMUCam2+ ...
52
(5)
U nive rsit a s K rist e n M a ra na t ha
vii
III.3.2.1 Skematik Pengontrol Berbasis Pengontrol Mikro ATmega32
55
III.3.2.2 Skematik Pengontrol Berbasis Pengontrol Mikro Attiny2313
56
III.4 Algoritma Pemrograman Robot Pemain Bola ...
58
BAB IV DATA PENGAMATAN DAN ANALISIS
IV.1 Pengujian Sensor Kamera CMUCam2+ ...
98
IV.1.1 Pengujian terhadap Bola Tenis ...
98
IV.1.2 Pengujian terhadap Bola Pingpong ...
103
IV.2 Pengujian Algoritma Robot untuk Navigasi ...
106
IV.2.1 Pengujian Algoritma Navigasi untuk Pengambilan Bola Tenis ..
106
IV.2.2 Pengujian Algoritma Navigasi untuk Pengambilan Bola
Pingpong ...
108
IV.3 Pengujian Algoritma Robot untuk Navigasi dan Pengambilan Bola
109
IV.3.1 Pengujian Algoritma Robot untuk Navigasi dan
Pengambilan Bola Tenis ...
110
IV.3.2 Pengujian Algoritma Robot untuk Navigasi dan
Pengambilan Bola Pingpong ...
112
BAB V KESIMPULAN DAN SARAN
V.1 Kesimpulan ...
117
V.2 Saran ...
117
DAFTAR PUSTAKA ...
119
LAMPIRAN A FOTO ROBOT PEMAIN BOLA
LAMPIRAN B PROGRAM PADA PENGONTROL MIKRO ATMEGA32 dan
ATTINY2313
(6)
U nive rsit a s K rist e n M a ra na t ha
viii
DAFTAR TABEL
Halaman
Tabel 2.1 Fungsi Khusus
Port
B ...
27
Tabel 2.2 Fungsi Khusus
Port
C
...
27
Tabel 2.3 Fungsi Khusus
Port
D ...
28
Tabel 2.4 Konfigurasi
Port
ATmega32 ...
34
Tabel 2.5
Baud Rate
...
37
Tabel 2.6 Konfigurasi
Port
Attiny2313 ...
42
Tabel 3.1 Konfigurasi
Baud Rate
...
51
Tabel 4.1 Tabel Pengujian Algoritma Navigasi Strategi Pertama
Pengambilan Bola Tenis ...
107
Tabel 4.2 Tabel Pengujian Algoritma Navigasi Strategi Kedua
Pengambilan Bola Tenis ...
108
Tabel 4.3 Tabel Pengujian Algoritma Navigasi Pengambilan Bola
Pingpong ...
109
Tabel 4.4 Tabel Pengujian Algoritma Strategi Pertama Navigasi dan
Pengambilan Bola Tenis ...
111
Tabel 4.5 Tabel Pengujian Algoritma Strategi Kedua Navigasi dan
Pengambilan Bola Tenis ...
112
Tabel 4.6 Tabel Pengujian Algoritma Strategi Pertama Navigasi dan
Pengambilan Bola Pingpong ...
113
Tabel 4.7 Tabel Pengujian Algoritma Strategi Kedua Navigasi dan
Pengambilan Bola Pingpong ...
114
Tabel 4.8 Tabel Pengujian Algoritma Strategi Ketiga Navigasi dan
Pengambilan Bola Pingpong ...
116
Tabel 4.9 Tabel Pengujian Pengujian Navigasi dan Algoritma Pengambilan
Bola ...
116
(7)
U nive rsit a s K rist e n M a ra na t ha
ix
DAFTAR GAMBAR
Halaman
Gambar 2.1 Lapangan Pertandingan KRCI
Battle
2010 ...
6
Gambar 2.2 Bola Tenis dan Pingpong ...
7
Gambar 2.3 Kontrol Robot Loop Terbuka ...
8
Gambar 2.4 Kontrol Robot Loop Tertutup ...
9
Gambar 2.5
Gripper
Tunggal ...
11
Gambar 2.6
Gripper
Ganda ...
12
Gambar 2.7
Gripper
Eksternal ...
12
Gambar 2.8
Gripper
Internal ...
12
Gambar 2.9
Gripper
Mekanik ...
13
Gambar 2.10
Gripper
Vakum ...
13
Gambar 2.11
Gripper
magnetik ...
14
Gambar 2.12 Sensor Jarak Ultrasonik SRF05 ...
15
Gambar 2.13 Konfigurasi Pin Pertama ...
15
Gambar 2.14 Konfigurasi Pin ke Dua ...
16
Gambar 2.15 Diagram Waktu untuk Konfigurasi Pertama ...
16
Gambar 2.16 Diagram Waktu untuk Konfigurasi ke Dua ...
17
Gambar 2.17 Posisi Objek terhadap Sensor SRF05 ...
18
Gambar 2.18 CMUCam2+ ...
18
Gambar 2.19 Diagram Blok CMUCam2+ ...
19
Gambar 2.20 CMUCam2+
Color Tracking
...
20
Gambar 2.21 Perintah
\r
...
21
Gambar 2.22 Perintah
Reset
...
21
Gambar 2.23 Perintah
CR
...
21
Gambar 2.24 Format Perintah
RM
...
22
Gambar 2.25 Perintah
TC
...
22
Gambar 2.26 Konfigurasi Pin ATmega32 ...
26
Gambar 2.27 Diagram Blok ATmega32 ...
29
(8)
U nive rsit a s K rist e n M a ra na t ha
x
Gambar 2.29 Pemetaan Memori ATmega32 ...
31
Gambar 2.30 Pemetaan Memori Data ATmega32 ...
32
Gambar 2.31
Phase & Frequency Correct
PWM ...
33
Gambar 2.32 Gambaran Modul TWI keseluruhan ...
35
Gambar 2.33 Blok
USART
...
36
Gambar 2.34 Konfigurasi Pin Attiny2313 ...
39
Gambar 2.35 Diagram Blok Attiny2313 ...
40
Gambar 2.36
Register
Attiny2313 ...
41
Gambar 3.1 Diagram Blok Robot ...
43
Gambar 3.2 Bentuk
Gripper
...
44
Gambar 3.3 Dimensi dan Penempatan Sensor Robot Pemain Bola ...
46
Gambar 3.4 Algoritma Penggunaan Sensor SRF05 ...
49
Gambar 3.5 CMUCam2+
Board Layout
...
50
Gambar 3.6 Konfigurasi
Jumper Baud Rate
...
51
Gambar 3.7 Konfigurasi Kabel Serial CMUCam2+ dengan Komputer ..
52
Gambar 3.8 Contoh Tampilan GUI Mengambil Gambar ...
53
Gambar 3.9 Nilai RGB Maksimum dan Minimum ...
53
Gambar 3.10 Algoritma Penggunaan Sensor Kamera CMUCam2+ ...
54
Gambar 3.11 Skematik Pengontrol Berbasis Pengontrol Mikro ATmega32
56
Gambar 3.12 Skematik Pengontrol Berbasis Pengontrol Mikro Attiny2313
57
Gambar 3.13 Diagram Alir Algoritma Pemrograman pada ATmega 32 ...
58
Gambar 3.14 Diagram Alir Algoritma Pemrograman pada Attiny 2313 ...
97
Gambar 4.1 Tampilan GUI dalam Pengamatan Bola Tenis ...
98
Gambar 4.2 Posisi Bola Tenis Setelah di
Track Colour
...
99
Gambar 4.3 Proses Pengambilan Bola Tenis ...
100
Gambar 4.4 Pengujian terhadap Jarak Jangkauan Sensor Kamera ...
102
Gambar 4.5 Pengujian terhadap Sensor Kamera Bila diberikan Gangguan
Berupa Pergeseran Posisi pada Bola Tenis ...
103
Gambar 4.6 Tampilan GUI dalam Pengamatan Bola Pingpong ...
103
Gambar 4.7 Posisi Bola Pingpong Setelah di
Track Colour
...
104
(9)
U nive rsit a s K rist e n M a ra na t ha
xi
Gambar 4.9 Algoritma Navigasi untuk Strategi Pertama Pengambilan
Bola Tenis ...
106
Gambar 4.10 Algoritma Navigasi untuk Strategi Kedua Pengambilan
Bola Tenis ...
107
Gambar 4.11 Algoritma Navigasi untuk Pengambilan Bola Pingpong ...
108
Gambar 4.12 Algoritma Strategi Pertama Navigasi dan Pengambilan
Bola Tenis ... 110
Gambar 4.13 Algoritma Strategi Kedua Navigasi dan Pengambilan
Bola Tenis ...
111
Gambar 4.14 Algoritma Strategi Pertama Navigasi dan Pengambilan
Bola Pingpong ...
112
Gambar 4.15 Algoritma Strategi Kedua Navigasi dan Pengambilan
Bola Pingpong ...
113
Gambar 4.16 Algoritma Strategi Ketiga Navigasi dan Pengambilan
(10)
LAMPIRAN A
(11)
A-1
Tampak Atas
(12)
A-2
Tampak Samping
(13)
LAMPIRAN B
PROGRAM PADA PENGONTROL MIKRO
ATMEGA32 DAN ATTINY2313
(14)
B-1
PROGRAM UTAMA
PENGONTROL MIKRO ATMEGA32
/***************************************************** This program was produced by the
CodeWizardAVR V1.25.3 Professional Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Version :
Date : 8/21/2010 Author : WWW Company : KRCI Comments:
Chip type : ATmega32
Program type : Application Clock frequency : 11.059200 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 512
*****************************************************/ #include <mega32.h> #include <stdio.h> #include <delay.h> #include <core.c> #include <procedure.c> unsigned char buffer[32]; unsigned char cmucam[32]; unsigned int luiMemory = 0; unsigned int uiMemory = 0; unsigned int i;
unsigned char bMemory = 0; unsigned int timer = 0;
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) { timer++;
}
// Alphanumeric LCD Module functions #asm
.equ __lcd_port = 0x15;PORTC #endasm
#include <lcd.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) // 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;
(15)
B-1
// This flag is set on USART Receiver buffer overflowbit rx_buffer_overflow;
unsigned char receiverIndex = 0;
// 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; };
};
if (data == 'T' || receiverIndex >= 30) { receiverIndex = 0;
} else {
cmucam[receiverIndex] = data; receiverIndex++;
} }
#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];
#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>
(16)
B-2
//==========core============//// ---gripper---// #define POSISI_TANGKAP 0 #define POSISI_DEKAT 1 #define POSISI_JAUH 2 #define POSISI_TARUH 3 #define POSISI_SEDANG 4 #define CAPIT_BUKA 0 #define CAPIT_TUTUP 1 #define CAPIT_IDLE 2 unsigned char bMemPosisi = 4;
void kirimPerintah(unsigned char posisi, unsigned char capit) {
DDRD.3 = 1; DDRD.4 = 1;
if (bMemPosisi != posisi) { bMemPosisi = posisi; PORTD.3 = 1; PORTD.4 = 1; delay_ms(30); switch (posisi) {
case POSISI_TANGKAP: {
PORTD.3 = 1; PORTD.4 = 0; delay_ms(5); PORTD.3 = 0; PORTD.4 = 0; delay_ms(20); switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; }
break;
case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
break;
case CAPIT_IDLE: {
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } break; case POSISI_DEKAT: {
PORTD.3 = 1; PORTD.4 = 0; delay_ms(5); PORTD.3 = 0; PORTD.4 = 1; delay_ms(20); switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; }
break;
case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
break;
case CAPIT_IDLE: {
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } break; case POSISI_JAUH: {
PORTD.3 = 1; PORTD.4 = 0; delay_ms(5); PORTD.3 = 1; PORTD.4 = 0; delay_ms(20); switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; } break; case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
(17)
B-3
case CAPIT_IDLE:{
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } break; case POSISI_TARUH: {
PORTD.3 = 1; PORTD.4 = 0; delay_ms(5); PORTD.3 = 1; PORTD.4 = 1; delay_ms(20); switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; }
break;
case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
break;
case CAPIT_IDLE: {
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } break; case POSISI_SEDANG: {
PORTD.3 = 0; PORTD.4 = 1; delay_ms(5); PORTD.3 = 0; PORTD.4 = 0; delay_ms(20); switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; }
break;
case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
break;
case CAPIT_IDLE: {
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } break; }
} else {
switch (capit) { case CAPIT_BUKA: {
PORTD.3 = 0; PORTD.4 = 0; }
break;
case CAPIT_TUTUP: {
PORTD.3 = 0; PORTD.4 = 1; }
break;
case CAPIT_IDLE: {
PORTD.3 = 1; PORTD.4 = 0; } break; } delay_ms(10); } }
(18)
B-4
//---sensor ultrasonik---// unsigned int getPing(unsigned char i) { unsigned int jarak = 0;switch (i) { case 0: {
PORTA.0 = 0; DDRA.0 = 1; PORTA.0 = 1; delay_us(15); PORTA.0 = 0; DDRA.0 = 0;
while (PINA.0 == 0) { };
while (PINA.0 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; case 1: {
PORTA.1 = 0; DDRA.1 = 1; PORTA.1 = 1; delay_us(15); PORTA.1 = 0; DDRA.1 = 0;
while (PINA.1 == 0) { };
while (PINA.1 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; case 2: {
PORTA.2 = 0; DDRA.2 = 1; PORTA.2 = 1; delay_us(15); PORTA.2 = 0; DDRA.2 = 0;
while (PINA.2 == 0) { };
while (PINA.2 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; case 3: {
PORTA.3 = 0; DDRA.3 = 1; PORTA.3 = 1; delay_us(15); PORTA.3 = 0; DDRA.3 = 0;
while (PINA.3 == 0) { };
while (PINA.3 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; case 4: {
PORTA.4 = 0; DDRA.4 = 1; PORTA.4 = 1; delay_us(15); PORTA.4 = 0; DDRA.4 = 0;
while (PINA.4 == 0) { };
while (PINA.4 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; case 5: {
PORTA.5 = 0; DDRA.5 = 1; PORTA.5 = 1; delay_us(15);
(19)
B-5
PORTA.5 = 0;DDRA.5 = 0;
while (PINA.5 == 0) { };
while (PINA.5 == 1) { jarak++;
if (jarak > 9000) { break; } } delay_ms(5); } break; }
return jarak / 10; }
//---motor servo kontinu roda---// #define MAJU 0
#define BELOK_KIRI 1 #define PIVOT_KIRI 2 #define BELOK_KANAN 3 #define PIVOT_KANAN 4 #define MUNDUR 5 #define SLOW 0 #define FAST 1
void motorPulse(unsigned char speed, unsigned char direction) {
switch (speed) { case SLOW: {
switch (direction) { case MAJU: {
PORTB.0 = 1; PORTB.1 = 1; delay_us(1350); PORTB.0 = 0; delay_us(300); PORTB.1 = 0; delay_us(1350); }
break;
case BELOK_KIRI: {
PORTB.1 = 1; delay_us(1650); PORTB.1 = 0; delay_us(1350); }
break;
case PIVOT_KANAN:
{
PORTB.1 = 1; PORTB.0 = 1; delay_us(1350); PORTB.1 = 0; PORTB.0 = 0; delay_us(1650); }
break;
case BELOK_KANAN: {
PORTB.0 = 1; delay_us(1350); PORTB.0 = 0; delay_us(1650); }
break;
case PIVOT_KIRI: {
PORTB.1 = 1; PORTB.0 = 1; delay_us(1650); PORTB.1 = 0; PORTB.0 = 0; delay_us(1350); }
break; case MUNDUR: {
PORTB.0 = 1; PORTB.1 = 1; delay_us(1350); PORTB.1 = 0; delay_us(300); PORTB.0 = 0; delay_us(1350); } break; } } break; case FAST: {
switch (direction) { case MAJU: {
PORTB.0 = 1; PORTB.1 = 1; delay_us(1000); PORTB.0 = 0; delay_us(1000); PORTB.1 = 0;
(20)
B-6
delay_us(1000); } break; case BELOK_KIRI: {PORTB.1 = 1; delay_us(2000); PORTB.1 = 0; delay_us(1000); }
break;
case PIVOT_KANAN: {
PORTB.1 = 1; PORTB.0 = 1; delay_us(1000); PORTB.1 = 0; PORTB.0 = 0; delay_us(2000); }
break;
case BELOK_KANAN: {
PORTB.0 = 1; delay_us(1000); PORTB.0 = 0; delay_us(2000); }
break;
case PIVOT_KIRI: {
PORTB.1 = 1; PORTB.0 = 1; delay_us(2000); PORTB.1 = 0; PORTB.0 = 0; delay_us(1000); }
break; case MUNDUR: {
PORTB.0 = 1; PORTB.1 = 1; delay_us(1000); PORTB.1 = 0; delay_us(1000); PORTB.0 = 0; delay_us(1000); } break; } } break; } }
//============end of core==========//
// ---dip switch--- unsigned char terimaInput() {
DDRB &= 0x1F; DDRD &= 0x1F; DDRA &= 0x9F; PORTB |= ~0x1F; PORTD |= ~0x1F; PORTA |= ~0x9F;
return ~(((PINA & 0x60) << 1) | ((PIND & 0xE0) >> 2) | ((PINB & 0xE0) >> 5)); }
// ---servo tong---// SERVO_TONG PORTA.7 #define TUTUP 1
#define BUKA 0
void tong(unsigned int servo) { int i;
DDRA.7 = 1;
if (servo == TUTUP) { for (i = 0; i < 77; i++) { SERVO_TONG = 1; delay_us(2500); SERVO_TONG = 0; delay_us(17500); }
}
else if (servo == BUKA) { for (i = 0; i < 77; i++) { SERVO_TONG = 1; delay_us(700); SERVO_TONG = 0; delay_us(19300); }
} }
//========program untuk pengambilan bola tenis=====//
void RATA_BELAKANG() { while (getPing(2) != getPing(3)) { if (getPing(2) > getPing(3)) { motorPulse(SLOW, PIVOT_KANAN); } else motorPulse(SLOW, PIVOT_KIRI); }
(21)
B-7
}void MAJU_RATA_KIRI_1() {
while(getPing(1) < 150 || getPing(0) < 210){ if(getPing(4) < 35){
motorPulse (FAST, BELOK_KANAN);
}
else if(getPing(4) > 50){ motorPulse (FAST, BELOK_KIRI);
}
else motorPulse (FAST, MAJU); }
}
void MAJU_RATA_KANAN_1() { while(getPing(0) > 50){
if(getPing(1) < 32){ motorPulse (FAST, BELOK_KIRI);
}
else if(getPing(1) > 38){ motorPulse (FAST, BELOK_KANAN);
}
else motorPulse (FAST, MAJU); }
}
void MAJU_RATA_KANAN_2() { while (getPing(1) < 180 || getPing(3) >380){ if (getPing(4) < 30) {
motorPulse(FAST, PIVOT_KANAN);
} else if (getPing(4) > 50) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_1() { for(i=0; i<250; i++){
motorPulse(FAST, MAJU); }
}
void MAJU_2() { while(getPing(0) > 55){
motorPulse(FAST, MAJU); }
}
void MAJU_3() { while(getPing(0) > 60){
motorPulse(FAST, MAJU); }
}
void PIVOT_ KANAN_1() { while(getPing(2) > 100){
motorPulse(FAST, PIVOT_KANAN);
} }
void PIVOT_ KIRI_1() { while (getPing(3) > 100) {
motorPulse(FAST, PIVOT_KIRI); }
}
void CARI_TENIS_1() { kirimPerintah(POSISI_JAUH, CAPIT_IDLE);
printf("RS\r"); delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);
printf("TC 0 30 100 240 0 30\r"); delay_ms(100);
while (cmucam[0] == 0){
motorPulse(SLOW, PIVOT_KIRI); }
while (cmucam[1] < 138) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] < 50 ){
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] > 65) { motorPulse(FAST, BELOK_KANAN); } else motorPulse(FAST, MAJU); delay_ms(100); }
(22)
B-8
kirimPerintah(POSISI_SEDANG,CAPIT_IDLE); printf("RS\r"); delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);
printf("TC 0 30 100 240 0 30\r"); delay_ms(100);
while (cmucam[1] < 80) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] < 55){
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); } else motorPulse(FAST, MAJU); delay_ms(100); } kirimPerintah(POSISI_DEKAT, CAPIT_BUKA); delay_ms(500); printf("RS\r"); delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);
printf("TC 0 30 100 240 0 30\r"); delay_ms(100);
while (cmucam[1] < 20) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] < 55 ){
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); } else motorPulse(NORMAL, MAJU); delay_ms(100); }
for (i = 0; i < 100; i++){
motorPulse(SLOW, MUNDUR); } kirimPerintah(POSISI_TANGKAP, CAPIT_BUKA); delay_ms(500); kirimPerintah(POSISI_TANGKAP, CAPIT_TUTUP);
for (i = 0; i < 250; i++) motorPulse(FAST, MAJU); delay_ms(300);
kirimPerintah(POSISI_TARUH, CAPIT_TUTUP);
for (i = 0; i < 200; i++){
motorPulse(FAST, MUNDUR); } kirimPerintah(POSISI_TARUH, CAPIT_BUKA); delay_ms(500); kirimPerintah(POSISI_TARUH, CAPIT_TUTUP); }
void CARI_TENIS_2() {
kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);
printf("RS\r"); delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);
printf("TC 0 30 100 240 0 30\r"); delay_ms(100);
while (cmucam[1] < 80) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] < 55){
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); }
(23)
B-9
else motorPulse(FAST, MAJU); delay_ms(100); } kirimPerintah(POSISI_DEKAT, CAPIT_BUKA); delay_ms(500); printf("RS\r"); delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);printf("TC 0 30 100 240 0 30\r"); delay_ms(100);
while (cmucam[1] < 20) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(FAST, BELOK_KIRI); }
else if (cmucam[0] < 55 ){
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); } else motorPulse(NORMAL, MAJU); delay_ms(100); }
for (i = 0; i < 100; i++){
motorPulse(SLOW, MUNDUR); } kirimPerintah(POSISI_TANGKAP, CAPIT_BUKA); delay_ms(500); kirimPerintah(POSISI_TANGKAP, CAPIT_TUTUP);
for (i = 0; i < 250; i++) motorPulse(FAST, MAJU); delay_ms(300);
kirimPerintah(POSISI_TARUH, CAPIT_TUTUP);
for (i = 0; i < 200; i++){
motorPulse(FAST, MUNDUR); } kirimPerintah(POSISI_TARUH, CAPIT_BUKA); delay_ms(500); kirimPerintah(POSISI_TARUH, CAPIT_TUTUP); }
if (terimaInput() == 0x01) {
//////////////ambil tenis 1//////////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_TENIS_1(); while(getPing(0) > 45){ motorPulse(FAST, MAJU); }
while(getPing(4) > 30){
motorPulse(FAST, PIVOT_KANAN); }
kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);
while(cmucam[0] == 0){ if(getPing(4) < 28){
motorPulse (FAST, BELOK_KANAN); }
else if(getPing(4) > 35){
motorPulse (FAST, BELOK_KIRI); }
else motorPulse (FAST, MAJU);} while(cmucam[0] != 0){
CARI_BOLA_TENIS_2(); }
while(getPing(0) < 45){
motorPulse(FAST, PIVOT_KIRI); }
while(getPing(1) > 35){
motorPulse(FAST, PIVOT_KIRI); }
for(i=0; i<150; i++){ if(getPing(1) < 30){
motorPulse (FAST, BELOK_KIRI); }
else if(getPing(1) > 40){
motorPulse (FAST, BELOK_KANAN); }
else motorPulse (FAST, MAJU); }
while (getPing(2) > 20) {
motorPulse(FAST, PIVOT_KIRI); }
RATA_BELAKANG();
while (getPing(2) > 15 || getPing(3) > 15){ if (getPing(2) > getPing(3)){
(24)
B-10
motorPulse(SLOW, PIVOT_KANAN);}
else if (getPing(2) < getPing(3)){ motorPulse(SLOW, PIVOT_KIRI); }
else motorPulse(SLOW, MUNDUR); }
}
tong(BUKA); tong(TUTUP); }
if (terimaInput() == 0x02) {
////////////////ambil tenis 2//////////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_2(); MAJU_RATA_KANAN_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_3(); CARI_TENIS_1(); kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);
while(cmucam[0] == 0){ if(getPing(4) < 28){
motorPulse (FAST, BELOK_KANAN); }
else if(getPing(4) > 35){
motorPulse (FAST, BELOK_KIRI); }
else motorPulse (FAST, MAJU); }
while(cmucam[0] != 0){ CARI_BOLA_TENIS_2(); }
for(i=0; i<200; i++){ if(getPing(4) < 30){
motorPulse (FAST, BELOK_KANAN); }
else if(getPing(4) > 40){
motorPulse (FAST, BELOK_KIRI); }
else motorPulse (FAST, MAJU); }
while (getPing(3) > 20) {
motorPulse(FAST, PIVOT_KANAN); }
RATA_BELAKANG();
while (getPing(2) > 15 || getPing(3) > 15) { if (getPing(2) > getPing(3)){
motorPulse(SLOW, PIVOT_KANAN); }
else if (getPing(2) < getPing(3)) { motorPulse(SLOW, PIVOT_KIRI); }
else motorPulse(SLOW, MUNDUR); }
tong(BUKA); tong(TUTUP); }
if (terimaInput() == 0x03) {
////////////////navigasi tenis 1//////////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1();
while(getPing(0) < 45){
motorPulse(FAST, PIVOT_KIRI); }
while(getPing(1) > 35){
motorPulse(FAST, PIVOT_KIRI); }
for(i=0; i<150; i++){ if(getPing(1) < 30){
motorPulse (FAST, BELOK_KIRI); }
else if(getPing(1) > 40){
motorPulse (FAST, BELOK_KANAN); }
else motorPulse (FAST, MAJU); }
while (getPing(2) > 20) {
motorPulse(FAST, PIVOT_KIRI); }
RATA_BELAKANG(); }
if (terimaInput() == 0x04) {
(25)
B-11
kirimPerintah(POSISI_TARUH, CAPIT_IDLE); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_2(); MAJU_RATA_KANAN_2(); MAJU_3(); kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);while(cmucam[0] == 0){ if(getPing(4) < 28){
motorPulse (FAST, BELOK_KANAN); }
else if(getPing(4) > 35){
motorPulse (FAST, BELOK_KIRI); }
else motorPulse (FAST, MAJU); }
for(i=0; i<200; i++){ if(getPing(4) < 30){
motorPulse (FAST, BELOK_KANAN); }
else if(getPing(4) > 40){
motorPulse (FAST, BELOK_KIRI); }
else motorPulse (FAST, MAJU); }
while (getPing(3) > 20) {
motorPulse(FAST, PIVOT_KANAN); }
RATA_BELAKANG(); }
//=====program untuk pengambilan bola tenis=====//
//======program untuk pengambilan bola pingpong====//
void RATA_BELAKANG() { while (getPing(2) != getPing(3)) { if (getPing(2) > getPing(3)) { motorPulse(SLOW, PIVOT_KANAN); } else motorPulse(SLOW, PIVOT_KIRI); } }
void MAJU_1() { for (i = 0; i < 250; i++) {
motorPulse(FAST, MAJU); }
}
void MAJU_2() { while (getPing(0) > 55) { motorPulse(FAST, MAJU); }
}
void MAJU_3() {
while (getPing(3) > 180) { motorPulse(FAST, MAJU); }
}
void KELUAR_1() {
while (getPing(0) > 48 || getPing(1) < 150) { if (getPing(4) < 30) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 55) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void KELUAR_2() {
while (getPing(0) > 180 || getPing(1) < 150) {
if (getPing(4) < 30) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 55) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void KELUAR_3() {
while (getPing(1) < 150 || getPing(4) < 150) {
if (getPing(4) < 30) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 55) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
(26)
B-12
void MAJU_RATA_KANAN_1() {while (getPing(0) > 50) { if (getPing(1) < 35) {
motorPulse(FAST, BELOK_KIRI); }
else if (getPing(1) > 50) {
motorPulse(FAST, BELOK_KANAN); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KANAN_2() { while (getPing(0) > 200) {
if (getPing(1) < 35) {
motorPulse(FAST, BELOK_KIRI); }
else if (getPing(1) > 50) {
motorPulse(FAST, BELOK_KANAN); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KANAN_3() { while (getPing(4) < 180 || getPing(3) < 380) {
if (getPing(1) < 30) {
motorPulse(FAST, PIVOT_KIRI); }
else if (getPing(1) > 50) {
motorPulse(FAST, PIVOT_KANAN); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KANAN_4() { while (getPing(0) > 180 || getPing(1) < 150) {
if (getPing(1) < 35) {
motorPulse(FAST, PIVOT_KIRI); }
else if (getPing(1) > 50) {
motorPulse(FAST, PIVOT_KANAN); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KANAN_5() { for (i = 0; i < 200; i++) {
if (getPing(1) < 35) {
motorPulse(FAST, PIVOT_KIRI);
}
else if (getPing(1) > 50) {
motorPulse(FAST, PIVOT_KANAN); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_1() { while(getPing(0) > 185){ if (getPing(4) < 35) {
motorPulse(SLOW, PIVOT_KANAN); }
else if (getPing(4) > 40) {
motorPulse(SLOW, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_2() { while(getPing(0) > 50){ if (getPing(4) < 30) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 55) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_3() { while(getPing(3) < 230){ if (getPing(4) < 35) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 50) {
motorPulse(FSAT, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_4() { while(getPing(0) < 198){ if (getPing(4) < 35) {
motorPulse(SLOW, PIVOT_KANAN); }
else if (getPing(4) > 40) {
motorPulse(SLOW, PIVOT_KIRI); }
(27)
B-13
else motorPulse(FAST, MAJU);} }
void MAJU_RATA_KIRI_5() { for (i = 0; i < 500; i++) { if (getPing(4) < 35) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 50) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_6() { for (i = 0; i < 150; i++) { if (getPing(4) < 35) {
motorPulse(FAST, PIVOT_KANAN); }
else if (getPing(4) > 50) {
motorPulse(FAST, PIVOT_KIRI); }
else motorPulse(FAST, MAJU); }
}
void MAJU_RATA_KIRI_7() {
while (getPing(1) < 150 || getPing(0) < 200) {
if (getPing(4) < 35) {
motorPulse(FAST, BELOK_KANAN); }
else if (getPing(4) > 50) {
motorPulse(FAST, BELOK_KIRI); }
else motorPulse(FAST, MAJU); }
}
void PIVOT_KIRI_1() { while (getPing(3) > 100) { motorPulse(FAST, PIVOT_KIRI); }
}
void PIVOT_KIRI_2() { for (i = 0; i < 200; i++) {
motorPulse(FAST, PIVOT_KIRI); }
}
void PIVOT_KANAN_1() { while (getPing(2) > 100) {
motorPulse(FAST, PIVOT_KANAN); }
}
void MUTAR_BALIK() { while(getPing(0) <165){ if (getPing(1) > getPing(4)) bMemory = 1;
else if (getPing(1) < getPing(4)) bMemory = 2;
while (getPing(0) < 250 || getPing(2) > 150) {
if (bMemory == 1) {
motorPulse(NORMAL, PIVOT_KANAN); } else { motorPulse(NORMAL, PIVOT_KIRI); } } } }
void MAJU_GOAL() { while (getPing(0) > 30) { motorPulse(FAST, MAJU); }
}
void PIVOT_GOAL() { while (getPing(2) > 20) {
motorPulse(FAST, PIVOT_KIRI); }
}
void GOAL() {
while (getPing(2) > 15 || getPing(3) > 15) { if (getPing(3) > getPing(2)) {
motorPulse(SLOW, PIVOT_KIRI); }
else if (getPing(3) < getPing(2)) { motorPulse(SLOW, PIVOT_KANAN); }
else motorPulse(SLOW, MUNDUR); }
tong(BUKA); tong(TUTUP); }
void CARI_PINGPONG_1() { timer = 0;
kirimPerintah(POSISI_JAUH, CAPIT_IDLE);
(28)
B-14
printf("RS\r");delay_ms(100); printf("CR 18 32\r"); delay_ms(100); printf("RM 3\r"); delay_ms(100);
printf("TC 100 240 70 240 0 30\r"); //100 240 0 77 0 50
delay_ms(100);
while (cmucam[0] == 0)
motorPulse(FAST, PIVOT_KIRI); for (i = 0; i < 100; i++)
motorPulse(FAST, MAJU);
while (getPing(0) > 150 || getPing(2) < 160) {
if (getPing(1) > getPing(4)) { motorPulse(SLOW, BELOK_KANAN); }
else if (getPing(1) < getPing(4)) { motorPulse(SLOW, BELOK_KIRI); }
else motorPulse(FAST, MAJU); if (timer == 12)
return; }
kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);
delay_ms(500);
while (cmucam[1] < 125) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] < 45) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); } else motorPulse(FAST, MAJU); delay_ms(100);
if (timer == 12) return; }
while (cmucam[0] < 45 || cmucam[0] > 60) {
if (cmucam[0] < 45) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) { motorPulse(SLOW, BELOK_KANAN); }
else motorPulse(FAST, MAJU); if (timer == 12)
return; }
kirimPerintah(POSISI_DEKAT, CAPIT_BUKA);
delay_ms(500); while (1) {
if (cmucam[1] > 120)
motorPulse(SLOW, MUNDUR); else if (cmucam[0] < 50) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) motorPulse(SLOW, BELOK_KANAN); if (timer == 12) return; }
for (i = 0; i < 120; i++){
motorPulse(SLOW, MUNDUR); kirimPerintah(POSISI_TANGKAP, CAPIT_IDLE); delay_ms(500); kirimPerintah(POSISI_TANGKAP, CAPIT_TUTUP); }
for (i = 0; i < 200; i++){ motorPulse(FAST, MAJU); delay_ms(200);
kirimPerintah(POSISI_TARUH, CAPIT_TUTUP);
}
for (i = 0; i < 260; i++){ motorPulse(FAST, MUNDUR); kirimPerintah(POSISI_TARUH, CAPIT_BUKA); delay_ms(500); } }
(29)
B-15
void CARI_PINGPONG_2() {timer = 0;
kirimPerintah(POSISI_SEDANG, CAPIT_IDLE);
delay_ms(500);
if (getPing(1) > getPing(4)) bMemory = 1;
else if (getPing(1) < getPing(4)) bMemory = 2;
delay_ms(500);
while (cmucam[0] == 0 && cmucam[1] == 0) {
if (bMemory == 1) { motorPulse(SLOW, PIVOT_KANAN); }
else if (bMemory == 2) {
motorPulse(SLOW, PIVOT_KIRI); }
if (timer == 12) return; }
while (cmucam[1] < 130) {
if (cmucam[0] == 0 || cmucam[1] == 0) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] < 35) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 50) { motorPulse(SLOW, BELOK_KANAN); } else motorPulse(SLOW, MAJU); delay_ms(100);
if (timer == 12) return; }
while (cmucam[0] < 35 || cmucam[0] > 50) {
if (cmucam[0] < 35) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 50) { motorPulse(SLOW, BELOK_KANAN); }
else break; if (timer == 12) return; }
kirimPerintah(POSISI_DEKAT, CAPIT_BUKA);
delay_ms(500); while (1) {
if (cmucam[1] > 120)
motorPulse(SLOW, MUNDUR); else if (cmucam[0] < 50) {
motorPulse(SLOW, BELOK_KIRI); }
else if (cmucam[0] > 60) motorPulse(SLOW, BELOK_KANAN); if (timer == 12) return; }
for (i = 0; i < 120; i++){
motorPulse(SLOW, MUNDUR); kirimPerintah(POSISI_TANGKAP, CAPIT_IDLE); delay_ms(500); kirimPerintah(POSISI_TANGKAP, CAPIT_TUTUP); }
for (i = 0; i < 200; i++){ motorPulse(FAST, MAJU); delay_ms(200);
kirimPerintah(POSISI_TARUH, CAPIT_TUTUP);
}
for (i = 0; i < 260; i++){ motorPulse(FAST, MUNDUR); kirimPerintah(POSISI_TARUH, CAPIT_BUKA); delay_ms(500); } }
if (terimaInput() == 0x01) { ////////////////////////ambil pingpong 1/////////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_2(); MAJU_2(); PIVOT_KIRI_1(); MAJU_RATA_KANAN_1();
(30)
B-16
PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MAJU_RATA_KANAN_3(); MAJU_GOAL(); PIVOT_GOAL(); RATA_BELAKANG(); GOAL(); }if (terimaInput() == 0x02) {
/////////////ambil pingpong 2//////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_2(); MAJU_2(); PIVOT_KIRI_1(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MAJU_RATA_KANAN_3(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_2(); PIVOT_KIRI_2(); MAJU_RATA_KANAN_4(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_3(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_4(); PIVOT_KANAN_1(); RATA_BELAKANG();
(31)
B-17
MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_6(); MAJU_RATA_KIRI_7(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_3(); MAJU_RATA_KANAN_5(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_3(); PIVOT_KANAN_1(); MAJU_GOAL(); PIVOT_GOAL(); RATA_BELAKANG(); GOAL(); }if (terimaInput() == 0x03) { //////////////////ambil pingpong 3/////////////////////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_2(); MAJU_2(); PIVOT_KIRI_1(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MAJU_RATA_KANAN_3(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_2(); PIVOT_KIRI_2(); MAJU_RATA_KANAN_4(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_3(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_4(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); CARI_PINGPONG_1(); CARI_PINGPONG_2(); kirimPerintah(POSISI_TARUH, CAPIT_IDLE);
(32)
B-18
MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_5(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_GOAL(); PIVOT_GOAL(); RATA_BELAKANG(); GOAL(); }if (terimaInput() == 0x04) { /////////navigasi pingpong ///////// kirimPerintah(POSISI_TARUH, CAPIT_IDLE); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_RATA_KANAN_2(); MAJU_2(); PIVOT_KIRI_1(); MAJU_RATA_KANAN_1(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_1(); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_1(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MAJU_RATA_KANAN_3(); PIVOT_KIRI_1(); RATA_BELAKANG(); MAJU_2(); PIVOT_KIRI_2(); MAJU_RATA_KANAN_4(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_3(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_4(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_1(); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_2(); MAJU_2(); PIVOT_KANAN_1(); MAJU_RATA_KIRI_2(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_RATA_KIRI_6(); MAJU_RATA_KIRI_7(); PIVOT_KANAN_1(); RATA_BELAKANG(); MAJU_3(); MAJU_RATA_KANAN_5(); MUTAR_BALIK(); RATA_BELAKANG(); KELUAR_3(); PIVOT_KANAN_2(); MAJU_GOAL(); PIVOT_GOAL(); RATA_BELAKANG(); }
//===program untuk pengambilan bola pingpong===========//
(33)
B-19
PENGONTROL MIKRO ATTINY2313/*********************************** ******************
This program was produced by the CodeWizardAVR V1.25.3 Professional Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com Project : Version :
Date : 8/21/2010 Author : WWW Company : KRCI Comments :
Chip type : ATtiny2313 Clock frequency : 11.059200 MHz
Memory model : Tiny External SRAM size : 0 Data Stack size : 32
************************************ *****************/
#include <tiny2313.h> #include "gripper.c"
// Declare your global variables here void main(void) {
// Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize-
CLKPR = 0x80; CLKPR = 0x00;
#ifdef _OPTIMIZE_SIZE_ #pragma optsize+
#endif
// Input/Output Ports initialization // Port A initialization
// Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA = 0x00;
DDRA = 0x00; // Port B initialization
// Func7=In Func6=In Func5=In
Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0 PORTB = 0x00;
DDRB = 0x07; // Port D initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTD = 0x00; DDRD = 0x0F;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A = 0x00;
TCCR0B = 0x00; TCNT0 = 0x00; OCR0A = 0x00; OCR0B = 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 // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off
TCCR1A = 0x00; TCCR1B = 0x00; TCNT1H = 0x00; TCNT1L = 0x00; ICR1H = 0x00; ICR1L = 0x00; OCR1AH = 0x00; OCR1AL = 0x00; OCR1BH = 0x00; OCR1BL = 0x00;
// External Interrupt(s) initialization // INT0: Off
(34)
B-20
// Interrupt on any change on pinsPCINT0-7: Off GIMSK = 0x00; MCUCR = 0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK = 0x00;
// Universal Serial Interface initialization // Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off USICR = 0x00;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR = 0x80; DDRB.0 = 1; DDRB.1 = 1; DDRB.2 = 1; DDRD.0 = 0; DDRD.1 = 0; DDRD.2 = 1; DDRD.3 = 1;
while (1) {
if (PIND.0 == 1 && PIND.1 == 0) { delay_ms(10);
if (PIND.0 == 0 && PIND.1 == 0) { delay_ms(30);
while (1){
lengan(POSISI_TANGKAP); if(PIND.0 == 0 && PIND.1 == 0)
capit(CAPIT_BUKA); else if(PIND.0 == 0 && PIND.1 == 1)
capit(CAPIT_TUTUP); else if(PIND.0 == 1 && PIND.1 == 0)
capit(CAPIT_IDLE); else
break; }
} else if (PIND.0 == 0 && PIND.1 == 1) {
delay_ms(30); while (1){
lengan(POSISI_LIHAT_DEKAT);
if(PIND.0 == 0 && PIND.1 == 0)
capit(CAPIT_BUKA); else if(PIND.0 == 0 && PIND.1 == 1)
capit(CAPIT_TUTUP); else if(PIND.0 == 1 && PIND.1 == 0)
capit(CAPIT_IDLE); else
break; }
} else if (PIND.0 == 1 && PIND.1 == 0) {
delay_ms(30); while (1){
lengan(POSISI_LIHAT_JAUH);
if(PIND.0 == 0 && PIND.1 == 0)
capit(CAPIT_BUKA); else if(PIND.0 == 0 && PIND.1 == 1)
capit(CAPIT_TUTUP); else if(PIND.0 == 1 && PIND.1 == 0)
capit(CAPIT_IDLE); else
break; }
}
else if (PIND.0 == 1 && PIND.1 == 1) {
delay_ms(30); while (1){
lengan(POSISI_TARUH); if(PIND.0 == 0 && PIND.1 == 0)
capit(CAPIT_BUKA); else if(PIND.0 == 0 && PIND.1 == 1)
capit(CAPIT_TUTUP); else if(PIND.0 == 1 && PIND.1 == 0)
capit(CAPIT_IDLE); else
break; }
}
} else if (PIND.0 == 0 && PIND.1 == 1) {
(35)
B-21
delay_ms(10);if (PIND.0 == 0 && PIND.1 == 0) { delay_ms(30);
while (1){
lengan(POSISI_LIHAT_SEDANG); if(PIND.0 == 0 && PIND.1 == 0)
capit(CAPIT_BUKA); else if(PIND.0 == 0 && PIND.1 == 1)
capit(CAPIT_TUTUP); else if(PIND.0 == 1 && PIND.1 == 0)
capit(CAPIT_IDLE); else break; } } } } //===========gripper============// #include <delay.h>
#define CAPIT_TUTUP 0 #define CAPIT_BUKA 1 #define CAPIT_IDLE 2 #define POSISI_TANGKAP 0 #define POSISI_LIHAT_DEKAT 1 #define POSISI_LIHAT_JAUH 2 #define POSISI_TARUH 3 #define POSISI_LIHAT_SEDANG 4 //---capit--- unsigned char capit(unsigned char mode){ //en portb.0
//in1 portb.1 //in2 portb.2 switch(mode){
case CAPIT_TUTUP:{ PORTB = 0x03; }break;
case CAPIT_BUKA:{ PORTB = 0x05; }break;
case CAPIT_IDLE:{ PORTB = 0x00; }break;
} return 0; }
//---lengan---
void lengan(unsigned int derajat){ switch(derajat){
case POSISI_TANGKAP:{ PORTD.2 = 1; PORTD.3 = 1; delay_us(750); PORTD.2 = 0; delay_us(1500); PORTD.3 = 0; delay_us(17800); }break;
case POSISI_LIHAT_DEKAT:{ PORTD.2 = 1;
PORTD.3 = 1; delay_us(1300); PORTD.2 = 0; delay_us(400); PORTD.3 = 0; delay_us(18300); }break;
case POSISI_LIHAT_JAUH:{ PORTD.2 = 1;
PORTD.3 = 1; delay_us(1200); PORTD.3 = 0; delay_us(600); PORTD.2 = 0; delay_us(18200); }break; case POSISI_TARUH:{ PORTD.2 = 1; PORTD.3 = 1; delay_us(900); PORTD.3 = 0; delay_us(1600); PORTD.2 = 0; delay_us(17500); }break;
case
POSISI_LIHAT_SEDANG:{ PORTD.2 = 1; PORTD.3 = 1; delay_us(1500); PORTD.2 = 0; PORTD.3 = 0; delay_us(18500); }break;
} }
(36)
LAMPIRAN C
DATASHEET
Sensor Jarak Ultrasonik ( SRF05 )
... C-1
Sensor Kamera( CMUCam2+)
... C-5
(37)
C-1
(38)
(39)
(40)
(41)
C-5
(42)
(43)
(44)
(45)
(46)
(47)
(48)
(49)
(50)
(51)
(52)
(53)
(54)
(55)
(56)
(57)
(58)
(59)
1
U nive rsit a s K rist e n M a ra na t haBAB I
PENDAHULUAN
Pada bab ini berisi tentang latar belakang, identifikasi masalah, perumusan
masalah, tujuan, pembatasan masalah, spesifikasi alat dan sistematika penulisan
laporan tugas akhir.
I.1 Latar
Belakang
Robot adalah sebuah alat mekanik yang dapat melakukan tugas fisik, baik
menggunakan pengawasan dan kontrol manusia, ataupun menggunakan program
yang telah didefinisikan terlebih dulu (kecerdasan buatan). Robot biasanya
digunakan untuk tugas yang berat, berbahaya, pekerjaan yang berulang dan kotor.
Umumnya robot industri digunakan dalam bidang produksi. Penggunaan robot
lainnya termasuk untuk pembersihan limbah beracun, penjelajahan bawah air dan
luar angkasa, pertambangan, pekerjaan "cari dan bantu" (search and rescue) dan
untuk pencarian tambang. Untuk saat ini, robot dengan tingkat kemampuan tinggi
yang sedang dikembangkan adalah robot yang memiliki image processing.
Kontes Robot Cerdas Indonesia bertujuan untuk meningkatkan kreatifitas
dan inovasi dari mahasiswa. Dalam hal ini KRCI 2010 Divisi Battle
memperlombakan robot dengan kemampuan pengenalan citra (image) melalui
kamera, karena objek yang diperebutkan adalah bola-bola berwarna tertentu yang
diletakkan di tempat-tempat tertentu. Selain itu robot harus dapat mengenali goal
atau gawangnya sendiri agar tidak salah memasukkan bola. Robot–robot tersebut
harus dirancang dan dibuat sendiri, dengan menggunakan sensor-sensor, aktuator
serta pengontrol mikro yang ada dan harus diprogram sesuai dengan tema kontes
setiap tahunnya.
(60)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha
2
I.2 Identifikasi
Masalah
Kebutuhan akan robot yang memiliki kemampuan mencari, mengambil
dan memasukkan bola ke dalam suatu goal pada lapangan yang dijelaskan pada
peraturan KRCI 2010.
I.3 Perumusan
Masalah
Perumusan masalah yang akan dibahas dalam Tugas Akhir ini adalah
bagaimana merealisasikan dan memprogram robot untuk mencari, mengambil dan
memasukkan bola ke dalam goal pada KRCI 2010 Divisi Battle.
I.4 Tujuan
Tujuan yang akan dicapai dalam Tugas Akhir ini adalah untuk membuat
robot yang mampu mencari, mengambil dan memasukkan bola ke dalam goal
pada konfigurasi lapangan yang tetap dalam KRCI 2010 Divisi Battle.
I.5 Pembatasan
Masalah
Agar permasalahan yang dibahas terfokus dan tidak melebar, maka Tugas
Akhir dengan judul
“Realisasi Robot Pemain Bola untuk KRCI 2010 Divisi
Battle
”
mengambil batasan masalah sebagai berikut:
1.
Lapangan berukuran 500 cm x 500 cm.
2.
Simulasi hanya dilakukan pada setengah lapangan.
3.
Simulasi hanya dilakukan untuk Tim Biru.
4.
Dimensi maksimum robot adalah 30 cm x 30 cm x 30 cm.
5.
Waktu maksimal yang digunakan dalam mencari, mengambil dan
memasukkan bola hanya 3 menit.
(61)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha
3
I.6 Spesifikasi
Alat
Spesifikasi alat yang digunakan adalah sebagai berikut:
1.
Pengontrol menggunakan rangkaian
ATmega32 yang ditambah
dengan sebuah LCD 2 x 16 dan Attiny 2313.
2.
Pengambilan bola dengan menggunakan pencapit yang terdiri dari 1
buah motor dc dan 2 buah motor servo.
3.
Sensor Jarak Ultrasonik sebanyak 5 buah yang digunakan untuk
mengetahui jarak robot dengan lingkungan sekitarnya.
4.
Sensor Kamera (CMUCam2+) yang digunakan untuk mengetahui
posisi dan warna bola.
5.
Robot memiliki kecepatan maksimum 40cm/s.
I.7 Sistematika
Penulisan
Sistematika pembahasan laporan Tugas Akhir ini disusun menjadi lima
bab, yaitu:
BAB I PENDAHULUAN
Bab ini berisi tentang latar belakang, identifikasi masalah, perumusan masalah,
tujuan, pembatasan masalah, spesifikasi alat dan sistematika penulisan laporan
tugas akhir.
BAB II LANDASAN TEORI
Pada bab ini dijelaskan mengenai teori-teori penunjang yang diperlukan dalam
merancang dan merealisasikan robot pemain bola yaitu berupa penjelasan KRCI
2010, teori robotika, teori gripper, sensor-sensor dan pengontrol mikro.
BAB III PERANCANGAN DAN REALISASI
Bab ini membahas perancangan dan realisasi struktur robot, sensor, rangkaian
pengontrol mikro dan algoritma pemrograman pada robot.
BAB IV DATA PENGAMATAN DAN ANALISIS
Pada bab ini akan dibahas hasil pengujian sensor kamera CMUCam2+, pengujian
algoritma untuk navigasi robot dan pengujian algoritma untuk mencari,
mengambil dan memasukkan bola ke goal pada lapangan.
(62)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha
4
BAB V KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari Tugas Akhir dan saran-saran yang perlu dilakukan
untuk perbaikan di masa mendatang.
(63)
117
U nive rsit a s K rist e n M a ra na t haBAB V
KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari tugas akhir dan saran-saran yang perlu
dilakukan untuk perbaikan di masa mendatang.
V.1
Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab
sebelumnya, dapat disimpulkan bahwa:
1.
Strategi yang digunakan kurang tepat dikarenakan kecepatan robot yang
lambat. Sehingga sulit untuk mengambil semua bola dalam waktu 3 menit.
2.
Robot dapat dikendalikan menggunakan pengontrol mikro ATMega32 dan
Attiny2313 untuk melakukan navigasi menyusuri ruangan, mencari,
mengambil dan memasukkan bola ke
goal
.
3.
Robot dapat mencari dan mengambil bola jika posisi bola bergeser dari
tempat semula bola berada, dengan syarat bola masih berada dalam jarak
jangkauan sensor kamera CMUCam2+.
4.
Intensitas cahaya pada ruangan sangat mempengaruhi keberhasilan robot
dalam mencari dan mengambil bola.
V.2
Saran
Saran-saran yang dapat diberikan untuk perbaikan dan pengembangan dari
Tugas Akhir ini adalah sebagai berikut:
1.
Algoritma pemrograman ditambahkan pengontrol PID, supaya pergerakan
robot dalam bermanuver lebih baik.
2.
Dimensi robot diperkecil sehingga memudahkan pergerakan robot.
3.
Penempatan sensor jarak ultrasonik diperbaiki, sehingga kesalahan
pembacaan sensor jarak ultrasonik dapat dikurangi.
4.
Bentuk gripper diganti dengan gripper yang mampu mengambil beberapa
bola dalam waktu yang bersamaan.
(64)
Bab V Kesimpulan dan Saran
U nive rsit a s K rist e n M a ra na t ha
118
5.
Motor servo kontinu pada robot diganti dengan motor yang memiliki
kecepatan lebih tinggi, sehingga waktu yang digunakan dalam mencari,
mengambil dan memasukkan bola ke
goal
lebih singkat.
6.
Penambahan strategi “Hit and Search”, dimana terlebih dahulu posisi bola
digeser dari tempat semula, kemudian mencari bola tersebut.
(65)
Universitas Kristen Maranatha
118
DAFTAR PUSTAKA
1.
Andrianto, Heri.
Pemrograman Mikrokontroler AVR ATMEGA16
Menggunakan Bahasa C (CodeVision AVR).
Bandung : Informatika. 2008.
2.
Budiharto, W.
Membuat Robot Cerdas
. Jakarta : Gramedia. 2006.
3.
Pitowarno, E.
Robotika Disain, Kontrol, dan Kecerdasan Buatan
. Edisi ke-1,
Yogyakarta : Andi. 2006.
4.
Sigit, Riyanto.
Robotika, Sensor, dan Aktuator.
Edisi ke-1, Yogyakarta :
Graha Ilmu. 2007.
5.
Sumbodo, Wirawan.
Bahan Ajar: Sistem Otomasi Industri
. Semarang :
2008.
6.
Supriadi, Ahmad.
Perencanaan Jalur dan Penghindaran Tabrakan pada
Robot POEMAV
. Bandung.
7.
Tugino.
Robot End Effector
. Yogyakarta : 2007.
8.
Anonim.
, Buku Panduan KRCI 2010
. Jakarta : DIKTI. 2009.
9.
Anonymous,
ATMega32 datasheet
. Amerika : Atmel. 2006.
10.
Anonymous,
ATTiny2313 datasheet
. Amerika : Atmel. 2010.
11.
Anonymous,
CMUcam2 Vision Sensor User Guide
. Amerika : Acroname.
12.
Anonymous,
SRF05 - Ultra-Sonic Ranger Technical Specification.
Inggris :
(1)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha 2
I.2 Identifikasi Masalah
Kebutuhan akan robot yang memiliki kemampuan mencari, mengambil dan memasukkan bola ke dalam suatu goal pada lapangan yang dijelaskan pada peraturan KRCI 2010.
I.3 Perumusan Masalah
Perumusan masalah yang akan dibahas dalam Tugas Akhir ini adalah bagaimana merealisasikan dan memprogram robot untuk mencari, mengambil dan memasukkan bola ke dalam goal pada KRCI 2010 Divisi Battle.
I.4 Tujuan
Tujuan yang akan dicapai dalam Tugas Akhir ini adalah untuk membuat robot yang mampu mencari, mengambil dan memasukkan bola ke dalam goal
pada konfigurasi lapangan yang tetap dalam KRCI 2010 Divisi Battle.
I.5 Pembatasan Masalah
Agar permasalahan yang dibahas terfokus dan tidak melebar, maka Tugas Akhir dengan judul “Realisasi Robot Pemain Bola untuk KRCI 2010 Divisi Battle” mengambil batasan masalah sebagai berikut:
1. Lapangan berukuran 500 cm x 500 cm.
2. Simulasi hanya dilakukan pada setengah lapangan. 3. Simulasi hanya dilakukan untuk Tim Biru.
4. Dimensi maksimum robot adalah 30 cm x 30 cm x 30 cm.
5. Waktu maksimal yang digunakan dalam mencari, mengambil dan memasukkan bola hanya 3 menit.
(2)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha 3
I.6 Spesifikasi Alat
Spesifikasi alat yang digunakan adalah sebagai berikut:
1. Pengontrol menggunakan rangkaian ATmega32 yang ditambah dengan sebuah LCD 2 x 16 dan Attiny 2313.
2. Pengambilan bola dengan menggunakan pencapit yang terdiri dari 1 buah motor dc dan 2 buah motor servo.
3. Sensor Jarak Ultrasonik sebanyak 5 buah yang digunakan untuk mengetahui jarak robot dengan lingkungan sekitarnya.
4. Sensor Kamera (CMUCam2+) yang digunakan untuk mengetahui posisi dan warna bola.
5. Robot memiliki kecepatan maksimum 40cm/s.
I.7 Sistematika Penulisan
Sistematika pembahasan laporan Tugas Akhir ini disusun menjadi lima bab, yaitu:
BAB I PENDAHULUAN
Bab ini berisi tentang latar belakang, identifikasi masalah, perumusan masalah, tujuan, pembatasan masalah, spesifikasi alat dan sistematika penulisan laporan tugas akhir.
BAB II LANDASAN TEORI
Pada bab ini dijelaskan mengenai teori-teori penunjang yang diperlukan dalam merancang dan merealisasikan robot pemain bola yaitu berupa penjelasan KRCI 2010, teori robotika, teori gripper, sensor-sensor dan pengontrol mikro.
BAB III PERANCANGAN DAN REALISASI
Bab ini membahas perancangan dan realisasi struktur robot, sensor, rangkaian pengontrol mikro dan algoritma pemrograman pada robot.
BAB IV DATA PENGAMATAN DAN ANALISIS
Pada bab ini akan dibahas hasil pengujian sensor kamera CMUCam2+, pengujian algoritma untuk navigasi robot dan pengujian algoritma untuk mencari, mengambil dan memasukkan bola ke goal pada lapangan.
(3)
BAB I PENDAHULUAN
U nive rsit a s K rist e n M a ra na t ha 4
BAB V KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari Tugas Akhir dan saran-saran yang perlu dilakukan untuk perbaikan di masa mendatang.
(4)
117
U nive rsit a s K rist e n M a ra na t haBAB V
KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari tugas akhir dan saran-saran yang perlu
dilakukan untuk perbaikan di masa mendatang.
V.1
Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab
sebelumnya, dapat disimpulkan bahwa:
1.
Strategi yang digunakan kurang tepat dikarenakan kecepatan robot yang
lambat. Sehingga sulit untuk mengambil semua bola dalam waktu 3 menit.
2.
Robot dapat dikendalikan menggunakan pengontrol mikro ATMega32 dan
Attiny2313 untuk melakukan navigasi menyusuri ruangan, mencari,
mengambil dan memasukkan bola ke
goal
.
3.
Robot dapat mencari dan mengambil bola jika posisi bola bergeser dari
tempat semula bola berada, dengan syarat bola masih berada dalam jarak
jangkauan sensor kamera CMUCam2+.
4.
Intensitas cahaya pada ruangan sangat mempengaruhi keberhasilan robot
dalam mencari dan mengambil bola.
V.2
Saran
Saran-saran yang dapat diberikan untuk perbaikan dan pengembangan dari
Tugas Akhir ini adalah sebagai berikut:
1.
Algoritma pemrograman ditambahkan pengontrol PID, supaya pergerakan
robot dalam bermanuver lebih baik.
2.
Dimensi robot diperkecil sehingga memudahkan pergerakan robot.
3.
Penempatan sensor jarak ultrasonik diperbaiki, sehingga kesalahan
pembacaan sensor jarak ultrasonik dapat dikurangi.
4.
Bentuk gripper diganti dengan gripper yang mampu mengambil beberapa
bola dalam waktu yang bersamaan.
(5)
Bab V Kesimpulan dan Saran
U nive rsit a s K rist e n M a ra na t ha
118
5.
Motor servo kontinu pada robot diganti dengan motor yang memiliki
kecepatan lebih tinggi, sehingga waktu yang digunakan dalam mencari,
mengambil dan memasukkan bola ke
goal
lebih singkat.
6.
Penambahan strategi “Hit and Search”, dimana terlebih dahulu posisi bola
digeser dari tempat semula, kemudian mencari bola tersebut.
(6)
Universitas Kristen Maranatha