Cerca codice

Corso Lezione 8 di 10: Auto Intelligente Raspberry Pi Pico – Lezione 8: Servomotore e Inseguimento di Oggetti

Questa lezione fa parte di: Raspberry Pi Pico 4WD Smart Car

Corso Lezione 8 di 10: Auto Intelligente Raspberry Pi Pico – Lezione 8: Servomotore e Inseguimento di Oggetti

Questa lezione del corso Raspberry Pi Pico Smart Car di Robojax esplora la funzionalità di un servomotore e come usarlo per creare un robot che segue oggetti o "segui la tua mano". Il progetto va oltre il semplice controllo del motore, dimostrando come combinare un sensore a ultrasuoni azionato da servo con una logica Python intelligente per creare un'auto che cerca attivamente e segue un oggetto nel suo raggio d'azione. Questo è un concetto fondamentale nella robotica, che ti consente di costruire progetti interattivi come un robot che segue una persona, un animale domestico intelligente che gioca a riportare, o una telecamera di sicurezza autonoma che traccia il movimento. La lezione copre anche un secondo progetto più semplice: un'auto che si avvicina automaticamente, spinge e si allontana da oggetti entro una specifica zona di distanza.

pi_pico_4WD_follow-hand

Hardware e Componenti

Questo progetto si basa sul kit auto Raspberry Pi Pico 4WD di SunFounder. I componenti chiave utilizzati in questa lezione sono:

  • Scheda Raspberry Pi Pico
  • Telaio Smart Car 4WD con motori
  • Servomotore (idealmente un servo con ingranaggi in metallo per la durata)
  • Sensore di distanza a ultrasuoni (HC-SR04)
  • Scheda driver motori (parte del kit auto)
  • LED RGB (per feedback visivo)
  • Sorgente di alimentazione (pacco batterie per l'auto)
PICOBOARDWHITEANGLE2_1200x857

Il servomotore è il cuore della funzionalità di questa lezione. A differenza di un motore DC standard che gira continuamente, un servomotore è progettato per ruotare e mantenere una specifica posizione angolare, tipicamente tra 0 e 180 gradi. Questo lo rende perfetto per puntare con precisione il sensore a ultrasuoni. La qualità di un servo è spesso determinata dal materiale dei suoi ingranaggi (plastica vs. metallo) e dalla sua coppia, che ne determina la forza e la durata.

Come funziona

Il diagramma qui sotto spiega come funziona il codice. 

pi_pico_4WD_follow-hand_flow_chart

Guida al Cablaggio

Il cablaggio per questa lezione è semplice, poiché si basa sul kit auto preassemblato. La connessione critica è il servomotore, che deve essere collegato a uno specifico pin GPIO sul Pico.

Nel video, l'istruttore collega il servo al pin numero 18 sul Raspberry Pi Pico. Il sensore a ultrasuoni è montato sulla parte superiore del braccio del servo, consentendogli di ruotare a sinistra e a destra per scansionare l'area. Il resto del cablaggio per i motori, il LED RGB e l'alimentazione si presume sia pre-collegato dalle lezioni precedenti del corso.

Per una guida visiva dettagliata, fare riferimento allo schema di cablaggio qui sotto.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

Spiegazione del Codice

Il codice Python per questa lezione è costruito attorno a una libreria personalizzata pico_4wd, che semplifica interazioni hardware complesse. Le parti configurabili dall'utente si trovano all'inizio dello script e controllano il comportamento dell'auto.

Ecco le variabili chiave che puoi regolare per personalizzare il comportamento "segui la mano" del tuo robot:

  • car.RADAR_REFERENCE = 25: Questa è la distanza massima in centimetri che il sensore "vedrà". Qualsiasi oggetto oltre questa distanza viene ignorato. Puoi aumentarla per rendere l'auto più sensibile o diminuirla per richiedere un oggetto più vicino.
  • car.RADAR_MAX_ANGLE = 45 & car.RADAR_MIN_ANGLE = -45: Questi definiscono gli angoli più a sinistra (45) e più a destra (-45) che il servo scansionerà. Questo crea un campo visivo di 90 gradi davanti all'auto.
  • car.RADAR_STEP_ANGLE = 10: Questo è l'incremento (in gradi) che il servo usa per muoversi tra i punti di scansione. Un passo più piccolo (es., 5) dà una risoluzione più fine ma richiede più tempo per completare una scansione completa. Un passo più grande (es., 15) scansiona più velocemente ma con minore precisione.
  • MOTOR_FORWARD_POWER = 40: Questo imposta la potenza del motore (0-100) usata quando l'auto si muove in avanti verso l'oggetto rilevato. Regolalo per cambiare la velocità di inseguimento dell'auto.
  • MOTOR_TURNING_POWER = 40: Questo imposta la potenza del motore usata quando l'auto gira per affrontare l'oggetto. Un valore più alto farà girare l'auto in modo più aggressivo.

La logica principale della funzione main() è un ciclo continuo. Prima chiama car.radar_scan(), che restituisce una stringa di '1' e '0' che rappresenta se un oggetto è stato rilevato a ciascun angolo di scansione (un '1' significa che un oggetto è entro la distanza di riferimento). Il codice poi analizza questa stringa per trovare il gruppo più grande di '1' consecutivi, che indica il centro dell'oggetto rilevato. In base a dove si trova questo centro nel campo di scansione, all'auto viene comandato di girare a sinistra, girare a destra o muoversi in avanti per allinearsi con l'oggetto e seguirlo.

Dimostrazione Live del Progetto

Il video fornisce una chiara dimostrazione del progetto in azione. L'istruttore esegue prima uno script di test per mostrare come il servomotore possa essere spostato ad angoli precisi come 90, 0 e -90 gradi. Questo è fondamentale per comprendere il range del servo e per montare correttamente il sensore a ultrasuoni.

Dopo aver montato il sensore, viene mostrata la funzione "segui la mano". Mentre l'istruttore muove la mano davanti all'auto, il sensore montato sul servo esegue una scansione a sinistra e a destra. La logica dell'auto elabora i dati del sensore e gira le ruote per sterzare verso la mano rilevata, seguendola efficacemente sul pavimento. La dimostrazione evidenzia come l'auto possa tracciare un oggetto mentre si muove e regolare la sua direzione di conseguenza. Viene mostrato anche un secondo progetto, in cui l'auto è programmata per avvicinarsi e spingere un oggetto se questo viene rilevato a una distanza compresa tra 10 e 20 centimetri, e per indietreggiare se l'oggetto si avvicina troppo (sotto i 10 centimetri).

Punti Chiave

Questa lezione è un'ottima introduzione all'uso dei servomotori per creare comportamenti robotici interattivi. Combinando un servo con un sensore di distanza, puoi costruire un robot con un "senso della vista" che può tracciare attivamente e rispondere al suo ambiente. La capacità di regolare parametri come angoli di scansione, dimensione del passo e potenza del motore consente un controllo preciso sul comportamento del robot, che è una competenza fondamentale per qualsiasi progetto di robotica.

Capitoli

  • [00:00] Introduzione al Servomotore e all'Inseguimento di Oggetti
  • [01:48] Caratteristiche e Capacità del Kit del Corso
  • [03:08] Comprensione del Funzionamento del Servomotore
  • [06:08] Test del Servomotore con Codice Python
  • [09:59] Spiegazione della Funzione "Segui la Mano"
  • [10:49] Dimostrazione della Funzionalità "Segui la Mano"
  • [15:37] Progetto: Spinta e Arretramento da Oggetti
  • [18:40] Dimostrazione del Progetto di Spinta di Oggetti
  • [19:25] Conclusione e Prossimi Passi

Immagini

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

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Nessun file disponibile.