Кодты іздеу

Сабақ 9/10: Raspberry Pi Pico 4WD Smart Car көмегімен кедергілерді болдырмау

Бұл сабақтың бөлігі: Raspberry Pi Pico 4WD Smart Car

Сабақ 9/10: Raspberry Pi Pico 4WD Smart Car көмегімен кедергілерді болдырмау

Кіріспе

Бұл нұсқаулық Robojax-тың 10 сабақтан тұратын Курс Сабағы 9-ға негізделген және SunFounder Raspberry Pi Pico 4WD Smart Car жинағын пайдаланып кедергілерді болдырмайтын роботты құруды көрсетеді. Жоба сервомотормен басқарылатын ультрадыбыстық сенсорды қозғалтқышты басқарумен біріктіріп, қоршаған ортада автономды түрде жүре алатын робот жасайды. Сенсорды радар сияқты айналдыра отырып, көлік кедергілерді анықтайды және жүру үшін бос жолды интеллектуалды түрде таңдайды, бұл оны робототехникаға, сенсорлық интеграцияға және автономды навигацияға тамаша кіріспе етеді.

Sunfounder_Pico4DW-09-Obstacle-avoidance қондырғысы едендегі кедергімен

Бұл жоба тек ойыншық емес; ол көптеген практикалық қолданулардың негізі болып табылады. Міне, сізді шабыттандыратын бірнеше идея:

  • Автономды зерттеу роботы: Адамның араласуынсыз бөлмені немесе ашық аумақты картаға түсіріп, зерттей алатын робот жасаңыз.
  • Ақылды шаңсорғыш: Тазалау кезінде жиһаздар мен қабырғаларды болдырмай, бөлмеде жүретін робот жасау үшін сол принциптерді қолданыңыз.
  • Күзет патруль роботы: Көлікті периметрді аралауға бағдарламалаңыз және күтпеген кедергілерді немесе бұзушылықтарды анықтау және хабарлау үшін ультрадыбыстық сенсорды пайдаланыңыз.
  • ЖИ үшін білім беру платформасы: Бұл жобаны жол табу және синхронды локализация және карта құру (SLAM) сияқты күрделірек алгоритмдерді үйренуге қадам ретінде пайдаланыңыз.

Бұл сабақ көліктің шешім қабылдауына мүмкіндік беретін негізгі логика мен кодқа бағытталған. Көлік ультрадыбыстық сенсорды айналдыру үшін сервомоторды пайдаланады, ол 0-ден 180 градусқа дейінгі қашықтықтарды өлшейтін радар ретінде жұмыс істейді. Код бұл деректерді талдап, ең кең бос жолды табады және көлікті сәйкесінше алға, солға немесе оңға бағыттайды. Бейне жеке компоненттерді сынаудан бастап нақты лабиринтте соңғы кедергілерді болдырмау алгоритмін іске қосуға дейінгі барлық процесті көрсетеді.

Аппараттық құрал/Компоненттер

Бұл жоба SunFounder Raspberry Pi Pico 4WD Smart Car жинағына негізделген. Осы сабақта қолданылатын негізгі компоненттер:

  • Raspberry Pi Pico микроконтроллерлік платасы
  • Төрт қозғалтқышы бар SunFounder 4WD Smart Car шассиі
  • Қозғалтқыш драйверінің платасы
  • Ультрадыбыстық қашықтық сенсоры (HC-SR04 түрі)
  • Сервомотор (ультрадыбыстық сенсорды айналдыру үшін)
  • Қуат көзі (көлікке арналған батареялар)

Сым қосу нұсқаулығы

SunFounder жинағы оңай құрастыруға арналған және сымдар әдетте арнайы кеңейту платасы арқылы алдын ала қосылған. Ультрадыбыстық сенсор сервомоторға орнатылған, ол негізгі басқару платасына қосылған. Бұл қондырғы сенсордың қоршаған ортаны сканерлеу үшін айналуына мүмкіндік береді. Сіздің жинағыңызға арналған егжей-тегжейлі сым қосу схемасы үшін SunFounder-дің ресми құжаттамасын қараңыз.

Негізгі қосылымдар ультрадыбыстық сенсордың триггер және эхо түйреуіштерін және сервомотордың сигнал түйреуішін қамтиды, олардың барлығы Raspberry Pi Pico-дағы арнайы GPIO түйреуіштеріне қосылған. Қозғалтқыш драйвері де төрт жетек қозғалтқышын басқару үшін Pico-ға қосылған. Бейнеде сым қосу схемаларын қоса алғанда, толық құжаттама жинақпен бірге жүктеуге қолжетімді екендігі айтылған.

Sunfounder_Pico4DW-09-Obstacle-avoidance_ультрадыбыстық сенсор кедергіні анықтағанда

