Cari Kode

Kursus Pelajaran 9 dari 10: Penghindaran Rintangan menggunakan Mobil Pintar 4WD Raspberry Pi Pico

Pelajaran ini adalah bagian dari: Mobil Pintar Raspberry Pi Pico 4WD

Kursus Pelajaran 9 dari 10: Penghindaran Rintangan menggunakan Mobil Pintar 4WD Raspberry Pi Pico

Pendahuluan

Panduan ini, berdasarkan Pelajaran Kursus 9 dari 10 dari Robojax, menunjukkan cara membangun robot penghindar rintangan menggunakan kit SunFounder Raspberry Pi Pico 4WD Smart Car. Proyek ini menggabungkan sensor ultrasonik yang digerakkan servo dengan kontrol motor untuk menciptakan robot yang dapat menavigasi lingkungannya secara otonom. Dengan mengayunkan sensor seperti radar, mobil mendeteksi rintangan dan secara cerdas memilih jalur yang jelas untuk melanjutkan, menjadikannya pengenalan yang sempurna untuk robotika, integrasi sensor, dan navigasi otonom.

Pengaturan Sunfounder_Pico4DW-09-Obstacle-avoidance dengan rintangan di lantai

Proyek ini bukan sekadar mainan; ini adalah fondasi untuk banyak aplikasi praktis. Berikut adalah beberapa ide untuk menginspirasi Anda:

  • Robot Eksplorasi Otonom: Bangun robot yang dapat memetakan dan menjelajahi ruangan atau area luar ruangan tanpa campur tangan manusia.
  • Penyedot Debu Pintar: Gunakan prinsip yang sama untuk membuat robot yang menavigasi ruangan, menghindari furnitur dan dinding sambil membersihkan.
  • Bot Patroli Keamanan: Program mobil untuk berpatroli di sekeliling area dan gunakan sensor ultrasonik untuk mendeteksi serta melaporkan rintangan atau intrusi yang tidak terduga.
  • Platform Pendidikan untuk AI: Gunakan proyek ini sebagai batu loncatan untuk mempelajari algoritma yang lebih kompleks seperti pencarian jalur dan pemetaan serta lokalisasi simultan (SLAM).

Pelajaran ini berfokus pada logika inti dan kode yang memungkinkan mobil membuat keputusan. Mobil menggunakan motor servo untuk memutar sensor ultrasonik, bertindak sebagai radar untuk mengukur jarak dari 0 hingga 180 derajat. Kode menganalisis data ini untuk menemukan jalur kosong terluas dan mengarahkan mobil untuk bergerak maju, kiri, atau kanan sesuai kebutuhan. Video ini mendemonstrasikan seluruh proses, dari menguji komponen individual hingga menjalankan algoritma penghindaran rintangan akhir di labirin dunia nyata.

Perangkat Keras/Komponen

Proyek ini didasarkan pada kit SunFounder Raspberry Pi Pico 4WD Smart Car. Komponen penting yang digunakan dalam pelajaran ini adalah:

  • Papan mikrokontroler Raspberry Pi Pico
  • Sasis SunFounder 4WD Smart Car dengan empat motor
  • Papan penggerak motor
  • Sensor jarak ultrasonik (tipe HC-SR04)
  • Motor servo (untuk memutar sensor ultrasonik)
  • Catu daya (baterai untuk mobil)

Panduan Pengkabelan

Kit SunFounder dirancang untuk perakitan yang mudah, dan pengkabelan biasanya sudah terhubung sebelumnya melalui papan ekspansi khusus. Sensor ultrasonik dipasang pada motor servo, yang kemudian dihubungkan ke papan kontrol utama. Pengaturan ini memungkinkan sensor diputar untuk memindai lingkungan. Untuk diagram pengkabelan terperinci yang spesifik untuk kit Anda, silakan merujuk ke dokumentasi resmi SunFounder.

Koneksi inti melibatkan pin pemicu dan gema sensor ultrasonik, serta pin sinyal motor servo, semuanya terhubung ke pin GPIO tertentu di Raspberry Pi Pico. Penggerak motor juga terhubung ke Pico untuk mengontrol empat motor penggerak. Video menyebutkan bahwa dokumentasi lengkap, termasuk diagram pengkabelan, tersedia untuk diunduh dengan kit.

Sunfounder_Pico4DW-09-Obstacle-avoidance_saat ultrasonik mendeteksi rintangan

Penjelasan Kode

Pelajaran ini berfokus pada logika dalam contoh `obstacle_avoid`. Kode ditulis dalam MicroPython. Meskipun program lengkap tersedia untuk diunduh, kami akan fokus pada parameter kunci yang dapat dikonfigurasi pengguna yang mengontrol perilaku mobil. Ini biasanya ditemukan di bagian atas skrip.

Berikut adalah variabel utama yang dapat Anda sesuaikan untuk menyempurnakan kinerja robot Anda:


