Arduino line tracer

Posted: 27 Maret 2014 in Otomasi dan Robotika

Oke kali ini saya akan posting Arduino line tracer. ini adalah design loh ya. belum saya praktekkan. tapi berdasarkan pengalaman sebelumnya InsyaAllah bisa jalan. saya posting mungkin kalau ada yang butuh belajar robot line tracer bisa digunakan untuk belajar.

posting ini dilengkapi dengan source code, skematik, dan pcb nya. jangan lupa pakai pcb wizard untuk membuka .pcb dan live wire untuk membuka file .lvw.
livewire dan pcb wizard bisa di download disini http://www.new-wave-concepts.com/demo.html atau https://dl.dropboxusercontent.com/u/80151151/Livewire%26PCBwizard.rar

jadi intinya ini ada sensor garis sebanyak 6 buah. membaca menggunakan adc setelah dibaca maka bisa di outputkan hasil pembacaan menggunakan led

susunan led nya merah-kuning-hijau-hijau-kuning-merah. gunakan led yang kotak ya. jangan yang bulat 3mm. soalnya space nya mepet dan agar rapi juga. jadi kalau garisnya di tengah led tengah hijau nya yang menyala . semakin miring semakin merah.

lalu itu ada header hitam isi 4 pin untuk bluetooth. opsional saja. karena ini nanti kalau penelitian bisa debugging bagaimana input sensor dan aksi outpunya melalui motor. dan bisa diakses realtime. bluetoothnya 4 pin BTSM kayak di sini  http://diytech.net/2012/03/07/dalam-beberapa-aplikasi-atau-disain-kadangkala-kita-memerlukan/

oh ya ada port  untuk ISP nya juga bila tidak pakai arduino bootloader. tapi disarankan sih arduino aja. pasangg dlu ATMega328P nya lalu di burn deh bootloadernya pakai port SPI nya ( -, +, reset, sck, miso, mosi). untuk tutorial burning arduino bootloadernya bisa dibaca disini http://zainms.blogspot.com/2013/03/proyek-arduino-robot-sederhana.html

ada di bagian burning bootloader. itu tinggal sesuaikan pin nya aja. artinya harus punya arduino dlu trus di burn ke sini.

ini download skematiknya http://dl.dropboxusercontent.com/u/80151151/linetracer%20arduino/arduinocontrol.lvw

pcb http://dl.dropboxusercontent.com/u/80151151/linetracer%20arduino/linetraceraduino.pcb

sensor http://dl.dropboxusercontent.com/u/80151151/linetracer%20arduino/sensor6lurus.pcb

coding arduino http://dl.dropboxusercontent.com/u/80151151/linetracer%20arduino/linetracer_arduino/linetracer_arduino.ino

daftar komponen http://dl.dropboxusercontent.com/u/80151151/linetracer%20arduino/komponen.txt

ini saya viewkan codingnya langsung ya.

#include <EEPROMex.h>

const byte enka = 9 ;
const byte enki = 10;
const byte moka1 = 12;
const byte moka2 = 11;
const byte moki1 = 8;
byte moki2 = 13;
const byte led0 = 2;
const byte led1 = 3;
const byte led2 = 4;
const byte led3 = 5;
const byte led4 = 6;
const byte led5 = 7;

boolean sen[6];
unsigned int batasBlackWhite = 0;
String kirim;
void setup() {
  // put your setup code here, to run once:
 pinMode(led0, OUTPUT);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(moki1, OUTPUT);
 pinMode(enka, OUTPUT);
 pinMode(enki, OUTPUT);
 pinMode(moka2, OUTPUT);
 pinMode(moki2, OUTPUT);
 pinMode(moki2, OUTPUT);
 batasBlackWhite=EEPROM.read(0);
 Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  bacaPerintah();
  baca_sensor();
  tracking();
}

void baca_sensor()
{
                unsigned int s[6];
                delayMicroseconds(10);
                s[0]=analogRead(A0);
                delayMicroseconds(10);
                s[1]=analogRead(A1);
                delayMicroseconds(10);
                s[2]=analogRead(A2);
                delayMicroseconds(10);
                s[3]=analogRead(A3);
                delayMicroseconds(10);
                s[4]=analogRead(A4);
                delayMicroseconds(10);
                s[5]=analogRead(A5);
                delayMicroseconds(10);
                //garis hitam = 1
                //latar putih = 0
                if (s[0]>=batasBlackWhite){sen[0]=0;}       else {sen[0]=1;}
                if (s[1]>=batasBlackWhite){sen[1]=0;}       else {sen[1]=1;}
                if (s[2]>=batasBlackWhite){sen[2]=0;}       else {sen[2]=1;}
                if (s[3]>=batasBlackWhite){sen[3]=0;}       else {sen[3]=1;}
                if (s[4]>=batasBlackWhite){sen[4]=0;}       else {sen[4]=1;}
                if (s[5]>=batasBlackWhite){sen[5]=0;}       else {sen[5]=1;}

            //led aktif 0; jika 0 nyala; gunakan led bar atau led kecil yang kotak. jgn yang bundar. krn gk cukup
            digitalWrite(led0, !sen[0]);
            digitalWrite(led1, !sen[1]);
            digitalWrite(led2, !sen[2]);
            digitalWrite(led3, !sen[3]);
            digitalWrite(led4, !sen[4]);
            digitalWrite(led5, !sen[5]);
            kirim = (String)sen[0]+' '+sen[1]+' '+sen[2]+' '+sen[3]+' '+sen[4]+' '+sen[5]+' ==> ';
            Serial.print(kirim);

}

