You are on page 1of 11

/*----------------------------------------------------------------Author : Julian Sahertian Inspired By Boedi, Safi'i, KoERa, Inzar

Comments: Kita tidak akan pernah belajar kalau tahu segala hal,
so Keep Trial n Error
NB
: Program ini Hanya untuk Pembelajaran,
Jangan Mengomersilkan Program ini!!!
------------------------------------------------------------------*/
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#define buzz PORTB.0
#define tombol1 PINB.4
#define tombol2 PINB.3
#define tombol3 PINB.2
#define tombol4 PINB.1
#define sKi PIND.6
#define sKa PIND.7
#define pwmka PORTD.0
#define dirka PORTD.1
#define remka PORTD.2
#define pwmki PORTD.3
#define dirki PORTD.4
#define remki PORTD.5
#define on
0
#define off
1
/*-------------VARIABEL------------*/
unsigned char xcount,i;
unsigned char set_pwm,Kp,Kd;
int rpwm,lpwm;
int error, last_error;
unsigned int s[8];
unsigned char sensor, sens[8];
eeprom unsigned int banding[8],max[8],min[8],baca[8];
unsigned char gr1,gr2;
/*------------------PWM--------------------*/
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ xcount++;
if (xcount>=rpwm)
pwmka=1;
else
pwmka=0;
if (xcount>=lpwm)
pwmki=1;
else
pwmki=0;
}
/*------------------------ADC------------------------*/
#define ADC_VREF_TYPE 0x40
/*-------Read the AD conversion result-------*/
unsigned int 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 ADCW;
}
/*-------------KALIBRASI SENSOR-----------*/
void kalibrasi()
{
delay_ms(30);
for(i=0; i<=7; i++)

{
max[i]=0;
min[i]=1024;
}
i=0;
delay_ms(10);
while(tombol1)
{ buzz=on;
for(i=0; i<=7; i++)
{baca[i]=read_adc(i);
if (baca[i]<min[i])
min[i]=baca[i];
if(baca[i]>max[i])
max[i]=baca[i];
}
i=0;
}
i=0;
/*------perhitungan nilai pembanding-----*/
for(i=0;i<=7;i++)
{banding[i]=((max[i]+min[i])/2);
}
i=0;
buzz=off;
delay_ms(150);
}
void belkir(unsigned char kanan, unsigned char kiri)
{ pwmka=0;
pwmki=0;
dirka=1;
dirki=0;
remka=1;
remki=1;
rpwm=kanan; lpwm=kiri;
}
void belkan(unsigned char kanan, unsigned char kiri)
{ pwmka=0;
pwmki=0;
dirka=0;
dirki=1;
remka=1;
remki=1;
rpwm=kanan; lpwm=kiri;
}
/*-------------------------------------SCANGARIS PID-----------------------------------*/
/*--------------------------------------BACA SENSOR-----------------------------------*/
void tampil_sensor()
{
s[0]=read_adc(0);
if(s[0]>banding[0])
{PORTC.7=gr2;}
else
{PORTC.7=gr1;}
s[1]=read_adc(1);
if(s[1]>banding[1])
{PORTC.6=gr2;}
else
{PORTC.6=gr1;}
s[2]=read_adc(2);
if(s[2]>banding[2])
{PORTC.5=gr2;}
else
{PORTC.5=gr1;}
s[3]=read_adc(3);
if(s[3]>banding[3])
{PORTC.4=gr2;}
else
{PORTC.4=gr1;}
s[4]=read_adc(4);
if(s[4]>banding[4])
{PORTC.3=gr2;}
else
{PORTC.3=gr1;}
s[5]=read_adc(5);
if(s[5]>banding[5])
{PORTC.2=gr2;}

else
s[6]=read_adc(6);
if(s[6]>banding[6])
else
s[7]=read_adc(7);
if(s[7]>banding[7])
else

{PORTC.2=gr1;}
{PORTC.1=gr2;}
{PORTC.1=gr1;}
{PORTC.0=gr2;}
{PORTC.0=gr1;}

}
void baca_sensor()
{ for(i=0;i<=7;i++)
{ s[i]=read_adc(i);
if(s[i]>banding[i]) {sens[i]=gr1;}
else {sens[i]=gr2;}
}
sensor=(sens[7]*1)+(sens[6]*2)+(sens[5]*4)+(sens[4]*8)+(sens[3]*16)+(sens[2]*3
2)+(sens[1]*64)+(sens[0]*128);
}
/*---------------------------2.MAPING ERROR--------------------------*/
void nilai_error()
{ switch(sensor){
//1
case 0b10000000:error=-12; break;
case 0b01000000:error=-9; break;
case 0b00100000:error=-6; break;
case 0b00010000:error=-1; break;
case 0b00001000:error= 1; break;
case 0b00000100:error= 6; break;
case 0b00000010:error= 9; break;
case 0b00000001:error= 12; break;
//2
case 0b11000000:error=-10; break;
case 0b01100000:error=-8; break;
case 0b00110000:error=-3; break;
case 0b00011000:error= 0; break;
case 0b00001100:error= 3; break;
case 0b00000110:error= 8; break;
case 0b00000011:error= 10; break;
//3
case 0b11100000:error=-9; break;
case 0b01110000:error=-6; break;
case 0b00111000:error=-1; break;
case 0b00011100:error= 1; break;
case 0b00001110:error= 6; break;
case 0b00000111:error= 9; break;
};
}
/*--------------------------3.RUMUS PID CONTROLLER-------------------------*/
void pid()
{//
rpwm = set_pwm - (int)(((error)*Kp)-((error-last_error)*Kd));
//
lpwm = set_pwm + (int)(((error)*Kp)+((error-last_error)*Kd));
rpwm=(int)(((-error)* (((Kp)))) +set_pwm)-((error-last_error)* (((Kd))));
lpwm=(int)((( error)* (((Kp)))) +set_pwm)+((error-last_error)* (((Kd))));
last_error=error;
}
/*-----------------------------4.KELUARKAN PID---------------------------*/
void keluarkan()
{ if (lpwm >255)
{lpwm =255;
pwmki=0; dirki=1; remki=1; goto ak
hir_kir;};
if (lpwm >=0)
{lpwm =lpwm;
pwmki=0; dirki=1; remki=1; goto ak
hir_kir;};

if (lpwm <-255)
{lpwm =255;
pwmki=0; dirki=0; remki=1; goto ak
hir_kir;};
if (lpwm <0)
{lpwm =(-lpwm); pwmki=0; dirki=0; remki=1; goto ak
hir_kir;};
akhir_kir:
if (rpwm >255)
{rpwm =255;
pwmka=0; dirka=1; remka=1; goto ak
hir_kan;};
if (rpwm >=0)
{rpwm =rpwm;
pwmka=0; dirka=1; remka=1; goto a
khir_kan;};
if (rpwm <-255)
{rpwm =255;
pwmka=0; dirka=0; remka=1; goto ak
hir_kan;};
if (rpwm <0)
{rpwm =(-rpwm); pwmka=0; dirka=0; remka=1; goto ak
hir_kan;};
akhir_kan:
}
void scan()
{ baca_sensor();
nilai_error();
pid();
keluarkan();
}
/*------LAKUKAN SCANGARIS-----*/
void doscan()
{ while (1)
{ tampil_sensor();
scan();
}
}
/*--------REM--------*/
void rem(int lama)
{ pwmka=1;
pwmki=1;
dirka=1;
dirki=1;
remka=0;
remki=0;
rpwm=0;
lpwm=0;
delay_ms(lama);
}
void mundur(unsigned char kanan, unsigned char kiri, int lama)
{ pwmka=0;
pwmki=0;
dirka=0;
dirki=0;
remka=1;
remki=1;
rpwm=kanan; lpwm=kiri;
delay_ms(lama);
}
/*----------MAJU--------*/
void maju(unsigned char kanan, unsigned char kiri, int lama)
{ pwmka=0;
pwmki=0;
dirka=1;
dirki=1;
remka=1;
remki=1;
rpwm=kanan; lpwm=kiri;
delay_ms(lama);
}
/*---------SCAN PERCABANGAN--------*/
void scanpercab(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sens[0]&&sens[7]) x++;
while(sens[0]&&sens[7])

