Kali ini admin nubie ingin membagikan cara membuat robot dengan komponen utama IC ATMEGA 8535
Siapkan komponen utama berikut:
1. ATMEGA 8535
2. Sensor UVtron (mendeteksi api)
3. Sensor ultrasonic (mendeteksi dinding)
4. LDR (mendeteksi cahaya api)
5. Motor DC (kanan dan kiri)
6. LCD 16×2
Cara kerjanya:
Ketika tidak ada api maka robot akan diam dan sensor api mendeteksi keadaan disekitarnya. ketika ada api robot akan berputar mencari dimana posisi api, setelah posisi api tepat di depan robot maka robot akan berjalan maju hingga mendekati api dan meniupnya hingga padam. Jika api dipindahkan tiba-tiba atau terlalu jauh maka robot akan kembali mencari posisi api tersebut.
Ketika tidak ada api maka robot akan diam dan sensor api mendeteksi keadaan disekitarnya. ketika ada api robot akan berputar mencari dimana posisi api, setelah posisi api tepat di depan robot maka robot akan berjalan maju hingga mendekati api dan meniupnya hingga padam. Jika api dipindahkan tiba-tiba atau terlalu jauh maka robot akan kembali mencari posisi api tersebut.
Program:
Berikut ini adalah script untuk robot pencari api, project ini dibuat dalam rangka pembelajaran, jadi mohon maaf kalo masih kurang sempurna.
Pemprograman menggunakan Codevision AVR yang mendukung pemprograman bahasa C.
Berikut ini adalah script untuk robot pencari api, project ini dibuat dalam rangka pembelajaran, jadi mohon maaf kalo masih kurang sempurna.
Pemprograman menggunakan Codevision AVR yang mendukung pemprograman bahasa C.
#include
#include
#include
#asm
.equ __lcd_port=0×18 ;PORTB
#endasm
#include
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
#define ADC_VREF_TYPE 0×60
#define pwm_kiri OCR1A
#define arah_kiri1 PORTD.0
#define arah_kiri2 PORTD.1
#define pwm_kanan OCR1B
#define arah_kanan1 PORTD.2
#define arah_kanan2 PORTD.3
#define ut_kiri PINA.6
#define ut_depan PINA.5
#define ut_kanan PINA.4
#define uvtron PINA.3
#define kipas PORTD.7
#include
#include
#asm
.equ __lcd_port=0×18 ;PORTB
#endasm
#include
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
#define ADC_VREF_TYPE 0×60
#define pwm_kiri OCR1A
#define arah_kiri1 PORTD.0
#define arah_kiri2 PORTD.1
#define pwm_kanan OCR1B
#define arah_kanan1 PORTD.2
#define arah_kanan2 PORTD.3
#define ut_kiri PINA.6
#define ut_depan PINA.5
#define ut_kanan PINA.4
#define uvtron PINA.3
#define kipas PORTD.7
unsigned char api,api_old1,api_old2;
unsigned int adc_data[30],count;
unsigned int adc0,adc1,adc2,adc0_old,adc1_old,adc2_old;
unsigned char ratus,puluh,satuan;
unsigned char k,adc_lengkap,buffer[30];
static unsigned char input_index=0;
unsigned int adc_data[30],count;
unsigned int adc0,adc1,adc2,adc0_old,adc1_old,adc2_old;
unsigned char ratus,puluh,satuan;
unsigned char k,adc_lengkap,buffer[30];
static unsigned char input_index=0;
void cek_adc();
void baca_adc();
void baca_sensor_api();
void mundur();
void maju();
void berhenti();
void belok_kiri();
void belok_kanan();
void baca_adc();
void baca_sensor_api();
void mundur();
void maju();
void berhenti();
void belok_kiri();
void belok_kanan();
interrupt [ADC_INT] void adc_isr(void)
{
adc_data[count]=ADCH;
if(++input_index>2) input_index=0;
if (++count > (29))
{
count=0;
input_index=0;
adc_lengkap=1;
return;
}
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
ADCSRA|=0×40;
}
{
adc_data[count]=ADCH;
if(++input_index>2) input_index=0;
if (++count > (29))
{
count=0;
input_index=0;
adc_lengkap=1;
return;
}
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
ADCSRA|=0×40;
}
void main(void)
{
PORTA=0xFF;
DDRA=0×00;
PORTB=0×00;
DDRB=0×00;
PORTC=0×00;
DDRC=0xFF;
PORTD=0x7F;
DDRD=0xFF;
TCCR0=0×00;
TCNT0=0×00;
OCR0=0×00;
{
PORTA=0xFF;
DDRA=0×00;
PORTB=0×00;
DDRB=0×00;
PORTC=0×00;
DDRC=0xFF;
PORTD=0x7F;
DDRD=0xFF;
TCCR0=0×00;
TCNT0=0×00;
OCR0=0×00;
TCCR1A=0xA3;
TCCR1B=0x0D;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
TCCR1B=0x0D;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
ASSR=0×00;
TCCR2=0×00;
TCNT2=0×00;
OCR2=0×00;
MCUCR=0×00;
MCUCSR=0×00;
TIMSK=0×00;
ACSR=0×80;
SFIOR=0×00;
ADCSRA=0x8F;
SFIOR&=0x0F;
lcd_init(16);
TCCR2=0×00;
TCNT2=0×00;
OCR2=0×00;
MCUCR=0×00;
MCUCSR=0×00;
TIMSK=0×00;
ACSR=0×80;
SFIOR=0×00;
ADCSRA=0x8F;
SFIOR&=0x0F;
lcd_init(16);
#asm(“sei”)
adc0_old=0;
adc1_old=0;
adc2_old=0;
api_old1=0;
api_old2=0;
adc0_old=0;
adc1_old=0;
adc2_old=0;
api_old1=0;
api_old2=0;
while (1)
{
{
target1: if(ut_kiri==1 && ut_kanan==1 && ut_depan==1)
{
mundur();
}
else if(ut_kiri==1 && ut_kanan==1)
{
mundur();
}
else if(ut_kiri==1 && ut_depan==1)
{
mundur();
delay_ms(1000);
belok_kanan();
delay_ms(1000);
}
else if(ut_kanan==1 && ut_depan==1)
{
mundur();
delay_ms(1000);
belok_kiri();
delay_ms(1000);
}
else if(ut_kiri==1)
{
belok_kanan();
}
else if(ut_depan==1)
{
mundur();
}
else if(ut_kanan==1)
{
belok_kiri();
}
else if((ut_depan==0)&&(ut_kiri==0)&&(ut_kanan==0))
{
berhenti();
goto target2;
}
{
mundur();
}
else if(ut_kiri==1 && ut_kanan==1)
{
mundur();
}
else if(ut_kiri==1 && ut_depan==1)
{
mundur();
delay_ms(1000);
belok_kanan();
delay_ms(1000);
}
else if(ut_kanan==1 && ut_depan==1)
{
mundur();
delay_ms(1000);
belok_kiri();
delay_ms(1000);
}
else if(ut_kiri==1)
{
belok_kanan();
}
else if(ut_depan==1)
{
mundur();
}
else if(ut_kanan==1)
{
belok_kiri();
}
else if((ut_depan==0)&&(ut_kiri==0)&&(ut_kanan==0))
{
berhenti();
goto target2;
}
target2: for(k=1; k=1 && api_old2>=1)
{
lcd_gotoxy(0,0);
lcd_putsf(“ADA-API “);
api=0;
goto target3;
}
else if(api_old1<1 && api_old2<1)
{
lcd_gotoxy(0,0);
lcd_putsf(“TIDAK ADA-API “);
goto target1;
}
{
lcd_gotoxy(0,0);
lcd_putsf(“ADA-API “);
api=0;
goto target3;
}
else if(api_old1<1 && api_old2<1)
{
lcd_gotoxy(0,0);
lcd_putsf(“TIDAK ADA-API “);
goto target1;
}
target3: cek_adc();
if(adc0_old<=adc1_old && adc0_old<=adc2_old)
{
belok_kanan();
goto target2;
}
else if(adc2_old<=adc0_old && adc2_old<=adc1_old)
{
belok_kiri();
goto target2;
}
else if(adc1_old<=adc0_old && adc1_old<=adc2_old)
{
maju();
if(ut_depan==1)
{
for(k=1; k=5 && api_old2>=5))
{
lcd_gotoxy(0,0);
lcd_putsf(“ADA-API “);
maju();
delay_ms(500);
berhenti();
kipas=1;
delay_ms(500);
kipas=0;
delay_ms(5000);
api=0;
{
belok_kanan();
goto target2;
}
else if(adc2_old<=adc0_old && adc2_old<=adc1_old)
{
belok_kiri();
goto target2;
}
else if(adc1_old<=adc0_old && adc1_old<=adc2_old)
{
maju();
if(ut_depan==1)
{
for(k=1; k=5 && api_old2>=5))
{
lcd_gotoxy(0,0);
lcd_putsf(“ADA-API “);
maju();
delay_ms(500);
berhenti();
kipas=1;
delay_ms(500);
kipas=0;
delay_ms(5000);
api=0;
for(k=1; k=5 && api_old2>=5))
{
lcd_gotoxy(0,0);
lcd_putsf(“MASIH ADA-API “);
api=0;
}
else goto target1;
{
lcd_gotoxy(0,0);
lcd_putsf(“MASIH ADA-API “);
api=0;
}
else goto target1;
cek_adc();
if(adc1_old<=adc0_old && adc1_old=adc0_old && adc1_old>=adc2_old)
{
goto target1;
}
{
goto target1;
}
};
}
}
void cek_adc(void)
{
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
ADCSRA|=0×40;
{
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
ADCSRA|=0×40;
puter: if(adc_lengkap!=1) goto puter;
adc_lengkap=0;
baca_adc();
}
adc_lengkap=0;
baca_adc();
}
void baca_adc(void)
{
{
adc0=(adc0_old+adc_data[0]+adc_data[3]+adc_data[6]+adc_data[9]+adc_data[12]
+adc_data[15]+adc_data[18]+adc_data[21]+adc_data[24])/10;
adc0_old=adc0;
ratus=adc0/100; adc0%=100;
puluh=adc0/10; adc0%=10;
satuan=adc0%10;
lcd_gotoxy(0,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
adc0_old=adc0;
ratus=adc0/100; adc0%=100;
puluh=adc0/10; adc0%=10;
satuan=adc0%10;
lcd_gotoxy(0,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
adc1=(adc1_old+adc_data[1]+adc_data[4]+adc_data[7]+adc_data[10]+adc_data[13]
+adc_data[16]+adc_data[19]+adc_data[22]+adc_data[25])/10;
adc1_old=adc1;
ratus=adc1/100; adc1%=100;
puluh=adc1/10; adc1%=10;
satuan=adc1%10;
lcd_gotoxy(5,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
adc1_old=adc1;
ratus=adc1/100; adc1%=100;
puluh=adc1/10; adc1%=10;
satuan=adc1%10;
lcd_gotoxy(5,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
adc2=(adc2_old+adc_data[2]+adc_data[5]+adc_data[8]+adc_data[11]+adc_data[14]
+adc_data[17]+adc_data[20]+adc_data[23]+adc_data[26])/10;
adc2_old=adc2;
ratus=adc2/100; adc2%=100;
puluh=adc2/10; adc2%=10;
satuan=adc2%10;
lcd_gotoxy(10,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
}
adc2_old=adc2;
ratus=adc2/100; adc2%=100;
puluh=adc2/10; adc2%=10;
satuan=adc2%10;
lcd_gotoxy(10,1);
sprintf(buffer, “%d%d%d “,ratus,puluh,satuan);
lcd_puts(buffer);
}
void baca_sensor_api(void)
{
unsigned char i;
{
unsigned char i;
for(i=0;i<10;i++)
{
if(uvtron==0)
{
api++;
}
delay_ms(10);
}
api_old1=api;
api_old2=api_old1;
}
{
if(uvtron==0)
{
api++;
}
delay_ms(10);
}
api_old1=api;
api_old2=api_old1;
}
void maju(void)
{
lcd_gotoxy(0,0);
lcd_putsf(“ JALAN MAJU “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri1=1;
arah_kanan1=1;
arah_kiri2=0;
arah_kanan2=0;
delay_ms(10);
}
{
lcd_gotoxy(0,0);
lcd_putsf(“ JALAN MAJU “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri1=1;
arah_kanan1=1;
arah_kiri2=0;
arah_kanan2=0;
delay_ms(10);
}
void mundur(void)
{
lcd_gotoxy(0,0);
lcd_putsf(“ JALAN MUNDUR “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri2=1;
arah_kanan2=1;
arah_kiri1=0;
arah_kanan1=0;
delay_ms(10);
}
{
lcd_gotoxy(0,0);
lcd_putsf(“ JALAN MUNDUR “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri2=1;
arah_kanan2=1;
arah_kiri1=0;
arah_kanan1=0;
delay_ms(10);
}
void berhenti(void)
{
pwm_kiri=0;
pwm_kanan=0;
arah_kiri1=0;
arah_kanan1=0;
arah_kiri2=0;
arah_kanan2=0;
delay_ms(10);
}
{
pwm_kiri=0;
pwm_kanan=0;
arah_kiri1=0;
arah_kanan1=0;
arah_kiri2=0;
arah_kanan2=0;
delay_ms(10);
}
void belok_kiri(void)
{
lcd_gotoxy(0,0);
lcd_putsf(“ BELOK KIRI “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri2=0;
arah_kanan1=0;
arah_kiri1=1;
arah_kanan2=1;
delay_ms(10);
}
{
lcd_gotoxy(0,0);
lcd_putsf(“ BELOK KIRI “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri2=0;
arah_kanan1=0;
arah_kiri1=1;
arah_kanan2=1;
delay_ms(10);
}
void belok_kanan(void)
{
lcd_gotoxy(0,0);
lcd_putsf(“ BELOK KANAN “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri1=0;
arah_kanan2=0;
arah_kiri2=1;
arah_kanan1=1;
delay_ms(10);
}
{
lcd_gotoxy(0,0);
lcd_putsf(“ BELOK KANAN “);
pwm_kiri=0x1FFF;
pwm_kanan=0x1FFF;
arah_kiri1=0;
arah_kanan2=0;
arah_kiri2=1;
arah_kanan1=1;
delay_ms(10);
}
Selamat bekerja, Semoga sukses...!!!
0 komentar:
Posting Komentar