Line Following Robot

Di dalam post ini, kami akan menerangkan cara mudah membuat Line Following Robot dengan menggunakan Arduino. Robot ini akan menggunakan dua sensor InfraRed untuk mengesan Garisan-Hitam dan berdasarkan input yang diterima dari sensor, Arduino akan mengarahkan motor untuk bergerak.

Anda boleh menggunakan Line Following Kit yang mempunyai setup yang hampir sama dengan Kit MatGyver, atau anda boleh mendapatkan Kit Line Following MatGyver MkII dari WebStore kami di URL di bawah:

Kit Line Following Robot MkII MatGyver

Kit Line Following Robot MkII MatGyver

Jika anda telah mendapatkan Kit Line Following MatGyver MkII, anda boleh rujuk URL berikut pula, untuk Manual Pemasangan Kit.

Manual Pemasangan Kit Line Following MatGyver

Maual Pemasangan Kit Line Following MatGyver

Coding Penuh (BlueTooth) untuk Robot Line Following ini ada di URL berikut:

Korang boleh terus gunakan coding yang di sediakan oleh #teamMatGyver berikut, untuk terus bermain dengan Robot Line Following MkII ni,
atau,
korang boleh terus baca sampai habis untuk penerangan coding-coding yang telah dibuat.

Coding Disabled Functions

Coding Enabled Functions

Untuk coding yang tidak menggunakan BlueTooth Module HC-06, anda boleh copy / paste code di bahagian bawah tutorial ini.

Litar Diagram Sambungan Komponen

Litar Sambungan Wiring Line Following Robot MkII MatGyver

Anda boleh rujuk Manual Pemasangan Kit Line Following Robot di atas, untuk penyambungan yang lebih terperinci.

Senarai Komponen yang di perlukan

Anda boleh skip bahagian ini jika telah mempunyai semua senarai komponen.

LANGKAH #1: Memahami Bagaimana Sensor Infrared Berfungsi

Infrared Object Sensor

Sensor Infrared IR jenis ini digunakan dalam Line Following ini. Anda juga boleh gunakan sensor lain yang khas untuk Line-Following, tapi kami gunakan module ini kerana ia juga boleh digunakan untuk projek-projek lain bagi detect objek.

Sensor Infrared ini mempunyai jarak bacaan 10cm maksimum.

Terdapat 1 LED Transmitter (warna putih) yang akan transmit IR-Light secara continuous ke-HADAPAN. IR-Light ini bersifat mudah terpantul pada objek berkilat atau warna putih. IR-Light yang terpantul tadi, akan diterima semula oleh 1 LED Receiver (warna hitam).

PENTING! :
Anda perlu TUNE-kan sensitivity Sensor ini dengan menggunakan screw driver kecil, dan putar kan Potentiometer berwarna biru di atas module sehingga signal LED di atas module menyala, menandakan objek telah di detect.

Gunakan Objek Hitam dan Putih dan letakkan dihadapan sensor semasa tune, supaya sensor dapat detect dan bezakan warna Hitam / Putih.

LANGKAH #2: Memahami Bagaimana Mengawal Motor dengan Module L298N

Module-module yang disambungkan pada Arduino, semuanya mempunyai protokol-protokol penggunaan mereka. Kita perlu tahu protokol yang diperlu dipatuhi untuk menjalankan Motor dengan Module L298N

Protokol sambungan Wiring untuk module L298N

Dalam rajah di atas, kita boleh lihat, terdapat 2 motor boleh disambungkan pada Module ini.

Protokol Kawalan Motor Dengan Module L298N

Kalau tengok betul-betul carta protokol penggunaan L298N ni, terdapat 6 pin yang perlu di kawal oleh Arduino untuk pusingkan Motor. 3 pin untuk Motor A (kiri), dan 3 pin untuk Motor B (kanan).

Pin IN1, IN2, IN3 dan IN4 hanya perlukan Output Digital HIGH/LOW saja dari Arduino, manakala pin ENA dan ENB menggunakan output PWM dari pin Arduino bagi mengawal laju-perlahan motor.

Tukar kondisi HIGH/LOW pin IN1 dan IN2 bagi menukar arah pusingan.

Bagi tutorial lanjut mengenai Module Motor Driver L298N ni, boleh rujuk link di bawah:

Tutorial Kawalan DC Motor dengan L298N

Bagi mempermudahkan coding, #teamMatGyver telah membahagikan coding menggerakkan motor ni kepada 3 Sub-Routine mengikut protokol di atas yang diletakkan di bawah Void Loop supaya mudah dipanggil dalam Loop-Utama.

  • gerakForward();
  • pusingKanan();
  • pusingKiri();

