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?

34 comentarios

  1. Hola, acabo de estrenar un printbot evolution con mi hijo y estamos encantados!!

    Lo primero que hemos hecho para comprobar que todo funcionaba ha sido descargar el programa del esquiva-obstaculos desde esta página y cargarlo directamente (ya tendremos tiempo para aprender a programar bien). Ha funcionado, pero hay algo que creo que no va del todo bien. Mientras realiza la comprobación con el módulo de ultrasonidos (moviendo el mini servo), se supone que las ruedas deberían estar paradas, pero sin embargo el printbot está siempre girando a la derecha mientras busca, por lo que el resultado no siempre es bueno.

    ¿podríais decirme si es el comportamiento normal o es que hay algo mal?

    Gracias y enhorabuena por el trabajo que hacéis.

    1. Anita de Prado

      Hola Adolfo,

      ¡Me alegro que disfrutéis la experiencia! :) No te preocupes por el problema que comentas, es algo normal. Lo único que debéis hacer es calibrar los servos de rotación continua (motores de las ruedas) con un destornillador estrella.

      Aquí os dejo un vídeo explicativo para saber cómo calibrarlos:
      https://youtu.be/krCLMx88gvc

      Cualquier duda nos comentáis. ¡Un saludo!

  2. Hola Anita,
    Ahora mismo he terminado de programar mi Printbot evolution en biqbloq, ha sido muy divertido. La pregunta: luego, una vez terminado, ¿cómo puedo guardar mi proyecto y pasárselo a mi robot? Graciaaaas.

    1. Anita de Prado

      Hola Juan,

      Una vez tengas hecho el programa en bitbloq y quieras programar tu robot, tan sólo tienes que conectar la placa cerebro al ordenador con el cable USB y pulsar sobre la opción “Cargar” en bitbloq.

      En la pestaña “Más opciones” puedes elegir descargar el proyecto (en formato .xml) o descargar el código arduino (en formato .ino).

  3. holaaa acabo de meter el programa y lo he probado pero el sensor de ultrasonidos no reconoce los objetos que tiene a su alrededor, sino que sigue avanzando y chocando con los objetos

    1. Anita de Prado

      Hola Jose,

      Comprueba que estén bien conectados los cables al propio módulo ultrasonidos BAT:
      VCC – Cable naranja
      TRI – Cable azul
      ECH – Cable rojo
      GND – Cable negro

      Para la conexión a la placa, el cable naranja puedes conectarlo a cualquier pin rojo, da igual que sea en la ristra de pines analógicos o digitales. Igualmente, el cable negro conectalo a cualquier pin negro de la placa. Éstos son pines de alimentación y no importa el número ya que todos los pines rojos aportan 5V y todos los negros sirven para la conexión a tierra (0V o GND).

      También comprueba que el interruptor de la placa ZUM esté en posición encendido (ON) que es justo el interruptor que habilita/deshabilita los pines de alimentación:
      cosas_importantes_conexionado

      Cuéntanos si así se soluciona tu problema.

  4. lo he comprobado todo y sigue sin funcionar

  5. Hola:

    Estamos intentando programar el robot para esquivar obstáculos, pero no encontramos la opción “Stop” en Funciones. ¿Hay que crearla de cero para que esté disponible? Vemos que en el ejemplo si aparece la función pero no en una programación nueva. ¿Qué estamos haciendo mal?

    Muchas gracias.

    Javier

    1. Anita de Prado

      Hola Javier,
      Las funciones hay que crearlas desde cero, a partir de un “bloque de función sin retorno” vacío.

  6. Buenas puede que este no sea el lugar donde pedir la información, perdón si es así.
    Estoy dudando si comprar el printboot evolution o zum kit. El kit de evolution , permite hacer el escarabajo? ¿Cúal me recomendais para regalar a un niño de 7 años ya iniciado en robótica?

    1. Alberto Valero

      Hola Alberto,

      El PrintBot evolution es más completo y se pueden hacer más cosas con él, además incorpora la nueva electrónica ZUM, diseñada y fabricada en España, que es de mejor calidad que la Freaduino (incorporada en el escarabajo)

      Como las familias electrónicas son distintas con el evolution no podrás hacer el escarabajo (tal cual) y viceversa.

      En cualquier caso, sin tener en cuenta el precio, nuestra recomendación, por calidad del material y por variedad de uso nuestra recomendación es el evolution, o si tienes una impresora 3D, directamente adquirir el ZUM kit e imprimir tú mismo el evolution.

  7. hi,

    Where can I find bitbloq in uk or in French ?

    Can I have bitbloq on my Pc instead of using the Web ?

    Is there any libraries for programing directly with Arduino Ide ?

    Thank you.

    JM.

    1. sgruben

      Hi JM!

      Bitbloq is available in 9 languages. You can change your language preference at the bottom of the page. Also, if you are registered, go to your profile settings to select the preferred language.

      For the moment, bitbloq is available only in web format.

      You can find in our repository libraries used in bitbloq, which can be used in Arduino IDE.

      Regards,

  8. Hola, me gustaría saber por qué se utiliza un portapilas de 12 v, si la placa funciona a 5 v.

    Gracias

    1. SGracia

      ¡Hola Juan Carlos!

      Esto es porque la entrada para el portapilas va desde 6V a 17V, es decir, podríamos conectar cualquier batería o portapilas que nos diese 7V+, pues el regulador de la placa ya se encarga de darle los 5V que necesita.

  9. Hola

    Me gustaria saber como adquir el sensor con doble infrarojo de manera independiente. Tengo los nuevos maletines, pero ese componente no esta incluido

    Gracias

    1. SGracia

      Hola Felix,

      Lamentablemente, no disponemos de este módulo para adquirir de forma individual, no obstante puedes contactar con nuestro departamento comercial por si pudiesen facilitarte más información al respecto: 911 420 681.

  10. Hola,

    Hemos adquirido recientemente el Printbot Evolution, pero resulta que ahora se programa en bitloq2 y no en bitloq1, por lo que este artículo no me sirve. ¿Tenéis algún ejemplo de programa en bitloq2 para el printbot evolution? En la web sólo he encontrado cosas parciales o con leds (pero el printbot evolution no tiene leds). Por ejemplo el programa de huir de la oscuridad solo está en bitloq1 y vuelvo con el mismo problema, ahora sólo se puede usar el bitloq2 y casi no hay ejemplos de programas.

    Gracias.

  11. Hola, que tal!!

    Estoy programando con la nueva versión de bitbloq el esquiva-obstaculos en mi printbot evolution y me he atascado en un paso. La función “search-obstacle”. Supongo que en bitbloq2 tengo que declarar una función con argumentos y que devuelva un valor. Pero me encuentro que no se como añadir en la función “que me devuelva un valor 1″ durante el primer “if”. Muchas gracias!!

    1. SGracia

      Buenos días, César:

      En las opciones avanzadas (ve al apartado de los bloques de Funciones y pulsa sobre “Avanzados”, en la parte inferior) deberías encontrar en complemento al resto de bloques todo lo que necesites.

  12. Pingback: Destripando el Printbot Evolution de BQ - Rufián en la Red

  13. Buenas tardes
    Mi printbot se mueve pero siempre mira hacia la derecha.No comprueba si hay obstáculos en el centro o izquierda porque no gira.¿Hay que ajustar también este servo de alguna manera?
    GRacias

    1. SGracia

      Buenos días, Mercedes:

      Comprueba que el mini-servo sobre el que instalamos el sensor ultrasonidos se ha montado tal y como se inidica en la guía de montaje del PrintBot Evolution, teniendo en cuenta que el cabezal debe quedar correctamente alineado en la posición máxima del servo: http://diwo.bq.com/montaje-del-printbot-evolution/

      Un saludo.

  14. Hola! acabo de copiar el programa “programando un esquivaobstáculos” pero al verificar el programa me da un error y no soy capaz de encontrar en que me pude equivocar. El código que me da es:
    Error al compilar: C:/Users/P/.web2board/tmp.ino: In function ‘void loop()': C:/Users/P/.web2board/tmp.ino:22: error: case label not within a switch statement C:/Users/P/.web2board/tmp.ino:22: error: break statement not within loop or switch

    Muchas gracias.

  15. Pingback: Trabajo integral en robótica con BQ PrintBot Evolution: estudio de sus componentes, impresión en 3D de piezas, montaje y programación

  16. Hola, yo en el último apartado no me deja pegar lo de “en otro caso ejecutar:” con el resto de bloques.

    1. Enrique Heredia

      Hola,
      Había un error en la captura del post, el bloque que se debe utilizar es de lo contrario, ejecutar: en vez de en otro caso ejecutar:. Ahora Bitbloq los diferencia e impice mezclarlos. Muchas gracias por hacérnoslo notar, ya hemos corregido la captura.
      Un saludo

  17. Buenos dias.
    Estoy programando en big blog pero me atasque en describir funciones, no encuentro el bloque mover, ni la variable componente.
    Gracias por su ayuda

    1. Enrique Heredia

      Hola Alex,
      Están en la pestaña de “Componentes” (en rojo). Ahí debería aparecerte el bloque de Mover. Si te fijas, dentro de componentes, abajo pone Avanzados, al clicar sobre ello te saldrán más bloques, ahí está el de variable (componente).
      Un saludo

  18. Mi nombre es Alex:
    Tengo que habilitar componentes en el Hardware?. Puesto que veo que salen servo_0.
    Pero no puedo obtener la opción de utilizar esos bloques.
    Atte

    1. Enrique Heredia

      Hola Alex,
      Para que te aparezcan los bloques de cada componente en la pestaña de software debes conectar el componente a uno de los pines de la placa, si no no se pueden utilizar sus bloques.
      Un saludo

Los comentarios están cerrados.