esquiva-obstaculos
OJO

RECUERDA: Este post fue originalmente escrito usando la primera versión de Bitbloq. Si estás buscando el contenido y los programas del post original, podrás encontrarlos en la sección de descargas.

En esta entrada te explicamos cómo programar un esquiva obstáculos. Si tienes un robot con un sensor de ultrasonidos y un miniservo que lo pueda mover, podrás programarlo de esta forma. El PrintBot Evolution es una herramienta perfecta para realizar esta programación.

Ostacle_avoid

¡Jugar con fuego es peligroso! Aunque tengamos una fantástica piel de dragón, nuestro robot lo que va a hacer es intentar no chocarse y rodear los objetos que encuentre en su camino.

¿Cómo funciona el esquiva obstáculos?


Hay multitud de formas de programar un robot para que esquive obstáculos, pero te vamos a explicar el funcionamiento de una de ellas. Estas son las tareas que debe hacer el robot:

  1. Tomar medidas
  2. Comprobar detección de obstáculo
  3. Ejecutar el movimiento correcto

Veamos en detalle cada una de estas tareas:

1) Tomando medidas con el sensor de ultrasonidos

En primer lugar tomaremos 3 medidas con el sensor de ultrasonidos: a la izquierda, al centro y otra a la derecha.

beep-1 beep-2 beep-3

Lo que estamos midiendo es la distancia al objeto que tenga delante el sensor, por tanto bastará ir cambiando la posición del sensor como cuando nosotros giramos la cabeza para mirar hacia un lado. Este cambio de orientación podemos hacerlo con un miniservo.

2) Comprobar detección de obstáculos para saber cómo actuar

beep

Si no hay ningún obstáculo a menos de 25 cm por delante del robot, haremos que suene un pitido “Beep” y podremos avanzar recto.

beep-meec_err

Si en cambio hay obstáculo a menos de 25 cm, habrá sonado un pitido de error “Meec”. En este caso tenemos que comprobar si podemos esquivarlo por algún lateral.

beep-meec

Primero comprobamos si podemos esquivarlo por la izquierda. Si no hay obstáculo a menos de 25 cm en este lado podremos girar a la izquierda.

mec-mec-beep

Si no se puede por la izquierda, comprobamos a ver si es posible esquivarlo por la derecha.

Pero… ¿Qué sucede si las tres direcciones están bloqueadas? Pues que haremos sonar un aviso “Meeec meec ¡Soy un robot quejándose! ¡Por aquí no se puede avanzar!“.

Y dado que está atrapado, debemos hacer retroceder al robot y a continuación hacer cambie de rumbo, por ejemplo que gire a la izquierda.

r_Meec-meec-meec

3) Ejecutar el movimiento correcto

En este último paso, tan sólo tendremos que mover las ruedas del robot para que describa la trayectoria decidida en el paso anterior. ¡A rodar motores!

ostacle_avoid_3

Programando en bitbloq para el PrintBot Evolution


Vamos a usar bitbloq para hacer este programa. Además, tomaremos como referencia las conexiones que se proponen en la guía de montaje del PrintBot Evolution. Si es la primera vez que utilizas este tipo de componentes electrónicos, puedes ver pulsando aquí unos primeros pasos antes de comenzar la programación.

Para empezar, declaramos las variables que necesitamos:

Esquiva_001B

Las variables “obs_Left, obs_Right y obs_Center” las utilizaremos para guardar un 1 o un 0 si se ha detectado un obstáculo a la izquierda, derecha o delante respectivamente. Un 1 significa obstáculo en esa dirección.

Las variables “angle_Left, angle_Right y angle_Center” guardan las posiciones del miniservo para que los “ojos” del robot estén mirando hacia la izquierda, derecha o centro. Recordad que al ordenar al miniservo que se mueva a un ángulo lo que hacemos es girar y orientar el sensor ultrasonidos.

Una vez definimos las variables, vamos a comenzar a programar el bucle de programa que se repetirá una y otra vez. Lo primero es hacer que el robot se pare con la función Stop:

Esquiva_002B

Las 3 mediciones de las que hablábamos se pueden programar de esta forma:

Esquiva_003B

La función “search_Obstacle” es la buscadora de obstáculos. Tiene como parámetro de entrada un ángulo y la salida será un 1 o un 0. Esta completa función se programa así en bitbloq:

Esquiva_004

Como véis, primero mueve el miniservo a ese ángulo de entrada, después usa el bloque del sensor de ultrasonidos que mide distancia (en centímetros) y por último el bloque verde de comparación:

– Si la distancia que mide el sensor es menor que 25cm: reproduce sonido de error con el zumbador y devuelve un 1. ¡Hay obstáculo!
– De lo contrario, pitido agudo con el zumbador “beep” que indica zona despejada. Devolverá en este caso un 0. ¡Está despejado!

Ahora viene la elección de cómo debe actuar el robot según los obstáculos detectados. ¿Cómo reaccionar? Ya hemos explicado las 4 posibilidades antes, aquí os dejo cómo se programan con los bloques bitbloq:

Esquiva_005B

Ya sólo nos queda definir cómo son esas funciones de movimiento que estamos ejecutando. Para hacer AVANZAR al robot usamos la función llamada “go_Fordward“:

Esquiva_006

Esta función hace sonar unos pitidos con el zumbador avisando de camino despejado. A continuación, mueve las dos ruedas con los servos de rotación continua: el servo izquierdo (pin 8) gira en sentido horario y el servo derecho (pin 9) gira en sentido antihorario. [Nota: El sentido de giro se aprecia mirando las ruedas desde el centro del robot]

Para hacer GIRAR al robot usamos las funciones llamadas “turn_Left” si gira a la izquierda y “turn_Right” si gira a la derecha. Para DETENER al robot usamos la función llamada “Stop” que también usábamos al principio:

Esquiva_007

Por último, para hacer RETROCEDER al robot usamos la función llamada “go_Backward“:

Esquiva_008

Esta función es tan larga porque hace tres cosas:

– Emitir unos graciosos sonidos de error (“¡Oh oh oohh, robot atrapado!”)
– Mover la cabeza-miniservo de un lado a otro (“¡No no noo, robot confuso!”)
– Retroceder moviendo los servos de rotación continua.

Este sería el programa al completo:

Esquiva completo

¡Ya tienes el programa completo! Pero… Recuerdo que esta es sólo una forma sencilla de programar un esquiva-obstáculos, hay varias cosas que se podrían mejorar: aumentar la velocidad, la toma de más de 3 medidas para no dejarse obstáculos sin detectar o, por ejemplo, un cambio en la prioridad de las acciones (no siempre es mejor avanzar y girar a la izquierda). ¿Te atreves a mejorar el código?