Kode Program lengkap Grid Line Follower

Halaman ini menjelasakan tentang kode program pergerakan motor dc untuk melengkapi penjelasan kode program arah pergerakan grid line follower yang telah dijelaskan sebelumnya. Jika Anda menggunakan rangkaian yang telah disediakan pada blog ini, maka program di bawah dapat langsung digunakan.

Berikut adalah  lengkap grid line ollower beserta penjelasan singkat.
//===============Kode program grid line follower lengkap================

#include "Arduino.h"
#define pinStart 13
#define sensor3 2
#define sensor2 7
#define sensor1 11
#define sensor4 12
#define v_kanan OCR1A
#define v_kiri OCR1B
#define speed_belok 400
#define waktu_delay 80
volatile uint8_t dataSensor = 0, temp = 0, flipflop = 1, counter = 0 ; 
void (inisialisasiPort(void)
{
 int Pins[11] = {sensor1, sensor2, sensor3, sensor4, pinStart, 9, 10, A0, A1, A2, A3};
 for (int i = 0; i < 12; i++)
       {
            if (i <= 4)
              {
                  pinMode(Pins[i], INPUT_PULLUP);
              }
              else
              {
                 pinMode(Pins[i], OUTPUT);
                 digitalWrite(Pins[i]), HIGH);
              }
       }
 while (digitalRead(pinStart) == 1) // Menunggu tombol start ditekan.
 {}
 TCCR1A = 0b10100011;
 TCCR1B = 0b00001100;
 TCCR2B = 0b00000011;
 TIMSK2 = 0b00000001;
 sei ();
}

ISR(TIMER2_OVF_vect)
{
 dataSensor = bacaSensor(); //Memanggil fungsi bacaSensor
 temp = digitalRead(sensor4); //Membaca data pada sensor4(grid counter)
 if (temp == 0)
   {
     if (flipflop == 0)
     {
       flipflop = 1;
       counter++;
     }
   }
  if (temp == 0)
    flipflop = 0;
}

uint8_t bacaSensor() // Fungsi pembacaan sensor garis (sensor1, sensor2 dan sensor3)
{
 uint8_t data, nilai = 0;
 data = digitalRead(sensor1);
 if (data == 0)
   {
      nilai = 0b00000110;
   }
if (data == 1)
   {
     nilai = 0b00000111;
   }
data = digitalRead(sensor2);
 if (data == 0)
  {
    nilai = 0b00000101 & nilai;
  }
 if (data == 1)
  {
    nilai = 0b00000111 & nilai;
  }
data = digitalRead(sensor3);
 if (data == 0)
 {
   nilai = 0b00000011 & nilai; 
 }
if (data == 1)
 {
   nilai = 0b00000111 & nilai; 
 }
return nilai;
}

void stop(void)
{
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
}

void maju(uint16_t speedKiri, uint16_t speedKanan)
{
 digitalWrite(A0, HIGH);
 digitalWrite(A1, LOW);
 digitalWrite(A2, HIGH);
 digitalWrite(A3, LOW) ;
 v_kanan = speedKanan;
 v_kiri = speedKiri;
}

void maju(uint16_t speedKiri, uint16_t speedKanan)
{
 digitalWrite(A0, HIGH);
 digitalWrite(A1, LOW);
 digitalWrite(A2, HIGH);
 digitalWrite(A3, LOW);
 v_kanan = speedKanan;
 v_kiri = speedKiri;
}

void mundur(uint16_t speed_kiri, uint16_t speed_kanan)
{
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, LOW);
  digitalWrite(A1, HIGH); 
  v_kanan = speed_kanan;
  v_kiri = speed_kiri;
}

void belok_kiri(uint16_t speed_kiri, uint16_t speed_kanan, uint8_t mode)
{
 if (mode == 0)
   {
     digitalWrite(A0, LOW);
     digitalWrite(A1, HIGH);
     digitalWrite(A2, HIGH);
     digitalWrite(A3, LOW);
     v_kanan = speed_kanan
     v_kiri = speed_kiri;
   }
     if (mode == 1)
        maju(speed_kiri, speed_kanan);
     if (mode == 2)
        mundur(speed_kiri, speed_kanan);
}
void belok_kanan(uint16_t speed_kiri, uint16_t speed_kanan, uint8_t mode)
{
  if (mode == 0)
   {
     digitalWrite(A0, HIGH);
     digitalWrite(A1, LOW);
     digitalWrite(A2, LOW);
     digitalWrite(A3, HIGH);
     v_kanan = speed_kanan;
     v_kiri = speed_kiri;
   }
 if (mode == 1)
    maju(speed_kiri, speed_kanan);
 if (mode == 2)
    mundur(speed_kiri, speed_kanan);
}

