Nota
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.
¿Por qué unirte?
Soporte experto: Resuelve problemas técnicos y de posventa con la ayuda de nuestra comunidad y equipo.
Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Preestrenos exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y adelantos.
Descuentos exclusivos: Disfruta de descuentos en nuestros productos más recientes.
Promociones y sorteos festivos: Participa en sorteos y promociones especiales durante las festividades.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [here] y únete hoy mismo.
4. Evitación de Obstáculos
En este proyecto, PiCar-X detectará obstáculos frente a él mientras avanza, y cuando los obstáculos estén demasiado cerca, cambiará la dirección de avance.
Ejecutar el Código
cd ~/picar-x/example
sudo python3 4.avoiding_obstacles.py
Después de ejecutar el código, PiCar-X comenzará a avanzar.
Si detecta que la distancia del obstáculo delante es inferior a 20 cm, retrocederá.
Si hay un obstáculo entre 20 y 40 cm, girará a la izquierda.
Si no hay obstáculos en la dirección tras girar a la izquierda o la distancia del obstáculo es mayor a 25 cm, seguirá avanzando.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como picar-x/example
. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
from picarx import Picarx
import time
POWER = 50
SafeDistance = 40 # > 40 seguro
DangerDistance = 20 # > 20 && < 40 gira,
# < 20 retrocede
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()
¿Cómo funciona?
Importación del Módulo Picarx e Inicialización de Constantes:
Esta sección del código importa la clase
Picarx
del módulopicarx
, que es esencial para controlar el robot Picarx. Se definen constantes comoPOWER
,SafeDistance
yDangerDistance
, que se utilizarán más adelante en el script para controlar el movimiento del robot en función de las mediciones de distancia.from picarx import Picarx import time POWER = 50 SafeDistance = 40 # > 40 seguro DangerDistance = 20 # > 20 && < 40 gira, # < 20 retrocede
Definición de la Función Principal y Lectura del Sensor Ultrasónico:
La función
main
es donde se controla el robot Picarx. Se crea una instancia dePicarx
, que activa las funcionalidades del robot. El código entra en un bucle infinito, leyendo constantemente la distancia del sensor ultrasónico. Esta distancia se utiliza para determinar el movimiento del robot.def main(): try: px = Picarx() while True: distance = round(px.ultrasonic.read(), 2) # [Rest of the logic]
Lógica de Movimiento Basada en la Distancia:
El movimiento del robot se controla en función de la
distance
leída desde el sensor ultrasónico. Si ladistance
es mayor que laSafeDistance
, el robot avanza. Si la distancia está entreDangerDistance
ySafeDistance
, gira levemente y avanza. Si ladistance
es menor queDangerDistance
, el robot retrocede mientras gira en la dirección opuesta.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)
Seguridad y Limpieza con el Bloque “finally”:
El bloque
try...finally
garantiza la seguridad deteniendo el movimiento del robot en caso de una interrupción o error. Esta es una parte crucial para evitar comportamientos incontrolables del robot.try: # [Lógica de control] finally: px.forward(0)
Punto de Entrada de Ejecución:
El punto de entrada estándar de Python
if __name__ == "__main__":
se utiliza para ejecutar la función principal cuando el script se ejecuta como un programa independiente.if name == "main": main()
En resumen, el script utiliza el módulo Picarx para controlar un robot, utilizando un sensor ultrasónico para medir distancias. El movimiento del robot se adapta en función de estas mediciones, garantizando una operación segura a través de un control cuidadoso y un mecanismo de seguridad en el bloque finally.