Você está na página 1de 5

Robot Pencari Cahaya

Abstrak:

Pada aplikasi kali ini, dibuat robot yang bergerak menuju kepada cahaya
yang paling terang yang mengenai permukaan rangka robot. Sensor yang
digunakan untuk mengukur level kecerahan cahaya adalah LDR, light
dependent resistor, yang terpasang di tiga titik rangka robot (lihat disain
mekanik). Metode yang digunakan adalah membandingkan nilai tegangan
keluaran dari rangkaian LDR yang adalah representasi dari level
kecerahan cahaya, kemudian robot akan menuju ke titik sensor LDR yang
menerima level kecerahan cahaya terbesar.

Modul-Modul Depok Instruments yang Mendukung:

DI-Smart AVR System (Sistem Minimum Mikrokontroler AVR ATMEGA8535)


atau
DI-Basic AVR System
DI-Smart Extension Board
DI-MDCD4A (Motor DC Driver 4A)
DI-MLDR (DI-Multifunction LDR) = 3 modul (minimal)
Blok Diagram:

Disain Mekanik:

Cara Kerja Robot:

Zona deteksi robot dibagi menjadi 4 bagian: sisi depan, sisi kanan, sisi
belakang, dan sisi kiri.
Tiap zona dibagi lagi menjadi 3 segmen pemantauan sesuai dengan
jumlah sensor.
Robot akan mencari cahaya sampai robot mencapai titik yang memiliki
tingkat kecerahan yang lebih dari atau sama dengan batas kecerahan
yang telah ditetapkan di program sebelumnya.
Robot akan berhenti pula jika tidak mendapatkan perbedaan tingkat
kecerahan cahaya di 4 zona deteksi di mana di tiap zona tingkat
kecerahan berada di bawah batas gelap.
Jika dari 3 segmen dalam satu zona deteksi memiliki kecerahan yang
sama, maka robot akan bergerak ke arah depan, dengan skala prioritas;
depan-kanan-kiri.
Flowchart:

1. BASCOM:

$regfile = m8535.dat
$crystal = 11059200
Config Adc = Single , Prescaler = Auto
Start Adc
Dim Adc_kanan As Word
Dim Adc_kiri As Word
Dim Adc_tengah As Word
Chanel_kanan Alias 0
Chanel_kiri Alias 1
Chanel_tengah Alias 2
Motor_kanan Alias Portc.0
Motor_kiri Alias Portc.1
Config Motor_kanan = Output
Config Motor_kiri = Output

Do
Adc_kanan = Getadc(chanel_kanan)
Adc_kiri = Getadc(chanel_kiri)
Adc_tengah = Getadc(chanel_tengah)

If Adc_tengah < Adc_kiri And Adc_tengah < Adc_kanan Then


maju 1 step
Motor_kanan = 1
Motor_kiri = 1
Waitms 2000

Elseif Adc_kanan < Adc_kiri And Adc_kanan < Adc_tengah Then


belok kanan 30 derajat
Motor_kiri = 1
Motor_kanan = 0
Waitms 500

Elseif Adc_kiri < Adc_kanan And Adc_kiri < Adc_tengah Then


belok kiri 30 derajat
Motor_kiri = 0
Motor_kanan = 1
Waitms 500
End If

Motor_kanan = 0
Motor_kiri = 0
Waitms 100

Loop
End

2. Code Vision AVR (C):

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project :
Version :
Date : 28/04/2011
Author :
Company :
Comments:

Chip type : ATmega8535


Program type : Application
Clock frequency : 11,059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/

#include <mega8535.h>

#include <delay.h>
#define chanel_ldr_kanan 0
#define chanel_ldr_kiri 1
#define chanel_ldr_tengah 2

#define motor_kanan PORTC.0


#define motor_kiri PORTC.1

#define ddr_motor_kanan DDRC.0


#define ddr_motor_kiri DDRC.1

#define ADC_VREF_TYPE 0x00

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

// Declare your global variables here

void main(void)
{
unsigned int adc_kanan, adc_tengah, adc_kiri;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 691,200 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;

ddr_motor_kanan=1;
ddr_motor_kiri=1;

while (1)
{
// Place your code here
adc_kanan=read_adc(chanel_ldr_kanan);
adc_kiri=read_adc(chanel_ldr_kiri);
adc_tengah=read_adc(chanel_ldr_tengah);

if (adc_tengah<adc_kiri && adc_tengah<adc_kanan){


//maju 1 step
motor_kanan=1;
motor_kiri=1;
delay_ms(2000);
}
else if (adc_kanan<adc_kiri && adc_kanan<adc_tengah){
//belok kanan 30 derajat
motor_kanan=0;
motor_kiri=1;
delay_ms(500);
}
else if(adc_kiri<adc_kanan && adc_kiri<adc_tengah){
//belok kiri 30 derajat
motor_kanan=1;
motor_kiri=0;
delay_ms(500);
}

motor_kanan=0;
motor_kiri=0;

};
}

Você também pode gostar