Sigue líneas en LabVIEW: Máquinas de estado

maquina_de_estado_finitoContinuamos con la serie de artículos de LabView, esta vez con un programa un poco más complicado: Sigue líneas en LabVIEW: Máquinas de estado. Como sabréis, una máquina de estados finita o autómata finito es un sistema que dependiendo de unas entrada de datos, opera con ella y devuelve una salida. Hay muchas máquinas de estados que nos podemos encontrar en el día a día; por ejemplo las máquinas expendedoras son máquinas de estados, los semáforos son máquinas de estados, hasta los interruptores de luz de nuestra casa son una máquina de estados.

Sigue líneas como máquina de estados:

En este caso estamos hablando de máquinas de estados finitos porque tienen un número finito de estados. Por ejemplo, un interruptor tendrá dos estados: dejando pasar la corriente o cortando su paso. Un dispensador de bebidas tiene muchos estados, como: esperando pedido o devolviendo cambio. En el caso de la máquina de estados finitos que vamos a hacer hoy vamos a tener tres estados. Se trata de un robot sigue líneas que además esquiva obstáculos situados en su camino. Los estados posibles con los que vamos a trabajar serán: “dentro del blanco”, “dentro del negro”, y “obstáculo”.

Tribot

Dicha máquina de estados tendrá como entrada los valores de un sensor de ultrasonidos, y del sensor de luz en modo activo. Según sea el valor de esas entradas actuará de una manera u otra. Por ejemplo si esta en lo negro se moverá a lo blanco y viceversa. Sin embargo si detecta un obstáculo a menos de cierta distancia le dará prioridad y tratará de esquivarlo. Por tanto siempre que reciba por la entrada que un obstáculo está a menos de x cm. se moverá al estado “obstáculo”, independientemente del valor de luz captado por el otro sensor.

Implementación en LabVIEW:

En primer lugar vamos a explicar la estructura case. En LabVIEW se pueden crear estructuras case que podrán ejecutar distintos trozos del programa según qué entrada reciban. Todo esto es configurable, y al crearlo ya viene con una entrada que lee booleanos y con dos estados: uno para false y otro para true. Para crear una estructura case tenéis que situaros en el diagrama de bloques de vuestro VI, darle click derecho → Structures → Case Structure:

Case
Una vez seleccionado, estiramos para dejarlo del tamaño que queramos y hacemos click para ponerlo. Si clickeáis encima de donde pone true, podéis cambiar a la parte que ejecutaría si la entrada valiese False:

Case2
Podemos añadir nuevos casos además de True y False, para ello haced click derecho sobre el case y darle a Add Case After (después) o Before (antes) del caso actual:

Case3
Podemos movernos de uno a otro y ver que hace en cada caso. Por supuesto está vacío en un principio, para que lo rellenemos con nuestro código. Nuestro problema requiere de dos case: el primero comprobará que no haya obstáculos, y el segundo en que parte estamos (blanco o negro). Según en que estado nos encontremos debemos ejecutar solo la parte de código correspondiente, por ejemplo si detectamos un obstáculo es innecesario que comprobemos si estamos en blanco o en negro, ya que no nos sirve para nada, y además es un fallo conceptual (el estado es “obstáculo”, no “obstáculo y en negro” y “obstáculo y en blanco”, ya que si no nuestra máquina tendría cuatro estados y no tres).

Una vez tengamos la máquina de estados, es necesario conectarle las entradas (en este caso las lecturas del sensor de ultrasonidos y de luz). Además debemos meterlo todo en un bucle para que se ejecute hasta que apretemos el botón ENTER. El programa quedaría de la siguiente manera:

Estado “dentro del blanco”:

blanco

Estado “dentro del negro”:

negro

Estado “obstáculo”:

obstáculo

En este vídeo podéis observar su funcionamiento:

Ya sabéis que si tenéis dudas podéis escribir en el foro.

Comments are closed.