Diferencia entre revisiones de «Butialo: Ejemplo 5 - Seguidor de líneas con dos sensores con eventos»
(Página creada con '__TOC__ ==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 rob...') |
(→Solución) |
||
Línea 25: | Línea 25: | ||
* '''programa principal''' | * '''programa principal''' | ||
− | Consiste en avanzar el robot hasta tanto no se | + | 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. |
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | events.add( | + | events.add(obtener_estado, '==', NEGRO_IZQUIERDO, girar_izquierda) |
− | events.add( | + | events.add(obtener_estado, '==', NEGRO_DERECHO, girar_derecha) |
+ | events.add(obtener_estado, '==', NEGRO_AMBOS, avanzar) | ||
+ | events.add(obtener_estado, '==', BLANCO, detener) | ||
events.go() | events.go() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Línea 42: | Línea 44: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | * ''' | + | * '''detener''' |
− | + | Detiene los motores. | |
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | local function | + | local function detener() |
− | + | Motors.setvel2mtr(0, 0, 0, 0) | |
− | + | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | <syntaxhighlight lang="lua"> | |
− | + | local function es_negro(valor) | |
+ | return (valor > COLOR_NEGRO) | ||
+ | end | ||
+ | </syntaxhighlight> | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | local function | + | local function girar_derecha() |
− | + | Motors.setvel2mtr(0,MOTOR_GIRO_VEL,0,0) | |
− | + | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | <syntaxhighlight lang="lua"> | |
− | + | local function girar_izquierda() | |
+ | Motors.setvel2mtr(0,0,0,MOTOR_GIRO_VEL) | ||
+ | end | ||
+ | </syntaxhighlight> | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | local function | + | local function obtener_estado() |
− | + | negro_izquierda = es_negro(Grey_1.getValue()) | |
− | + | negro_derecha = es_negro(Grey_2.getValue()) | |
− | if ( | + | 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 | else | ||
− | + | return BLANCO | |
end | end | ||
− | |||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> |
Revisión del 20:36 10 oct 2012
Contenido
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 tres estados posibles: NEGRO_AMBOS, NEGRO_IZQUIERDO y NEGRO_DERECHO. 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
local function es_negro(valor)
return (valor > COLOR_NEGRO)
end
local function girar_derecha()
Motors.setvel2mtr(0,MOTOR_GIRO_VEL,0,0)
end
local function girar_izquierda()
Motors.setvel2mtr(0,0,0,MOTOR_GIRO_VEL)
end
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 debe colocar un sensor de escala de grises lo más cercano a la mesa, pero siempre sin tocarla, 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 de la mesa.
Se muestra a continuación una imagen ilustrativa de la configuración del robot vista desde arriba.
Video
Código
Butialo: Ejemplo 4 - Butiá que no se cae de la mesa con un sensor sin eventos - Código