Soek Kode

Kursusles 8 van 10: Raspberry Pi Pico Slim Motor – Les 8: Servomotor en Voorwerpvolging

Hierdie les is deel van: Raspberry Pi Pico 4WD Slim Motor

Kursusles 8 van 10: Raspberry Pi Pico Slim Motor – Les 8: Servomotor en Voorwerpvolging

Hierdie les uit die Raspberry Pi Pico Smart Car-kursus deur Robojax ondersoek die funksionaliteit van 'n servomotor en hoe om dit te gebruik om 'n voorwerp-volgende of "volg jou hand"-robot te skep. Die projek gaan verder as eenvoudige motorbeheer en demonstreer hoe om 'n servo-aangedrewe ultrasoniese sensor met intelligente Python-logika te kombineer om 'n motor te skep wat aktief 'n voorwerp binne sy reeks soek en volg. Dit is 'n fundamentele konsep in robotika, wat jou in staat stel om interaktiewe projekte te bou soos 'n robot wat 'n persoon volg, 'n slim troeteldier wat bal speel, of 'n outonome sekuriteitskamera wat beweging volg. Die les dek ook 'n tweede, eenvoudiger projek: 'n motor wat outomaties na voorwerpe binne 'n spesifieke afstandsonde nader, stoot en terugbeweeg.

pi_pico_4WD_follow-hand

Hardeware en Komponente

Hierdie projek is gebaseer op die SunFounder Raspberry Pi Pico 4WD-motorkit. Die sleutelkomponente wat in hierdie les gebruik word, is:

  • Raspberry Pi Pico-bord
  • 4WD Slimmotorsasi met motors
  • Servomotor (ideaal 'n metaalrat-servo vir duursaamheid)
  • Ultrasoniese afstandsensor (HC-SR04)
  • Motorbestuurderbord (deel van die motorkit)
  • RGB-LED (vir visuele terugvoer)
  • Kragbron (batterypak vir die motor)
PICOBOARDWHITEANGLE2_1200x857

Die servomotor is die kern van hierdie les se funksionaliteit. Anders as 'n standaard GS-motor wat voortdurend draai, is 'n servomotor ontwerp om na 'n spesifieke hoekposisie te draai en dit te hou, gewoonlik tussen 0 en 180 grade. Dit maak dit perfek om die ultrasoniese sensor presies te rig. Die kwaliteit van 'n servo word dikwels bepaal deur sy ratmateriaal (plastiek vs. metaal) en sy wringkrag, wat sy sterkte en duursaamheid bepaal.

Hoe dit werk

Die diagram hieronder verduidelik hoe die kode werk. 

pi_pico_4WD_follow-hand_flow_chart

Bedradingsgids

Die bedrading vir hierdie les is eenvoudig, aangesien dit voortbou op die vooraf-geassembleerde motorkit. Die kritieke verbinding is die servomotor, wat aan 'n spesifieke GPIO-pen op die Pico gekoppel moet word.

In die video koppel die instrukteur die servo aan pen nommer 18 op die Raspberry Pi Pico. Die ultrasoniese sensor is bo-op die servohoring gemonteer, wat dit toelaat om links en regs te draai om die area te skandeer. Die res van die bedrading vir die motors, RGB-LED en krag word aanvaar as vooraf gekoppel van vorige lesse in die kursus.

Vir 'n gedetailleerde visuele gids, verwys asseblief na die bedradingdiagram hieronder.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

Kodeverduideliking

Die Python-kode vir hierdie les is gebou rondom 'n pasgemaakte pico_4wd-biblioteek, wat komplekse hardeware-interaksies vereenvoudig. Die gebruikerskonfigureerbare dele is bo-aan die skrif en beheer die motor se gedrag.

Hier is die sleutelveranderlikes wat jy kan aanpas om jou robot se "volg hand"-gedrag te personaliseer:

  • car.RADAR_REFERENCE = 25: Dit is die maksimum afstand in sentimeter wat die sensor sal "sien." Enige voorwerp verder as hierdie afstand word geïgnoreer. Jy kan dit verhoog om die motor meer sensitief te maak of verlaag om 'n nader voorwerp te vereis.
  • car.RADAR_MAX_ANGLE = 45 & car.RADAR_MIN_ANGLE = -45: Dit definieer die mees linkse (45) en mees regse (-45) hoeke wat die servo sal skandeer. Dit skep 'n 90-grade gesigsveld voor die motor.
  • car.RADAR_STEP_ANGLE = 10: Dit is die inkrement (in grade) wat die servo gebruik om tussen skandeerpunte te beweeg. 'n Kleiner stap (bv. 5) gee 'n fyner resolusie maar neem langer om 'n volle skandering te voltooi. 'n Groter stap (bv. 15) skandeer vinniger maar met laer presisie.
  • MOTOR_FORWARD_POWER = 40: Dit stel die motorkrag (0-100) wat gebruik word wanneer die motor vorentoe beweeg na die opgespoorde voorwerp. Pas dit aan om die motor se jaagspoed te verander.
  • MOTOR_TURNING_POWER = 40: Dit stel die motorkrag wat gebruik word wanneer die motor draai om die voorwerp te konfronteer. 'n Hoër waarde sal die motor meer aggressief laat draai.

Die hoof-logika van die main()-funksie is 'n deurlopende lus. Dit roep eers car.radar_scan() aan, wat 'n string van '1'e en '0'e teruggee wat voorstel of 'n voorwerp by elke skandeerhoek opgespoor is (a '1' beteken 'n voorwerp is binne die verwysingsafstand). Die kode ontleed dan hierdie string om die grootste groep opeenvolgende '1'e te vind, wat die middelpunt van die opgespoorde voorwerp aandui. Gebaseer op waar hierdie middelpunt in die skandeerveld is, word die motor beveel om links te draai, regs te draai, of vorentoe te beweeg om homself met die voorwerp in lyn te bring en dit te volg.