void cek_speedmaju(void) // Prosedur untuk mengubah kecepatan motor berdasar //pembacaan sensor garis untuk pergerakan maju
{
  if (dataSensor == 0b00000111)
     stop();
  if (dataSensor == 0b00000100)
     belok_kanan(720, 380, 1);
  if (dataSensor == 0b00000001)
     belok_kiri(380, 720, 1);
  if (dataSensor == 0b00000110)
     belok_kanan(400, 420, 0);
  if (dataSensor == 0b00000011)
    belok_kiri(420, 400, 0);
  if (dataSensor == 0b00000000)
   maju(998, 1022);
}

void tunggu_awal_belok(uint8_t mode)
{
  while(dataSensor != 0b00000111)
  {
    if (mode == 1)
       cek_speedmaju();
  }
}

void tunggu_akhir_belok(void)
{
  while(dataSensor != 0b00000000)
    {}
}

void kondisi_counter_maju(uint8_t kondisi)
{
  while (counter != kondisi)
  { 
    cek_speedmaju();
  }
}

void kondisi_counter_mundur(uint8_t kondisi)
{
  while(counter != kondisi)
   {
     cek_speedmundur();
   }
}
void cek_speedmundur(void)
 {
   // Saat ini prosedur ini tidak digunakan
 }

void setup()
{
   inisialisasiPort();
}

