Nota
Ciao, benvenuto nella community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti a noi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato ai nuovi annunci di prodotto e anteprime esclusive.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e giveaway: Partecipa a promozioni e omaggi durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca [here] e unisciti oggi stesso!
4. Evitamento Ostacoli
In questo progetto, PiCar-X rileverà ostacoli davanti a sé mentre si muove in avanti, e quando gli ostacoli sono troppo vicini, cambierà direzione.
Esegui il codice
cd ~/picar-x/example
sudo python3 4.avoiding_obstacles.py
Dopo aver eseguito il codice, PiCar-X si muoverà in avanti.
Se rileva che la distanza dell’ostacolo davanti è inferiore a 20 cm, si sposterà all’indietro.
Se c’è un ostacolo tra 20 e 40 cm, girerà a sinistra.
Se non ci sono ostacoli nella direzione dopo aver girato a sinistra o la distanza dell’ostacolo è superiore a 25 cm, continuerà a muoversi in avanti.
Codice
Nota
Puoi Modificare/Reimpostare/Copiare/Eseguire/Interrompere il codice seguente. Ma prima devi andare nel percorso del codice sorgente come picar-x/example
. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
from picarx import Picarx
import time
POWER = 50
SafeDistance = 40 # > 40 sicuro
DangerDistance = 20 # > 20 && < 40 girare,
# < 20 indietro
def main():
try:
px = Picarx()
# px = Picarx(ultrasonic_pins=['D2','D3']) # tring, echo
while True:
distance = round(px.ultrasonic.read(), 2)
print("distance: ",distance)
if distance >= SafeDistance:
px.set_dir_servo_angle(0)
px.forward(POWER)
elif distance >= DangerDistance:
px.set_dir_servo_angle(30)
px.forward(POWER)
time.sleep(0.1)
else:
px.set_dir_servo_angle(-30)
px.backward(POWER)
time.sleep(0.5)
finally:
px.forward(0)
if __name__ == "__main__":
main()
Come funziona?
Importazione del Modulo Picarx e Inizializzazione delle Costanti:
Questa parte del codice importa la classe
Picarx
dal modulopicarx
, essenziale per controllare il robot Picarx. Sono definite costanti comePOWER
,SafeDistance
eDangerDistance
, che verranno utilizzate successivamente per controllare il movimento del robot in base alle misurazioni della distanza.from picarx import Picarx import time POWER = 50 SafeDistance = 40 # > 40 sicuro DangerDistance = 20 # > 20 && < 40 girare, # < 20 indietro
Definizione della Funzione Principale e Lettura del Sensore Ultrasonico:
La funzione
main
è il punto in cui viene controllato il robot Picarx. Viene creata un’istanza diPicarx
, che attiva le funzionalità del robot. Il codice entra in un ciclo infinito, leggendo costantemente la distanza dal sensore ultrasonico. Questa distanza viene utilizzata per determinare il movimento del robot.def main(): try: px = Picarx() while True: distance = round(px.ultrasonic.read(), 2) # [Resto della logica]
Logica del Movimento Basata sulla Distanza:
Il movimento del robot è controllato in base alla
distanza
letta dal sensore ultrasonico. Se ladistanza
è maggiore diSafeDistance
, il robot si muove in avanti. Se la distanza è compresa traDangerDistance
eSafeDistance
, gira leggermente e continua a muoversi in avanti. Se ladistanza
è inferiore aDangerDistance
, il robot si muove all’indietro girando in direzione opposta.if distance >= SafeDistance: px.set_dir_servo_angle(0) px.forward(POWER) elif distance >= DangerDistance: px.set_dir_servo_angle(30) px.forward(POWER) time.sleep(0.1) else: px.set_dir_servo_angle(-30) px.backward(POWER) time.sleep(0.5)
Sicurezza e Pulizia con il Blocco “finally”:
Il blocco
try...finally
garantisce la sicurezza fermando il movimento del robot in caso di interruzione o errore. Questo è un passaggio cruciale per prevenire comportamenti incontrollabili del robot.try: # [Logica di controllo] finally: px.forward(0)
Punto di Ingresso dell’Esecuzione:
Il classico punto di ingresso Python
if __name__ == "__main__":
viene utilizzato per eseguire la funzione principale quando lo script viene eseguito come programma autonomo.if name == "main": main()
In sintesi, lo script utilizza il modulo Picarx per controllare un robot, utilizzando un sensore ultrasonico per la misurazione della distanza. Il movimento del robot viene adattato in base a queste misurazioni, garantendo un funzionamento sicuro attraverso un attento controllo e un meccanismo di sicurezza nel blocco finally.