{ buzz=on; tampil_sensor(); scan();


};
};
}
void scanpercab2(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sens[1]&&sens[6]) x++;
while(sens[1]&&sens[6])
{ buzz=on; tampil_sensor(); scan();
};
};
}
void scanpercab3(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sens[2]&&sens[5]) x++;
while(sens[2]&&sens[5])
{ buzz=on; tampil_sensor(); scan();
};
};
}
void scanpercabki(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sens[0]) x++;
while(sens[0])
{ buzz=on; tampil_sensor();scan();
};
};
}
void scanpercabka(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sens[7]) x++;
while(sens[7])
{ buzz=on; tampil_sensor();scan();
};
};
}
void scanki(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sKi) x++;
while(sKi)

{ buzz=on; tampil_sensor();scan();
};
};
}
void scanka(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sKa) x++;
while(sKa)
{ buzz=on; tampil_sensor();scan();
};
};
}
void scankaki(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{ buzz=off;
tampil_sensor();
scan();
if(sKa&&sKi) x++;
while(sKa&&sKi)
{ buzz=on; tampil_sensor();scan();
};
};
}
void scanputih(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{buzz=off;
scan();
if(sens[0]&&sens[7]){gr1=1; gr2=0; x++;}
while(sens[0]&&sens[7])
{buzz=on; scan();}
}
}
void scanhitam(unsigned char cab)
{ unsigned char x=0;
while(x<cab)
{buzz=on;
scan();
if(sens[0]&&sens[7]){gr1=0; gr2=1; x++;}
while(sens[0]&&sens[7])
{buzz=off; scan();}
}
}
/*-------belok kanan------*/
void belokkanan(){
//kiri.....kanan
baca_sensor();
while(sens[1]||sens[2]||sens[3]||sens[4]||sens[5]||sens[6])
{ belkan(180,150);
baca_sensor();
};
while(!sens[2]&&!sens[3]&&!sens[4]&&!sens[5])
{ belkan(180,150);
baca_sensor();
};

rem(40);
}
/*------belok kiri-----*/
void belokkiri(){
//kiri.....kanan
baca_sensor();
while(sens[1]||sens[2]||sens[3]||sens[4]||sens[5]||sens[6])
{ belkir(150,180);
baca_sensor();
};
while(!sens[2]&&!sens[3]&&!sens[4]&&!sens[5])
{ belkir(150,180);
baca_sensor();
};
rem(40);
}
/*----------------------------belok kanan2------------------------------*/
void belokkanan2(){
//kiri.....kanan
baca_sensor();
while(sens[0]||sens[1]||sens[2]||sens[3]||sens[4]||sens[5]||sens[6]||sens[7])
{ belkan(150,50);
baca_sensor();
};
while(!sens[1]&&!sens[2]&&!sens[3]&&!sens[4]&&!sens[5]&&!sens[6])
{ belkan(150,50);
baca_sensor();
};
rem(40);
}
/*----------------------------belok kiri2-------------------------------*/
void belokkiri2(){
//kiri.....kanan
baca_sensor();
while(sens[0]||sens[1]||sens[2]||sens[3]||sens[4]||sens[5]||sens[6]||sens[7])
{ belkir(50,150);
baca_sensor();
};
while(!sens[1]&&!sens[2]&&!sens[3]&&!sens[4]&&!sens[5]&&!sens[6])
{ belkir(50,150);
baca_sensor();
};
rem(40);
}
/*------STRATEGI------*/
void strategi()
{
//scanpercab3(1);set_pwm=200;
scanpercabka(1); rem(20); belokkanan();
scanpercabka(1); rem(20); belokkanan();
scanpercabki(1); rem(20); belokkiri();
scanpercab3(1); rem(30); belokkiri();delay_ms(10); set_pwm=120;
scanka(1);rem(30); belokkanan2(); delay_ms(10);
scanka(1); set_pwm=170;
scanpercabka(1); rem(20); belokkanan(); set_pwm=150;
scanka(1); rem(20); belokkanan(); delay_ms(10);
//2
scanpercabki(1); rem(20); belokkiri();
scanpercab(1); rem(20); belokkanan(); delay_ms(10);
scanpercabki(1); rem(20); belokkiri();

scanki(1); rem(30); belokkiri();


//3
scanki(1);
scanpercabka(1); rem(20); belokkanan();
scanputih(1);
scanhitam(1);
scanpercabki(1); rem(20); belokkiri();
scanki(1);
//4
scanpercab(1); rem(20); belokkanan();
scanki(1); rem(20); belokkiri2();
scanki(1);
scanpercabka(1); rem(20); belokkanan();
scanpercabki(1); rem(20); belokkiri();
scanpercabki(1); rem(20); belokkiri();
scanpercabka(1); rem(20); belokkanan();
scanpercabka(1); rem(20); belokkanan();
scanpercabki(1); rem(20); belokkiri();
scanpercab3(1); rem(20); belokkiri();
scanki(1); rem(20); belokkiri();
scanpercabki(1); rem(20); belokkiri();
scanpercabki(1); rem(20); belokkiri();
scanpercabki(1); rem(20); belokkiri();
scanpercab(1); rem(20); belokkanan();
scanki(1); rem(20); belokkiri2();
scanpercabki(1);
//5
scanpercabka(1); rem(20); belokkanan();
scanpercab(1); rem(20); belokkanan();
scanki(1); rem(20); belokkiri2();
scanpercab3(2); rem(20); belokkanan();
scanpercabki(1);
scanpercab(1); rem(20); belokkanan();
scanputih(1);
scanpercab3(1); rem(20); belokkanan();
scanhitam(1);
scanpercabki(1); rem(20); belokkiri();
scanpercab(1); rem(20); belokkanan();
}
void strategi1()
{
}
void strategi2()
{
}
void strategi3()
{doscan();}
void strategi4()
{doscan();}
void strategi5()
{doscan();}
void strategi6()
{doscan();}
void strategi7()
{doscan();}
void strategi8()
{doscan();}
void menu()
{PORTC=0b11111111;
satu:

buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b01111111;
if(tombol2==0){delay_ms(150); goto dua;}
if(tombol3==0){delay_ms(10); strategi1();}
}
dua:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b10111111;
if(tombol2==0){delay_ms(150); goto tiga;}
if(tombol3==0){delay_ms(10); strategi2();}
}
tiga:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11011111;
if(tombol2==0){delay_ms(150); goto empat;}
if(tombol3==0){delay_ms(10); strategi3();}
}
empat:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11101111;
if(tombol2==0){delay_ms(150); goto lima;}
if(tombol3==0){delay_ms(10); strategi4();}
}
lima:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11110111;
if(tombol2==0){delay_ms(150); goto enam;}
if(tombol3==0){delay_ms(10); strategi5();}
}
enam:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11111011;
if(tombol2==0){delay_ms(150); goto tujuh;}
if(tombol3==0){delay_ms(10); strategi6();}
}
tujuh:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11111101;
if(tombol2==0){delay_ms(150); goto delapan;}

