Anda di halaman 1dari 13

HARDWARE LINE TRACER MIKRO (ARDUINO) Rangkaian mikrokontroller pada arduino, secara umum memiliki skematik yang sama

dengan rangkaian mikrokontroller pada umumnya, berikut adalah skematik dari rangkaian mikronya :

Sementara untuk desain boardnya, memiliki konfigurasi arduino yang umum beredar di pasaran, seperti gambar berikut :

Pada arduino ini, tidak dilengkapi dengan converter USB to ttl karena pada tidak terlalu dibutuhkan komunikasi serial jika kita hanya memfungsikannya sebagai otak dari sebuah line tracer. Sehingga kita hanya cukup menggunakan programmer USB ASP sebagai sarana untyk mendownload program. Sementara untuk shield yang diletakkan diatas rangkaian arduino, tampak seperti gambar berikut :

Pada rangkaian tersebut telah dilengkapi dengan rangkaian driver, lampu indicator sensor, tombol start/stop, serta konektor menuju sensor. Pada rangkaian driver, terdapat 4 buah optocoupler yang berfungsi sebagai komponen pemisah antara rangkaian mikro dengan driver motor. Ketika kita ingin menggerakkan motor kanan maju, maka kaki 8 yang berfungsi sebagai rem, harus diberi logika 0 dan kaki 9 diberi logika 1, maka motor akan bergerak maju. Kecepatan dari putaran motor ini dapat kita control dengan menggunakan PWM pada arduino (seperti pada program). Tombol dihubungkan pada kaki 12, serta sensor dipasang pada kaki Analog, mulai dari A0-A5. Led indicator sensor aktif high yang dihubungkan dengan resistor 1k sebagai pembatas arus. Untuk rangkaian sensor, seperti pada gambar berikut :

Untuk desain board dan lay out dari sensor, tampak seperti gambar berikut :

Cara kerja dari sensor ini, sama dengan sensor pada line tracer analog pada umumnya, ketika sensor berada pada permukaan hitam, maka akan menghasilkan tegangan analog yang besar, sedangkan ketika mendapatkan warna putih, akan menghasilkan tegangan analog yang lebih kecil. Melalui proses kalibrasi yang ada pada program, akan menjadikan mikro mengetahui, apakah dia berada pada lintasan warna hitam atau putih dan dapat mengambil keputusan tentang arah pergerakan dari roda. PROGRAM PADA ARDUINO Berikut adalah program dan penjelasan pada line tracer mikro ini: ///////////// PROGRAM LINE TRACER ANALOG ////////////////////

/* define digunakan untuk mengganti nama pin dari pin arduino, sehingga lebih mudah di ingat, misalnya "#define L2 4" memiliki arti bahwa pada pin4, diganti nama menjadi L2 (LED2) */ #define L0 2 #define L1 3 #define L2 4 #define L3 5 #define L4 6

#define L5 7

#define KAN_MAJU 9 #define KAN_REM 8 #define KIR_MAJU 11 #define KIR_REM 10

#define TOMBOL 12 #define LED_TOMBOL 13

#define S0 A0 #define S1 A1 #define S2 A2 #define S3 A3 #define S4 A4 #define S5 A5

/* tipe variabel boolean memiliki nilai true atau false variabel "sensor" digunakan untuk mendeteksi posisi sensor variable ns0-ns5 digunakan untuk menyimpan nilai pembacaan ADC dari tiap-tiap sensor dan dijadikan sebagai nilai referensi */ boolean lp = true, enable0 = true, enable1 = true, start = false; // byte sensor=0;

int ns0,ns1,ns2,ns3,ns4,ns5;

/* void setup digunakan untuk melakukan setting pada tiap pin arduino */ void setup() { pinMode(L0, OUTPUT); pinMode(L1, OUTPUT); pinMode(L2, OUTPUT); pinMode(L3, OUTPUT); pinMode(L4, OUTPUT); pinMode(L5, OUTPUT);

pinMode(KAN_REM, OUTPUT); pinMode(KIR_REM, OUTPUT);

pinMode(TOMBOL, INPUT); digitalWrite(TOMBOL, HIGH); pinMode(LED_TOMBOL, OUTPUT); kalibrasi(); } /* void loop, adalah temmpat program melakukan looping (eksekusi berulang-ulang) terdapat fungsi "baca_tombol", "baca_sensor" serta fungsi-fungsi yang lain memilki arti bahwa program tersebut akan melompat ketempat fungsi

itu berada */ void loop() { baca_tombol(); baca_sensor(); if (start){ posisi_sensor(); digitalWrite(LED_TOMBOL, HIGH); } else { digitalWrite(LED_TOMBOL, LOW); kanan_rem(); kiri_rem(); } }