Terdapat juga sedikit formula Matematik dalam analogWrite() supaya senang nak Fine-Tune Speed setiap Individu-Motor kemudian.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

void gerakForward(){
   analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed
   digitalWrite(IN1_kiri, LOW);  //fwd
   digitalWrite(IN2_kiri, HIGH); //fwd

   analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed 
   digitalWrite(IN3_kanan, LOW);  //fwd
   digitalWrite(IN4_kanan, HIGH); //fwd
}//END GERAK FORWARD

void pusingKanan(){
    analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed
    digitalWrite(IN1_kiri, LOW);   //fwd
    digitalWrite(IN2_kiri, HIGH);  //fwd

    analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed 
    digitalWrite(IN3_kanan, HIGH); //rev
    digitalWrite(IN4_kanan, LOW);  //rev
  
}//END PUSING KANAN

void pusingKiri(){
    analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed  
    digitalWrite(IN1_kiri, HIGH); //rev
    digitalWrite(IN2_kiri, LOW);  //rev

    analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed
    digitalWrite(IN3_kanan, LOW);  //fwd
    digitalWrite(IN4_kanan, HIGH); //fwd
}//END PUSING KIRI

LANGKAH #4: Memahami Proses-Flow Robot Line Following

Pada hadapan robot ini akan ada dua sensor InfraRed dan terdapat 4 Empat Kemungkinan bagi kawalan Robot ini: –

Kemungkinan 1: Pergerakan Ke Hadapan

Dalam keadaan ini, kedua-dua sensor Kiri dan Kanan Robot tidak mengesan garisan hitam. Bermakna, kedua-dua sensor akan memberi Signal LOW pada Arduino. Dengan ini, kita mahukan Robot beregerak lurus ke-Hadapan.

Output Sensor Kanan : LOW
Output Sensor Kiri : LOW

Dengan ini, kita boleh arahkan Robot bergerak ke-Hadapan dengan input dari sensor.

  //Apa jadi jika sensor kiri dan kanan detect putih?
  //OUTPUT : Jalan Garis Lurus
  if(digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == LOW && autofollow_mode == 1){
     //isi aktiviti sini
     gerakForward();
  }

Kemungkinan 2: Pusing / Belok Ke Kiri

Bilakah Robot perlu belok ke-Kiri ?
Dalam hal ini, ia berlaku apabila Sensor Kiri mengesan garisan Hitam, manakala Sensor Kanan mengesan lantai putih. Dalam keadaan ini, kita perlukan Robot berputar ke Kiri (lawan jam). Untuk melaksanakan ini, Motor Kiri perlu berputar ke belakang (reverse) dan Motor Kanan berputar ke hadapan (forward). Hasilnya, Robot bergerak ke kiri.

Output Sensor Kanan : LOW
Output Sensor Kiri : HIGH

//Apa jadi jika sensor kiri detect hitam?
  //OUTPUT : Pusing kiri
  if(digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == HIGH && autofollow_mode == 1){
     //isi aktiviti sini
     pusingKiri();
  }

Kemungkinan 3: Pusing / Belok Ke Kanan

Dalam hal ini, hanya sensor kanan mengesan garisan. Ini bermakna kereta perlu beralih ke arah kanan. Motor kiri berputar ke depan (forward) dan motor kanan berputar ke belakang (reverse). Hasilnya, kereta bergerak ke kanan.

Output Sensor Kanan : HIGH
Output Sensor Kiri : LOW

//Apa jadi jika sensor kanan detect hitam?
  //OUTPUT : Pusing kanan
  if(digitalRead(sensor_kanan) == HIGH && digitalRead(sensor_kiri) == LOW && autofollow_mode == 1){
     //isi aktiviti sini
     pusingKanan();
  }

Kemungkinan 4: Berhenti.

Dalam kes ini, kedua-dua sensor mengesan garisan. Ini bermakna kereta telah sampai ke garisan penamat. Kedua-dua motor berhenti berputar. Hasilnya, kereta berhenti.

Output Sensor Kanan : HIGH
Output Sensor Kiri : HIGH

Bagi coding untuk stop ini, kami berikan “HomeWork” kepada korang untuk cuba coding sendiri.

Walaubagaimanapun, kami tidak mempunyai coding BERHENTI dalam full code kami, kerana tidak perlu.

LANGKAH #5: Menggabungkan Semua Coding dan Upload

Kalau dah faham bagaimana Coding Robot Line Following ini di bina, anda boleh terus Copy dan Paste coding di bawah, dan Upload ke-dalam Robot korang.