Lewende Projekdemonstrasie

Die video bied 'n duidelike demonstrasie van die projek in aksie. Die instrukteur voer eers 'n toetskrip uit om te wys hoe die servomotor na presiese hoeke soos 90, 0 en -90 grade beweeg kan word. Dit is noodsaaklik om die servo se reeks te verstaan en om die ultrasoniese sensor korrek te monteer.

Na die montering van die sensor word die "volg hand"-funksie ten toon gestel. Terwyl die instrukteur sy hand voor die motor beweeg, skandeer die servo-gemonteerde sensor links en regs. Die motor se logika verwerk die sensordata en draai die wiele om na die bespeurde hand te stuur, en volg dit effektief oor die vloer. Die demonstrasie beklemtoon hoe die motor 'n voorwerp kan volg terwyl dit beweeg en sy rigting dienooreenkomstig aanpas. 'n Tweede projek word ook gewys, waar die motor geprogrammeer is om 'n voorwerp te nader en te stoot as dit tussen 10 en 20 sentimeter weg bespeur word, en om terug te trek as die voorwerp te naby kom (onder 10 sentimeter).

Kernpunte

Hierdie les is 'n uitstekende inleiding tot die gebruik van servomotors vir die skep van interaktiewe robotgedrag. Deur 'n servo met 'n afstandsensor te kombineer, kan jy 'n robot met 'n "sin van sig" bou wat sy omgewing aktief kan volg en daarop kan reageer. Die vermoë om parameters soos skandeerhoeke, stapgrootte en motorkrag te verstel, maak fyn beheer oor die robot se gedrag moontlik, wat 'n kritieke vaardigheid vir enige robotikaprojek is.

Hoofstukke

  • [00:00] Inleiding tot Servomotor en Voorwerpvolging
  • [01:48] Kursuspakket Kenmerke en Vermoëns
  • [03:08] Verstaan Servomotorwerking
  • [06:08] Toets van Servomotor met Python-kode
  • [09:59] Verduideliking van die "Volg Hand"-funksie
  • [10:49] Demonstrasie van die "Volg Hand"-funksionaliteit
  • [15:37] Projek: Voorwerpstoot en Terugtrek
  • [18:40] Demonstrasie van die Voorwerpstootprojek
  • [19:25] Gevolgtrekking en Volgende Stappe

Beelde

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

Hulpbronne en verwysings

Geen hulpbronne nog.

Lêers📁

Geen lêers beskikbaar.