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.
- 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)
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.
Skrip Program:
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 0×00
// 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|=0×40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0×10)==0);
ADCSRA|=0×10;
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=0×80;
SFIOR=0×00;
// 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=0×84;
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;
};
}
0 komentar:
Posting Komentar