Kod Ara

Ders 9/10: Raspberry Pi Pico 4WD Akıllı Araba ile Engel Kaçınma

Bu ders, bir parçasıdır: Raspberry Pi Pico 4WD Akıllı Araba

Ders 9/10: Raspberry Pi Pico 4WD Akıllı Araba ile Engel Kaçınma

Giriş

Bu kılavuz, Robojax'ın 10 derslik Kurs Dersi 9'una dayanarak, SunFounder Raspberry Pi Pico 4WD Akıllı Araç kitini kullanarak engellerden kaçınan bir robotun nasıl inşa edileceğini göstermektedir. Proje, servo tahrikli ultrasonik sensörü motor kontrolüyle birleştirerek çevresinde otonom olarak gezinebilen bir robot oluşturur. Sensörü radar gibi tarayarak araç engelleri algılar ve ilerlemek için akıllıca temiz bir yol seçer; bu da onu robotik, sensör entegrasyonu ve otonom navigasyona mükemmel bir giriş yapar.

Sunfounder_Pico4DW-09-Obstacle-avoidance zeminde engelle kurulum

Bu proje sadece bir oyuncak değil; birçok pratik uygulama için bir temeldir. İşte size ilham verecek birkaç fikir:

  • Otonom Keşif Robotu: İnsan müdahalesi olmadan bir odayı veya dış alanı haritalayıp keşfedebilen bir robot inşa edin.
  • Akıllı Süpürge: Temizlik yaparken mobilyalardan ve duvarlardan kaçınarak bir odada gezen bir robot oluşturmak için aynı prensipleri kullanın.
  • Güvenlik Devriye Botu: Arabayı bir çevreyi devriye gezecek şekilde programlayın ve beklenmedik engelleri veya izinsiz girişleri algılamak ve raporlamak için ultrasonik sensörü kullanın.
  • Yapay Zeka için Eğitim Platformu: Bu projeyi yol bulma ve eşzamanlı konumlandırma ve haritalama (SLAM) gibi daha karmaşık algoritmaları öğrenmek için bir basamak olarak kullanın.

Bu ders, arabanın kararlar almasını sağlayan temel mantık ve koda odaklanır. Araba, ultrasonik sensörü döndürmek için bir servo motor kullanır ve 0 ila 180 derece arasındaki mesafeleri ölçen bir radar görevi görür. Kod, bu verileri analiz ederek en geniş boş yolu bulur ve arabayı buna göre ileri, sola veya sağa yönlendirir. Video, tek tek bileşenleri test etmekten gerçek dünya labirentinde nihai engelden kaçınma algoritmasını çalıştırmaya kadar tüm süreci gösterir.

Donanım/Bileşenler

Bu proje, SunFounder Raspberry Pi Pico 4WD Akıllı Araç kitine dayanmaktadır. Bu derste kullanılan temel bileşenler şunlardır:

  • Raspberry Pi Pico mikrodenetleyici kartı
  • Dört motorlu SunFounder 4WD Akıllı Araç şasisi
  • Motor sürücü kartı
  • Ultrasonik mesafe sensörü (HC-SR04 tipi)
  • Servo motor (ultrasonik sensörü döndürmek için)
  • Güç kaynağı (araba için piller)

Bağlantı Kılavuzu

SunFounder kiti kolay montaj için tasarlanmıştır ve bağlantılar genellikle özel bir genişletme kartı üzerinden önceden bağlanır. Ultrasonik sensör servo motora monte edilir ve ardından ana kontrol kartına bağlanır. Bu kurulum, sensörün çevreyi taramak için döndürülmesine olanak tanır. Kitinize özel ayrıntılı bağlantı şeması için lütfen resmi SunFounder belgelerine bakın.

Temel bağlantılar, ultrasonik sensörün tetikleme ve yankı pinlerini ve servo motorun sinyal pinini içerir; bunların tümü Raspberry Pi Pico'daki belirli GPIO pinlerine bağlanır. Motor sürücüsü ayrıca dört tahrik motorunu kontrol etmek için Pico'ya bağlanır. Video, bağlantı şemaları dahil tam belgelerin kit ile birlikte indirilebileceğini belirtir.

Sunfounder_Pico4DW-09-Obstacle-avoidance_ultrasonik engel algıladığında

