Butialo: Ejemplo 1 - Seguidor de líneas con un sensor sin eventos

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

Descripción

Se desea Implementar un seguidor de líneas básico que permite al robot Butiá seguir el rastro de una línea de color negro sobre el suelo, utilizando un sensor de grises.

El robot deberá avanzar mientras se encuentre en una zona oscura y en caso de salirse de la misma, girar para poder encontrar nuevamente una zona oscura.

Solución

Descripción

Antes de describir cómo es la solución, es menester decir que el sensor de escala de grises debe ser calibrado previamente a la ejecución del programa a desarrollar para poder obtener los respectivos valores límites de color negro y color blanco.

Para tomar estos valores, colocamos el sensor sobre una zona negra y utilizamos la función Grey_1.getValue() que nos brinda el entorno Butialo (en este caso, se conectó el sensor al puerto 1, por eso su nombre es “Grey_1”). Nos arrojará un valor que tendremos identificado como “valor sobre zona oscura”. Posteriormente, se hizo lo mismo sobre una zona de color blanco, mediante lo cual obtuvimos un “valor sobre zona clara”.

Con dichos valores, sabemos en forma aproximada cuál es el entorno de valores en los cuales el sensor de grises detectará el color blanco o el color negro. A partir de esto, calculamos el valor medio y así es que obtuvimos el valor de la variable COLOR_NEGRO (35000 para las pruebas realizadas). Es decir, si el valor arrojado por el sensor es mayor o igual a 35000, sabemos que nos encontramos sobre una zona oscura o negra; y si es menor a 35000 asumimos que se trata del color blanco.

Una vez calibrado el sensor, 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 el color de la línea sea negro, en caso contrario deberá buscar dicho color realizando un movimiento en forma de abanico. Luego de que se busca el color negro, y se encuentra, se utiliza la función invertir_sentido() para que la siguiente vez que se busque el color negro, se haga en el sentido más probable de que esté.

while true do
    avanzar()
    while (es_negro()) do
        util.wait(0.1)
    end
    buscar_negro()
    util.wait(TIEMPO_CENTRADO)
    invertir_sentido()
end
  • 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
  • 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()
    local color = Grey_1.getValue()
    return (color > COLOR_NEGRO)
end
  • girar

Gira el robot en el sentido correspondiente, el cual estará definido por la variable sentido

local function girar()
     if sentido == "I" then
         Motors.setvel2mtr(1,MOTOR_GIRO_VEL,0,MOTOR_GIRO_VEL)
     else
         Motors.setvel2mtr(0,MOTOR_GIRO_VEL,1,MOTOR_GIRO_VEL)
     end
     invertir_sentido()
end
  • buscar_negro

Si el robot no encuentra color negro entonces deberá buscarlo. El robot hace un abanico, girando determinado tiempo en un sentido, para luego girar el doble de tiempo en el sentido opuesto. Esta acción culminará cuando se detecte que el robot está en una zona oscura.

local function buscar_negro()
    tiempo = 0.5
    local tiempo_girando
    while true do
        tiempo_girando = 0
        girar()        	
        while (not es_negro() and tiempo_girando <= tiempo) do
            util.wait(0.1)
            tiempo_girando = tiempo_girando + 0.1
        end
        if es_negro() then
            break
        else
            tiempo = tiempo * 2
        end
    end
end

Configuración

Se debe colocar un sensor de escala de grises lo más cercano al piso posible, pero siempre sin tocarlo, en la parte de adelante del Butiá.

En nuestro caso encastramos piezas de forma de generar el soporte para adherir el sensor al Butiá, quedando dicho sensor a ras del piso.

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

Configuración

Video

Código

Butialo: Ejemplo 1 - Seguidor de líneas con un sensor sin eventos - Código