Pretraži kod

Kurs Lekcija 8 od 10: Raspberry Pi Pico pametni automobil – Lekcija 8: Servo motor i praćenje objekata

Kurs Lekcija 8 od 10: Raspberry Pi Pico pametni automobil – Lekcija 8: Servo motor i praćenje objekata

Ova lekcija iz kursa Raspberry Pi Pico Smart Car autora Robojaxa istražuje funkcionalnost servo motora i kako ga koristiti za kreiranje robota koji prati objekat ili "prati vašu ruku". Projekat ide dalje od jednostavne kontrole motora, demonstrirajući kako kombinirati servo upravljani ultrazvučni senzor s inteligentnom Python logikom kako bi se kreirao automobil koji aktivno traži i prati objekat unutar svog dometa. Ovo je fundamentalni koncept u robotici, koji vam omogućava da izgradite interaktivne projekte poput robota koji prati osobu, pametnog ljubimca koji donosi lopticu ili autonomne sigurnosne kamere koja prati pokret. Lekcija također pokriva i drugi, jednostavniji projekat: automobil koji se automatski približava, gura i udaljava od objekata unutar određene zone udaljenosti.

pi_pico_4WD_follow-hand

Hardver i komponente

Ovaj projekat se temelji na SunFounder Raspberry Pi Pico 4WD automobilskom kompletu. Ključne komponente korištene u ovoj lekciji su:

  • Raspberry Pi Pico ploča
  • 4WD Smart Car šasija s motorima
  • Servo motor (idealno servo s metalnim zupčanicima radi izdržljivosti)
  • Ultrazvučni senzor udaljenosti (HC-SR04)
  • Ploča za upravljanje motorima (dio automobilskog kompleta)
  • RGB LED (za vizualnu povratnu informaciju)
  • Izvor napajanja (baterijski paket za automobil)
PICOBOARDWHITEANGLE2_1200x857

Servo motor je srce funkcionalnosti ove lekcije. Za razliku od standardnog DC motora koji se neprekidno okreće, servo motor je dizajniran da se rotira i zadrži specifičnu ugaonu poziciju, obično između 0 i 180 stepeni. To ga čini savršenim za precizno usmjeravanje ultrazvučnog senzora. Kvalitet serva često je određen materijalom zupčanika (plastika naspram metala) i njegovim obrtnim momentom, koji diktira njegovu snagu i izdržljivost.

Kako radi

Dijagram u nastavku objašnjava kako kod funkcionira. 

pi_pico_4WD_follow-hand_flow_chart

Vodič za povezivanje

Povezivanje za ovu lekciju je jednostavno, jer se nadograđuje na prethodno sastavljeni automobilski komplet. Kritična veza je servo motor, koji mora biti spojen na specifičan GPIO pin na Pico ploči.

U videu, instruktor povezuje servo na pin broj 18 na Raspberry Pi Pico. Ultrazvučni senzor je montiran na vrh servo roga, što mu omogućava da se rotira lijevo i desno kako bi skenirao područje. Ostatak povezivanja za motore, RGB LED i napajanje pretpostavlja se da je već povezan iz prethodnih lekcija u kursu.

Za detaljan vizualni vodič, molimo pogledajte dijagram povezivanja ispod.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

Objašnjenje koda

Python kod za ovu lekciju izgrađen je oko prilagođene pico_4wd biblioteke, koja pojednostavljuje složene hardverske interakcije. Dijelovi koje korisnik može konfigurirati nalaze se na vrhu skripte i kontroliraju ponašanje automobila.

