Realisasi Robot Pemain Bola Untuk KRCI 2010 Divisi Battle.

(1)

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 overflow

bit 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 pins

PCINT0-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 ha

BAB 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 ha

BAB 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 ha

BAB 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

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 :