void loop()
{
 cek_speedmaju(); // pengecekan pembacaan sensor garis saat maju
 if(counter == 1)    
   {
    _delay_ms(waktu_delay);
    belok_kanan(speed_belok, speed_belok, 0);
    tunggu_awal_belok(0);
    tunggu_akhir_belok();
    counter = 1;
    kondisi_counter_maju(4);
   }
  cek_speedmaju();
  if (counter == 4)
   {
     _delay_ms(waktu_delay);
     belok_kiri(speed_belok, speed_belok, 0);
     tunggu_awal_belok(0);
     tunggu_akhir_belok();
     counter = 4;
     kondisi_counter_maju(5);
   }
  cek_speedmaju();
  if (counter == 5)
  {
     _delay_ms(waktu_delay);
     belok_kiri(speed_belok, speed_belok, 0);
     tunggu_awal_belok(0);
     tunggu_akhir_belok();
     counter = 5;
     kondisi_counter_maju(8);
   }
    cek_speedmaju();
  if (counter == 8)
   {
     _delay_ms(waktu_delay);
     belok_kanan(speed_belok, speed_belok, 0);
     tunggu_awal_belok(0);
     tunggu_akhir_belok();
     counter = 8;
     kondisi_counter_maju(9);
   }
    cek_speedmaju();
  if (counter == 9)
     {
      _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 9;
       kondisi_counter_maju(12);
     }
     cek_speedmaju();
     if (counter == 12)
     {
      _delay_ms(waktu_delay);
      belok_kiri(speed_belok, speed_belok, 0);
      tunggu_awal_belok(0);
      tunggu_akhir_belok();
      counter = 12;
      kondisi_counter_maju(13);
     }
     cek_speedmaju();
     if (counter == 13)
     {
      _delay_ms(waktu_delay);
      belok_kiri(speed_belok, speed_belok, 0);
      tunggu_awal_belok(0);
      tunggu_akhir_belok();
     counter = 13;
      kondisi_counter_maju(16);
     }
     cek_speedmaju();
     if (counter == 16)
     {
       _delay_ms(waktu_delay);
      belok_kanan(speed_belok, speed_belok, 0);
      tunggu_awal_belok(0);
      tunggu_akhir_belok();
      counter = 16;
       kondisi_counter_maju(17);
     }
     cek_speedmaju();
    if (counter == 17)
    {
      _delay_ms(waktu_delay);
     belok_kanan(speed_belok, speed_belok, 0);
     tunggu_awal_belok(0);
     tunggu_akhir_belok();
     counter = 17;
      kondisi_counter_maju(20);
    }
    cek_speedmaju();
     if (counter == 20)
     {
      _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
      counter = 20;
       kondisi_counter_maju(24);
     }
     cek_speedmaju();
     if (counter == 24)
     {
       _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 24;
       kondisi_counter_maju(25);
     }
     cek_speedmaju();
     if (counter == 25)
     {
       _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 25;
       kondisi_counter_maju(29);
     }
     if (counter == 29)
     {
       _delay_ms(waktu_delay);
       belok_kiri(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 29;
       kondisi_counter_maju(30);
     }
     if (counter == 30)
     {
       _delay_ms(waktu_delay);
       belok_kiri(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 30;
       kondisi_counter_maju(34);
     }
     if (counter == 34)
     {
       _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 34;
       kondisi_counter_maju(35);
     }
     if (counter == 35)
     {
       _delay_ms(waktu_delay);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 35;
       kondisi_counter_maju(39);
     }
     if (counter == 39)
     {
       tunggu_awal_belok(1);
       belok_kanan(speed_belok, speed_belok, 0);
       tunggu_awal_belok(0);
       tunggu_akhir_belok();
       counter = 39;
       kondisi_counter_maju(40);
     }
     if (counter == 40)
     {
        _delay_ms(waktu_delay);
        belok_kiri(speed_belok, speed_belok, 0);
        tunggu_awal_belok(0);
        tunggu_akhir_belok();
        counter = 40;
        kondisi_counter_maju(41);
     }
     if (counter == 41)
       {
         _delay_ms(waktu_delay);
         belok_kanan(speed_belok, speed_belok, 0);
         tunggu_awal_belok(0);
         tunggu_akhir_belok();
         counter = 41;
         kondisi_counter_maju(42);
       }
     if (counter == 42)
       {
         _delay_ms(waktu_delay);
          belok_kiri(speed_belok, speed_belok, 0);
          tunggu_awal_belok(0);
          tunggu_akhir_belok();
          counter = 42;
          kondisi_counter_maju(43);
        }
     if (counter == 43)
        {
           _delay_ms(waktu_delay);
           belok_kanan(speed_belok, speed_belok, 0);
           tunggu_awal_belok(0);
           tunggu_akhir_belok();
           counter = 43;
           kondisi_counter_maju(44);
         }
     if (counter == 44)
        {
           _delay_ms(waktu_delay);
           belok_kiri(speed_belok, speed_belok, 0);
           tunggu_awal_belok(0);
           tunggu_akhir_belok();
           counter = 44;
           kondisi_counter_maju(45);
        }
     if (counter == 45)
        {
          _delay_ms(waktu_delay);
          belok_kanan(speed_belok, speed_belok, 0);
          tunggu_awal_belok(0);
          tunggu_akhir_belok();
          counter = 45;
          kondisi_counter_maju(46);
        }
     if (counter == 46)
       {
         _delay_ms(waktu_delay);
         belok_kanan(speed_belok, speed_belok, 0);
         tunggu_awal_belok(0);
         tunggu_akhir_belok();
         counter = 46;
         kondisi_counter_maju(49);
       }

     if (counter == 49)
       {
         _delay_ms(waktu_delay);
         belok_kiri(speed_belok, speed_belok, 0);
         tunggu_awal_belok(0);
         tunggu_akhir_belok();
         tunggu_awal_belok(1);
         stop();
         _delay_ms(waktu_delay+20);
         belok_kanan(speed_belok, speed_belok, 0);
         tunggu_awal_belok(0);
         tunggu_akhir_belok();
         counter = 0;
         cek_speedmaju();
       }
 }

//==============================end====================================

Kode program di atas didesain agar grid line follower berjalan pada jalur yang memiliki 4 garis horisontal dan 5 garis vertikal seperti gambar di bawah : 
Jalur grid linefollower
Gambar 1. Jalur grid line follower

Editor yang umum digunakan untuk menuliskan program dan mengupload program ke papan Arduino adalah menggunakan Arduino IDE. Penulis lebih suka menggunakan Sloeber yang dapat di download dari http://eclipse.baeyens.it/ karena Sloeber menawarkan kemudahan dalam melakukan pengembangan kode program dan melakukan modifikasi  pada library yang telah disediakan oleh pengembang open source Arduino. Jika Anda masih belum mengerti masksud program di atas Anda bisa bertanya melalui blog ini.