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); }
[…] Arduino line tracer […]