Di dalam post ini, kami akan menerangkan cara membina Line Following Robot dengan menggunakan Arduino, melalui MG Line Following Robot Kit MKII, MatGyver. Robot ini akan menggunakan dua (2) 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 ini, atau anda boleh mendapatkan Kit Line Following MatGyver MkII dari WebStore kami di URL di bawah:
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
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.
Untuk coding yang tidak menggunakan BlueTooth Module HC-06, anda boleh copy / paste code di bahagian bawah tutorial ini.
Litar Diagram Sambungan Komponen

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.
- Arduino UNO / SMD-Type x1 unit
- Small Breadboard x1 unit
- Motor Driver L298N x1 unit
- 6V DC Motor bersama Tayar x2 unit
- IR Object Sensor x2 unit
- Battery Li-Ion 18650 (3.7Vx2V) x2 unit
- Battery Holder Li-Ion 18650 2-Cell x1 unit
- Battery Charger untuk Li-Ion x1 unit
- SPDT Toggle Switch x1 unit
- Wire Jumper Female-Male 20cm x1 set
- Wire Jumper Male-Male 20cm x1 set
- Bluetooth Module HC-06 (jika mahu gunakan Bluetooth) x1 unit
LANGKAH #1: Memahami Bagaimana Sensor Infrared Berfungsi

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

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

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.
Paling senang singgah MR.DIY saja ya!
Selamat Bermain Line-Follow Robot!
BLUETOOTH CONTROL
BLUETOOTH APP: BLUETOOTH RC CAR
CODING TAMBAHAN: Bluetooth Remote Control
//CODING DISEDIAKAN OLEH MatGyver.my //Project : MG Line Following Robot MkII 2 Sensor //Program Version : V6.2.3 #include <SoftwareSerial.h> SoftwareSerial mySerial(11, 12); // RX, TX char blueToothVal = 'S'; //ROBOT MODES #define ENABLE_BLUETOOTH #define ENABLE_LINEFOLLOW //UNCOMMENT "//" ini untuk melihat data melalui Serial Monitor //CHECK SERIAL MONITOR #define ENABLE_SERIAL_DEBUG //untuk melihat data dari Bluetooth //#define ENABLE_SENSOR_CHECK //untuk melihat data dari Sensor //MODE OPERATORS byte bluetooth_mode = 0; byte autofollow_mode = 0; byte mode_switch = 0; //menamakan pin-pin sensor byte sensor_kanan = 2; //pin# 13 byte sensor_kiri = 3; //pin# 11 //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 = 1.00; //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) //Line follow Balance Motor Kiri & Kanan float power_kiri = 1.0; // 0.8 = 80% float power_kanan = 0.7; // 1 = 100% //Remote Balance Motor Kiri & Kanan float power_kiri_R = 0.9; // 0.8 = 80% float power_kanan_R = 1.0; // 1 = 100% void setup() { // code di sini hanya akan berulang sekali sahaja: //UNCOMMENT UNTUK ENABLE BLUETOOTH MODE #ifdef ENABLE_BLUETOOTH bluetooth_mode = 1; #endif //LINE FOLLOWING MODE CHOOSE BY BLUETOOTH //#ifdef ENABLE_LINEFOLLOW //autofollow_mode = 1; //#endif //MULAKAN KOMUNIKASI SERIAL UTK Serial.print pada kelajuan baud rate 9600bps Serial.begin(9600); mySerial.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); //SAFETY START //MOTOR KANAN digitalWrite(ENA_kiri, LOW); digitalWrite(IN1_kiri, LOW); digitalWrite(IN2_kiri, LOW); //MOTOR KIRI digitalWrite(ENB_kanan, LOW); digitalWrite(IN3_kanan, LOW); digitalWrite(IN4_kanan, LOW); //MODECHECK if(bluetooth_mode == 1){ autofollow_mode = 0;} } void loop() { // code di sini hanya akan berulang secara infiniti pada kelajuan 8Mhz Arduino: // nyatakan coding-coding yang akan diulangi. //BT Mode & MODE SWITCH #ifdef ENABLE_BLUETOOTH bluetoothRemote(); #endif /***OPERASI KERETA***/ //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(); } //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(); } //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(); } //Apa jadi jika semua sensor tidak detect? //OUTPUT : jika tidak letak apa-apa ia akan buat apa yang dibuat sebelumnya //if(digitalRead(sensor_tengah) == LOW && digitalRead(sensor_kanan) == LOW && digitalRead(sensor_kiri) == LOW){ //} //CHECK SERIAL CONDITION SENSOR #ifdef ENABLE_SENSOR_CHECK checksensors(); #endif //UNCOMMENT "//" ini untuk melihat data Bluetooth melalui Serial Monitor //CHECK SERIAL DEBUG #ifdef ENABLE_SERIAL_DEBUG checkBT(); #endif } void gerakForward(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, (255*power_kiri_R));//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, LOW); //fwd digitalWrite(IN2_kiri, HIGH); //fwd if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, (255*power_kanan_R));//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, LOW); //fwd digitalWrite(IN4_kanan, HIGH); //fwd }//END GERAK FORWARD void gerakReverse(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, (255*power_kiri_R));//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, HIGH); //rev digitalWrite(IN2_kiri, LOW); //rev if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, (255*power_kanan_R));//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, HIGH); //rev digitalWrite(IN4_kanan, LOW); //rev }//END GERAK REVERSE void pusingKanan(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 0.4*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, LOW); //fwd digitalWrite(IN2_kiri, HIGH); //fwd if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 0.4*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, HIGH); //rev digitalWrite(IN4_kanan, LOW); //rev }//END PUSING KANAN void pusingKiri(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 0.4*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (turn_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, HIGH); //rev digitalWrite(IN2_kiri, LOW); //rev if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 0.4*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (turn_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, LOW); //fwd digitalWrite(IN4_kanan, HIGH); //fwd }//END PUSING KIRI /**FUNGSI KAWALAN CONTROL TAMBAHAN**/ /**UNTUK BLUETOOTH CONTROL**/ void FwdKanan(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, LOW); //fwd digitalWrite(IN2_kiri, HIGH); //fwd if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 0.5*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, LOW); //fwd slow digitalWrite(IN4_kanan, HIGH); //fwd slow }//END FWDKANAN void FwdKiri(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 0.5*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, LOW); //fwd slow digitalWrite(IN2_kiri, HIGH); //fwd slow if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, LOW); //fwd digitalWrite(IN4_kanan, HIGH); //fwd }//END FWDKIRI void RevKanan(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, HIGH); //rev digitalWrite(IN2_kiri, LOW); //rev if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 0.5*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, HIGH); //rev slow digitalWrite(IN4_kanan, LOW); //rev slow }//END REVERSE KANAN void RevKiri(){ if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENA_kiri, 0.5*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENA_kiri, (fwd_power*power_kiri));//ubah speed } digitalWrite(IN1_kiri, HIGH); //rev slow digitalWrite(IN2_kiri, LOW); //rev slow if(bluetooth_mode == 1){ //untuk BT Control Mode analogWrite(ENB_kanan, 0.7*255);//ubah speed } if(bluetooth_mode == 0){ //untuk Line Follow Mode analogWrite(ENB_kanan, (fwd_power*power_kanan));//ubah speed } digitalWrite(IN3_kanan, HIGH); //rev digitalWrite(IN4_kanan, LOW); //rev }//END REVERSE KIRI /**END BLUETOOTH CONTROLS**/ void checksensors(){ Serial.print("Sensor Kiri: "); Serial.print(digitalRead(sensor_kiri)); Serial.print(" "); Serial.print("Sensor Kanan: "); Serial.print(digitalRead(sensor_kanan)); Serial.print(" "); Serial.println(); }//END CHECK SENSOR void bluetoothRemote(){ if(mySerial.available()){ blueToothVal = mySerial.read(); } //LINE FOLLOW/BLUETOOTH MODE SELECT if(blueToothVal == 'X'){ autofollow_mode = 1; bluetooth_mode = 0;} if(blueToothVal == 'x'){ autofollow_mode = 0; bluetooth_mode = 1;} //ENABLE KAWALAN BLUETOOTH if(bluetooth_mode == 1){ //KAWALAN PERGERAKAN OLEH BT REMOTE if(blueToothVal == 'F'){gerakForward();} if(blueToothVal == 'B'){gerakReverse();} if(blueToothVal == 'R'){pusingKanan();} if(blueToothVal == 'L'){pusingKiri();} //KAWALAN EXTRA PERGERAKAN if(blueToothVal == 'I'){FwdKanan();} if(blueToothVal == 'G'){FwdKiri();} if(blueToothVal == 'J'){RevKanan();} if(blueToothVal == 'H'){RevKiri();} if(blueToothVal == 'S' || blueToothVal == 'x'){ //MOTOR KANAN digitalWrite(ENA_kiri, LOW); digitalWrite(IN1_kiri, LOW); digitalWrite(IN2_kiri, LOW); //MOTOR KIRI digitalWrite(ENB_kanan, LOW); digitalWrite(IN3_kanan, LOW); digitalWrite(IN4_kanan, LOW); } }//END OF ENABLE KAWALAN BLUETOOTH }//END BLUETOOTH REMOTE void checkBT(){ Serial.print(" BTSignal:"); Serial.print(blueToothVal); Serial.print(" BTMode:"); Serial.print(bluetooth_mode); Serial.print(" LineMode:"); Serial.print(autofollow_mode); Serial.println(); }//END CHECK BT
Penerangan terperinci akan datang..