Cari Kode

Pelajaran 28/31: Mobil-6 Mobil Arduino self-driving SunFounder menggunakan | Robojax

Pelajaran 28/31: Mobil-6 Mobil Arduino self-driving SunFounder menggunakan | Robojax

Dalam proyek ini, kita akan membuat mobil self-driving dasar menggunakan Arduino, sensor ultrasonik, dan dua sensor inframerah. Ini adalah proyek pengantar yang fantastis untuk belajar tentang navigasi otonom, fusi sensor, dan logika pengambilan keputusan. Mobil ini dapat bergerak maju, mundur, dan berbelok untuk menghindari rintangan, secara efektif menemukan jalur yang jelas dengan sendirinya. Proyek ini didasarkan pada kit Arduino 3-in-1 SunFounder dan merupakan bagian dari kursus Arduino Robojax.

Proyek ini bukan hanya tentang membuat mainan; ini adalah pengenalan praktis untuk konsep inti di balik robotika otonom. Logika dan sensor yang sama digunakan dalam aplikasi dunia nyata seperti robot penyedot debu, kendaraan berpemandu otomatis di gudang, dan bahkan sistem navigasi robot yang lebih kompleks. Dengan memahami cara menggabungkan penginderaan jarak dengan aturan navigasi sederhana, Anda dapat membuat berbagai proyek, seperti:

  • Membangun robot kecil yang dapat bernavigasi di ruangan dan menghindari furnitur.
  • Membuat kendaraan otomatis yang dapat mengikuti jalur sederhana atau berpatroli di suatu area.
  • Belajar cara mengimplementasikan algoritma penghindaran rintangan dasar untuk proyek robotika yang lebih besar.

Komponen Perangkat Keras

Proyek ini menggunakan komponen dari kit 3-in-1 SunFounder. Bagian pentingnya adalah:

  • Papan Arduino Uno
  • Sasis mobil 2WD atau 3-in-1 SunFounder dengan motor
  • Modul penggerak motor (misalnya, L298N atau sejenisnya)
  • Sensor jarak ultrasonik HC-SR04
  • Dua sensor rintangan IR
  • Kabel jumper dan sumber daya untuk motor

Panduan Pengkabelan

Pengkabelan adalah langkah pertama yang penting untuk menghidupkan mobil self-driving Anda. Koneksinya sederhana, tetapi sangat penting untuk memeriksa ulang setiap koneksi untuk menghindari kerusakan komponen. Logika di balik pengkabelan adalah menghubungkan pin kontrol Arduino ke penggerak motor dan sensor, memungkinkan Arduino membaca data dan mengirim perintah.

  • Pin Penggerak Motor (A-1B, A-1A, B-1B, B-1A): Pin-pin ini mengontrol kecepatan dan arah dua motor. Pin-pin ini terhubung ke pin Arduino 5, 6, 9, dan 10, yang mendukung PWM, memungkinkan kontrol kecepatan variabel.
  • Sensor Ultrasonik (Trig dan Echo): Pin Trig mengirimkan pulsa ultrasonik, dan pin Echo menerima sinyal yang dipantulkan. Pin Trig terhubung ke pin Arduino 3, dan pin Echo terhubung ke pin Arduino 4.
  • Sensor IR (Kiri dan Kanan): Sensor-sensor ini mendeteksi apakah ada rintangan tepat di depannya. Sensor IR kiri terhubung ke pin Arduino 8, dan sensor IR kanan terhubung ke pin 7. Sensor-sensor ini digunakan untuk memeriksa ruang di sisi mobil.

Untuk panduan visual yang terperinci, silakan merujuk pada diagram pengkabelan di bawah ini, yang memetakan setiap koneksi dengan jelas.

Penjelasan Kode

Kode ditulis dalam bahasa pemrograman Arduino (C++). Program lengkap tersedia untuk diunduh dari halaman sumber daya yang ditautkan dalam deskripsi video. Mari kita uraikan bagian-bagian kunci yang dapat dikonfigurasi pengguna dari sketsa ini.

Definisi Pin

Di bagian atas kode, Anda mendefinisikan pin yang menghubungkan Arduino ke berbagai komponen. Anda dapat mengubahnya jika menggunakan pin yang berbeda di papan Anda.

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

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

const int rightIR = 7;
const int leftIR = 8;

Pin A_1B, A_1A, B_1B, dan B_1A mengontrol penggerak motor jembatan-H. Dengan mengatur pin-pin ini HIGH atau LOW dalam kombinasi yang berbeda, Anda dapat mengontrol arah setiap motor. echoPin dan trigPin digunakan untuk sensor ultrasonik, dan rightIR dan leftIR digunakan untuk sensor inframerah.