//CODING DISEDIAKAN OLEH MatGyver.my
//Project : MG Line Following Robot MkI 2 Sensor

//menamakan pin-pin sensor
byte sensor_kanan = 2;  //pin#
byte sensor_kiri = 3;   //pin#

//menamakan pin-pin motor kiri, MOTOR A
byte ENA_kiri = 10; //pin#
byte IN1_kiri = 9;  //pin#
byte IN2_kiri = 8;  //pin#

//menamakan pin-pin motor kanan, MOTOR B
byte ENB_kanan = 6; //pin#
byte IN3_kanan = 5; //pin#
byte IN4_kanan = 4; //pin#

//motor power
/*****modify ini sahaja*****/
float power_keseluruhan = 0.95; //1 = 100% , lain setup akan menggunakan power berlainan
/*****modify ini sahaja*****/

//tuned power
int fwd_power = 90*power_keseluruhan; //max adalah 255 (range 0 ~ 255)
int turn_power = 150*power_keseluruhan;  //max adalah 255 (range 0 ~ 255)

//nak balancekan kelajuan motor kiri dan kanan supaya sama laju
float power_kiri = 0.7; // 0.8 = 80%
float power_kanan = 1; // 1 = 100%

void setup() {
  // code di sini hanya akan berulang sekali sahaja:

  //MULAKAN KOMUNIKASI SERIAL UTK Serial.print pada kelajuan baud rate 9600bps
  Serial.begin(9600);

  //DECLARE FUNGSI-FUNGSI PIN ARDUINO
  //PIN-PIN SENSOR
  pinMode(sensor_kanan, INPUT);
  pinMode(sensor_kiri, INPUT);
  //MOTOR KANAN
  pinMode(ENA_kiri, OUTPUT);
  pinMode(IN1_kiri, OUTPUT);
  pinMode(IN2_kiri, OUTPUT);
  //MOTOR KIRI
  pinMode(ENB_kanan, OUTPUT);
  pinMode(IN3_kanan, OUTPUT);
  pinMode(IN4_kanan, OUTPUT);
  
}

void loop() {
  // code di sini hanya akan berulang secara infiniti pada kelajuan 8Mhz Arduino:
  // nyatakan coding-coding yang akan diulangi.

  //Apa jadi jika sensor kiri dan kanan detect putih?
  //OUTPUT : Jalan Garis Lurus
  if(digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == LOW){
    analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed
    digitalWrite(IN1_kiri, LOW);
    digitalWrite(IN2_kiri, HIGH);

    analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed
    digitalWrite(IN3_kanan, LOW);
    digitalWrite(IN4_kanan, HIGH);
  }

  //Apa jadi jika sensor kiri detect hitam?
  //OUTPUT : Pusing kiri
  if(digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == HIGH){
    analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed
    digitalWrite(IN1_kiri, HIGH);
    digitalWrite(IN2_kiri, LOW);

    analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed
    digitalWrite(IN3_kanan, LOW);
    digitalWrite(IN4_kanan, HIGH);
  }

  //Apa jadi jika sensor kanan detect hitam?
  //OUTPUT : Pusing kanan
  if(digitalRead(sensor_kanan) == HIGH && digitalRead(sensor_kiri) == LOW){
    analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed
    digitalWrite(IN1_kiri, LOW);
    digitalWrite(IN2_kiri, HIGH);

    analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed
    digitalWrite(IN3_kanan, HIGH);
    digitalWrite(IN4_kanan, LOW);
  }

  //Apa jadi jika semua sensor tidak detect?
  //OUTPUT : jika tidak letak apa-apa ia akan buat apa yang dibuat sebelumnya
  //if(digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == LOW){

  //}
  
  //uncomment ini untuk melihat data Sensor melalui Serial Monitor
  //checksensors();

}

void checksensors(){
  Serial.print(digitalRead(sensor_kiri));
  Serial.print(" ");
  Serial.print(digitalRead(sensor_kanan));
  Serial.print(" ");
  Serial.println();

}

LANGKAH #6: Cipta Litar Line-Following

Sekarang, korang dah boleh buat litar korang sendiri untuk Robot Follow.
Simple saja, gunakan Electrical Tape berwarna hitam yang boleh didapati di mana-mana kedai hardware terdekat.

Electrical Tape Hitam

Paling senang singgah MR.DIY saja ya!

Selamat Bermain Line-Follow Robot!

CODING TAMBAHAN: Bluetooth Remote Control

Penerangan terperinci akan datang..