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

De Proyecto Butiá
Saltar a: navegación, buscar
 
Línea 1: Línea 1:
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
local COLOR_MESA = 55000
+
local COLOR_NEGRO = 35000
local INTERVALO_CHEQUEO = 0.05
+
local TIEMPO_RETROCESO = 0.1
+
local VELOCIDAD_RETROCESO = 500
+
local VELOCIDAD_GIRO = 500
+
 
local MOTOR_VEL = 500
 
local MOTOR_VEL = 500
local MIN_TIEMPO_GIRO = 0.5
+
local MOTOR_GIRO_VEL = 500
local MAX_TIEMPO_GIRO = 2
+
local NEGRO_IZQUIERDO, NEGRO_DERECHO, NEGRO_AMBOS, BLANCO = 0, 1, 2, 3
local MIN_TIEMPO_RETROCESO = 1.5
+
local negro_izquierda
local MAX_TIEMPO_RETROCESO = 2.5
+
local negro_derecha
  
 
local function avanzar()
 
local function avanzar()
Línea 15: Línea 11:
 
end
 
end
  
local function chequear_giro_izquierda()
+
local function detener()
     -- Para girar random izq o der, uso un entero del 0-1
+
     Motors.setvel2mtr(0, 0, 0, 0)
    -- Si valor random > 0.5 es izq, sino der
+
    -- DERECHA = false, IZQUIERDA = true
+
    local sentido = math.random (0, 1)
+
    return sentido > 0.5
+
 
end
 
end
  
local function girar_aleatorio()
+
local function es_negro(valor)
     local tiempo_giro = math.random(MIN_TIEMPO_GIRO, MAX_TIEMPO_GIRO)
+
     return (valor > COLOR_NEGRO)
    local izquierda = chequear_giro_izquierda()
+
    if (izquierda) then
+
Motors.setvel2mtr(0, VELOCIDAD_GIRO, 1, VELOCIDAD_GIRO)
+
    else
+
Motors.setvel2mtr(1, VELOCIDAD_GIRO, 0, VELOCIDAD_GIRO)
+
    end
+
    util.wait(tiempo_giro)
+
 
end
 
end
  
local function retroceder_aleatorio()
+
local function girar_derecha()
    local tiempo_retroceso = math.random(MIN_TIEMPO_RETROCESO, MAX_TIEMPO_RETROCESO)
+
     Motors.setvel2mtr(0,MOTOR_GIRO_VEL,0,0)
     Motors.setvel2mtr(1, VELOCIDAD_RETROCESO, 1, VELOCIDAD_RETROCESO)
+
    util.wait(tiempo_retroceso)
+
 
end
 
end
  
local function retroceder_y_girar_aleatorio()
+
local function girar_izquierda()
     retroceder_aleatorio()
+
     Motors.setvel2mtr(0,0,0,MOTOR_GIRO_VEL)
     girar_aleatorio()
+
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
 
end
  
events.add(Grey_2.getValue, '>=', COLOR_MESA,retroceder_y_girar_aleatorio)
+
events.add(obtener_estado, '==', NEGRO_IZQUIERDO, girar_izquierda)
events.add(Grey_2.getValue, '<', COLOR_MESA, avanzar )
+
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>

Revisión actual del 12:09 15 oct 2012

local COLOR_NEGRO = 35000
local MOTOR_VEL = 500
local MOTOR_GIRO_VEL = 500
local NEGRO_IZQUIERDO, NEGRO_DERECHO, NEGRO_AMBOS, BLANCO = 0, 1, 2, 3
local negro_izquierda
local negro_derecha

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

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

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()