Senin, 09 Juni 2014

Robot Line Follower Microcontroller ATmega32



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



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

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.



                       
               Gambar 2 warna hitam cahaya pantulan sedikit, warna putih cahaya pantulan lebih banyak


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  

B.   Perancangan Desain Robot
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

 3.   Rangkaian Sensor Samping
                                                Gambar 8. Rangkaian sensor samping

4.      Rangkaian Driver Motor

                               Gambar 9. Rangkaian driver motor kanan

                                                  Gambar 10. Rangkaian driver motor kiri

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 14. Lay Out PCB sensor photo diode samping

4.      Driver Motor Kanan dan Kiri


                                                    Gambar 15. Lay Out PCB Driver Motor

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

H.  Robot Line Follower Setelah Microcontroler Diprogram


                                         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. 




                                DAFTAR PUSTAKA



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)



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;
    }
}
}

 





































2 komentar:

  1. Titanium TV - TIBCOS - TITanium Art
    TITanium 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.

    BalasHapus