Cari Kode

Pelajaran 26/31: Mobil Pintar Bagian 4 : Menghindari Rintangan Menggunakan Sensor Ultrasonik | SunFounder Robojax

Pelajaran 26/31: Mobil Pintar Bagian 4 : Menghindari Rintangan Menggunakan Sensor Ultrasonik | SunFounder Robojax

Dalam pelajaran ini, kita meningkatkan mobil pintar Anda dengan kemampuan untuk melihat dan bereaksi terhadap lingkungannya menggunakan sensor ultrasonik. Dengan mengukur jarak ke objek di depannya, mobil dapat membuat keputusan cerdas: mobil akan bergerak maju ketika jalur bersih, berhenti ketika ada objek di dalam zona peringatan, dan mundur ketika rintangan terlalu dekat. Proyek ini dibangun di atas dasar kontrol motor dan sensor yang telah Anda pelajari, menghasilkan kendaraan yang benar-benar otonom.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

Ini bukan sekadar mainan; ini adalah langkah mendasar menuju pembangunan proyek robotika yang lebih kompleks. Logika yang akan Anda terapkan di sini—rasakan, pikirkan, bertindak—adalah logika yang sama yang digunakan dalam segala hal, dari robot penyedot debu hingga otomasi industri. Berikut adalah beberapa ide untuk menginspirasi kreasi Anda sendiri:

  • Rover Otonom: Buat robot yang dapat menjelajahi ruangan atau lorong tanpa menabrak dinding atau furnitur.
  • Sistem Alarm Kedekatan: Pasang sensor ultrasonik pada servo untuk memindai area dan memicu alarm atau lampu ketika penyusup memasuki zona yang ditentukan.
  • Asisten Parkir Cerdas: Bangun sistem yang menggunakan pembacaan jarak untuk memandu kendaraan masuk ke tempat yang sempit, memberikan umpan balik visual atau audio.

Panduan ini didasarkan pada kit Arduino 3-in-1 SunFounder dan proyek "Play with Ultrasonic Module" miliknya. Kita akan membahas pengkabelan, menjelaskan kode pengambilan keputusan, dan mendemonstrasikan mobil saat beraksi.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

Cara Kerja Logika Penghindar Rintangan

Inti dari proyek ini adalah pohon keputusan yang sederhana namun kuat. Sensor ultrasonik terus-menerus mengukur jarak ke objek yang berada tepat di depannya. Nilai jarak ini kemudian digunakan untuk mengontrol motor mobil, seperti yang ditunjukkan pada diagram di bawah ini.

  • Jika jarak > 25 cm: Jalur bersih, jadi mobil bergerak maju.
  • Jika 10 cm < jarak <= 25 cm: Sebuah objek terdeteksi di "zona peringatan," jadi mobil berhenti untuk menghindari tabrakan.
  • Jika 2 cm < jarak <= 10 cm: Sebuah objek berada sangat dekat. Mobil mundur untuk menciptakan lebih banyak ruang.
  • Jika jarak <= 2 cm: Pembacaan kemungkinan merupakan kesalahan (terlalu dekat untuk diukur secara akurat), jadi mobil berhenti sebagai tindakan pengamanan.

Komponen Perangkat Keras

Untuk membangun proyek ini, Anda akan memerlukan komponen-komponen berikut, yang semuanya termasuk dalam kit 3-in-1 SunFounder.

  • 1x Arduino Uno (atau papan yang kompatibel)
  • 1x Sasis mobil pintar dengan dua motor bergigi
  • 1x Modul Driver Motor L298N
  • 1x Sensor Jarak Ultrasonik HC-SR04
  • 1x Papan tempat merangkai (breadboard)
  • Kabel jumper
  • Catu daya untuk mobil (misalnya, paket baterai)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

Panduan Pengkabelan

Pengkabelan menghubungkan driver motor, sensor ultrasonik, dan Arduino. Driver motor mengontrol roda mobil, sementara sensor ultrasonik bertindak sebagai "mata"-nya.