Ovdje su ključne varijable koje možete prilagoditi kako biste prilagodili ponašanje vašeg robota "prati ruku":

  • car.RADAR_REFERENCE = 25: Ovo je maksimalna udaljenost u centimetrima koju senzor "vidi". Svaki objekat izvan ove udaljenosti se ignorira. Možete je povećati kako bi automobil bio osjetljiviji ili je smanjiti kako bi zahtijevao bliži objekat.
  • car.RADAR_MAX_ANGLE = 45 & car.RADAR_MIN_ANGLE = -45: Ove vrijednosti definiraju krajnji lijevi (45) i krajnji desni (-45) ugao koje servo skenira. Ovo stvara vidno polje od 90 stepeni ispred automobila.
  • car.RADAR_STEP_ANGLE = 10: Ovo je korak (u stepenima) koji servo koristi za kretanje između tačaka skeniranja. Manji korak (npr. 5) daje finiju rezoluciju, ali zahtijeva više vremena za potpuno skeniranje. Veći korak (npr. 15) skenira brže, ali s nižom preciznošću.
  • MOTOR_FORWARD_POWER = 40: Ovo postavlja snagu motora (0-100) koja se koristi kada se automobil kreće naprijed prema otkrivenom objektu. Prilagodite ovo kako biste promijenili brzinu automobila u potjeri.
  • MOTOR_TURNING_POWER = 40: Ovo postavlja snagu motora koja se koristi kada se automobil okreće kako bi se suočio s objektom. Veća vrijednost učinit će da se automobil okreće agresivnije.

Glavna logika funkcije main() je kontinuirana petlja. Prvo poziva car.radar_scan(), koja vraća niz '1' i '0' koji predstavlja je li objekat otkriven na svakom uglu skeniranja ('1' znači da je objekat unutar referentne udaljenosti). Kod zatim analizira ovaj niz kako bi pronašao najveću grupu uzastopnih '1', što ukazuje na centar otkrivenog objekta. Na osnovu toga gdje se taj centar nalazi u polju skeniranja, automobilu se naređuje da se okrene lijevo, okrene desno ili krene naprijed kako bi se poravnao s objektom i pratio ga.

Demonstracija uživo projekta

Video pruža jasnu demonstraciju projekta u akciji. Instruktor prvo pokreće test skriptu kako bi pokazao kako se servo motor može pomjeriti na precizne uglove poput 90, 0 i -90 stepeni. Ovo je ključno za razumijevanje opsega serva i za pravilno montiranje ultrazvučnog senzora.

Nakon montiranja senzora, prikazana je funkcija "praćenje ruke". Dok instruktor pomjera ruku ispred auta, servo montirani senzor skenira lijevo i desno. Logika auta obrađuje podatke sa senzora i okreće točkove kako bi se usmjerilo prema detektovanoj ruci, efektivno je prateći po podu. Demonstracija naglašava kako auto može pratiti objekat dok se kreće i prilagođavati svoj smjer u skladu s tim. Prikazan je i drugi projekat, gdje je auto programiran da prilazi i gura objekat ako je detektovan na udaljenosti između 10 i 20 centimetara, te da se povuče ako je objekat preblizu (ispod 10 centimetara).

Ključne poruke

Ova lekcija je odličan uvod u korištenje servo motora za kreiranje interaktivnih robotskih ponašanja. Kombinovanjem serva sa senzorom udaljenosti, možete napraviti robota sa "osjećajem vida" koji može aktivno pratiti i reagovati na svoje okruženje. Mogućnost podešavanja parametara poput uglova skeniranja, veličine koraka i snage motora omogućava finu kontrolu nad ponašanjem robota, što je ključna vještina za svaki robotski projekat.

Poglavlja

  • [00:00] Uvod u servo motor i praćenje objekata
  • [01:48] Karakteristike i mogućnosti kompleta za kurs
  • [03:08] Razumijevanje rada servo motora
  • [06:08] Testiranje servo motora sa Python kodom
  • [09:59] Objašnjenje funkcije "praćenje ruke"
  • [10:49] Demonstracija funkcionalnosti "praćenje ruke"
  • [15:37] Projekat: guranje objekta i povlačenje unazad
  • [18:40] Demonstracija projekta guranja objekta
  • [19:25] Zaključak i sljedeći koraci

Slike

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

Resursi i reference

Još nema resursa.

Datoteke📁

Nema dostupnih datoteka.