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ódulo picarx, que es esencial para controlar el robot Picarx. Se definen constantes como POWER, SafeDistance y DangerDistance, 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 de Picarx, 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 la distance es mayor que la SafeDistance, el robot avanza. Si la distancia está entre DangerDistance y SafeDistance, gira levemente y avanza. Si la distance es menor que DangerDistance, 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.