Kod Açıklaması

Bu ders, `obstacle_avoid` örneğindeki mantığa odaklanır. Kod MicroPython'da yazılmıştır. Tam program indirilebilir olsa da, arabanın davranışını kontrol eden önemli, kullanıcı tarafından yapılandırılabilir parametrelere odaklanacağız. Bunlar genellikle betiğin en üstünde bulunur.

Robotunuzun performansını ince ayarlamak için ayarlayabileceğiniz ana değişkenler şunlardır:


# Radar ve hareket parametreleri
radar_reference = 20  # Güvenli kabul edilecek minimum mesafe cm cinsinden
step_angle = 10       # Her radar tarama adımı için açı artışı
forward_speed = 30    # İleri hareket için motor hızı (0-100)
turn_speed = 50       # Dönüş için motor hızı (0-100)
forward_scan_angle = 50  # Engel algılanmadığında servo tarafından taranan açı
  • radar_reference: Bu, santimetre cinsinden kritik güvenlik mesafesidir. Bir engel bu değerden daha yakın algılanırsa, araba bunu bir "tehlike" olarak kabul eder ve bir kaçınma manevrası başlatır. Videoda bu 20 cm olarak ayarlanmıştır.
  • step_angle: Bu, radar taramasının çözünürlüğünü tanımlar. Daha küçük bir değer (örneğin, 10 derece) daha ayrıntılı bir tarama anlamına gelir ancak daha uzun sürer. Daha büyük bir değer daha hızlı olur ancak dar engelleri kaçırabilir.
  • forward_speed & turn_speed: Bunlar motorlara gönderilen gücü kontrol eder. Arabanın genel hızını ve çevikliğini değiştirmek için bunları ayarlayabilirsiniz. Dönüş hızı, arabanın etkili bir şekilde dönebilmesini sağlamak için genellikle daha yüksek ayarlanır.
  • forward_scan_angle: Hemen önde acil bir tehlike olmadığında, araba taramasını bu açıya (ileri yöne odaklı) daraltarak doğrudan yolundaki engelleri daha sık kontrol eder ve daha pürüzsüz ileri hareket sağlar.

Video ayrıca ana karar verme mantığını da açıklıyor. Bir `get_direction()` işlevi, mesafe okumalarının listesini (güvenli/güvensiz için 1'lere ve 0'lara dönüştürülmüş) analiz ederek en geniş sürekli "1" yolunu bulur. Bu en geniş yolun nerede olduğuna bağlı olarak, işlev bir yön döndürür: "ileri", "sol" veya "sağ". Ana döngü daha sonra ilgili eylemi gerçekleştirir, arabayı döndürür ve öndeki yol açılana kadar yeniden tarar.

Canlı Proje/Gösterim

Video, projenin kapsamlı bir gösterimini sağlar. Önce ultrasonik sensörü tek başına test ederek mesafeyi nasıl ölçtüğünü ve değerleri kabuğa nasıl yazdırdığını gösterir. Eğitmen daha sonra bir akış şeması kullanarak engelden kaçınma algoritmasını açıklar ve sola ve sağa dönme karar verme sürecini detaylandırır. Son olarak, araba kutulardan oluşturulan küçük bir labirente yerleştirilir ve engelden kaçınma davranışının tamamını eylem halinde gösterir. Araba, ileriye doğru net bir yol bulmak için sola ve sağa dönerek labirentte başarıyla ilerler.

Video Bölümleri

  • [00:00] Engelden Kaçınmaya Giriş
  • [01:31] SunFounder Akıllı Araba Kiti ve Özelliklerine Genel Bakış
  • [02:47] Engelden Kaçınma Özelliği Nasıl Çalışır
  • [03:34] Ultrasonik Sensörü Test Etme
  • [07:45] Engelden Kaçınma Algoritması ve Akış Şemasını Açıklama
  • [12:49] Ana Engelden Kaçınma Kodunu Analiz Etme
  • [15:43] Engelden Kaçınma Mantığının Canlı Gösterimi
  • [22:53] Engellerden Oluşan Bir Labirent ile Final Gösterimi
  • [24:35] Sonuç ve Sonraki Adımlar

Görseller

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
Dil: 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()

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Henüz kaynak yok.

Dosyalar📁

Ahududu Kodu