Berikut adalah diagram koneksi dari dokumentasi SunFounder:

Mari kita uraikan koneksinya. Pertama, beri daya pada rel positif dan negatif papan tempat merangkai dari pin 5V dan GND Arduino. Sensor ultrasonik kemudian dihubungkan sebagai berikut:

  • VCC (Daya): Terhubung ke rel positif pada papan tempat merangkai.
  • GND (Ground): Terhubung ke rel negatif pada papan tempat merangkai.
  • Trig (Pemicu): Terhubung ke pin digital 3 pada Arduino. Pin ini mengirimkan pulsa ultrasonik.
  • Echo (Penerima): Terhubung ke pin digital 4 pada Arduino. Pin ini menerima pulsa yang dipantulkan.

Koneksi driver motor sama seperti pada pelajaran sebelumnya. Empat pin kontrol (IN1, IN2, IN3, IN4) terhubung ke pin digital Arduino 5, 6, 9, dan 10. Pin-pin ini mengontrol kecepatan dan arah kedua motor. Pastikan daya dan ground driver motor terhubung dengan benar ke paket baterai dan ground Arduino. (di video pada 02:24)

Penjelasan Kode

Kode untuk proyek ini mengontrol perilaku mobil berdasarkan pembacaan jarak dari sensor ultrasonik. Logikanya sederhana dan mudah disesuaikan. Mari kita lihat bagian-bagian kunci yang dapat dikonfigurasi oleh pengguna.

1. Definisi Pin

Di bagian atas sketsa, pin untuk motor dan sensor ultrasonik didefinisikan. Anda dapat mengubahnya jika Anda telah menghubungkan komponen ke pin Arduino yang berbeda.

const int A_1B = 5;
  const int A_1A = 6;
  const int B_1B = 9;
  const int B_1A = 10;
  
  const int trigPin = 3;
  const int echoPin = 4;

Di sini, A_1A, A_1B, B_1A, dan B_1B mengontrol motor kiri dan kanan melalui driver L298N. trigPin dan echoPin digunakan untuk sensor ultrasonik.

2. Variabel Perilaku dan Logika

Perilaku utama dikontrol di dalam fungsi loop(). Di sinilah Anda dapat menyesuaikan "kepribadian" mobil.

void loop() {
    float jarak = bacaDataSensor();
    if (jarak > 25) {
      gerakMaju(200);
    }
    else if (jarak < 10 && jarak > 2) {
      gerakMundur(200);
    } else {
      hentikanGerak();
    }
  }

Berikut cara menyesuaikannya:

  • Ambang Jarak: Angka 25 dan 10 menentukan zona "aman" dan "bahaya" dalam sentimeter. Naikkan 25 untuk membuat mobil berhenti lebih awal, atau turunkan untuk memungkinkannya mendekati rintangan. Angka 2 adalah batas aman untuk mengabaikan pembacaan yang salah dari objek yang terlalu dekat.
  • Kecepatan Motor: Nilai 200 yang diteruskan ke gerakMaju() dan gerakMundur() mengatur kecepatan mobil. Nilai ini dapat berkisar dari 0 hingga 255. Nilai yang lebih rendah, seperti 150, akan membuat mobil bergerak lebih lambat dan lebih hati-hati.

Sisa kode terdiri dari fungsi bacaDataSensor(), yang menangani pengaturan waktu sensor ultrasonik untuk menghitung jarak, dan fungsi gerakMaju(), gerakMundur(), dan hentikanGerak(), yang mengontrol driver motor untuk menjalankan aksi yang diinginkan.

Mengatasi Kesalahan Umum

