Кодты іздеу

Сабақ 8/10: Raspberry Pi Pico ақылды көлігі – Сабақ 8: Серво қозғалтқыш және нысанды қадағалау

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

Сабақ 8/10: Raspberry Pi Pico ақылды көлігі – Сабақ 8: Серво қозғалтқыш және нысанды қадағалау

Бұл сабақ Robojax компаниясының Raspberry Pi Pico Smart Car курсынан серво қозғалтқыштың функционалдығын және оны нысанды қадағалайтын немесе «қолыңызды қадағалайтын» робот жасау үшін қалай пайдалану керектігін зерттейді. Жоба қарапайым қозғалтқышты басқарудан асып түседі, серво басқаратын ультрадыбыстық сенсорды интеллектуалды Python логикасымен біріктіріп, өз ауқымындағы нысанды белсенді түрде іздеп, қадағалайтын көлікті жасауды көрсетеді. Бұл робототехникадағы негізгі тұжырымдама, ол адамды қадағалайтын робот, доп әкелетін ақылды үй жануары немесе қозғалысты бақылайтын автономды қауіпсіздік камерасы сияқты интерактивті жобаларды құруға мүмкіндік береді. Сабақ сонымен қатар екінші, қарапайым жобаны қамтиды: белгілі бір қашықтық аймағындағы нысандарға автоматты түрде жақындайтын, итеріп, кері шегінетін көлік.

pi_pico_4WD_follow-hand

Аппараттық құралдар мен компоненттер

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

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

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

Қалай жұмыс істейді

Төмендегі диаграмма кодтың қалай жұмыс істейтінін түсіндіреді. 

pi_pico_4WD_follow-hand_flow_chart

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

Бұл сабаққа арналған сым қосу қарапайым, өйткені ол алдын ала жиналған көлік жинағына негізделген. Ең маңызды қосылым - серво қозғалтқыш, ол Pico платасындағы белгілі бір GPIO түйреуішіне қосылуы керек.

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

Егжей-тегжейлі көрнекі нұсқаулық үшін төмендегі сым қосу диаграммасын қараңыз.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

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

Бұл сабаққа арналған Python коды күрделі аппараттық өзара әрекеттесуді жеңілдететін арнайы pico_4wd кітапханасының айналасында құрылған. Пайдаланушы конфигурациялайтын бөліктер скрипттің жоғарғы жағында орналасқан және көліктің мінез-құлқын басқарады.

Міне, роботыңыздың «қолды қадағалау» мінез-құлқын теңшеу үшін реттей алатын негізгі айнымалылар:

  • car.RADAR_REFERENCE = 25: Бұл сенсор «көретін» максималды қашықтық сантиметрмен. Осы қашықтықтан ары нысандар еленбейді. Көлікті сезімтал ету үшін мұны арттыруға немесе жақынырақ нысанды талап ету үшін азайтуға болады.
  • car.RADAR_MAX_ANGLE = 45 & car.RADAR_MIN_ANGLE = -45: Бұлар серво сканерлейтін ең сол жақ (45) және ең оң жақ (-45) бұрыштарды анықтайды. Бұл көліктің алдында 90 градустық көру өрісін жасайды.
  • car.RADAR_STEP_ANGLE = 10: Бұл сервоның сканерлеу нүктелері арасында қозғалу үшін қолданатын қадам (градуспен). Кішірек қадам (мысалы, 5) жоғары ажыратымдылық береді, бірақ толық сканерлеуге көбірек уақыт кетеді. Үлкенірек қадам (мысалы, 15) жылдамырақ сканерлейді, бірақ дәлдігі төмен.
  • MOTOR_FORWARD_POWER = 40: Бұл көлік анықталған нысанға қарай алға қозғалғанда қолданылатын қозғалтқыш қуатын (0-100) орнатады. Көліктің қуу жылдамдығын өзгерту үшін мұны реттеңіз.
  • MOTOR_TURNING_POWER = 40: Бұл көлік нысанға қарай бұрылғанда қолданылатын қозғалтқыш қуатын орнатады. Жоғары мән көліктің агрессивтірек бұрылуына әкеледі.

main() функциясының негізгі логикасы үздіксіз цикл болып табылады. Ол алдымен car.radar_scan() функциясын шақырады, ол әр сканерлеу бұрышында нысанның анықталғанын көрсететін '1' және '0' жолын қайтарады ('1' нысанның анықтамалық қашықтықта екенін білдіреді). Содан кейін код бұл жолды талдап, ең үлкен қатарынан '1' тобын табады, бұл анықталған нысанның орталығын көрсетеді. Осы орталықтың сканерлеу өрісінде қай жерде екеніне байланысты көлікке нысанмен туралану және оны қадағалау үшін солға бұрылу, оңға бұрылу немесе алға жылжу бұйырылады.

Тірі жоба демонстрациясы

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

Сенсорды орнатқаннан кейін, "қолды қадағалау" функциясы көрсетіледі. Нұсқаушы қолын көліктің алдында қозғалтқанда, сервоға орнатылған сенсор солға және оңға сканерлейді. Көліктің логикасы сенсор деректерін өңдеп, анықталған қолға қарай бағыттау үшін дөңгелектерді бұрады, осылайша оны еден бойымен тиімді қадағалайды. Демонстрация көліктің қозғалатын нысанды қалай бақылап, бағытын соған сәйкес реттейтінін көрсетеді. Екінші жоба да көрсетіледі, онда көлік нысан 10 мен 20 сантиметр аралығында анықталса, оған жақындап, итеріп жіберуге, ал нысан тым жақын болса (10 сантиметрден аз), артқа шегінуге бағдарламаланған.

Негізгі тұжырымдар

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

Тараулар

  • [00:00] Серво қозғалтқышқа және нысанды қадағалауға кіріспе
  • [01:48] Курс жинағының мүмкіндіктері мен қабілеттері
  • [03:08] Серво қозғалтқыштың жұмысын түсіну
  • [06:08] Python кодымен серво қозғалтқышты сынау
  • [09:59] "Қолды қадағалау" функциясын түсіндіру
  • [10:49] "Қолды қадағалау" функциясын демонстрациялау
  • [15:37] Жоба: Нысанды итеру және артқа шегіну
  • [18:40] Нысанды итеру жобасының демонстрациясы
  • [19:25] Қорытынды және келесі қадамдар

Суреттер

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand_flow_chart
pi_pico_4WD_follow-hand_flow_chart
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
905-Lesson 8/10 Pi Pico 4WD card Python code: follow hand
Тіл: C++
# Lesson 8/10 Pi Car Pico 4WD: Follow hand
# Download and resource page https://robojax.com/RJT630

import pico_4wd as car

car.RADAR_REFERENCE = 25
car.RADAR_MAX_ANGLE = 45
car.RADAR_MIN_ANGLE = -45
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 40
MOTOR_TURNING_POWER = 40

def main():
    while True:
        radar_data = car.radar_scan()
        if isinstance(radar_data, int):
            continue
        radar_data = [str(i) for i in radar_data]
        radar_data = "".join(radar_data)
        paths = radar_data.split("1")
        length_list = []
        for path in paths:
            length_list.append(len(path))
        if max(length_list) == 0:
            car.move("stop") 
        else:
            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:
                car.move("right", MOTOR_TURNING_POWER)
            elif pos > 2 * delta:
                car.move("left", MOTOR_TURNING_POWER)
            else:
                #if radar_data[int(len(radar_data)/2-1)] == "0":
                #    car.move("stop")
                #else:
                car.move("forward", MOTOR_FORWARD_POWER)

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

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

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

Файлдар📁

Файлдар жоқ.