Realisasi Robot Merangkak Enam Kaki Holonomik.
REALISASI ROBOT MERANGKAK
ENAM KAKI HOLONOMIK
Disusun Oleh:
Nama : Nico Hanafi
NRP : 0422013
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha,
Jl. Prof.Drg.Suria Sumantri, MPH no.65, Bandung, Indonesia,
email : i_mr2@yahoo.com
ABSTRAK
Robotika sudah berkembang dengan pesat. Banyak sekali jenis robot yang
dibuat sekarang ini. Pada dasarnya gerak dari robot yang dibuat terdapat dua yaitu
kaki dan roda. Masing-masing memiliki keunggulan dan kelemahan. Robot berkaki
memiliki kesulitan dalam penerapannya. Kesulitan yang dihadapi robot berkaki yaitu
kesetimbangan dan kelincahan bermanuver.
Tugas Akhir ini merealisasikan sebuah robot berkaki enam yang setiap
kakinya memiliki dua derajat kebebasan. Robot menggunakan 12 motor servo sebagai
penggerak. Robot ini dikontrol menggunakan pengontrol mikro ATMEGA16 dan
ATtiny2313. Selain itu, robot juga dilengkapi dengan sensor jarak GP2D12 dan
sensor kompas CMPS03.
Robot berkaki enam diujicoba dengan dua cara yaitu bergerak berdasarkan
arah dan langkah serta bergerak menuju ruangan yang terdapat dalam maze. Pada cara
pertama, robot diuji dengan bergerak menuju arah kelipatan 45
0posisi bumi
sedangkan pada cara kedua robot bergerak menuju empat ruangan yang ada dalam
maze. Hasil pengujian menunjukkan robot mampu bergerak menuju arah kelipatan
45
0posisi bumi tetapi masih terdapat penyimpangan sudut ketika mencapai arah
tersebut. Untuk pengujian kedua, robot hanya dapat bergerak menuju dua dari empat
ruangan dalam maze. Berdasarkan pengujian robot merangkak enam kaki berhasil
direalisasikan dan mampu bergerak holonomik.
Kata Kunci : Robot Berkaki Enam, Pengontrol Mikro ATMega16, Pengontrol Mikro
ATtiny2313, Holonomik.
(2)
REALIZATION OF HOLONOMIC CRAWLER
HEXAPOD ROBOT
Composed by:
Name : Nico Hanafi
Nrp
: 0422013
Electrical Engineering, Maranatha Christian University,
Jl. Prof.Drg.Suria Sumantri, MPH no.65, Bandung, Indonesia,
email : i_mr2@yahoo.com
ABSTRACT
Robotics has been expanded rapidly. Nowadays there are many types of robots
that have been made. Basically robots use two ways to walk. They are leg and wheel.
Each has its advantages and disadvantages. Legged robots have difficulties in their
application. The difficulties are balance and agility in maneuver.
This Final Project realizes a hexapod robot which each leg have two degrees
of freedom. It uses 12 servo motors as actuator. This hexapod robot is controlled by
microcontroller ATMEGA16 and ATtiny2313. Besides, hexapod robot is equipped
with distance sensor GP2D12 and compass sensor CMPS03.
This hexapod robot is tested in two ways. They are walking based on direction
and steps and walking to rooms in a maze. In the first test, hexapod robot is tested on
walking to the direction of 45
0multiple of earth’s position and the other hexapod
robot walks through four rooms in a maze. The result shows that hexapod robot is
able to walk to the direction of 45
0multiple of earth’s position although there is angle
deviation when it reaches the direction. For the second test, robot is only able to walk
to two of four rooms in the maze. Based on tests crawler hexapod robot is
successfully realized and it can walk holonomic.
Keyword: Hexapod, Microcontroller ATMEGA16, Microcontroller ATtiny2313,
Holonomic
(3)
DAFTAR ISI
KATA PENGANTAR...i
ABSTRAK
...iii
ABSTRACT
...iv
DAFTAR ISI...v
DAFTAR TABEL
...ix
DAFTAR GAMBAR...x
BAB I
PENDAHULUAN
I.1
Latar Belakang ...1
I.2
Identifikasi Masalah...1
I.3
Perumusan Masalah ...1
I.4
Tujuan ...1
I.5
Pembatasan Masalah ...2
I.6
Spesifikasi Alat ...2
I.7
Sistematika Pembahasan ...3
BAB II
LANDASAN TEORI
II.1
Robot...4
II.1.1 Definisi Robot ...4
II..1.2 Klasifikasi Robot Berdasarkan Mobilitas ...5
II..1.3 Klasifikasi Robot Berdasarkan Konstruksi Robot ...6
II.1.4 Sejarah Robot Berkaki ...8
II.1.5 Cara Berjalan Robot Berkaki Enam ...10
II.1.6 Gerak Robot Holonomik ...12
II.1.7 Bentuk Robot Berkaki Enam...13
II.1.8 Degree Of Freedom (DOF) ...13
II.2
Motor Servo ...14
II.3
Sensor...17
II.3.1 Sensor Jarak (Sharp GP2D12)...18
(4)
II.4
Pengontrol Mikro ...24
II.4.1 Pengenalan ATMEL AVR RISC ...24
II.4.2 Pengontrol Mikro ATMEGA16 ...25
II.4.2.1 Fitur ATMEGA16 ...25
II.4.2.2 Konfigurasi Pin ATMEGA16 ...26
II.4.2.3 Diagram Blok ATMEGA16 ...28
II.4.2.4
General Purpose Register
ATMEGA16 ...30
II.4.2.5 Peta Memori ATMEGA16 ...30
II.4.2.6 PWM (
Pulse Width Modulation
) ATMEGA16 ...32
II.4.2.7 Pin
Input
/
Output
ATMEGA16...33
II.4.2.8
I2C (Inter-Integrated Circuit )
ATMEGA16 ...34
II.4.2.9
USART
ATMEGA16...35
II.4.3 Pengontrol Mikro ATtiny2313...36
II.4.3.1 Fitur ATtiny2313...37
II.4.3.2 Konfigurasi Pin ATtiny2313 ...37
II.4.3.3 Register dan Memori ATtiny2313 ...40
II.4.3.4
Port
Input
/
Output
ATtiny2313...40
II.4.3.5
PULSE WIDTH MODULATION
ATtiny2313 ...41
BAB III PERANCANGAN DAN REALISASI
III.1
Perancangan Sistem Robot Berkaki Enam ...42
III.1.1
Diagram Blok Sistem Pengontrol Robot Berkaki Enam...42
III.2.1
Diagram Blok Sistem Pengontrol Robot Berkaki Enam
dalam
Maze
...43
III.2
Perancangan dan Realisasi Robot Berkaki Enam ...43
III.3
Perancangan dan Realisasi Rangkaian Sensor dan Pengontrol Mikro...45
III.3.1
Sensor...45
III.3.1.1 Sensor Jarak ...46
III.3.1.2 Sensor Kompas ...46
III.3.2
Pengontrol Mikro ...47
III.3.2.1 Skematik Pengontrol Berbasis Pengontrol Mikro
ATMEGA16 ...47
(5)
III.3.2.2 Skematik Pengontrol Berbasis Pengontrol Mikro
ATtiny2313 ...48
III.3.2.2.1 Pulse Width Modulation ATtiny2313...49
III.4
Algoritma Pergerakan Kaki ...51
III.4.1
Arah 0 derajat...52
III.4.2
Arah 45 derajat...53
III.4.3
Arah 90 derajat...54
III.4.4
Arah 135 derajat...55
III.4.5
Arah 180 derajat...56
III.4.6
Arah 225 derajat...57
III.4.7
Arah 270 derajat...58
III.4.8
Arah 315 derajat...59
III.5
Algoritma Pemrograman Robot Berkaki Enam ...60
III.5.1
Robot Berjalan Sesuai dengan Langkah dan Arah
yang Dimasukkan...60
III.5.2
Robot Berjalan Menuju Ruangan - Ruangan yang
Terdapat pada
Maze
...62
III.6
Robot Bergerak Holonomik...73
BAB IV DATA PENGAMATAN DAN ANALISA
IV.1
Pengujian Sudut Servo ...74
IV.2
Pengujian Sensor Jarak GP2D12 ...75
IV.2.1
Pengukuran Jarak pada Objek Kayu ...75
IV.3
Pengujian Sensor Kompas (CMPS03) ...76
IV.4
Pengujian Robot Berkaki Enam...77
IV.4.1
Langkah dan Arah yang Dimasukkan Melalui
Keypad ...
78
IV.4.1.1 Penyimpangan Sudut ...78
IV.4.1.2 Jarak ...81
IV.4.2 Percobaan dalam Maze ...84
IV.4.2.1 Ruangan 1 ...84
IV.4.2.2 Ruangan 2 ...85
IV.4.2.3 Ruangan 3 ...86
(6)
BAB V
KESIMPULAN DAN SARAN
V.1
Kesimpulan ...88
V.2
Saran ...88
DAFTAR PUSTAKA
LAMPIRAN – A Foto Robot Berkaki Enam
LAMPIRAN – B Program pada Pengontrol ATMEGA16 dan ATtiny2313
LAMPIRAN – C Datasheet
(7)
DAFTAR TABEL
Tabel 2.1 Register-register yang Disediakan Sensor CMPS03 ...22
Tabel 2.2 Fungsi Khusus Port B ...27
Tabel 2.3 Fungsi Khusus Port C ...27
Tabel 2.4 Fungsi Khusus Port D ...28
Tabel 2.5 Konfigurasi
Port
ATMEGA16 ...33
Tabel 2.6
Baud Rate...
36
Tabel 3.1 Rentang Nilai OCR1x...50
Tabel 4.1 Pengujian Sudut Servo HS-475 HB...74
Tabel 4.2 Pengujian Jarak pada Objek Kayu ...75
Tabel 4.3 Pengukuran Sudut Arah Mata Angin...76
Tabel 4.4 Sudut Awal Robot 0
0Berjalan dengan 1 Langkah ...78
Tabel 4.5 Sudut Awal Robot 90
0Berjalan dengan 1 Langkah ...78
Tabel 4.6 Sudut Awal Robot 0
0Berjalan dengan 5 Langkah ...79
Tabel 4.7 Sudut Awal Robot 90
0Berjalan dengan 5 Langkah ...79
Tabel 4.8 Sudut Awal Robot 0
0Berjalan dengan 10 Langkah ...79
Tabel 4.9 Sudut Awal Robot 90
0Berjalan dengan 10 Langkah ...80
Tabel 4.10 Sudut Awal Robot 0
0Berjalan dengan 15 Langkah ...80
Tabel 4.11 Sudut Awal Robot 90
0Berjalan dengan 15 Langkah ...80
Tabel 4.12 Sudut Awal Robot 0
0Berjalan dengan 1 Langkah ...81
Tabel 4.13 Sudut Awal Robot 90
0Berjalan dengan 1 Langkah ...81
Tabel 4.14 Sudut Awal Robot 0
0Berjalan dengan 5 Langkah ...82
Tabel 4.15 Sudut Awal Robot 90
0Berjalan dengan 5 Langkah ...82
Tabel 4.16 Sudut Awal Robot 0
0Berjalan dengan 10 Langkah ...82
Tabel 4.17 Sudut Awal Robot 90
0Berjalan dengan 10 Langkah ...83
Tabel 4.18 Sudut Awal Robot 0
0Berjalan dengan 15 Langkah ...83
Tabel 4.19 Sudut Awal Robot 90
0Berjalan dengan 15 Langkah ...83
Tabel 4.20 Pengujian Robot pada Ruangan 1 ...84
Tabel 4.21 Pengujian Robot pada Ruangan 2 ...85
Tabel 4.22 Pengujian Robot pada Ruangan 3 ...86
(8)
DAFTAR GAMBAR
Gambar 1.1 Konfigurasi Lapangan Percobaan ...2
Gambar 2.1 Sebuah Roda yang Dibagi-bagi Menjadi Beberapa Bagian...8
Gambar 2.2 Cara Berjalan Tripod...11
Gambar 2.3 Cara Berjalan Wave ...12
Gambar 2.4 Hexapod CH3-R...13
Gambar 2.5 Hexapod Szabad(ka) ...13
Gambar 2.6 Contoh Robot dengan 6 Derajat Kebebasan ...14
Gambar 2.7 Struktur dalam Motor Servo ...15
Gambar 2.8 Koneksi Kabel Motor Servo ...15
Gambar 2.9 Potensiometer Motor Servo ...16
Gambar 2.10 Contoh Posisi dan Lebar Pulsa yang Diberikan...17
Gambar 2.11 Bentuk Sensor Inframerah Sharp GP2D12 ...18
Gambar 2.12 Pengaruh Jarak Terhadap Besarnya Sudut...18
Gambar2.13 Alokasi Pin CMPS03 ...20
Gambar 2.14 Sketsa Sinyal PWM ...20
Gambar 2.15
Bit Sequence
I2C pada Sensor CMPS03...21
Gambar 2.16 Rangkaian
Tactile Switch
untuk Proses Kalibrasi...23
Gambar 2.17 Orientasi sensor CMPS03 ...24
Gambar 2.18 Konfigurasi Pin ATMEGA16 ...26
Gambar 2.19 Diagram Blok ATMEGA16...29
Gambar 2.20
General Purpose Register
ATMEGA16...30
Gambar 2.21 Pemetaan Memori ATMEGA16 ...31
Gambar 2.22 Pemetaan Memori Data ATMEGA16...31
Gambar 2.23
Phase & Frequency Correct
PWM...32
Gambar 2.24 Gambaran Modul TWI keseluruhan ...34
Gambar 2.25 Blok USART...35
Gambar 2.26 Konfigurasi Pin ATtiny2313...38
Gambar 2.27 Diagram Blok ATtiny2313 ...39
Gambar 2.28 Register ATtiny2313...40
Gambar 3.1 Diagram Blok Sistem Pengontrol Robot Berkaki Enam...42
(9)
Gambar 3.3 Koneksi Pin Pada Motor Servo ...44
Gambar 3.4 Dimensi Gambar Kaki Robot Dilihat dari Samping ...44
Gambar 3.5 Sketsa Robot Berkaki Enam ...45
Gambar 3.6 Alokasi Pin CMPS03 ...46
Gambar 3.7 Diagram Alir Penggunaan Sensor CMPS03 ...47
Gambar 3.8 Skematik Rangkaian Pengontrol Mikro ATMEGA16...48
Gambar 3.9 Skematik Rangkaian Pengontrol Mikro ATtiny2313 ...49
Gambar 3.10 Bentuk Robot Dilihat dari Atas...51
Gambar 3.11 Penempatan Motor Servo Pertama dan Kedua pada Kaki ...52
Gambar 3.12 Diagram Alir Gerakan Kaki Arah 0 Derajat ...53
Gambar 3.13 Diagram Alir Gerakan Kaki Arah 45 Derajat ...54
Gambar 3.14 Diagram Alir Gerakan Kaki Arah 90 Derajat ...55
Gambar 3.15 Diagram Alir Gerakan Kaki Arah 135 Derajat ...56
Gambar 3.16 Diagram Alir Gerakan Kaki Arah 180 Derajat ...57
Gambar 3.17 Diagram Alir Gerakan Kaki Arah 225 Derajat ...58
Gambar 3.18 Diagram Alir Gerakan Kaki Arah 270 Derajat ...59
Gambar 3.19 Diagram Alir Gerakan Kaki Arah 315 Derajat ...60
Gambar 3.20 Diagram Alir Pada Pengontrol Mikro ATMEGA16...61
Gambar 3.21 Diagram Alir Pada Pengontrol Mikro ATtiny2313 ...62
Gambar 3.22 Diagram Alir Program Secara Umum...63
Gambar 3.23 Diagram Alir Koreksi...64
Gambar 3.24 Diagram Alir Ruangan 1 ...65
Gambar 3.25 Lanjutan Diagram Alir Ruangan 1...66
Gambar 3.26 Diagram Alir Ruangan 2 ...67
Gambar 3.27 Lanjutan Diagram Alir Ruangan 2...68
Gambar 3.28 Diagram Alir Ruangan 3 ...69
Gambar 3.29 Lanjutan Diagram Alir Ruangan 3...70
Gambar 3.30 Diagram Alir Ruangan 4 ...71
Gambar 3.31 Lanjutan Diagram Alir Ruangan 4...72
Gambar 3.32 Lanjutan Kedua Diagram Alir Ruangan 4 ...73
Gambar 4.1 Pola Gerak Robot pada Ruangan 1 ...84
Gambar 4.2 Pola Gerak Robot pada Ruangan 2 ...85
Gambar 4.3 Pola Gerak Robot pada Ruangan 3 ...86
(10)
LAMPIRAN A
(11)
(12)
(13)
LAMPIRAN B
PROGRAM PADA PENGONTROL
ATMEGA16 DAN ATTINY2313
(14)
1.
Robot mampu berjalan sesuai dengan langkah dan arah yang dimasukkan
melalui keypad.
ATMEGA16
/***************************************************** This program was produced by the
CodeWizardAVR V1.25.3 Standard Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Version : Date : 2/6/2007
Author : Laboratorium Company : Fisika dan Instrumentasi Comments:
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
#include <stdio.h> #include <delay.h> #include <math.h> #include <scankeypadB.h> int sudut,i;
unsigned char text1[32],text2[32],text3[32]; int data1,data2;
unsigned int kps; char lngkh; // I2C Bus functions #asm
.equ __i2c_port=0x1B ;PORTA .equ __sda_bit=1
.equ __scl_bit=0 #endasm #include <i2c.h>
// Alphanumeric LCD Module functions #asm
.equ __lcd_port=0x15 ;PORTC #endasm
#include <lcd.h>
// Standard Input/Output functions #include <stdio.h>
#define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits // of the AD conversion result
unsigned char read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10;
return ADCH; }
// Declare your global variables here int keytonum(void)
{ long val; char datal[33]; char keypadchar; val = 0x00;
(15)
{
keypadchar = scan_keypadB(); switch (keypadchar) {
case 1: val = val +1; break;
case 2: val = val +2; break;
case 3: val = val +3; break;
case 4: val = val +4; break;
case 5: val = val +5; break;
case 6: val = val +6; break;
case 7: val = val +7; break;
case 8: val = val +8; break;
case 9: val = val +9; break;
case '0': val = val; break;
case '*': val = 0; break; }
if (keypadchar != '*' & keypadchar != '#' & keypadchar != 0 & keypadchar != 'A' & keypadchar != 'B' & keypadchar != 'C' & keypadchar != 'D')
{
val = val * 10; }
keypadchar = 0; lcd_clear();
sprintf (datal,"ANGKA=%u \n*=clear #=OK ", val/10); lcd_puts (datal);
delay_ms(300);
keypadchar = scan_keypadB(); }
return val/10; }
void main(void) {
// Declare your local variables here // Input/Output Ports initialization // Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;
DDRA=0x00; // Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00;
DDRB=0x00; // Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
DDRC=0x00; // Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh
(16)
// OC0 output: Disconnected TCCR0=0x00;
TCNT0=0x00; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // 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;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00;
TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off
// USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00;
UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x47;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
SFIOR=0x00; // ADC initialization
// ADC Clock frequency: 691.200 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: None // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84;
(17)
i2c_init();
// LCD module initialization lcd_init(16);
while (1) {
// Place your code here lcd_clear(); lngkh=keytonum(); lcd_putsf("langkah="); delay_ms(2000); lcd_clear(); sprintf(text3,"langkah=%d",lngkh); lcd_puts(text3); putchar (lngkh); delay_ms(3000); i2c_start(); i2c_write(0xC0); i2c_write(0x02); i2c_start(); i2c_write(0xC1); data1=i2c_read(1); data2=i2c_read(0); i2c_stop(); lcd_clear(); kps=((float)data1*256+data2)/10; sprintf(text1,"kps=%d",kps); lcd_puts(text1); delay_ms(2000); lcd_clear(); sudut=keytonum(); lcd_putsf("Sudut="); delay_ms(2000); lcd_clear(); sprintf(text2,"sudut=%d",sudut); lcd_puts(text2);
if ( (kps>337.5) && (kps<=359.9) || (kps>=0) && (kps<=22.5) ) {
switch (sudut) {
case 0: {putchar('A');} break; case 45: {putchar ('B');} break; case 90: {putchar ('C');} break; case 135: {putchar ('D');} break; case 180: {putchar ('E');} break; case 225: {putchar ('F');} break; case 270: {putchar ('G');} break; case 315: {putchar ('H');} break;};}
if ( (kps>22.5) && (kps<=67.5) ) {
switch (sudut) {
case 0: {putchar ('H');}break; case 45: {putchar ('A');}break; case 90: {putchar ('B');}break; case 135: {putchar ('C');}break; case 180: {putchar ('D');}break; case 225: {putchar ('E');}break; case 270: {putchar ('F');}break; case 315: {putchar ('G');}break;};}
if ( (kps>67.5) && (kps<=112.5) ) {
switch (sudut) {
case 0: {putchar ('G');}break; case 45: {putchar ('H');}break; case 90: {putchar ('A');}break; case 135: {putchar ('B');}break; case 180: {putchar ('C');}break; case 225: {putchar ('D');}break;
(18)
case 270: {putchar ('E');}break; case 315: {putchar ('F');} break;};}
if ( (kps>112.5) && (kps<=157.5) ) {
switch (sudut) {
case 0: {putchar ('F');}break; case 45: {putchar ('G');}break; case 90: {putchar ('H');}break; case 135: {putchar ('A');}break; case 180: {putchar ('B');}break; case 225: {putchar ('C');}break; case 270: {putchar ('D');}break;
case 315: {putchar ('E');}break;};}
if ( (kps>157.5) && (kps<=202.5) ) {
switch (sudut) {
case 0: {putchar ('E');}break; case 45: {putchar ('F');}break; case 90: {putchar ('G');}break; case 135: {putchar ('H');}break; case 180: {putchar ('A');}break; case 225: {putchar ('B');}break; case 270: {putchar ('C');}break; case 315: {putchar ('D');}break;};}
if ( (kps>202.5) && (kps<=247.5) ) {
switch (sudut) {
case 0: {putchar ('D');}break; case 45: {putchar ('E');}break; case 90: {putchar ('F');}break; case 135: {putchar ('G');}break; case 180: {putchar ('H');}break; case 225: {putchar ('A');}break; case 270: {putchar ('B');}break; case 315: {putchar ('C');}break;};}
if ( (kps>247.5) && (kps<=292.5) ) {
switch (sudut) {
case 0: {putchar ('C');}break; case 45: {putchar ('D');}break; case 90: {putchar ('E');}break; case 135: {putchar ('F');}break; case 180: {putchar ('G');}break; case 225: {putchar ('H');}break; case 270: {putchar ('A');}break; case 315: {putchar ('B');}break;};}
if ( (kps>292.5) && (kps<=337.5) ) {
switch (sudut) {
case 0: {putchar ('B');}break; case 45: {putchar ('C');}break; case 90: {putchar ('D');}break; case 135: {putchar ('E');}break; case 180: {putchar ('F');}break; case 225: {putchar ('G');}break; case 270: {putchar ('H');}break; case 315: {putchar ('A');}break;};}
}; }
(19)
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 : 3/11/2009
Author : Lab Instrumentasi Company : UKM Comments:
Chip type : ATtiny2313 Clock frequency : 8.000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32
*****************************************************/ #include <tiny2313.h>
#include <delay.h> #include <stdio.h> char langkah; char servo,a; int i; int posisi45; int posisi90; int posisi110; int posisi135; int posisid45; int posisid90; int posisid110; int posisid135; #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter; #else
unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif
// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) {
char status,data; status=UCSRA; data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
rx_buffer[rx_wr_index]=data;
(20)
if (++rx_counter == RX_BUFFER_SIZE) {
rx_counter=0; rx_buffer_overflow=1; };
};
//servo=getchar();
}
#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
char naik(char servo_no) {
posisi45 = posisi45|servo_no; posisi90 = posisi90|servo_no; posisi110 = posisi110|servo_no; posisi135 = posisi135|servo_no; }
char turun(char servo_no) {
posisi135 = posisi135&(~servo_no); posisi110 = posisi110&(~servo_no); posisi90 = posisi90&(~servo_no); posisi45 = posisi45&(~servo_no); }
char tengah(char servo_no) {
posisi135 = posisi135&(~servo_no); posisi110 = posisi110&(~servo_no); posisi45 = posisi45|servo_no; posisi90 = posisi90|servo_no; }
char naikd(char servo_no) {
posisid45 = posisid45|servo_no; posisid90 = posisid90|servo_no; posisid110 = posisid110|servo_no; posisid135 = posisid135|servo_no; }
char turund(char servo_no) {
posisid135 = posisid135&(~servo_no); posisid110 = posisid110&(~servo_no); posisid90 = posisid90&(~servo_no); posisid45 = posisid45&(~servo_no); }
char tengahd(char servo_no) {
posisid135 = posisid135&(~servo_no); posisid110 = posisid110&(~servo_no); posisid45 = posisid45|servo_no; posisid90 = posisid90|servo_no; }
(21)
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
// Place your code here PORTB=0xFF;
PORTD=0xFF; delay_us(1250); PORTB=posisi45; PORTD=posisid45; delay_us(50); PORTB=posisi90; PORTD=posisid90; delay_us(200); PORTB=posisi110; PORTD=posisid110; delay_us(200); PORTB=posisi135; PORTD=posisid135; delay_us(150); PORTB=0x00; PORTD=0x00; }
// Standard Input/Output functions #include <stdio.h>
// Declare your global variables here void sudut0(void)
{
tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x20); delay_ms(500); naikd(0x04); delay_ms(500); turun(0x04); delay_ms(500); naik(0x20); delay_ms(500); turund(0x20); delay_ms(500); turund(0x04); delay_ms(500); naik(0x40); delay_ms(500); naikd(0x10); delay_ms(500); naik(0x04); delay_ms(500); turun(0x20); delay_ms(500); turun(0x40); delay_ms(500); turund(0x10); delay_ms(500); tengah(0x20); delay_ms(500); tengah(0x04); delay_ms(500); tengahd(0x20); delay_ms(500); tengahd(0x04); delay_ms(500); tengah(0xFF); tengahd(0xFF); delay_ms(500);
tengah(0xFF); tengahd(0xFF); delay_ms(500);
(22)
naikd(0x40); delay_ms(500); naikd(0x08); delay_ms(500); turun(0x08); delay_ms(500); naik(0x01); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); naik(0x40); delay_ms(500); naikd(0x10); delay_ms(500); naik(0x08); delay_ms(500); turun(0x01); delay_ms(500); turund(0x10); delay_ms(500); turun(0x40); delay_ms(500); tengah(0x01); delay_ms(500); tengah(0x08); delay_ms(500); tengah(0x40); delay_ms(500); tengahd(0x08); delay_ms(500); } void sudut45(void) { tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x20); delay_ms(500); naikd(0x04); delay_ms(500); turun(0x04); delay_ms(500); naik(0x20); delay_ms(500); turund(0x04); delay_ms(500); turund(0x20); delay_ms(500); naikd(0x40); delay_ms(500); naikd(0x08); delay_ms(500); naik(0x04); delay_ms(500); turun(0x20); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); tengah(0x20); delay_ms(500); tengah(0x04); delay_ms(500); tengahd(0x20); delay_ms(500); tengahd(0x04); delay_ms(500); } void sudut90(void) {
(23)
tengah(0xFF); tengahd(0xFF); delay_ms(500); naik(0x40); delay_ms(500); turun(0x02); delay_ms(500); turun(0x40); delay_ms(500); naik(0x02); delay_ms(500); tengah(0x02); delay_ms(500); tengah(0x40); delay_ms(500); naikd(0x10); delay_ms(500); naik(0x10); delay_ms(500); turund(0x10); delay_ms(500); turun(0x10); delay_ms(500); tengah(0x10); delay_ms(500); tengahd(0x10); delay_ms(500); } void sudut135(void) { tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x40); delay_ms(500); naikd(0x08); delay_ms(500); turun(0x01); delay_ms(500); naik(0x08); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); naikd(0x04); delay_ms(500); naikd(0x20); delay_ms(500); naik(0x01); delay_ms(500); turun(0x08); delay_ms(500); turund(0x04); delay_ms(500); turund(0x20); delay_ms(500); tengah(0x01); delay_ms(500); tengah(0x08); delay_ms(500); tengahd(0x40); delay_ms(500); tengahd(0x08); delay_ms(500); } void sudut180(void) { tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x20); delay_ms(500);
(24)
naikd(0x04); delay_ms(500); naik(0x04); delay_ms(500); turun(0x20); delay_ms(500); turund(0x20); delay_ms(500); turund(0x04); delay_ms(500); naik(0x40); delay_ms(500); naikd(0x10); delay_ms(500); turun(0x04); delay_ms(500); naik(0x20); delay_ms(500); turun(0x40); delay_ms(500); turund(0x10); delay_ms(500); tengah(0x20); delay_ms(500); tengah(0x04); delay_ms(500); tengahd(0x20); delay_ms(500); tengahd(0x04); delay_ms(500); tengah(0xFF); tengahd(0xFF); delay_ms(500); tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x40); delay_ms(500); naikd(0x08); delay_ms(500); naik(0x08); delay_ms(500); turun(0x01); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); naik(0x40); delay_ms(500); naikd(0x10); delay_ms(500); turun(0x08); delay_ms(500); naik(0x01); delay_ms(500); turund(0x10); delay_ms(500); turun(0x40); delay_ms(500); tengah(0x01); delay_ms(500); tengah(0x08); delay_ms(500); tengah(0x40); delay_ms(500); tengahd(0x08); delay_ms(500); } void sudut225(void) { tengah(0xFF);
(25)
tengahd(0xFF); delay_ms(500); naikd(0x20); delay_ms(500); naikd(0x04); delay_ms(500); naik(0x04); delay_ms(500); turun(0x20); delay_ms(500); turund(0x20); delay_ms(500); turund(0x04); delay_ms(500); naikd(0x40); delay_ms(500); naikd(0x08); delay_ms(500); turun(0x04); delay_ms(500); naik(0x20); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); tengah(0x04); delay_ms(500); tengah(0x20); delay_ms(500); tengahd(0x04); delay_ms(500); tengahd(0x20); delay_ms(500); }
void sudut270(void) {
tengah(0xFF); tengahd(0xFF); delay_ms(500); naik(0x40); delay_ms(500); naik(0x02); delay_ms(500); turun(0x40); delay_ms(500); turun(0x02); delay_ms(500); tengah(0x02); delay_ms(500); tengah(0x40); delay_ms(500); naikd(0x10); delay_ms(500); turun(0x10); delay_ms(500); turund(0x10); delay_ms(500); naik(0x10); delay_ms(500); tengah(0x10); delay_ms(500); tengahd(0x10); delay_ms(500); }
void sudut315(void) {
tengah(0xFF); tengahd(0xFF); delay_ms(500); naikd(0x40); delay_ms(500);
(26)
naikd(0x08); delay_ms(500); naik(0x01); delay_ms(500); turun(0x08); delay_ms(500); turund(0x40); delay_ms(500); turund(0x08); delay_ms(500); naikd(0x04); delay_ms(500); naikd(0x20); delay_ms(500); turun(0x01); delay_ms(500); naik(0x08); delay_ms(500); turund(0x04); delay_ms(500); turund(0x20); delay_ms(500); tengah(0x01); delay_ms(500); tengah(0x08); delay_ms(500); tengahd(0x40); delay_ms(500); tengahd(0x08); delay_ms(500); }
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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00; DDRB=0xFF; // Port D initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00; DDRD=0x7F;
// 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;
(27)
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 125.000 kHz // Mode: CTC top=OCR1A // 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: On // Compare B Match Interrupt: Off TCCR1A=0x00;
TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0xD8; OCR1AH=0x09; OCR1AL=0xC4; OCR1BH=0x00; OCR1BL=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40;
// Universal Serial Interface initialization // Mode: Disabled
// Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On
// USART Transmitter: Off // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00;
UCSRB=0x90; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
// Global enable interrupts #asm("sei")
while (1) {
// Place your code here a=getchar();
if(a>64) { servo=a; delay_ms(100); langkah=getchar(); }
else { langkah=a; delay_ms(100); servo=getchar(); }
(28)
if(servo=='A') {
for(i=0;i<langkah;i++) {
sudut0(); } } if(servo=='B') {
for(i=0;i<langkah;i++) {
sudut45(); } }
if(servo=='C') {
for(i=0;i<langkah;i++) {
sudut90(); } }
if(servo=='D') {
for(i=0;i<langkah;i++) {
sudut135(); } }
if(servo=='E') {
for(i=0;i<langkah;i++) {
sudut180(); } }
if(servo=='F') {
for(i=0;i<langkah;i++) {
sudut225(); } }
if(servo=='G') {
for(i=0;i<langkah;i++) {
sudut270(); } }
if(servo=='H') {
for(i=0;i<langkah;i++) {
sudut315(); } } }; }
(29)
2.
Robot berjalan menuju ruangan-ruangan yang terdapat pada maze.
ATMEGA16
/***************************************************** This program was produced by the
CodeWizardAVR V1.25.3 Standard Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Version : Date : 2/6/2007
Author : Laboratorium Company : Fisika dan Instrumentasi Comments:
Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
#include <stdio.h> #include <delay.h> #include <math.h> #include <scankeypadB.h> int data1,data2;
unsigned int kps,kompas; void sensorjarak(void); int a,b,c,d,e,f;
unsigned char text[32],text1[32]; // I2C Bus functions
#asm
.equ __i2c_port=0x1B ;PORTA .equ __sda_bit=1
.equ __scl_bit=0 #endasm #include <i2c.h>
// Alphanumeric LCD Module functions #asm
.equ __lcd_port=0x15 ;PORTC #endasm
#include <lcd.h>
// Standard Input/Output functions #include <stdio.h>
#define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits // of the AD conversion result
unsigned char read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10;
return ADCH; }
// Declare your global variables here
(30)
{
a=read_adc(7);
a=2141.72055 * (pow(a,-1.078867)); b=read_adc(6);
b=2141.72055 * (pow(b,-1.078867)); c=read_adc(5);
c=2141.72055 * (pow(c,-1.078867)); d=read_adc(4); d=2141.72055 * (pow(d,-1.078867)); e=read_adc(3); e=2141.72055 * (pow(e,-1.078867)); f=read_adc(2); f=2141.72055 * (pow(f,-1.078867)); lcd_clear();
sprintf(text,"a=%d b=%d c=%d d=%d e=%d f=%d ",a,b,c,d,e,f); lcd_puts(text);
delay_ms(200); }
void koreksi(void) {
i2c_start(); i2c_write(0xC0); i2c_write(0x02); i2c_start(); i2c_write(0xC1); data1=i2c_read(1); data2=i2c_read(0); i2c_stop(); lcd_clear();
kps=((float)data1*256+data2)/10; sprintf(text1,"kps=%d",kps); lcd_puts(text1);
delay_ms(200);
kompas=220;
if (kps<(kompas-5)) putchar ('R'); if (kps>(kompas+5)) putchar ('L');
i2c_start(); i2c_write(0xC0); i2c_write(0x02); i2c_start(); i2c_write(0xC1); data1=i2c_read(1); data2=i2c_read(0); i2c_stop(); lcd_clear();
kps=((float)data1*256+data2)/10; sprintf(text1,"kps=%d",kps); lcd_puts(text1);
delay_ms(200); }
void main(void) {
// Declare your local variables here // Input/Output Ports initialization // Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;
DDRA=0x00; // Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00;
DDRB=0x00; // Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
(31)
DDRC=0x00; // Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00;
TCNT0=0x00; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // 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;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00;
TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off
// USART Transmitter: On // USART Mode: Asynchronous
// USART Baud rate: 9600 (Double Speed Mode) UCSRA=0x02;
UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x8F;
// Analog Comparator initialization // Analog Comparator: Off
(32)
ACSR=0x80; SFIOR=0x00; // ADC initialization
// ADC Clock frequency: 691.200 kHz // ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: None // Only the 8 most significant bits of
// the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84;
// I2C Bus initialization i2c_init();
// LCD module initialization lcd_init(16);
while (1) {
// Place your code here
lcd_putsf(“ruangan=”); switch(scan_keypadB()) {
case 1: // ruangan 1
{
sensorjarak(); while ( b<35 && e>80 ) {
koreksi();
if (f<10) putchar ('E'); if (d<10) putchar ('A'); else putchar('G'); sensorjarak(); }
sensorjarak();
while ( a > 18 && f > 18 ) {
koreksi();
if ( b < 10 ) putchar ('G'); if ( e < 10 ) putchar ('C'); else putchar ('A'); sensorjarak(); }
sensorjarak();
while ( ( a < 18 || f < 18 ) && b >15 ) {
koreksi();
if(f<10 || a<10) putchar ('E'); if(c<10 || d<10) putchar ('A'); else putchar ('C'); sensorjarak(); }}
break; case 2: // Ruangan 2 {
sensorjarak();
while ( a > 18 && f > 18 ) {
koreksi();
if ( b < 10 ) putchar ('G'); if ( e < 10 ) putchar ('C'); else putchar ('A'); sensorjarak(); }
sensorjarak();
(33)
{ koreksi();
if(f<10 || a<10) putchar ('E'); if(c<10 || d<10) putchar ('A'); else putchar ('C'); sensorjarak(); }
sensorjarak();
while(a<20 && f<20 && b<20 && c>35 && d>35) { koreksi(); putchar ('E'); sensorjarak(); }} break; case 3: // ruangan 3 {
sensorjarak();
while (b<150 && a>15 && f>15 && c>15 && d>5) {
koreksi();
if(c<15) putchar ('A'); else putchar ('C'); sensorjarak(); }
sensorjarak();
while ( a > 18 && f > 18 ) {
koreksi();
if ( b < 10 ) putchar ('G'); if ( e < 10 ) putchar ('C'); else putchar ('A'); sensorjarak(); }
sensorjarak();
while ( ( a < 18 || f < 18 ) && b >15 ) {
koreksi();
if(f<10 || a<10) putchar ('E'); if(c<10 || d<10) putchar ('A'); else putchar ('C'); sensorjarak(); }
sensorjarak();
while (a>18 && f >18 && c>20 && d>20) { koreksi(); putchar ('E'); sensorjarak(); } sensorjarak();
while(b<20 && c>20 && d>20) { koreksi(); putchar ('E'); sensorjarak(); }} break; case 4: // ruangan 4 {
sensorjarak();
while ( a>18 && f>18 && c>15 && d>15) {
koreksi();
if (b<10) putchar('G'); if (e>25) putchar ('G');
(34)
else putchar ('E'); sensorjarak(); }
sensorjarak();
while ( a > 18 && f > 18 ) {
koreksi();
if ( b < 10 ) putchar ('G'); if ( e < 10 ) putchar ('C'); else putchar ('A'); sensorjarak(); }
sensorjarak();
while ( ( a < 18 || f < 18 ) && b >15 ) {
koreksi();
if(f<10 || a<10) putchar ('E'); if(c<10 || d<10) putchar ('A'); else putchar ('C'); sensorjarak(); }}
break; }; }; }
(35)
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 : 3/11/2009
Author : Lab Instrumentasi Company : UKM Comments:
Chip type : ATtiny2313 Clock frequency : 8.000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32
*****************************************************/ #include <tiny2313.h>
#include <delay.h> #include <stdio.h> char langkah; char servo,a; int i; int posisi45; int posisi90; int posisi110; int posisi135; int posisid45; int posisid90; int posisid110; int posisid135; #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter; #else
unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif
// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) {
char status,data; status=UCSRA; data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE)
(36)
{
rx_counter=0; rx_buffer_overflow=1; };
}; }
#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
char naik(char servo_no) {
posisi45 = posisi45|servo_no; posisi90 = posisi90|servo_no; posisi110 = posisi110|servo_no; posisi135 = posisi135|servo_no; }
char turun(char servo_no) {
posisi135 = posisi135&(~servo_no); posisi110 = posisi110&(~servo_no); posisi90 = posisi90&(~servo_no); posisi45 = posisi45&(~servo_no); }
char tengah(char servo_no) {
posisi135 = posisi135&(~servo_no); posisi110 = posisi110&(~servo_no); posisi45 = posisi45|servo_no; posisi90 = posisi90|servo_no;} char naikd(char servo_no) {
posisid45 = posisid45|servo_no; posisid90 = posisid90|servo_no; posisid110 = posisid110|servo_no; posisid135 = posisid135|servo_no; }
char turund(char servo_no) {
posisid135 = posisid135&(~servo_no); posisid110 = posisid110&(~servo_no); posisid90 = posisid90&(~servo_no); posisid45 = posisid45&(~servo_no); }
char tengahd(char servo_no) {
posisid135 = posisid135&(~servo_no); posisid110 = posisid110&(~servo_no); posisid45 = posisid45|servo_no; posisid90 = posisid90|servo_no; }
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
// Place your code here PORTB=0xFF;
PORTD=0xFF; delay_us(1200);
(37)
PORTB=posisi45; PORTD=posisid45; delay_us(100); PORTB=posisi90; PORTD=posisid90; delay_us(200); PORTB=posisi110; PORTD=posisid110; delay_us(200); PORTB=posisi135; PORTD=posisid135; delay_us(50); PORTB=0x00; PORTD=0x00; }
// Standard Input/Output functions #include <stdio.h>
// Declare your global variables here void sudut0(void) { tengah(0xFF); tengahd(0xFF); delay_ms(100); naikd(0x20); delay_ms(100); naikd(0x04); delay_ms(100); turun(0x04); delay_ms(100); naik(0x20); delay_ms(100); turund(0x20); delay_ms(100); turund(0x04); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); naik(0x04); delay_ms(100); turun(0x20); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0x20); delay_ms(100); tengah(0x04); delay_ms(100); tengahd(0x20); delay_ms(100); tengahd(0x04); delay_ms(100); tengah(0xFF); tengahd(0xFF); delay_ms(100); naikd(0x40); delay_ms(100); naikd(0x08); delay_ms(100); turun(0x08); delay_ms(100); naik(0x01); delay_ms(100); turund(0x40); delay_ms(100); turund(0x08); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10);
(38)
delay_ms(100); naik(0x08); delay_ms(100); turun(0x01); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengah(0x01); delay_ms(100); tengah(0x08); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x08); delay_ms(100); } void sudut90(void) { tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); turun(0x02); delay_ms(100); naik(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x20); delay_ms(100); naikd(0x04); delay_ms(100); naik(0x02); delay_ms(100); turun(0x10); delay_ms(100); tengahd(0x20); delay_ms(100); tengahd(0x04); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); turun(0x02); delay_ms(100); naik(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x40); delay_ms(100); naikd(0x08); delay_ms(100);
(39)
naik(0x02); delay_ms(100); turun(0x10); delay_ms(100); tengahd(0x40); delay_ms(100); tengahd(0x08); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); } void sudut180(void) { tengah(0xFF); tengahd(0xFF); delay_ms(100); naikd(0x20); delay_ms(100); naikd(0x04); delay_ms(100); naik(0x04); delay_ms(100); turun(0x20); delay_ms(100); turund(0x20); delay_ms(100); turund(0x04); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); turun(0x04); delay_ms(100); naik(0x20); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0x20); delay_ms(100); tengah(0x04); delay_ms(100); tengahd(0x20); delay_ms(100); tengahd(0x04); delay_ms(100); tengah(0xFF); tengahd(0xFF); delay_ms(100); naikd(0x40); delay_ms(100); naikd(0x08); delay_ms(100); naik(0x08); delay_ms(100); turun(0x01); delay_ms(100); turund(0x40); delay_ms(100); turund(0x08); delay_ms(100); naik(0x40); delay_ms(100);
(40)
naikd(0x10); delay_ms(100); turun(0x08); delay_ms(100); naik(0x01); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengah(0x01); delay_ms(100); tengah(0x08); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x08); delay_ms(100); } void sudut270(void) { tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); naik(0x02); delay_ms(100); turun(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x40); delay_ms(100); naikd(0x08); delay_ms(100); turun(0x02); delay_ms(100); naik(0x10); delay_ms(100); tengahd(0x40); delay_ms(100); tengahd(0x08); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); naik(0x02); delay_ms(100); turun(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x04); delay_ms(100);
(41)
naikd(0x20); delay_ms(100); turun(0x02); delay_ms(100); naik(0x10); delay_ms(100); tengahd(0x04); delay_ms(100); tengahd(0x20); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); } void koreksi1(void) { tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); naik(0x02); delay_ms(100); naik(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x04); delay_ms(100); naikd(0x20); delay_ms(100); turun(0x02); delay_ms(100); turun(0x10); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); naik(0x02); delay_ms(100); naik(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x40); delay_ms(100); naikd(0x08); delay_ms(100); turun(0x02); delay_ms(100);
(42)
turun(0x10); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); }
void koreksi2(void) {
tengah(0xFF); tengahd(0xFF); delay_ms(100); naik(0x40); delay_ms(100); naikd(0x10); delay_ms(100); turun(0x02); delay_ms(100); turun(0x10); delay_ms(100); turun(0x40); delay_ms(100); turund(0x10); delay_ms(100); naikd(0x04); delay_ms(100); naikd(0x20); delay_ms(100); naik(0x02); delay_ms(100); naik(0x10); delay_ms(100); tengah(0x02); delay_ms(100); tengah(0x10); delay_ms(100); tengah(0x40); delay_ms(100); tengahd(0x10); delay_ms(100); }
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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00; DDRB=0xFF; // Port D initialization
(43)
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00;
DDRD=0x7F;
// 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: 125.000 kHz // Mode: CTC top=OCR1A // 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: On // Compare B Match Interrupt: Off TCCR1A=0x00;
TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0xD8; OCR1AH=0x09; OCR1AL=0xC4; OCR1BH=0x00; OCR1BL=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40;
// Universal Serial Interface initialization // Mode: Disabled
// Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On
// USART Transmitter: Off // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00;
UCSRB=0x90; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
// Global enable interrupts #asm("sei")
(44)
while (1) {
// Place your code here servo=getchar(); if(servo=='A') {
sudut0(); } if(servo=='C') {
sudut90(); }
if(servo=='E') { sudut180(); }
if(servo=='G') {
sudut270(); }
if(servo=='L') {
koreksi1(); }
if(servo=='R') {
koreksi2(); }
(45)
LAMPIRAN C
DATASHEET
Sensor Inframerah (GP2D12
) ... C-1
(46)
GP2D12
Optoelectronic Device
FEATURES
• Analog output
• Effective Range: 10 to 80 cm • LED pulse cycle duration: 32 ms • Typical response time: 39 ms • Typical start up delay: 44 ms • Average current consumption: 33 mA
• Detection area diameter @ 80 cm: 6 cm PIN SIGNAL NAME 1 VO
GND VCC
GP2D12-8
123
DESCRIPTION
The GP2D12 is a distance measuring sensor with integrated signal processing and analog voltage output.
2 3
Figure 1. Pinout
GND VCC
PSD
SIGNAL PROCESSING CIRCUIT
VOLTAGE REGULATOR
OSCILLATOR CIRCUIT
LED DRIVE CIRCUIT LED
OUTPUT CIRCUIT
VO
DISTANCE MEASURING IC
GP2D12-4
Figure 2. Block Diagram
(47)
GP2D12
ELECTRICAL SPECIFICATIONS
Absolute Maximum Ratings
Ta = 25°C, VCC = 5 VDC
PARAMETER
Supply Voltage Output Terminal Voltage Operating Temperature Storage Temperature SYMBOL VCC VO Topr Tstg RATING
-0.3 to +7.0 -0.3 to (VCC + 0.3) -10 to +60 -40 to +70
UNIT
V V °C °C
Operating Supply Voltage
PARAMETER
Operating Supply Voltage
SYMBOL
VCC
RATING
4.5 to 5.5
UNIT
V
Electro-optical Characteristics
Ta = 25°C, VCC = 5 VDC
PARAMETER
Measuring Distance Range Output Voltage
Output Voltage Difference Average Supply Current
SYMBOL L
VO
VO
ICC
L = 80 cm
CONDITIONS MIN. TYP. MAX. UNIT NOTES
10 0.25 Output change at L change
1.75 (80 cm - 10 cm)
L = 80 cm
-0.4 2.0 33 80 0.55 2.25 50 cm V V mA 1, 2 1, 2 1, 2 1, 2 NOTES:
1. Measurements made with Kodak R-27 Gray Card, using the white side, (90% reflectivity). 2. L = Distance to reflective object.
VCC
(POWER SUPPLY)
38.3 ms ±9.6 ms
DISTANCE MEASURMENT OPERATING 1st MEASUREMENT 2nd MEASUREMENT nth MEASUREMENT VO (OUTPUT) UNSTABLE OUTPUT 1st OUTPUT 2nd OUTPUT nth OUTPUT 5.0 ms MAX.
GP2D12-5
Figure 3. Timing Diagram
(48)
GP2D12
RELIABILITY
The reliability of requirements of this device are listed in Table 1.
Table 1. Reliability
TEST ITEMS TEST CONDITIONS
One cycle -40°C (30 min.) to +70°C in 30 minutes, repeated 25 times
+40°C, 90% RH, 500h +70°C, 500h -40°C, 500h
+60°C, VCC = 5 V, 500h 100 m / s2, 6.0 ms
3 times / ±X, ±Y, ±Z direction 10-to-55-to-10 Hz i n 1 minute Amplitude: 1.5 mm
2 h i n e a c h X, Y, Z direction
Initial × 0.8 > VO VO > Initial × 1.2
FAILURE JUDGEMENT CRITERIA
SAMPLES (n), DEFECTIVE (C)
n = 11, C = 0 n = 11, C = 0 n = 11, C = 0 n = 11, C = 0 n = 11, C = 0 n = 6, C = 0 Temperature Cycling
High Temperature and High Humidity Storage High Temperature Storage Low Temperature Storage Operational Life (High Temperature) Mechanical Shock
Variable Frequency Vibration n = 6, C = 0
NOTES:
1. Test conditions are according to Electro-optical Characteristics, shown on page 2.
2. At completion of the test, allow device to remain at nominal room temperature and humidity (non-condensing) for two hours. 3. Confidence level: 90%, Lot Tolerance Percent Defect (LTPD): 20% / 40%.
MANUFACTURER’S INSPECTION
Inspection Lot
Inspection shall be carried out per each delivery lot.
Inspection Method
A single sampling plan, normal inspection level II based on ISO 2859 shall be adopted.
Table 2. Quality Level DEFECT
Major Defect Minor Defect
INSPECTION ITEM and TEST METHOD
Electro-optical characteristics defect
Defect to appearance or dimensions (crack, split, chip, scratch, stain)*
AQL (%)
0.4 1.0
NOTE: *Any one of these that affects the Electro-optical Characteristics shall be considered a defect.
(49)
GP2D12
3.0
2.8
2.6
2.4
2.2
2.0
ANALOG VOLTAGE OUTPUT (V)
1.8
1.6
1.4
1.2
1.0
0.8
0.6
0.4
0.2
0 10 20 30 40 50 60 70 80
DISTANCE TO REFLECTIVE OBJECT (cm)
NOTES:
White paper (Reflectance ratio 90%) Gray paper (Reflectance ratio 18%)
GP2D12-6
Figure 4. GP2D12 Example of Output/Distance Characteristics
(50)
GP2D12
3.0
2.8
9 cm 2.6
7 cm
2.4 10 cm
8 cm
2.2
12 cm 2.0
14 cm 1.8
16 cm 1.6
18 cm 1.4
20 cm ANALOG
VOLTAGE OUTPUT (V)
1.2
28 cm
1.0
30 cm 40 cm 0.8
50 cm 0.6
0.4
0.2
0.00 0.02 0.04 0.06 0.08 0.10 0.12 0.14
INVERSE NUMBER OF DISTANCE 1/(L + 0.42) (1/cm)
NOTES:
White paper (Reflectance ratio 90%) Gray paper (Reflectance ratio 18%)
GP2D12-7
Figure 5. GP2D12 Example of Output Characteristics with Inverse Number of Distance
(51)
GP2D12
PACKAGE SPECIFICATIONS
STAMP
STAMP EXAMPLE
GP2D12 5 3
LIGHT EMITTER SIDE
3.2 HOLE
4.5 (Note 1)
13.0
1.2 PCB 3.3 R3.75
3.75
3.2 HOLE
10.1
14.75
CONNECTOR
7.5 4.15 16.3
123
CONNECTOR SIGNAL PIN SIGNAL NAME
1
NOTES:
1. Dimensions shall reference lens center. 2. Unspecified tolerance shall be ±0.3 mm. 3. Scale: 2/1, dimensions are in mm.
2 3
VO
GND VCC
GP2D12-3
Connector: J.S.T. Trading Company, LTD S3B-PH
C-6
2-1.5 13.5
18.9 -0.3 8.4 7.2
+0.3
GP2D12 83
37.0 29.5 20 ±0.1 (Note 1)
LIGHT DETECTOR SIDE
R3.75
6.3 2.0
Month (1 to 9, X, Y, Z) Year (2005:5) Model Name
LENS CASE
(52)
GP2D12
PACKING SPECIFICATION
2
PAD (CORRUGATED CARDBOARD)
(2 SHEETS/CASE: TOP AND BOTTOM) 3
PRODUCT TRAYS (10-TRAY/CASE)
PRODUCT 4
PAD (CORRUGATED CARDBOARD) (9 SHEETS/CASE BETWEEN TRAYS)
TRAY (B)
1 PACKING CASE
5 CRAFT TAPE
(A)
PART NAME
Packing case Pad Tray
MATERIAL
Corrugated cardboard Corrugated cardboard
Polystyrene
MODEL NUMBER
(C)
DATE QUANTITY
PACKING METHOD
1. Each tray holds 50 pieces. Packing methods are shown in (A).
2. Each box holds 10 trays. Pads are added to top and bottom, and between layers, as in (B). top and bottom. Put pads between each tray (9 pads total) see above drawing (B).
3. The box is sealed with craft tape. (C) shows the location of the Model number, Quantity, and Inspection date. 4. Package weight: Approximately 4 kg.
GP2Y0A02YK-8
(53)
GP2D12
NOTES
• Keep the sensor lens clean. Dust, water, oil, and other contaminants can deteriorate the tics of this device. Applications should be designed to eliminate sources of lens contamination. • When using a protective cover over the emitter and detector, ensure the cover efficiently transmits light throughout the wavelength range of the LED ( = 850 nm ± 70 nm). Both sides of the protective cover should be highly polished. Use of a protective cover may decrease the effective distance over which the sensor operates. Ensure that any cover does not negatively affect the operation over the intended application range.
• Objects in proximity to the sensor may cause tions that can affect the operation of the sensor. • Sources of high ambient light (the sun or strong ficial light) may affect measurement. For best results, the application should be designed to vent interference from direct sunlight or artificial light.
• Using the sensor with a mirror can induce ment errors. Often, changing the incident angle on the mirror can correct this problem.
• If a prominent boundary line exists in the surface being measured, it should be aligned vertically to avoid measurement error. See Figure 6 for further details.
• When measuring the distance to objects in motion, align the sensor so that the motion is in the horizontal direction instead of vertical. Figure 7 illustrates the preferred alignment.
• A 10 µF (or larger) bypass capacitor between VCC and GND near the sensor is recommended. • To clean the sensor, use a dry cloth. Use of any uid to clean the device may result in decreased sitivity or complete failure.
• Excessive mechanical stress can damage the internal sensor or lens.
(AVOID IF POSSIBLE) (PREFERRED)
GP2D12-1
Figure 6. Proper Alignment to Surface Being Measured
(AVOID IF POSSIBLE) (PREFERRED)
DIRECTION OF MOVEMENT
DIRECTION OF MOVEMENT
GP2D12-2
Figure 7. Proper Alignment to Moving Surfaces
(54)
GP2D12
NOTICE
The circuit application examples in this publication are provided to explain representative applications of SHARP devices and are not intended to guarantee any circuit design or license any intellectual property right. SHARP takes no responsibility for any problems related to any intellectual property right of a third party resulting from the use of SHARP devices.
SHARP reserves the right to make changes in the specifications, characteristics, data, materials, structures and other contents described herein at any time without notice in order to improve design or reliability.
Contact SHARP in order to obtain the latest device specification sheets before using any SHARP device. Manu-facturing locations are also subject to change without notice.
In the absence of confirmation by device specification sheets, SHARP takes no responsibility for any defects that occur in equipment using any SHARP devices shown in catalogs, data books, etc.
The devices listed in this publication are designed for standard applications for use in general electronic equip-ment. SHARP’s devices shall not be used for or in connection with equipment that requires an extremely high level of reliability, such as military and aerospace applications, telecommunication equipment (trunk lines), nuclear power control equipment and medical or other life support equipment (e.g. Scuba). SHARP takes no responsibility for dam-age caused by improper use of device, which does not meet the conditions for use specified in the relevant specifi-cation sheet.
If the SHARP devices listed in the publication fall within the scope of strategic products described in the Foreign Exchange and Foreign Trade Law of Japan, it is necessary to obtain approval to export such SHARP devices. This publication is the proprietary product of SHARP and is copyrighted, with all rights reserved. Under the copy-right laws, no part of this publication may be reproduced or transmitted in any form or by any means, electronic or mechanical for any purpose, in whole or in part, without the express written permission of SHARP. Express written permission is also required before any use of this publication may be made by a third party.
Contact and consult with a SHARP representative if there are any questions about the contents of this publication.
(55)
(56)
BAB I
PENDAHULUAN
Bab ini membahas tentang latar belakang, identifikasi masalah, perumusan
masalah, tujuan, pembatasan masalah, spesifikasi alat, serta sistematika pembahasan.
I.1 Latar Belakang
Teknologi robot selalu berkembang setiap saat baik dalam hal jenis maupun
bentuk. Jenis dan bentuk robot yang berbeda-beda disesuaikan dengan kegunaan dari
robot tersebut. Robot berkaki termasuk salah satu jenis robot yang banyak
dikembangkan. Pengembangan robot berkaki ditujukan agar robot mampu bergerak
di segala medan.
Kesulitan yang dihadapi oleh robot berkaki adalah kesetimbangan dan
kelincahan bermanuver. Kesetimbangan dan kelincahan bermanuver robot
bergantung pada jumlah kaki, bentuk robot, dan cara berjalan robot.
I.2 Identifikasi Masalah
Identifikasi masalah Tugas Akhir ini adalah kebutuhan akan robot yang
memiliki kemampuan bergerak holonomik.
I.3 Perumusan Masalah
Perumusan masalah Tugas Akhir ini adalah bagaimana membuat struktur
tubuh robot dan mengontrol gerakan kaki agar dapat berjalan secara holonomik
berdasar pada langkah dan arah yang diperintahkan dan bermanuver dalam
maze
yang tetap.
I.4 Tujuan
Tujuan Tugas Akhir ini adalah membuat prototipe robot merangkak enam
kaki holonomik.
(57)
BAB I PENDAHULUAN
I.5 Pembatasan Masalah
Tugas Akhir ini dibatasi oleh beberapa hal :
1.
Kaki robot memiliki dua derajat kebebasan.
2.
Arah tujuan robot mengikuti posisi bumi dengan kelipatan 45
0(0
0-360
0).
3.
Arah 0
0merupakan posisi utara bumi.
4.
Tugas yang dikerjakan robot :
•
Robot mampu berjalan sesuai dengan langkah dan arah yang
dimasukkan melalui
keypad
.
•
Robot dapat berjalan menuju ruangan-ruangan yang terdapat pada
maze
.
5.
Lapangan yang digunakan untuk tempat percobaan menggunakan lapangan
yang sama dengan lapangan pada KRCI divisi senior berkaki dengan batasan:
•
Lapangan berlantai satu.
•
Lapangan berupa lahan datar bersekat.
•
Konfigurasi lapangan tetap untuk semua percobaan.
•
Konfigurasi lapangan yang digunakan ditunjukkan pada Gambar 1.1.
Gambar 1.1 Konfigurasi Lapangan Percobaan
I.6 Spesifikasi Alat
Spesifikasi alat adalah sebagai berikut:
1.
Robot berbentuk hexapod.
2.
Robot mampu bergerak holonomik.
3.
Robot mampu bermanuver dalam maze.
(1)
(2)
BAB I
PENDAHULUAN
Bab ini membahas tentang latar belakang, identifikasi masalah, perumusan masalah, tujuan, pembatasan masalah, spesifikasi alat, serta sistematika pembahasan.
I.1 Latar Belakang
Teknologi robot selalu berkembang setiap saat baik dalam hal jenis maupun bentuk. Jenis dan bentuk robot yang berbeda-beda disesuaikan dengan kegunaan dari robot tersebut. Robot berkaki termasuk salah satu jenis robot yang banyak dikembangkan. Pengembangan robot berkaki ditujukan agar robot mampu bergerak di segala medan.
Kesulitan yang dihadapi oleh robot berkaki adalah kesetimbangan dan kelincahan bermanuver. Kesetimbangan dan kelincahan bermanuver robot bergantung pada jumlah kaki, bentuk robot, dan cara berjalan robot.
I.2 Identifikasi Masalah
Identifikasi masalah Tugas Akhir ini adalah kebutuhan akan robot yang memiliki kemampuan bergerak holonomik.
I.3 Perumusan Masalah
Perumusan masalah Tugas Akhir ini adalah bagaimana membuat struktur tubuh robot dan mengontrol gerakan kaki agar dapat berjalan secara holonomik berdasar pada langkah dan arah yang diperintahkan dan bermanuver dalam maze yang tetap.
I.4 Tujuan
Tujuan Tugas Akhir ini adalah membuat prototipe robot merangkak enam kaki holonomik.
(3)
BAB I PENDAHULUAN
UNIVERSITAS KRISTEN MARANATHA
I.5 Pembatasan Masalah
Tugas Akhir ini dibatasi oleh beberapa hal :
1. Kaki robot memiliki dua derajat kebebasan.
2. Arah tujuan robot mengikuti posisi bumi dengan kelipatan 450 (00-3600). 3. Arah 00 merupakan posisi utara bumi.
4. Tugas yang dikerjakan robot :
• Robot mampu berjalan sesuai dengan langkah dan arah yang dimasukkan melalui keypad.
• Robot dapat berjalan menuju ruangan-ruangan yang terdapat pada maze.
5. Lapangan yang digunakan untuk tempat percobaan menggunakan lapangan yang sama dengan lapangan pada KRCI divisi senior berkaki dengan batasan:
• Lapangan berlantai satu.
• Lapangan berupa lahan datar bersekat.
• Konfigurasi lapangan tetap untuk semua percobaan.
• Konfigurasi lapangan yang digunakan ditunjukkan pada Gambar 1.1.
Gambar 1.1 Konfigurasi Lapangan Percobaan
I.6 Spesifikasi Alat
Spesifikasi alat adalah sebagai berikut:
1. Robot berbentuk hexapod.
2. Robot mampu bergerak holonomik. 3. Robot mampu bermanuver dalam maze.
(4)
BAB I PENDAHULUAN
UNIVERSITAS KRISTEN MARANATHA
I.7 Sistematika Pembahasan
Sistematika pembahasan laporan Tugas Akhir ini disusun menjadi lima bab, yaitu sebagai berikut :
BAB I PENDAHULUAN
Bab ini membahas tentang latar belakang, identifikasi masalah, perumusan masalah, tujuan, pembatasan masalah, spesifikasi alat, serta sistematika pembahasan.
BAB II LANDASAN TEORI
Bab ini membahas teori-teori yang digunakan dalam merancang dan merealisasikan struktur kaki robot yaitu berupa teori tentang robot berkaki, motor servo, sensor kompas, sensor jarak, dan pengontrol mikro ATMEGA 16 dan ATtiny 2313.
BAB III PERANCANGAN DAN REALISASI
Bab ini membahas tentang perancangan sistem robot berkaki enam, perancangan dan realisasi robot berkaki enam, perancangan dan realisasi rangkaian sensor dan pengontrol mikro, algoritma pergerakan kaki, algoritma pemrograman robot berkaki enam, serta gerakan robot holonomik.
BAB IV DATA PENGAMATAN DAN ANALISA
Bab ini menjelaskan mengenai proses pengambilan data pengamatan, pengujian kemampuan robot, dan analisisnya.
BAB V KESIMPULAN DAN SARAN
Bab ini membahas mengenai kesimpulan dari Tugas Akhir dan saran-saran yang perlu dilakukan untuk perbaikan di masa yang mendatang.
(5)
BAB V
KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari Tugas Akhir dan saran-saran yang perlu diperhatikan untuk perbaikan di masa yang akan datang.
V.1 Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab sebelumnya, dapat disimpulkan bahwa:
1. Robot merangkak enam kaki dengan bentuk segienam, memiliki dua derajat kebebasan pada setiap kaki, dan mampu bergerak holonomik berhasil direalisasikan.
2. Robot merangkak enam kaki menggunakan prinsip wave gait untuk berjalan. 3. Penyimpangan sudut robot semakin besar bila berjalan lebih dari lima langkah. 4. Mekanik robot yang tidak sempurna dan penempatan sensor merupakan
faktor-faktor yang menyebabkan robot tidak dapat menjalankan tugasnya dengan baik.
V.2 Saran
Saran-saran yang dapat diberikan untuk perbaikan dan pengembangan Tugas Akhir ini di masa mendatang adalah:
1. Penempatan sensor pada robot perlu diperhatikan sehingga semua tempat dapat terdeteksi.
2. Koreksi digunakan ketika robot berjalan berdasarkan langkah dan arah untuk meminimalkan penyimpangan sudut.
(6)