Anda mungkin menemui kesalahan seperti 'gerakMaju' was not declared in this scope. Ini terjadi karena IDE Arduino membaca kode dari atas ke bawah. Ketika mencapai fungsi loop(), ia belum mengetahui fungsi-fungsi yang didefinisikan di bawahnya. Untuk memperbaikinya, Anda harus menambahkan "prototipe fungsi" sebelum fungsi setup(). Ini hanyalah deklarasi nama fungsi dan tipe kembaliannya, diakhiri dengan titik koma.

void gerakMaju(int kecepatan);
  void gerakMundur(int kecepatan);
  void hentikanGerak();
  float bacaDataSensor();

Menambahkan baris-baris ini memberi tahu kompiler, "Fungsi-fungsi ini ada dan akan didefinisikan nanti," yang menyelesaikan kesalahan tersebut. (di video pada 09:21)

Meningkatkan Stabilitas Sensor

Selama pengujian, Anda mungkin melihat mobil berhenti atau tersendat bahkan saat jalur bersih. Ini sering terjadi karena loop berjalan terlalu cepat, dan sensor ultrasonik tidak memiliki cukup waktu untuk menerima sinyal gema, menghasilkan pembacaan 0 cm. Untuk memperbaikinya, tambahkan penundaan kecil di akhir fungsi loop() untuk memberi waktu sensor bekerja.

void loop() {
    float jarak = bacaDataSensor();
    if (jarak > 25) {
      gerakMaju(200);
    }
    else if (jarak < 10 && jarak > 2) {
      gerakMundur(200);
    } else {
      hentikanGerak();
    }
    delay(100); // Tambahkan penundaan 100ms untuk pembacaan yang stabil
  }

Penundaan 100 milidetik biasanya cukup untuk mendapatkan pembacaan jarak yang stabil dan konsisten. (di video pada 10:56)

Demonstrasi Proyek Langsung

Setelah kode diunggah, buka Serial Monitor. Anda akan melihat teks yang menunjukkan status mobil, seperti "Maju", "Mundur", atau "Berhenti".

Dalam demonstrasi, mobil ditempatkan menghadap rintangan. Ketika rintangan berjarak lebih dari 25 cm, mobil bergerak maju. Saat Anda mendekatkan tangan, mobil berhenti ketika jarak turun di bawah 25 cm. Jika Anda mendekatkan tangan sangat dekat, dalam 10 cm, mobil akan mundur. Perilaku ini terlihat jelas di video dan mengonfirmasi bahwa logika penghindaran rintangan bekerja dengan benar. (di video pada 11:53)

Kesimpulan

Selamat! Anda telah berhasil membangun mobil pintar yang dapat menavigasi lingkungannya dan menghindari rintangan. Proyek ini menggabungkan input sensor, logika pengambilan keputusan, dan kontrol motor menjadi satu sistem yang fungsional. Anda tidak hanya belajar cara menggunakan sensor ultrasonik tetapi juga cara menerapkan algoritma kontrol sederhana yang menjadi dasar untuk robot otonom yang jauh lebih kompleks.

Bab

  • [00:00] Pengenalan Penghindaran Rintangan
  • [01:16] Tinjauan Proyek dan Prasyarat
  • [02:24] Menghubungkan Sensor Ultrasonik dan Driver Motor
  • [04:56] Membuka Kode Proyek
  • [05:12] Penjelasan Kode: Logika dan Fungsi
  • [08:34] Mengunggah Kode dan Uji Awal
  • [09:21] Pemecahan Masalah: Prototipe Fungsi
  • [10:56] Pemecahan Masalah: Menambahkan Penundaan untuk Stabilitas
  • [11:53] Demonstrasi Langsung Penghindaran Rintangan

Gambar

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Bahasa: C++
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor 
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA

*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int trigPin = 3;
const int echoPin = 4;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {
  float distance = readSensorData();
  if (distance > 25) {
    moveForward(200);
  }
  else if (distance < 10 && distance > 2) {
    moveBackward(200);
  } else {
    stopMove();
  }
}

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

Sumber daya & referensi

Berkas📁

Pustaka Arduino (zip)