Variabel Perilaku dan Logika

Logika inti dari perilaku self-driving ada di fungsi loop(). Mobil membuat keputusan berdasarkan pembacaan dari sensor IR dan sensor ultrasonik. Kode mendefinisikan jarak spesifik yang memicu tindakan berbeda. Misalnya, variabel distance diukur dalam sentimeter. Logikanya adalah sebagai berikut:

  • Jika jarak lebih besar dari 50 cm: Jalur di depan jelas, jadi mobil bergerak maju dengan kecepatan 200.
  • Jika jarak antara 2 cm dan 10 cm: Mobil terlalu dekat dengan rintangan. Mobil mundur selama satu detik, lalu berbelok ke kiri-belakang selama setengah detik untuk menemukan jalur baru.
  • Jika jarak antara 10 cm dan 50 cm: Mobil berada di "zona hati-hati." Mobil bergerak maju, tetapi dengan kecepatan lebih lambat yaitu 150.

Nilai ambang batas ini (50 cm, 10 cm, dan 2 cm) serta kecepatan (200 dan 150) adalah variabel utama yang dapat Anda sesuaikan untuk mengubah perilaku mobil Anda. Misalnya, Anda dapat meningkatkan jarak "aman" menjadi 60 cm jika mobil Anda bergerak cepat.

Fungsi Kustom

Kode ini mencakup beberapa fungsi kustom untuk mengontrol gerakan mobil. Fungsi-fungsi ini digunakan di seluruh loop utama untuk membuat kode lebih bersih dan lebih mudah dipahami.

  • moveForward(int speed): Fungsi ini mengatur pin motor untuk menggerakkan mobil maju. Parameter speed (0-255) mengontrol seberapa cepat motor berputar.
  • moveBackward(int speed): Mirip dengan moveForward, tetapi membalikkan arah motor untuk menggerakkan mobil mundur.
  • backLeft(int speed) dan backRight(int speed): Fungsi-fungsi ini memutar mobil dengan menjalankan satu motor secara mundur sementara motor lainnya berhenti. Ini adalah putaran poros yang membantu mobil mengubah arah secara efektif.
  • stopMove(): Fungsi ini menghentikan semua motor dengan mengatur semua pin kontrol ke LOW.
  • readSensorData(): Fungsi ini mengirimkan pulsa dari sensor ultrasonik dan mengukur waktu yang dibutuhkan untuk gema kembali. Kemudian menghitung jarak dalam sentimeter dan mengembalikan nilainya.

Demonstrasi Langsung Proyek

(dalam video pada 07:09) Dalam demonstrasi, mobil ditempatkan di lingkungan dengan berbagai rintangan seperti kotak dan dinding. Logika mobil terlihat saat ia bernavigasi. Ketika sensor ultrasonik mendeteksi dinding atau rintangan lebih dari 50 cm, ia dengan percaya diri melaju maju. Saat semakin dekat, sensor IR di sisi-sisi memeriksa ruang terbuka.

Jika rintangan terdeteksi di kiri, mobil melakukan belokan kanan mundur untuk menghindarinya dan sebaliknya. Ketika mobil menemukan dirinya di tempat sempit, seperti di bawah meja (dalam video pada 07:49), ia menggunakan fungsi mundur dan belok untuk membebaskan diri dan menemukan jalur yang jelas. Mobil terus-menerus membaca lingkungannya dan membuat keputusan, menunjukkan sistem kontrol reaktif yang tidak bergantung pada jalur yang direncanakan sebelumnya.

Bab Video

  • [00:00] Pengenalan Proyek Mobil Otonom
  • [00:28] Tentang Kit 3-in-1 SunFounder
  • [01:32] Membuka Kode dan Tinjauan Umum
  • [02:02] Penjelasan Struktur Kode dan Fungsi Baru
  • [03:11] Menyiapkan Pin dalam Fungsi Setup
  • [03:28] Logika Pengambilan Keputusan Utama dalam Loop
  • [05:41] Demonstrasi Langsung: Mobil dalam Aksi
  • [07:09] Demonstrasi dengan Rintangan dan Mengikuti Dinding
  • [09:58] Kesimpulan dan Pemikiran Akhir

Gambar

28 SunFounder Car 6 self-driving path
28 SunFounder Car 6 self-driving path
Car 7 8 28 self driving
Car 7 8 28 self driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Bahasa: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

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

const int rightIR = 7;
const int leftIR = 8;

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 backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  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);
}

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);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);
}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

Sumber daya & referensi

Berkas📁

Pustaka Arduino (zip)