mBot usa con inteligencia el sensor de ultrasonidos

Como aperitivo del desarrollo técnico que vamos a explicar en este post, quiero empezar enseñándote cómo se desenvuelve mBot en una superficie rugosa como es una alfombra de hilos gordos. A pesar de ser un robot con tracción en solo dos motores hemos comprobado que es un producto robusto y bien diseñado:

Evitando obstáculos

En el siguiente ejercicio programamos mBot de la forma más simple posible, siendo capaz de evitar choques con obstáculos que encuentre en su camino.

Antes de escribir el programa en mBlock es instructivo expresar mediante un diagrama de flujo la funcionalidad que vamos a implementar:

La traducción en mBlock es sencilla y directa, de tal forma que no es necesario generar pseudocódigo previamente:

Nótese la característica de mBlock que nos permite corre 3 programas en paralelo (los 3 grupos de bloques explicados con el texto en rojo). El funcionamiento de un lenguaje de programación clásico consiste en procesamiento en serie- una línea detrás de otra- (como ocurre por ejemplo con el programa equivalente en C++ para Arduino).

Sin embargo, mBlock nos permite programar y visualizar el código en conjuntos de bloques separados que nos facilitan la comprensión y la posterior ampliación del programa. Esta característica de un lenguaje se denomina concurrencia.

El aspecto que tiene el mismo programa para ejecutar dentro de Arduino, es decir, la versión que vamos a cargar desde mBlock a la placa mCore usando el cable USB, es el siguiente:

Nótese cómo en este caso debemos eliminar los otros dos conjuntos de bloques, ya que C++ estándar, el lenguaje en que se programa Arduino, no es un lenguaje concurrente. Hagamos una aclaración y sepamos que sí es posible programar de forma concurrente en C++,si bien para ello sería necesario ampliar el lenguaje con las librerías que implementan dicha funcionalidad.

Recordemos que para poder cargar el programa, el conjunto debe iniciarse con el bloque 'Programa de mBot'.

En el siguiente video, con el programa Arduino cargado, se muestra cómo mBot es capaz de salir de un espacio limitado por obstáculos usando la información que obtiene de su sensor de ultrasonidos:

NOTA: Hemos observado que la velocidad 50 (rango 0-255) es insuficiente para echar andar a mBot. Ha de ponerse al menos 100.

Una mejora simple que se introdujo en el diseño del entorno fue invertir la posición de los vasos de plásticos, ya que son más anchos en su base (forma tronco-cónica), y ello hace que el obstáculo tenga una mayor superficie expuesta a la altura a que se encuentra instalado el sensor de ultrasonidos:

Variante de exploración

Hasta ahora mBot sólo detecta obstáculos cuando los encuentra de frente. Vamos a darle más información al robot para que, de esta forma, pueda tomar decisiones más inteligentes.

Un breve inciso sobre el concepto de inteligencia y su aplicación a la Robótica. Teniendo presente que la inteligencia es la capacidad de un ser para adaptarse a los cambios en el entorno, es obvio que el primer eslabón de la cadena es la información que el ser puede recoger, lo cual consigue a través de sus sentidos, procesando e integrando dicha información a nivel cerebral gracias a los procesos de percepción.

Aplicado a mBot, y en particular al sensor de ultrasonidos, una de las formas de recoger más información de este sensor es girar a izquierda y derecha y comprobar si hay otros obstáculos, para en función de esto decidir por dónde bordear el obstáculo que se ha encontrado de frente (del mismo modo que cuando vamos conduciendo y llegamos a un cruce, miramos a ambos lados antes de cruzar).

El siguiente diagrama de flujo describe dicha funcionalidad para nuestro robot:

Enunciemos dicha funcionalidad para entenderla bien:

Si el objeto se encuentra a menos de 10 cm del robot, debe girar. En caso contrario, debe avanzar. La secuencia de giro y respuesta ha de ser la siguiente:

  1. Giro 90º a la izquierda
    • Detectar si hay obstáculo en el lado izquierdo
  2. Giro 90º a la derecha
    • Detectar si hay obstáculo en el lado derecho
  3. Caso de obstáculo
    • A la izquierda SÍ, a la derecha NO: girar 90º a la DERECHA
    • A la izquierda NO, a la derecha SÍ: girar 90º a la IZQUIERDA
    • A la izquierda SÍ, a la derecha SÍ: retroceder 100 mm, girar 90º (a derecha o izquierda, indiferente) y volver a comprobar 1

En el siguiente programa de mBlock se ha implementado la primera parte, es decir, la detección de obstáculo al frente y comprobación de distancias a izquierda y derecha:

Gracias a la característica de concurrencia de mBlock, podemos separar funcionalmente los grupos de bloques en subprogramas y probarlos por separado. Así:

  • Apartamos en primer lugar aquellos conjuntos del programa anterior que podemos reutilizar total o parcialmente
  • Hacemos un nuevo conjunto de bloques que lo que hace es verificar las distancias obtenidas por el sensor a izquierda y derecha respecto al sentido de avance de mBot. Concretamente, desde el punto de vista de las pruebas, hacemos que mBot ejecute este subprograma cuando presionamos la tecla 'flecha izquierda'.

En la figura adjunta se muestra recuadrada en rojo la parte del algoritmo que hemos implementado:

Ya sólo resta que mBot tome la decisión y ejecute el movimiento de sortear el obstáculo por la izquierda o por la derecha, según la información recogida del sensor de ultrasonidos.

...

 

Alcanzando la meta

Usando el algoritmo anterior podemos resolver el primer reto para mBot, que consiste en:

Alcanzar una meta en la que, en línea recta, existen dos obstáculos al avance