/* fungsi ini digunakan untuk membaca tiap sensor dari LTC jika hasil pembacaan kurang dari nilai referensi, maka akan dianggap berlogika 1, namun jika pembacaannya lebih besar dari nilai referensi, maka dianggap berlogika 0 */ void baca_sensor(){ if(analogRead(S5)<ns5){ digitalWrite(L5, HIGH); sensor |= B00000001;

} else{ digitalWrite(L5, LOW); sensor &= B11111110; } if(analogRead(S4)<ns4){ digitalWrite(L4, HIGH); sensor |= B00000010; } else{ digitalWrite(L4, LOW); sensor &= B11111101; } if(analogRead(S3)<ns3){ digitalWrite(L3, HIGH); sensor |= B00000100; } else{ digitalWrite(L3, LOW); sensor &= B11111011; } if(analogRead(S2)<ns2){ digitalWrite(L2, HIGH); sensor |= B00001000; }

else{ digitalWrite(L2, LOW); sensor &= B11110111; } if(analogRead(S1)<ns1){ digitalWrite(L1, HIGH); sensor |= B00010000; } else{ digitalWrite(L1, LOW); sensor &= B11101111; } if(analogRead(S0)<ns0){ digitalWrite(L0, HIGH); sensor |= B00100000; } else{ digitalWrite(L0, LOW); sensor &= B11011111; } }

/* fungsi ini digunakan untuk menentukan aksi setelah sensor dibaca dan didapatkan posisi sensor, setelah didapatkan posisi sensor,

maka variabel "lp" digunakan untuk menentukan posisi terakhir dari sensor, agar ketika sensor keluar lintasan, dia tau harusambil keputusan apa */ void posisi_sensor(){ if (sensor == B001100) { kiri_cepat(); kanan_cepat(); } else if (sensor == B000100 || sensor == B000110) { kiri_cepat(); kanan_pelan(); lp = true; } else if (sensor == B000010 || sensor == B000011) { kiri_cepat(); kanan_lambat(); lp = true; } else if (sensor == B000001) { kiri_cepat(); kanan_rem(); lp = true; } else if (sensor == B001000 || sensor == B011000) { kanan_cepat(); kiri_pelan(); lp = false; } else if (sensor == B010000 || sensor == B110000) { kanan_cepat(); kiri_lambat(); lp = false; } else if (sensor == B100000) { kanan_cepat(); kiri_rem(); lp = false; } else if (sensor == B000000){ if (lp){ kiri_cepat(); kanan_rem(); }else{ kanan_cepat(); kiri_rem(); } } else { kanan_lambat(); kiri_lambat(); } }

/* fungsi "kanan_cepat()", "kanan_pelan()", dst, digunakan untuk menggerakkan motor dan mengatur kecepatan motor lewat pwm

*/ void kanan_cepat(){ digitalWrite(KAN_REM, LOW); analogWrite(KAN_MAJU,255); } void kanan_pelan(){ digitalWrite(KAN_REM, LOW); analogWrite(KAN_MAJU,90); } void kanan_lambat(){ digitalWrite(KAN_REM, LOW); analogWrite(KAN_MAJU,35); } void kanan_rem(){ analogWrite(KAN_MAJU,0); delay(10); digitalWrite(KAN_REM, HIGH); delay(50); }

void kiri_cepat(){ digitalWrite(KIR_REM, LOW); analogWrite(KIR_MAJU,255); } void kiri_pelan(){

digitalWrite(KIR_REM, LOW); analogWrite(KIR_MAJU,90); } void kiri_lambat(){ digitalWrite(KIR_REM, LOW); analogWrite(KIR_MAJU,35); } void kiri_rem(){ analogWrite(KIR_MAJU,0); delay(10); digitalWrite(KIR_REM, HIGH); delay(50); }

/* fungsi ini digunakan untuk mengecek kondisi dari tombol */ void baca_tombol(){ if (digitalRead(TOMBOL) == LOW && enable1) { delay(100); start = ~start; enable1 = false; } else if (digitalRead(TOMBOL) == HIGH && enable1 == false){ enable1 = true; }

/* digunakan untuk mengkalibrasi, sehingga didapatkan nilai referensi yang tersimpan dalam variabel ns0, ns1, ns2, dst */ void kalibrasi(){ delay(1000); ns0= analogRead(S0); ns1= analogRead(S1); ns2= analogRead(S2); ns3= analogRead(S3); ns4= analogRead(S4); ns5= analogRead(S5); digitalWrite(L0, HIGH); digitalWrite(L1, HIGH); digitalWrite(L2, HIGH); digitalWrite(L3, HIGH); digitalWrite(L4, HIGH); digitalWrite(L5, HIGH); delay(2000); ns0= (analogRead(S0) + ns0) / 2; ns1= (analogRead(S1) + ns1) / 2; ns2= (analogRead(S2) + ns2) / 2; ns3= (analogRead(S3) + ns3) / 2;

ns4= (analogRead(S4) + ns4) / 2; ns5= (analogRead(S5) + ns5) / 2; digitalWrite(L0, LOW); digitalWrite(L1, LOW); digitalWrite(L2, LOW); digitalWrite(L3, LOW); digitalWrite(L4, LOW); digitalWrite(L5, LOW); delay(500); }

Anda mungkin juga menyukai