Кодты түсіндіру

Бұл сабақ `obstacle_avoid` мысалындағы логикаға бағытталған. Код MicroPython тілінде жазылған. Толық бағдарлама жүктеуге қолжетімді болғанымен, біз көліктің мінез-құлқын басқаратын негізгі, пайдаланушы конфигурациялайтын параметрлерге назар аударамыз. Олар әдетте скрипттің жоғарғы жағында орналасқан.

Міне, роботыңыздың өнімділігін дәл реттеу үшін реттей алатын негізгі айнымалылар:


# Радар және қозғалыс параметрлері
radar_reference = 20  # Қауіпсіз деп саналатын ең аз қашықтық, см
step_angle = 10       # Әр радар сканерлеу қадамының бұрыш қадамы
forward_speed = 30    # Алға жүру үшін қозғалтқыш жылдамдығы (0-100)
turn_speed = 50       # Бұрылу үшін қозғалтқыш жылдамдығы (0-100)
forward_scan_angle = 50  # Кедергі анықталмағанда серво сканерлейтін бұрыш
  • radar_reference: Бұл сантиметрдегі маңызды қауіпсіздік қашықтығы. Егер кедергі осы мәннен жақынырақ анықталса, көлік оны "қауіп" деп санайды және болдырмау маневрін бастайды. Бейнеде бұл 20 см етіп орнатылған.
  • step_angle: Бұл радар сканерлеуінің ажыратымдылығын анықтайды. Кішірек мән (мысалы, 10 градус) егжей-тегжейлі сканерлеуді білдіреді, бірақ ұзағырақ уақыт алады. Үлкенірек мән жылдамырақ болар еді, бірақ тар кедергілерді жіберіп алуы мүмкін.
  • forward_speed & turn_speed: Бұлар қозғалтқыштарға жіберілетін қуатты басқарады. Көліктің жалпы жылдамдығы мен икемділігін өзгерту үшін оларды реттей аласыз. Бұрылу жылдамдығы көбінесе жоғарырақ орнатылады, бұл көліктің тиімді бұрылуын қамтамасыз етеді.
  • forward_scan_angle: Алда тікелей қауіп болмағанда, көлік өзінің сканерлеуін осы бұрышқа (алға бағытталған) тарылтады, бұл тікелей жолындағы кедергілерді жиірек тексеруге мүмкіндік береді және тегіс алға қозғалысты қамтамасыз етеді.

Бейнеде сонымен қатар негізгі шешім қабылдау логикасы түсіндіріледі. `get_direction()` функциясы қашықтық өлшемдерінің тізімін (қауіпсіз/қауіпті үшін 1 және 0-ге түрлендірілген) талдап, "1" сандарының ең кең үздіксіз жолын табады. Осы ең кең жолдың орналасуына байланысты функция бағытты қайтарады: "алға", "солға" немесе "оңға". Негізгі цикл содан кейін сәйкес әрекетті орындайды, көлікті бұрады және алдағы жол ашық болғанша қайта сканерлейді.

Тірі Жоба/Демонстрация

Бейне жобаның толық демонстрациясын ұсынады. Ол ультрадыбыстық сенсорды жеке сынаудан басталады, оның қашықтықты қалай өлшейтінін және мәндерді терминалға басып шығаратынын көрсетеді. Нұсқаушы содан кейін блок-схеманы қолданып кедергілерді болдырмау алгоритмін түсіндіреді, солға және оңға бұрылу үшін шешім қабылдау процесін егжей-тегжейлі сипаттайды. Соңында, көлік қораптардан жасалған шағын лабиринтке қойылып, кедергілерді болдырмау әрекетінің толық жұмысы көрсетіледі. Көлік лабиринтті сәтті шарлап, алға ашық жол табу үшін солға және оңға бұрылады.

Бейне Бөлімдері

  • [00:00] Кедергілерді болдырмауға кіріспе
  • [01:31] SunFounder Smart Car жинағына және мүмкіндіктеріне шолу
  • [02:47] Кедергілерді болдырмау мүмкіндігі қалай жұмыс істейді
  • [03:34] Ультрадыбыстық сенсорды сынау
  • [07:45] Кедергілерді болдырмау алгоритмі мен блок-схемасын түсіндіру
  • [12:49] Негізгі кедергілерді болдырмау кодын талдау
  • [15:43] Кедергілерді болдырмау логикасының тірі демонстрациясы
  • [22:53] Кедергілер лабиринтімен қорытынды демонстрация
  • [24:35] Қорытынды және келесі қадамдар

Суреттер

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
Тіл: 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()

Сізге қажет болуы мүмкін нәрселер

Ресурстар мен сілтемелер

Әлі ресурстар жоқ.

Файлдар📁

Raspberry Pi коды