Kamis, 02 Januari 2014

listing program Robot Line Follower tanpa LCD

include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x20
int i; 
int mj,md;// data buat maju (mj) dan mundur (md)

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 maju()
{  
   PORTC=0x77;    
   delay_ms(70);
   PORTC=0xFF;
   delay_ms(100);
  
}
void mundur()
{                             
       PORTC=0xDD;    
       delay_ms(70);
       PORTC=0xFF;
       delay_ms(100);
      
    
}
void blkkiristgh()
{
        PORTC=0xF7;
        delay_ms(50);
        PORTC=0xFF; 
        delay_ms(100);
        i=0;       
}    
void blkkananstgh()
{
        PORTC=0x7F;
        delay_ms(50);
        PORTC=0xFF;
        delay_ms(100);
         i=0;
}        
// Declare your global variables here
void main(void)
{
unsigned int ADCIN1, ADCIN3, ADCIN5, ADCIN7,S4,S3,S2,S1;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
  
UCSRB=0x48;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;    */
                  

DDRC=0xFF;
DDRB=0xFF;
while (1)
      {
      ADCIN1=read_adc(1);
      ADCIN3=read_adc(3);
      ADCIN5=read_adc(5);
      ADCIN7=read_adc(7);   
     
       ADCIN1=ADCIN1+2; //  2 adalah penyamaan nilai
                   
          S4=ADCIN7*20;  // 20 adalah penguatan nilai
          S3=ADCIN5*20;
          S2=ADCIN3*20;
          S1=ADCIN1*20;         
 //==========KONDISI BELOK KANAN=========================
        if (S1 > 135 && S2 < 135 && S3 < 135 && S4 < 135)
        {        PORTC=0x7D;
            delay_ms(50);
            PORTC=0xFF; 
            delay_ms(100);
             i=0;              // belok kanan full
     }
   
     else if (S1 > 135 && S2 > 135 && S3 < 135 && S4 < 135)
              blkkananstgh();        

    else if (S1 > 135 && S2 > 135 && S3 > 135 && S4 < 135)  
        blkkananstgh();

  //=================KONDISI BELOK KIRI=====================
     else if (S1 < 135 && S2 < 135 && S3 < 135 && S4 > 135)
        {
            PORTC=0xD7;
            delay_ms(50);
            PORTC=0xFF;
            delay_ms(100); 
             i=0;          // belok kiri full
    }
       
    else if (S1 < 135 && S2 < 135 && S3 > 135 && S4 > 135)
           blkkiristgh();
   
else if (S1 < 135 && S2 > 135 && S3 > 135 && S4 > 135)
        blkkiristgh();       
         
//==================KONDISI MAJU===========================
          
    else if (S2 >135 && S3 > 135 && S1 < 135 && S4 < 135)
       {
       maju();
       mj=mj+1; 
       }
     else if (S2 >135 && S3 < 135 && S1 < 135 && S4 < 135)
       {
       maju();
       mj=mj+1; 
       }
    else if (S2 < 135 && S3 > 135 && S1 < 135 && S4 < 135)
       {
       maju();
       mj=mj+1; 
       }             
     else if (S2 > 135 && S3 > 135 && S1 > 135 && S4 > 135)
       {
       maju();
       mj=mj+1; 
       }
                  
//================KONDISI MUNDUR=======================
      
     else if  (S2 < 135 && S3 < 135 && S1 < 135 && S4 < 135)            
    {                      
                mundur();
                md=md+2;
        }
     else if  (S2 < 135 && S3 < 135 && S1 > 135 && S4 > 135)            
    {     
                mundur();
                md=md+2;                                         
     }
       
      else
      PORTC=0x77;      
                                 
        if (md>mj)
        {
            mj=0;
            md=0;   
             for(i=1;i>1000;i++)  // perintah mundur jika menemukan jalan buntu beberapa kali
                       {
                       PORTC=0xDD;                     
                       }
        }
                    
//==================KOMUNIKASI TO HYPERTERMINAL=============
    /*                                         
         printf("S4 = %u     ",S4);   
        printf("S3 = %u     ",S3);   
    printf("S2 = %u     ",S2);
    printf("S1 = %u     ",S1);     
    printf("mj = %u     ",mj);     
    printf("md = %u    \r ",md);            */

       
   
      };
}




Keterangan Flow Chart
< 135              : sensor medeteksi warna putih
> 135              : sensor medeteksi warna hitam
Robot maju     : motor kanan berputar searah jarum jam, motor kiri berputar searah jarum jam (dilihat pada satu sisi)
Robot  belok kiri         : motor kanan berputar searah jarum jam, motor kiri berputar berlawanan jarum jam (dilihat pada satu sisi)
Robot  belok kanan   : motor kanan berputar berlawanan jarum jam, motor kiri berputar searah jarum jam (dilihat pada satu sisi)
Robot  mundur              : motor kanan berputar berlawanan jarum jam, motor kiri                berputar berlawanan jarum jam (dilihat pada satu sisi)

Cara Kerja Robot
-       Pada saat sensor S2 dan S3 mendeteksi warna hitam serta S1 dan S4 mendeteksi warna putih maka robot akan bergerak maju sebab S2 dan S3 bernilai > 135 dan S1, S4 < 135
-       Ada tiga kondisi untuk robot agar belok ke kiri yaitu pada saat  S1 > 135, atau S1 dan S2 > dari 135, atau S1, S2, dan S3 > 135
-       Dan ada tiga kondisi juga untuk robot agar belok ke kanan yaitu pada saat  S4 > 135, atau S4 dan S3 > dari 135, atau S4, S3, dan S2 > 135
-       Untuk perintah mundur akan dieksekusi pada saat sensor membaca S1, S2, S3, S4 < 135 atau S1, S4 > 135 dan S2, S3 > 135.


Tabel 2.2 Input Output dari robot
Input
Output
Sensor
Port A
Pin Driver
Port C
Putaran Motor
S1
Pin 1
1A 
Pin 1
M Kanan CW
S2
Pin 3
 2A
Pin 3
M Kanan CCW
S3
Pin 5
 3A
Pin 5
M Kiri CCW
S4
Pin 7
 4A
Pin 7
M Kiri CW




Tidak ada komentar:

- See more at: http://winnerparluhutan.blogspot.com/2012/12/cara-membuat-link-otomatis-di-blogger.html#sthash.c0OKL0fD.dpuf