Butialo: Ejemplo 5 - Seguidor de líneas con eventos, utilizando dos sensores de grises

De Proyecto Butiá
Saltar a: navegación, buscar

Descripción

Se desea implementar utilizando eventos un programa que permita al robot Butiá seguir el rastro de una línea de color negro sobre el suelo.

El robot deberá avanzar mientras se encuentre en una zona oscura y en caso de salirse de la misma se tendrán tres alternativas posibles para poder encontrar nuevamente una zona oscura, dependiendo de cuál sensor detectó que el robot se ha salido de la zona.

Solución

Descripción

Obtenemos el valor de la variable COLOR_NEGRO de la misma forma que lo hicimos en el Ejemplo 1.

Como podemos apreciar en el Ejemplo 1, el robot tiene un comportamiento que claramente se adapta al paradigma reactivo. Esto es, SENSAR - ACTUAR. Cambiará su estado dependiendo de una condición que le indica para cada sensor si el color sensado se corresponde con el color negro (COLOR_NEGRO).

Distinguimos entonces cuatro estados posibles: NEGRO_AMBOS, NEGRO_IZQUIERDO, NEGRO_DERECHO y BLANCO. Cuando ambos sensores detectan el color negro, el robot se encuentra en el estado NEGRO_AMBOS. Por lo cual el robot deberá avanzar. Si el sensor izquierdo detecta el color negro y el sensor derecho no, entonces el robot se encuentra en el estado NEGRO_IZQUIERDO. El robot aquí deberá girar en sentido izquierdo para tratar de no salirse de la línea. Si el sensor derecho detecta el color negro y el sensor izquierdo no, entonces el robot se encuentra en el estado NEGRO_DERECHO. Análogamente, el robot deberá girar en sentido derecho. En caso contrario, el estado será BLANCO y al perder la línea con ambos sensores el robot se detiene.

Finalmente se organiza la estructura de la solución en diferentes funciones de forma de modularizar y distinguir fácilmente las acciones. El programa principal quedaría de la siguiente forma:

  • programa principal

Consiste en avanzar el robot hasta tanto no se cumpla alguna de las condiciones para cambiar de estado y en tal caso, se ejecutará la función asociada al evento correspondiente.

events.add(obtener_estado, '==', NEGRO_IZQUIERDO, girar_izquierda)
events.add(obtener_estado, '==', NEGRO_DERECHO, girar_derecha)
events.add(obtener_estado, '==', NEGRO_AMBOS, avanzar)
events.add(obtener_estado, '==', BLANCO, detener)
events.go()
  • avanzar

Activa los motores haciendo que los mismos giren a una velocidad prefijada en la constante MOTOR_VEL.

local function avanzar()
    Motors.setvel2mtr(0, MOTOR_VEL, 0, MOTOR_VEL)
end
  • detener

Detiene los motores.

local function detener()
    Motors.setvel2mtr(0, 0, 0, 0)
end
  • es_negro

Retorna un valor booleano que indica si el robot está parado sobre la zona oscura, según el valor obtenido por el sensor de grises y su comparación con la constante COLOR_NEGRO.

local function es_negro(valor)
    return (valor > COLOR_NEGRO)
end
  • girar_derecha

Gira el robot hacia la derecha con una velocidad definida por la variable MOTOR_GIRO_VEL.

local function girar_derecha()
    Motors.setvel2mtr(0,MOTOR_GIRO_VEL,0,0)
end
  • girar_izquierda

Gira el robot hacia la izquierda con una velocidad definida por la variable MOTOR_GIRO_VEL.

local function girar_izquierda()
    Motors.setvel2mtr(0,0,0,MOTOR_GIRO_VEL)
end
  • obtener_estado

Retorna el estado correspondiente, dependiendo de los valores obtenidos en cada uno de los sensores de grises.

local function obtener_estado()
    negro_izquierda = es_negro(Grey_1.getValue())
    negro_derecha = es_negro(Grey_2.getValue())
    if (negro_izquierda and negro_derecha) then
	return NEGRO_AMBOS
    elseif (negro_izquierda) then
	return NEGRO_IZQUIERDO
    elseif (negro_derecha) then
	return NEGRO_DERECHA
    else
	return BLANCO
    end
end

Configuración

Se deben colocar dos sensores de escala de grises lo más cercano al suelo, pero siempre sin tocarla, en la parte de adelante del Butiá. Dichos sensores deben estar lo suficientemente juntos como para que cuando se coloque el Butiá en el suelo, ambos sensores estén sobre la línea negra.

En nuestro caso encastramos piezas de forma de generar el soporte para adherir los sensores al Butiá, quedando dichos sensores a ras del suelo.

Se muestra a continuación una imagen ilustrativa de la configuración del robot vista desde arriba.

Configuración

Video

Código

Butialo: Ejemplo 5 - Seguidor de líneas con eventos, utilizando dos sensores de grises - Código