# Parameter radar dan pergerakan
radar_reference = 20  # Jarak minimum dalam cm yang dianggap aman
step_angle = 10       # Kenaikan sudut untuk setiap langkah pemindaian radar
forward_speed = 30    # Kecepatan motor untuk bergerak maju (0-100)
turn_speed = 50       # Kecepatan motor untuk berbelok (0-100)
forward_scan_angle = 50  # Sudut pemindaian servo saat tidak ada rintangan terdeteksi
  • radar_reference: Ini adalah jarak aman penting dalam sentimeter. Jika rintangan terdeteksi lebih dekat dari nilai ini, mobil akan menganggapnya sebagai "bahaya" dan memulai manuver penghindaran. Dalam video, ini diatur ke 20 cm.
  • step_angle: Ini menentukan resolusi pemindaian radar. Nilai yang lebih kecil (misalnya, 10 derajat) berarti pemindaian lebih terperinci tetapi membutuhkan waktu lebih lama. Nilai yang lebih besar akan lebih cepat tetapi bisa melewatkan rintangan sempit.
  • forward_speed & turn_speed: Ini mengontrol daya yang dikirim ke motor. Anda dapat menyesuaikannya untuk mengubah kecepatan keseluruhan dan kelincahan mobil. Kecepatan belok sering diatur lebih tinggi untuk memastikan mobil dapat berputar secara efektif.
  • forward_scan_angle: Ketika tidak ada bahaya langsung di depan, mobil mempersempit pemindaiannya ke sudut ini (berpusat ke depan) untuk memeriksa rintangan lebih sering di jalur langsungnya, memungkinkan pergerakan maju yang lebih mulus.

Video ini juga menjelaskan logika pengambilan keputusan utama. Fungsi `get_direction()` menganalisis daftar pembacaan jarak (diubah menjadi 1 dan 0 untuk aman/tidak aman) untuk menemukan jalur kontinu terluas dari angka "1". Berdasarkan lokasi jalur terluas ini, fungsi tersebut mengembalikan arah: "maju", "kiri", atau "kanan". Loop utama kemudian menjalankan tindakan yang sesuai, memutar mobil dan memindai ulang hingga jalur di depan jelas.

Proyek Langsung/Demonstrasi

Video ini memberikan demonstrasi menyeluruh tentang proyek tersebut. Dimulai dengan menguji sensor ultrasonik saja untuk menunjukkan cara mengukur jarak dan mencetak nilai ke shell. Instruktur kemudian menjelaskan algoritma penghindaran rintangan menggunakan diagram alir, merinci proses pengambilan keputusan untuk berbelok kiri dan kanan. Terakhir, mobil ditempatkan di labirin kecil yang dibuat dari kotak untuk mendemonstrasikan perilaku penghindaran rintangan secara lengkap dalam aksi. Mobil berhasil menavigasi labirin, berbelok kiri dan kanan untuk menemukan jalur yang jelas ke depan.

Bab Video

  • [00:00] Pengenalan Penghindaran Rintangan
  • [01:31] Gambaran Umum Kit Mobil Pintar SunFounder dan Fitur-fiturnya
  • [02:47] Cara Kerja Fitur Penghindaran Rintangan
  • [03:34] Menguji Sensor Ultrasonik
  • [07:45] Menjelaskan Algoritma Penghindaran Rintangan dan Diagram Alir
  • [12:49] Menganalisis Kode Utama Penghindaran Rintangan
  • [15:43] Demonstrasi Langsung Logika Penghindaran Rintangan
  • [22:53] Demonstrasi Akhir dengan Labirin Rintangan
  • [24:35] Kesimpulan dan Langkah Berikutnya

Gambar

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
909-Lesson 9/10 Pi Pico 4WD card Python code: obstacle avoid
Bahasa: C++
# Lesson 9/10 Pi Car Pico 4WD: Obstacle avoid
# Download and resource page https://robojax.com/RJT631
import pico_4wd as car
import time

car.RADAR_REFERENCE = 20
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 30
MOTOR_TURNING_POWER = 50

FORWARD_SCAN_ANGLE = 50

car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
status = "Danger"

def get_dir(radar_data):
    # get scan status of 0, 1
    # print(radar_data)
    radar_data = [str(i) for i in radar_data]
    radar_data = "".join(radar_data)
    # Split 0, leaves the free path
    paths = radar_data.split("0")
    # print(paths)
    # print("paths: %s" % paths)
    length_list = []
    # Calculate where is the widest
    for path in paths:
        length_list.append(len(path))
    if max(length_list) < 4:
        return "left"
    # Calculate the direction of the widest 
    i = length_list.index(max(length_list))
    pos = radar_data.index(paths[i])
    pos += (len(paths[i]) - 1) / 2
    delta = len(radar_data) / 3
    
    if pos < delta:
        return "left"
    elif pos > 2 * delta:
        return "right"
    else:
        return "forward"

def main():
    global status
    # General
    while True:
        radar_data = car.radar_scan()
        # print("radar_data: %s" % radar_data)
        # If radar data return a int, means scan not finished, and the int is current angle status
        if isinstance(radar_data, int):
            if radar_data == 0 and status != "Danger":
                print("Danger!")
                status = "Danger"
                car.move("stop")
                car.set_radar_scan_angle(180)
            continue
        else:
            status = "Save"
        
        direction = get_dir(radar_data)

        if direction == "left":
            print("turn left")
            distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("left", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        elif direction == "right":
            print("turn right")
            distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("right", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        else:
            print("forward")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
            car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

Hal-hal yang mungkin Anda butuhkan

Sumber daya & referensi

Belum ada sumber daya.

Berkas📁

Kode Raspberry Pi