if(tombol3==0){delay_ms(10); strategi7();}
}
delapan:
buzz=on;
delay_ms(100);
buzz=off;
while(1)
{ PORTC=0b11111110;
if(tombol2==0){delay_ms(150); goto satu;}
if(tombol3==0){delay_ms(10); strategi8();}
}
}
/*--------MAIN PROGRAM---------*/
void main(void)
{// Port B initialization
PORTB=0b11111111;
DDRB=0b00000001;
// Port D initialization
PORTD=0b11111111;
DDRD=0b00111111;
PORTC=0b00000000;
DDRC=0b11111111;
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
SPCR=0x00;
TWCR=0x00;
//Global Interrupt
#asm("sei")
buzz=on;
delay_ms(100);
buzz=off;
/*----garis hitam----*/
gr1=0;
gr2=1;
/*----garis putih----*/

//gr1=1;
//gr2=0;
/*---KONSTANTA PID--*/
Kp=25;
Kd=80;
/*---KECEPATAN---*/
set_pwm=150;
/*-----------JALANKAN PROGRAM----------*/
while(1)
{ tampil_sensor();
if
(!tombol1)
{kalibrasi();}
else if(!tombol2)
{menu();}
else if(!tombol3)
{strategi();}
else if(!tombol4)
{doscan();}
}
}

You might also like