LAPORAN
PRAKTIK
MIKROCONTROLLER
ROBOT
LINE FOLLOWER
DISUSUN OLEH :
NAMA : EKA SETIA BUDI SANTOSA
NIM :
12502244007
KELAS :
A2
JURUSAN PENDIDIKAN TEKNIK ELEKTRONIKA
FAKULTAS TEKNIK
UNIVERSITAS
NEGERI YOGYAKARTA
2014
BAB I
PENDAHULUAN
PENDAHULUAN
A. Latar Belakang
Di zaman
teknologi maju seperti
sekarang, banyak robot-robot cerdas dengan bentuk dan fungsi yang beragam.
Robot-robot mampu berkerja
secara otomatis menggantikan tugas-tugas
yang biasanya dilakukan manusia.
Bekerja pada lokasi
berbahaya seperti gunung berapi
dan lapangan ranjau
adalah pekerjaan berbahaya yang sekarang digantikan oleh robot.
Meskipun mempunyai fungsi
yang sama, desain, cara
kerja, dan kinerjanya
tergantung pada kretifitas pembuatnya.
Dari sisi desain
dan cara kerja, rata-rata
robot menunjukkan kecanggihan dengan strategi
dan pemakaian komponen
yang bermacam-macam.
Sebagaimana telah kita
ketahui bahwa banyak robot
yang kinerjanya dikontrol dengan cara
merubah program-program pada komputer. Urutan
kerja yang harus
dilakukan oleh robot telah
diprogramkan ke dalam perangkat lunak, sehingga
computer dapat melaksanakan
program tersebut dan robot
akan melaksanakan semua perintah yang terkandung pada program
tersebut. Namun dalam penggunaan
komputer pada waktu mengontrol
robot terlihat kurang
efisien jika dilihat dari
sisi pemakaian listrik
dan mobilitas, maka digunakan
mikrokontroler ATmega32
sebagai pengendali robot.
Untuk efisiensi maka sistem gerak robot memakai roda dengan motor DC sebagai
roda penggerak belakang sekaligus penentu arah belokan. Robot ini
merupakan robot otomatis
yang memiliki kemampuan tracking
sesuai dengan database dan
program yang ada
di dalam mikrokontroler robot
tersebut, dan juga melakukan gerakan mekanik secara otomatis. Sehingga robot
ini bisa melakukan perpindahan
dari suatu tempat
ke tempat yang lain
sesuai dengan track
yang telah disediakan bagi
robot tersebut dan
melakukan banyak gerakan mekanik
untuk meletakan balok serapih
mungkin. Sebagai proses kontrol
dan pengendali utama
dari sistem robot tersebut,
pada penelitian ini digunakan
mikrokontroler ATmega32 keluaran ATMEL. Pengunaan mikrokontroler ATmega32
sebagai pengontrol dari sistem
robot ini karena kemampuannya dalam melakukanpenanganan
terhadap sistemnya dan
mampu melakukan pengontrolan
dengan baik, sehingga pergerakan atau tracking dari robot ini sesuai dengan
program yang sudah ada. Mikrokontroler ini
sangat mudah didapat dipasaran
dan memiliki kapasitas karakteristik komponen
yang mendukung untuk aplikasi kerja
sistem yang.
B.
Tujuan
1. Mempelajari dan
mengembangkan sistem
pengendalian robot linefollower dengan
menggunakan mikrokontroler ATmega32
2. Menumbuh
kembangkan dan meningkatkan kreatifitas
3.
Menerapkan
teknologi mikrocontroller dalam pengembangan dunia robotika
C.
Manfaat
Robot line follower dapat digunakan sebagai dasar
dalam pengenalan dunia robotika, yang mana digunakan sebagai media pembelajaran
dalam rancang-bangun dan unjuk kerja robot line follower di lingkungan sekolah.
Kehadiran robot line follower ini akan membuat siswa semakin dekat dengan perkembangan
teknologi robot. Siswa dapat mengetahui bagaimana rancang-bangun dan unjuk
kerja robot line follower, komponen apa saja yang digunakan, dan bagaimana
langkah-langkah pembuatannya.
BAB II
PEMBAHASAN
A. Dasar Teori
1. Robot
Line Follower
Gambar 2 warna hitam cahaya
pantulan sedikit, warna putih cahaya pantulan lebih banyak
B. Perancangan Desain Robot
Robot line follower terdiri dari perangkat keras
yang meliputi perangkat elektronik dan mekanik, dan perangkat lunak berupa
bahasa pemrograman. Robot ini terdiri dari beberapa komponen yang saling
berhubungan, yaitu sensor, pengkondisi sinyal, mikrokontroler, dan driver
motor. Semua komponen tersebut disatukan dalam sebuah konstruksi sehingga
menjadi robot yang berfungsi. Prinsip dasarnya sama seperti manusia, sensor
sebagai mata, mikrokontroler segabai otak, dan motor sebagai pengerak robot
untuk berpindah.
Robot Line Follower pada dasarnya
adalah suatu robot yang dirancang agar dapat beroperasi secara otomatis
bergerak mengikuti alur garis yang telah dibuat diatas lantai. Konsep dasar
dalam pengoprasian line follower robot
bergantung pada pembacaan sistem sensor dan pengaturan gerak dari motor
DC. Adapun dasar pengoperasian robot Line follower adalah sebagai berikut
:
a) Untuk
membaca garis, robot dilengkapi dengan sensor yang diletakkan di ujung depan
dari robot tersebut. Sensor merupakan suatu piranti elektronika yang berfungsi
untuk mengubah besaran-besaran fisik yang ada di alam menjadi besaran elektrik
yang dapat dimengerti oleh rangkaian elektronika.
Dalam perancangan sebuah robot line follower, sensor
merupakan salah satu bagian sistem terpenting. Karena kemampuan robot untuk
mengikuti garis, akan tergantung pada aktivitas dan sensitifitas sensornya.
Sensor robot line follower biasanya menggunakan
sensor intensitas cahaya yang difungsikan untuk mendeteksi adanya garis putih
pada lapangan dengan warna hitam ataupun mendeteksi garis hitam pada alas
berwarna putih. Alasan penggunaan sensor intensitas cahaya yaitu pertimbangan
kemudahan pembacaan garis oleh sensor melalui pantulan cahaya yang diterimanya.
b) Untuk
mengendalikan robot diatas track,
digunakan beberapa pengendali mekanik, dan yang digunakan disini digunakan
motor DC sebagai penggeraknya kemudian menggunakan sebuah pengontrol untuk
mengendalikan motor tersebut dengan algoritma dan aturan yang disesuaikan pula.
c) Pengendalian
kecepatan sangat bergantung pada batas putaran dan pergesekan antara ban robot
dengan lantainya.
d) Ada
dua jenis garis yang mampu dibaca oleh robot line follower, yaitu garis putih dan garis hitam, sesuai dengan pengaturan
yang ditentukan
2. Microcontroller AVR ATmega32
Gambar 1. Susunan kaki
mikrokontroller ATmega 32
Sumber: www.atmel.com
Mikrokontroler merupakan suatu device
yang didalamnya sudah terintegrasi dengan I/O Port, RAM, ROM, sehingga dapat digunakan untuk berbagai keperluan
control. Mikrokontroler AVR ATmega 32 merupakan low power CMOS Mikrokontroler 8-bit yang dikembangkan oleh Atmel
dengan arsitektur RISC(Million Instruction
Set Computer) Sehingga dapat mencapai throughput
eksekusi instruksi 1 MIPS(Million
Istruction Per Second). Keistimewaan yang terdapat pada Mikrokontroler AVR
ATmega32 :
a. 8-bit
CPU sebagai pusat pengendalian aplikasi.
b. Mempunyai
131 instruksi yang sebagai besar dieksekusi dalam 1 cycle.
c. 32
register umum yang terhubung dengan ALU (Arithmetic
Logic Unit).
d. Kemampuan
memproses instruksi sampai 8 MIPS (Million
Instruction Per Second).
e. Memiliki
1024 Bytes EEPROM dengan endurance :
1000,000 Write/Erase Cycles.
f. Memiliki
2 Kbyte Internal SRAM (Stratic Random
Acces Memory) digunakan untuk menyimpan data dari program flash.
g. ADC (Analog To Digital Converter) internal
dengan resolusi 10 bit sebanyak 8 channel.
h. Konsumsi
daya :
- 1.1mA
ketika aktif.
- 0.35mA
ketika Idle.
- Power-down < 1µA. (atmel.com)
3. Sensor
Photo Diode
Prinsip kerjanya sensor photo diode adalah memanfaatkan
sifat cahaya yang akan dipantulkan jika mengenai benda berwarna terang dan akan
diserap jika mengenai benda berwarna gelap. Sebagai sumber cahaya kita gunakan
LED (Light Emiting Diode) yang akan memancarkan cahaya merah dan untuk
menangkap pantulan cahaya LED kita gunakan photodiode. Jika sensor berada
diatas garis hitam maka photodioda akan menerima sedikit sekali cahaya
pantulan. Tetapi jika sensor berada diatas garis putih maka photodioda akan
menerima banyak cahaya pantulan.
3. Motor
Prinsip dasar dari motor DC adalah jika sebuah kawat
berarus diletakkan antara kutub magnet (U-S), maka pada kawat itu akan bekerja
suatu gaya yang menggerakan kawat itu. Arah gerakan kawat dapat ditentukan dengan menggunakan
kaidah tangan kiri, yang berbunyi sebagai berikut:
”Apabila
tangan kiri terbuka diletakkan di antara kutub U dan S, sehingga garis-garis
gaya yang keluar dari kutub utara menembus telapak tangan kiri dan arus di
dalam kawat mengalir searah dengan arah keempat jari, maka kawat itu akan
mendapat gaya arahnya sesuai dengan arah ibu jari”.
Gambar 3.
Motor DC
1. Alas
Robot
Gambar 4. Rancangan alas robot
2. Dudukan
Motor DC dan AS Roda
Gambar 5. Rancangan dudukan motor
C. Perancangan Rangkaian Elektronik
1. Sistim
Minimum AT Mega 32
Gambar 6. Rangkaian sistim minimum ATmega32
2. Rangkaian
Sensor Photo Diode
Gambar 7. Rangkaian
sensor photo diode
Gambar 9. Rangkaian driver motor kanan
D. Lay Out PCB Rangkaian Elektronik
1. Sistim
Minimum AT Mega 32
Gambar 11. Lay Out PCB sistim minimum
2. Push
Button
Gambar 12. Lay OUT PCB Push
Button
3. Sensor
Photo Diode
Gambar 13. Lay Out PCB sensor photo diode depan
Gambar 15. Lay Out PCB Driver Motor
E. Langkah Pengerjaan
1. Pengerjaan alas dan dudukan motor robot
E. Langkah Pengerjaan
1. Pengerjaan alas dan dudukan motor robot
a.
Menggambar desain alas robot pada PCB
yang akan digunakan sebagai alas, sesuai desain ukuran diatas
b. Setelah desain digambar sesuai ukuran diatas, bagian yang tidak digunakan dipotong sehingga tersisa bagian yang akan digunakan sebagai alas robot
b. Setelah desain digambar sesuai ukuran diatas, bagian yang tidak digunakan dipotong sehingga tersisa bagian yang akan digunakan sebagai alas robot
Berikut gambar
alas robot yang telah selesai dipotong
Gambar 16. alas robot
c. Memotong plat alumunium yang akan digunakan
sebagai dudukan motor dengan ukuran seperti gambar desain diatas
d. Melakukan pengeboran pada titik-titik sebagai tempat
baut
Gambar
17. Dudukan motor
e.
Memasang motor DC, dan roda pada dudukan
motor
Gambar 18. Hasil pemasangan motor DC dan roda
pada dudukan motor
2.
Pengerjaan rangkaian elektronik
a.
Mencetak desain lay out PCB (sistim
minimum, sensor photo diode, dan driver motor) pada kertas glossy foto.
b.
Menempelkan lay out PCB hasil print
kertas glossy foto pada PCB dengan cara
disetrika
Gambar 19. Menyetrika
layout PCB pada PCB
c. Melarutkan permukaan tembaga PCB yang
tidak digunakan, dengan menggunakan larutan FeCl2
Gambar 20. Melarutkan
lapisan tembaga yang tidak digunakan
d. Melakukan pengeboran pada titik-titik
dari PCB yang akan digunakan sebagai tempat pemasangan komponen
Gambar 21. Melakukan pengeboran
e. Melapisi permukaan jalur tembaga dengan
pelapis PCB agar tidak terjadi korosi
f.
Melakukan pemasangan komponen
g. Melakukan penyolderan kaki-kaki komponen pada PCB
(Pemasangan dan penyolderan komponen dimulai dari
komponen yang paling kecil dan pendek)
Gambar 22. Melakukan pengeboran
Berikut gambar dari hasil pemasangan komponen pada PCB
1)
Sistim minimum
Gambar 23. Sistim minimum ATmega 32
2) Tombol-tombol
Gambar 24. Tombol-tombol
3) Driver Motor
Gambar 25. Driver Motor
4) Sensor Depan dan Samping
Gambar 26. Sensor photo diode Depan dan Samping
h.
Merakit rangkaian sistim minimum, sensor
photo diode, dan driver motor pada alas robot
Gambar
27. Hasil perakitan pada alas robot
i. Memasang dudukan motor pada alas robot dan melakukan pengkabelan
Gambar 28. Pemasangan dudukan motor pada alas robot dan melakukan pengkabelan
F. Perancangan Software
1. Algoritma
a. Mulai
b. Sensor photo diode mendeteksi pantulan cahaya berdasarkan garis putih dan hitam
c. Apakah S1 = 1 dan S2 = 0 dan S3 = 0 dan S4 = 0 dan S5 = 0 dan S6 = 0 dan S7 = 0 dan S8 = 0, jika ya belok kiri tajam
d. Jika tidak apakah S1 = 1 dan S2 = 1 dan S3 = 0 dan S4 = 0 dan S5 = 0 dan S6 = 0 dan S7 = 0 dan S8 = 0, jika ya belok kiri tajam
e. Jika tidak apakah S1 = 0 dan S2 = 1 dan S3 = 1 dan S4 = 0 dan S5 = 0 dan S6 = 0 dan S7 = 0 dan S8 = 0, jika ya belok kiri sedang
f. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 1 dan S4 = 1 dan S5 = 0 dan S6 = 0 dan S7 = 0 dan S8 = 0, jika ya belok kiri ringan
g. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 0 dan S4 = 1 dan S5 = 1 dan S6 = 0 dan S7 = 0 dan S8 = 0, jika ya maju cepat
h. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 0 dan S4 = 0 dan S5 = 1 dan S6 = 1 dan S7 = 0 dan S8 = 0, jika ya belok kanan ringan
i. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 0 dan S4 = 0 dan S5 = 0 dan S6 = 1 dan S7 = 1 dan S8 = 0, jika ya belok kanan sedang
j. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 0 dan S4 = 0 dan S5 = 0 dan S6 = 0 dan S7 = 1 dan S8 = 1, jika ya belok kanan tajam
k. Jika tidak apakah S1 = 0 dan S2 = 0 dan S3 = 0 dan S4 = 0 dan S5 = 0 dan S6 = 0 dan S7 = 0 dan S8 = 1, jika ya belok kanan tajam
l. Selesai
Keterangan :
a. S1 sampai dengan S8 = Sensor1 sampai dengan Sensor8
b. Keadaan 0 berarti sensor pada bidang warna putih, sedangkan keadaan 1 berarti sensor pada bidang (garis) warna hitam
2. Flow Chart
Gambar 29. flow chart pergerakan robot
G. Program Line Follower
Terlampir
Gambar 30. Robot Line Follower setelah diprogram
I. Hasil Uji Coba
Video 1
Video 2
Video 3
J. Analisa
Robot
line follower dapat mengikuti garis hitam yang disusun membentuk sejumlah
persimpangan-persimpangan. Robot diprogram untuk dapat membaca persimpangan yang dilaluinya, kemudian belok
sesuai dengan arah yang diinginkan. Untuk membaca garis, robot mendetaksi
dengan sensor photo diode yang dapat membedakan antara garis hitam dengan
lantai putih. Sensor tersebut dapat dikalibrasi untuk menyesuaikan pembacaan sensor
terhadap kondisi pencahayaan ruangan. Sehingga pembacaan sensor selalu akurat. Agar
pergerakan robot menjadi lebih halus, maka kecepatan robot diatur sesuai dengan
kondisi pembacaan sensor. Jika posisi robot menyimpang dari garis, maka robot
akan melambat. Namun jika robot tepat berada diatas garis, maka robot akan
bergerak cepat. Robot juga dapat kembali ke garis pada saat robot terlepas sama
sekali dari garis. Hal ini bisa dilakukan karena robot selalu mengingat kondisi
terakhir pembacaan sensor. Jika terakhir kondisinya adalah disebelah kiri
garis, maka robot akan bergerak ke kanan, demikian pula sebaliknya. Dalam
pembacaan sensor memanfaatkan pin ADC pada microcontroller ATmega32, sehingga
tegangan analog dapat dikonversi menjadi signal digital yang dapat diolah oleh microcontroller.
Pengendalian kecepatan gerak robot dengan
memanfaatkan PWM sangat efektif untuk mengendalikan kecepatan motor, Pulse Width
Modulation ini berfungsi sebagai pengatur tegangan
output. Fungsi PWM
ini dapat di
bentuk/dibuat dengan metode ISR
(Interrupt Service Routine)
dengan memanfaatkan fitur
Timer yang ada pada AVR pada saat timer tersebut terjadi
overflow/melimpah. Pengendalian kecepatan ini diperlukan karena jika kecepatan
motor terlalu tinggi respons dari pergerakan robot akan terlambat, sehingga
robot akan keluar dari lintasan garis.
Berdasarkan hasil uji coba pada track seperti video diatas robot line follower masih mengalami gangguan dalam mendeteksi garis, hal itu disebabkan karena pengaturan/setting nilai kendali PID yang kurang tepat. PID (dari singkatan bahasa Proportional–Integral–Derivative controller) merupakan kontroler untuk menentukan presisi suatu sistem dengan karakteristik adanya umpan balik pada sistem tesebut. Komponen kontrol PID ini terdiri dari tiga jenis yaitu Proportional, Integratif dan Derivatif. Ketiganya dapat dipakai
bersamaan maupun sendiri-sendiri tergantung dari respon yang kita inginkan terhadap suatu plant.
Kontroler Proporsional (P)
Pengaruh pada sistem :
1. Menambah atau mengurangi kestabilan.
2. Dapat memperbaiki respon transien khususnya : rise time, settling time
3. Mengurangi (bukan menghilangkan) Error steady state.
Kontroler Integral (I)
Pengaruh pada sistem :
1. Menghilangkan Error Steady State
2. Respon lebih lambat (dibandingkan dengan P)
3. Dapat Menambah Ketidakstabilan (karena menambah orde pada sistem)
Kontroler Derivatif (D)
Pengaruh pada sistem :
1. Memberikan efek redaman pada sistem yang berosilasi sehingga bisa memperbesar pemberian nilai Kp
2. Memperbaiki respon transien, karena memberikan aksi saat ada perubahan error
3. D hanya berubah saat ada perubahan error, sehingga saat ada error statis D tidak beraksi.Sehingga D
tidak boleh.
BAB
III
PENUTUP
A. Kesimpulan
1.
Robot
line follower berjalan berdasarkan
jalur / lintasan berupa garis hitam 1,5–2 cm
2.
Mikrokontroler dapat mengartikan logika
masukan sensor karena telah diprogram sedemikian rupa sehingga
dapat memberikan output sesuai logika yang di inputkan
3.
Kecepatan pergerakan robot diatur dengan
PWM Pulsa PWM adalah sederetan
pulsa yang lebar
pulsanya dapat diatur.
B. Saran
Robot line
follower ini dapat ditambahkan komponen lain seperti
sensor jarak. Sensor jarak
dapat berfungsi saat ada benda lain yang berada di depan
jalur line follower ini agar robot
ini dapat berhenti.
Robot line follower diharapkan dapat
dijadikan dasar dalam pengenalan dan pembelajaran tentang pemanfaatan
microcontroller sebagai pengendali robot, sehingga melalui pengenalan tersebut
dapat dikembangkan berbagai alat yang dapat membantu mempermudah pekerjaan
manusia dengan kendali miocrocontroller.
http://id.wikipedia.org/wiki/Robot, 1 Juni 2014.
http://tyanretsa.blogspot.com/2013/08/photodioda-dan-led.html, 1 Juni 2014
Modul Pembelajaran Mikrocontroller Dengan Robot Line Follower (Amir Fatah F)
DAFTAR PUSTAKA
http://tyanretsa.blogspot.com/2013/08/photodioda-dan-led.html, 1 Juni 2014
Modul Pembelajaran Mikrocontroller Dengan Robot Line Follower (Amir Fatah F)
1. Lampiran
/*****************************************************
This program was produced by
the
CodeWizardAVR V1.25.9
Professional
Automatic Program Generator
© Copyright 1998-2008 Pavel
Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Chip
type : ATmega32
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
// Alphanumeric LCD Module
functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x60
#include <stdio.h>
#define
t1 PINC.3
#define
t2 PINC.4
#define
t3 PINC.5
#define
t4 PINC.2
#define
t5 PINC.1
#define
t6 PINC.0
#define
ledbelakang PORTD.1
#define leddepan PORTD.2
#define led PORTB.3
#define
ledR PORTC.5
#define
ledL PORTC.6
#define
buzz PORTD.7
#define
kiri2 PORTD.3
#define
kiri1 PORTD.4
#define
kanan1 PORTD.5
#define
kanan2 PORTD.6
char
buff[33];
unsigned char kp,kd,ki,kpwm;
unsigned char
kepekaan[10],u,Hpeka[10], Lpeka[10];
unsigned int
sensordepan,sensorblk;
int
I,awal,error,lasterror,rate,move;
unsigned char c,count;
int rpwm,lpwm;
unsigned char x,xi,u;
unsigned char
delay1,delay2,vbelok,vmundur,vbelok1,vmundur1,vbelok2,vbelok3;
eeprom unsigned char
edelay1;
eeprom unsigned char
edelay2;
eeprom unsigned char
evmundur;
eeprom unsigned char
evbelok1;
eeprom unsigned char
evmundur1;
eeprom unsigned char
evbelok2;
eeprom unsigned char
evbelok3;
eeprom unsigned char
evbelok;
eeprom char ekepekaan[10];
eeprom unsigned char ekp;
eeprom unsigned char eki;
eeprom unsigned char ekd;
eeprom unsigned char ekpwm;
void maju(){
OCR1A=255-rpwm;
OCR1B=255-lpwm;
kanan2=0;
kiri2=0;
}
void mundur(){
OCR1A=255-rpwm;
OCR1B=255-lpwm;
kanan2=1;
kiri2=1;
}
void stop(){
OCR1A=255;
OCR1B=255;
kanan2=0;
kiri2=0;
}
void
kanan(){
OCR1A=255-rpwm;
OCR1B=255-lpwm;
kanan2=1;
kiri2=0;
}
void kiri(){
OCR1A=255-rpwm;
OCR1B=255-lpwm;
kanan2=0;
kiri2=1;
}
// 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);
// Delay needed for the
stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD
conversion to complete
while ((ADCSRA &
0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void scansensor(){
lcd_clear();
sensordepan=0;
sensorblk=0;
for(count=0;count<10;count++){
kepekaan[count]=ekepekaan[count];
leddepan=1;
ledbelakang=0;
for(count=0;count<8;count++){
u=read_adc(count);
if(count==0){
lcd_gotoxy(4,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+1; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==1){
lcd_gotoxy(5,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+2; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==2){
lcd_gotoxy(6,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+4; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==3){
lcd_gotoxy(7,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+8; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==4){
lcd_gotoxy(8,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+16; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==5){
lcd_gotoxy(9,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+32; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==6){
lcd_gotoxy(10,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+64; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==7){
lcd_gotoxy(11,0);
if(u>kepekaan[count]){
sensordepan=sensordepan+128; lcd_putchar('1');
}
else lcd_putchar('0');
}
}
leddepan=0;
ledbelakang=1;
for(count=8;count<10;count++){
u=read_adc((count-2));
if(count==8){
lcd_gotoxy(0,0);
if(u>kepekaan[count]){
sensorblk=sensorblk+1; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==9){
lcd_gotoxy(15,0);
if(u>kepekaan[count]){
sensorblk=sensorblk+2; lcd_putchar('1');
}
else lcd_putchar('0');
}
}
}
}
void
autoscan(){
int l,se;
unsigned char sxx;
lcd_clear();
led=1;
lcd_gotoxy(0,0);
lcd_putsf("Scan Sensor");
for(l=0;l<10;l++){
kepekaan[l]=0;
Lpeka[l]=255;
Hpeka[l]=0;
}
while(1){
leddepan=1;
ledbelakang=0;
delay_us(250);
for(se=0;se<8;se++){
sxx=read_adc(se);
if(sxx<Lpeka[se]){
Lpeka[se]=sxx;
}
if(sxx>Hpeka[se]){
Hpeka[se]=sxx;
}
}
leddepan=0;
ledbelakang=1;
delay_us(250);
for(se=8;se<10;se++){
sxx=read_adc(se-2);
if(sxx<Lpeka[se]){
Lpeka[se]=sxx;
}
if(sxx>Hpeka[se]){
Hpeka[se]=sxx;
}
}
if(!t1){
break;
}
}
leddepan=1;
ledbelakang=1;
for(se=0;se<10;se++){
kepekaan[se]=((Hpeka[se]-Lpeka[se])/2)+Lpeka[se];
lcd_gotoxy(0,0);
sprintf(buff,"Sensor %d =
%d",se,kepekaan[se]);
lcd_puts(buff);
lcd_gotoxy(0,1);
lcd_puts("================");
delay_ms(300);
lcd_clear();
delay_ms(200);
};
leddepan=0;
ledbelakang=0;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Scan
Selesai");
lcd_gotoxy(0,1);
lcd_putsf("Simpan
(T5)");
while(1){
if(!t5){
se=1;
for(se=0;se<10;se++){
ekepekaan[se]=kepekaan[se];
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Simpan");
delay_ms(400);
break;
}
}
}
void set_sensor(){
lcd_clear();
u=read_adc(xi);
lcd_gotoxy(0,0);
sprintf(buff, "ADC%d=%d",x,u);
lcd_puts(buff);
lcd_gotoxy(0,1);
sprintf(buff,
"Set%d=%d",x,kepekaan[x]);
lcd_puts(buff);
if(!t3){
kepekaan[x]=kepekaan[x]+1;
delay_ms(100);
}
if(!t4){
kepekaan[x]=kepekaan[x]-1;
delay_ms(100);
}
}
void pekasensor()
{
x=0;
while(1){
if(!t1){
x=x+1;
delay_ms(100);
}
if(x==10){
x=0;
}
if(!t2){
x=x-1;
delay_ms(100);
}
if(x==-1){
x=9;
}
if(x==0){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==1){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==2){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==3){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==4){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==5){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==6){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==7){
ledbelakang=0;
leddepan=1;
xi=x;
set_sensor();
}
else if(x==8){
ledbelakang=1;
leddepan=0;
xi=x-2;
set_sensor();
}
else if(x==9){
ledbelakang=1;
leddepan=0;
xi=x-2;
set_sensor();
}
if(!t5){
for(count=0;count<10;count++){
ekepekaan[count]=kepekaan[count];
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Scan Selesai");
delay_ms(200);
break;
}
delay_ms(100);
}
};
void setting(){
unsigned char n;
n=1;
leddepan=0;
ledbelakang=0;
while(1){
if(!t1){
n=n+1;
delay_ms(100);
}if(n>7){
n=1;
}
if(!t2){
n=n-1;
delay_ms(100);
}
if(n<1){
n=7;
}
if(n==1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("1|Menu
2|Kmbl 3|+");
lcd_gotoxy(0,1);
lcd_putsf("4|- 5|Smpn
6|jln");
}
if(n==2){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Scan Sensor
");
lcd_gotoxy(0,1);
lcd_putsf("Autoscan
(T4)");
if(!t4){
autoscan();
}
}
if(n==3){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Peka
Sensor");
lcd_gotoxy(0,1);
if(!t3){
pekasensor();
}
}
if(n==4){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kecepatan
PWM");
sprintf(buff,"V=%d",
kpwm);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
kpwm=kpwm+2;
}
else if(!t4){
kpwm=kpwm-2;
}
}
if(n==5){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Proportional");
sprintf(buff,"V=%d", kp);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
kp=kp+1;
}
else if(!t4){
kp=kp-1;
}
}
if(n==6){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Integral");
sprintf(buff,"V=%d", ki);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
ki=ki+1;
}
else if(!t4){
ki=ki-1;
}
}
if(n==7){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Derivatif");
sprintf(buff,"V=%d", kd);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
kd=kd+1;
}
else if(!t4){
kd=kd-1;
}
}
if(!t5){
if(kpwm!=ekpwm){
ekpwm=kpwm;
}
if(kp!=ekp){
ekp=kp;
}
if(ki!=eki){
eki=ki;
}
if(kd!=ekd){
ekd=kd;
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Simpan");
delay_ms(500);
}
if(!t6){
break;
}
delay_ms(100);
}
}
void setting2(){
unsigned char s;
s=1;
leddepan=0;
ledbelakang=0;
while(1){
if(!t1){
s=s+1;
delay_ms(100);
}
if(s>8){
s=1;
}
if(!t2){
s=s-1;
delay_ms(100);
}
if(s<1){
s=8;
}
if(s==1){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kcptn Blk
Lancp");
lcd_gotoxy(0,1);
sprintf(buff,"V =%d",vbelok);
lcd_puts(buff);
if(!t3){
vbelok=vbelok+2;
}
if(!t4){
vbelok=vbelok-2;
}
}
if(s==2){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("V Belok
Siku");
sprintf(buff,"%d",vbelok1);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
vbelok1=vbelok1+2;
}
if(!t4){
vbelok1=vbelok1-2;
}
}
if(s==3){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kcptn Blk
Per3an");
sprintf(buff,"%d",vbelok2);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
vbelok2=vbelok2+2;
}
if(!t4){
vbelok2=vbelok2-2;
}
}
if(s==4){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kcptn Blk
Per4an");
sprintf(buff,"%d",vbelok3);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
vbelok3=vbelok3+2;
}
if(!t4){
vbelok3=vbelok3-2;
}
}
if(s==5){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kcptn Mundr
Lncp");
sprintf(buff,"%d",vmundur);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t2){
vmundur=vmundur+2;
}
if(!t4){
vmundur=vmundur-2;
}
}
if(s==6){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kcptn
Mundur Siku");
sprintf(buff,"%d",vmundur1);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
vmundur1=vmundur1+2;
}
if(!t4){
vmundur1=vmundur1-2;
}
}
if(s==7){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Dly mundur
Lcp");
sprintf(buff,"%d",delay1);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
delay1=delay1+1;
}
if(!t4){
delay1=delay1-1;
}
}
if(s==8){
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Dly mundur
siku");
sprintf(buff,"%d",delay2);
lcd_gotoxy(0,1);
lcd_puts(buff);
if(!t3){
delay2=delay2+1;
}
if(!t4){
delay2=delay2-1;
}
}
if (!t5){
if (vbelok!=evbelok){
evbelok=vbelok;
}
if (vbelok1!=evbelok1){
evbelok1=vbelok1;
}
if (vbelok2!=evbelok2){
evbelok2=vbelok2;
}
if (vbelok3!=evbelok3){
evbelok3=vbelok3;
}
if (vmundur!=evmundur){
evmundur=vmundur;
}
if (vmundur1!=evmundur1){
evmundur1=vmundur1;
}
if (delay1!=edelay1){
edelay1=delay1;
}
if (delay2!=edelay2){
edelay2=delay2;
}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Simpan");
delay_ms(500);
}
if(!t6){
break;
}
delay_ms(100);
}
}
void run(){
switch (sensordepan) {
case 0b00000001 :
case 0b00000011 :
error=-15;
break;
case 0b00000111 : error=-11; break;
case 0b00000010 : error=-9; break;
case 0b00000110 :
case 0b00001111 : error=-7; break;
case 0b00000100 : error=-5; break;
case 0b00001100 :
case 0b00001110 :
case 0b00011110 : error=-3; break;
case 0b00001000 : error=-1; break;
case 0b00011000 :
case 0b00111000 :
case 0b00011100 :
case 0b00111100 :
case 0b00110000 :
case 0b01110000 : error=0; break;
case 0b00010000 : error=1; break;
case 0b01111000 : error=3; break;
case 0b00100000 : error=5; break;
case 0b01100000 :
case 0b11110000 : error=7; break;
case 0b01000000 : error=9; break;
case 0b11100000 : error=11; break;
case 0b11000000 :
case 0b10000000 :
error=15;
break;
case 0b0000000000 :
if((sensorblk==0b10)){
error=16;
}
if(sensorblk==0b01){
error=-16;
}
break;
}
scansensor();
rate = error - lasterror;
lasterror = error;
I = I + error;
move = (int) ((error * kp)+(rate *
kd))+((I * ki)/100);
rpwm = kpwm+move;
lpwm = kpwm-move;
if(error
==(16)){ // Perempatan belok
belok kanan
if (lpwm > vbelok2) lpwm = vbelok2;
if (rpwm < 255-vbelok3) rpwm = 255-vbelok3;
kanan();
}
else if(error ==(15)){ // Sudut Lancip belok kanan
if (lpwm > vbelok) lpwm = vbelok;
if (rpwm < 255-vmundur) rpwm = 255-vmundur;
kanan();
}
else if(error ==(11)){ // Sudut siku belok kanan
if (lpwm > vbelok1) lpwm = vbelok1;
if (rpwm < 255-vmundur1) rpwm = 255-vmundur1;
kanan();
}
else
if((error>(-7))&&(error<7)){ //
Belok kanan, lurus, belok kiri
if ((lpwm >
0)&&(rpwm>0)){
maju();
}
if ((lpwm >
255)&&(rpwm>=0)){
lpwm =255;
maju();
}
if ((rpwm >
255)&&(lpwm>=0)){
rpwm =255;
maju();
}
if ((lpwm <
0)&&(rpwm>0)){
lpwm = 255+ lpwm;
if(rpwm>255){
rpwm=255;
}
kiri();
}
if ((rpwm <
0)&&(lpwm>0)){
rpwm = 255+rpwm;
if(lpwm>255){
lpwm=255;
}
kanan();
}
}
else if(error ==(-11)){ //
Sudut siku belok kiri
if (lpwm < 255-vmundur1) lpwm =
255-vmundur1;
if (rpwm > vbelok1) rpwm = vbelok1;
kiri();
}
else if(error ==(-15)){ // Sudut Lancip belok kiri
if (lpwm < 255-vmundur) lpwm = 255-vmundur;
if (rpwm > vbelok) rpwm = vbelok;
kiri();
}
else if(error ==(-16)){ // Perempatan belok kiri
if (lpwm < 255-vbelok3) lpwm =
255-vbelok3;
if (rpwm > vbelok2) rpwm = vbelok2;
kiri();
}
}
// Timer 0 overflow
interrupt service routine
interrupt [TIM0_OVF] void
timer0_ovf_isr(void)
{
// Reinitialize Timer 0
value
TCNT0=0xFF;
c++;
if (c>=lpwm){
kiri1=1;
}
else{
kiri1=0;
}
if (c>=rpwm){
kanan1=1;
}
else{
kanan1=0;
}
}
// Timer 2 overflow
interrupt service routine
interrupt [TIM2_OVF] void
timer2_ovf_isr(void)
{
TCNT2=0x1f;
}
// Declare your global
variables here
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=Out Func2=In Func1=In Func0=In
// State7=T State6=T
State5=T State4=T State3=1 State2=T State1=T State0=T
PORTB=0x08;
DDRB=0x08;
// 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=P State2=P State1=P State0=P
PORTC=0xFF;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out
Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=1
State5=1 State4=1 State3=1 State2=0 State1=0 State0=0
PORTD=0x78;
DDRD=0xFF;
// Timer/Counter 0
initialization
// Clock source: System
Clock
// Clock value: 15,625 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
//TCCR0=0x05;
//TCNT0=0x01;
TCCR0=0X05;
TCNT0=0xFF;
OCR0=0x00;
// Timer/Counter 1
initialization
// Clock source: System
Clock
// Clock value: 62,500 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Inverted
// OC1B output: Inverted
// Noise Canceler: Off
// Input Capture on Falling
Edge
// Timer1 Overflow
Interrupt: Off
// Input Capture Interrupt:
Off
// Compare A Match
Interrupt: Off
// Compare B Match
Interrupt: Off
TCCR1A=0xF1;
TCCR1B=0x0C;
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: Timer2
Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x07;
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=0x01;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator
initialization
// Analog Comparator: Off
// Analog Comparator Input Capture
by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency:
1000,000 kHz
// ADC Voltage Reference:
AVCC pin
// ADC Auto Trigger Source:
Analog Comparator
// Only the 8 most
significant bits of
// the AD conversion result
are used
ADMUX=ADC_VREF_TYPE &
0xff; // ADC
ADCSRA=0x84;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD
initialization
// Connections specified in
the
// Project|Configure|C
Compiler|Libraries|Alphanumeric LCD menu:
//
RS - PORTB Bit 0
//
RD - PORTB Bit 1
//
EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
stop();
led=1;
ledbelakang=1;
leddepan=1;
delay_ms(200);
lcd_clear();
buzz=1;
lcd_gotoxy(1,0);
lcd_putsf("Line Follower");
lcd_gotoxy(0,1);
lcd_putsf("----========----");
delay_ms(300);
buzz=0;
lcd_clear();
led=0;
delay_ms(300);
led=1;
ledbelakang=1;
leddepan=0;
buzz=1;
lcd_gotoxy(0,0);
lcd_putsf("Eka Setia
Budi S");
lcd_gotoxy(2,1);
lcd_putsf("12502244007");
delay_ms(300);
lcd_clear();
buzz=0;
led=0;
delay_ms(300);
led=1;
ledbelakang=1;
leddepan=1;
lcd_gotoxy(0,0);
lcd_putsf("Univ.
Negeri Yogyakarta 2012");
delay_ms(300);
ledbelakang=0;
leddepan=1;
lcd_clear();
led=0;
ledbelakang=1;
leddepan=0;;
led=1;
ledbelakang=0;
leddepan=0;
delay_ms(100);
atas:
delay1=edelay1;
delay2=edelay2;
vmundur=evmundur;
vbelok1=evbelok1;
vmundur1=evmundur1;
vbelok3=evbelok3;
vbelok2=evbelok2;
kp=ekp;
kd=ekd;
ki=eki;
kpwm=ekpwm;
vbelok=evbelok;
for(count=0;count<10;count++){ //salin dari EEPROM
kepekaan[count]=ekepekaan[count];
}
lasterror=0;
error=0;
awal=error;
setting();
goto bawah;
atas1:
setting2();
bawah:
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Jalan");
delay_ms(300);
led=1;
delay_ms(500);
#asm("sei");
while(1){
scansensor();
if (!t1){
stop();
delay_ms(100);
goto atas;
}
if (!t2){
stop();
delay_ms(100);
goto atas1;
}
if (!t6){
break;
}
}
while(1){
leddepan=0;
scansensor();
run();
if (!t1){
stop();
delay_ms(100);
goto atas;
}
if (!t2){
stop();
delay_ms(100);
goto atas1;
}
}
}
Okey
BalasHapusbagus
Titanium TV - TIBCOS - TITanium Art
BalasHapusTITanium Audio. Audio, video titanium welding and titanium ore audio produced by TITACOR. In TITACOR, the titanium drill bits player is a sound fallout 76 black titanium stage, with a babylisspro nano titanium hair dryer voice control pad for voice-activated speakers.