void bacaPerintah()
{
	static unsigned int batasAnalogWhite;
	if (Serial.available()>0)
	{
		char perintah = Serial.read();

		if(perintah=='a')
		{
			batasAnalogWhite =  analogRead(A3);
			kirim = (String)"info#Analaog value "+batasAnalogWhite+" as white calibration";
			Serial.println(kirim);
		}
		else if(perintah=='b')
		{
			int batasAnalogBlack =  analogRead(A3);
			kirim = (String)"info#Analaog value "+batasAnalogBlack+" as black calibration";
			Serial.println(kirim);
			batasBlackWhite = (int)(batasAnalogBlack - batasAnalogWhite)/2; // batas tengah antara black white
			if(EEPROM.updateInt(0, batasBlackWhite))
			  {
					kirim = (String)"info#Analaog value "+batasBlackWhite+" as batasBlackWhite calibration";
					Serial.println(kirim);
			  }
		}
	}
}

void set_pwm(int kiri,int kanan)
{
    analogWrite(enki, kiri);
    analogWrite(enka, kanan);

}

void berhenti()
{
  digitalWrite(moka1, 0);
  digitalWrite(moka2, 0);
  digitalWrite(moki1, 0);
  digitalWrite(moki2, 0);
  set_pwm(0,0);
}
void rem()
{
  digitalWrite(moka1, 1);
  digitalWrite(moka2, 1);
  digitalWrite(moki1, 1);
  digitalWrite(moki2, 1);
  set_pwm(255,255);
}

void maju()
{
  digitalWrite(moka1, 1);
  digitalWrite(moka2, 0);
  digitalWrite(moki1, 1);
  digitalWrite(moki2, 0);
}
void mundur()
{
  digitalWrite(moka1, 0);
  digitalWrite(moka2, 1);
  digitalWrite(moki1, 0);
  digitalWrite(moki2, 1);
}
void kiri()
{

  digitalWrite(moka1, 1);
  digitalWrite(moka2, 0);
  digitalWrite(moki1, 1);
  digitalWrite(moki2, 1);
}
void kanan()
{
  digitalWrite(moka1, 1);
  digitalWrite(moka2, 1);
  digitalWrite(moki1, 1);
  digitalWrite(moki2, 0); 

}
void puter_kiri()
{
  digitalWrite(moka1, 1);
  digitalWrite(moka2, 0);
  digitalWrite(moki1, 0);
  digitalWrite(moki2, 1);

}  

void puter_kanan()
{
  digitalWrite(moka1, 0);
  digitalWrite(moka2, 1);
  digitalWrite(moki1, 1);
  digitalWrite(moki2, 0);
}

void tracking() //lanjutkan sendiri sesuai percobaan pada track sen 2 dan 3 di tengah
{
   byte last; //2 lurus, 1 kiri, 2 kanan;
   if (sen[0]==0&&sen[1]==0&&sen[2]==1&&sen[3]==1&&sen[4]==0&&sen[5]==0)
        {
            maju();
            set_pwm(255,255);
            last = 2;

        }
   else if(sen[0]==0&&sen[1]==1&&sen[2]==1&&sen[3]==0&&sen[4]==0&&sen[5]==0)
        {
            maju();
            set_pwm(240,255);
            last = 2;

        }
   else if(sen[0]==0&&sen[1]==1&&sen[2]==0&&sen[3]==0&&sen[4]==0&&sen[5]==0)
        {
            kiri();
            set_pwm(240,255);
            last = 1;

        }
   //tambahkan banyak else if disini untuk kemungkinan lain
   else//bila keluar dari semua kemungkinan
   {
     if(last==2)
     {
       maju();
       set_pwm(255,255);
     }
     else if(last==1)
     {
       kiri();
       set_pwm(240,255);
     }
     else
     {
       kanan();
       set_pwm(255,240);
     }
   }

  Serial.println(last);

}

 

skematik arduino linetracer

skematik arduino linetracer

pcb arduino line tracer

pcb arduino line tracer

sensor  6

sensor 6

 

Komentar
  1. […] Arduino line tracer […]

Tinggalkan Balasan ke the power of dreams Batalkan balasan