Butialo: Ejemplo 2 - Seguidor de líneas con eventos, utilizando un sensor de grises - Código

De Proyecto Butiá
Saltar a: navegación, buscar
local COLOR_NEGRO = 35000
local MOTOR_VEL = 500
local MOTOR_GIRO_VEL = 500
local sentido = "D"
local tiempo = 0.5
local evento_blanco_encontrado
local evento_buscar_negro
local buscando_negro = false
local TIEMPO_CENTRADO = 0.2
local last

local function invertir_sentido()
	if sentido == "I" then
		sentido = "D"
	else
		sentido = "I"
	end
end

local function get_elapsed()
	return util.get_time() - last
end

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
end

local function buscar_negro()
	if not buscando_negro then
		buscando_negro = true
		-- Se deshabilita el evento de "color blanco encontrado" porque no tiene que "mezclarse" con el actual
		events.remove(evento_blanco_encontrado)
	else
		-- Se remueve el evento anterior para agregar uno nuevo con el nuevo valor de la variable tiempo
		events.remove(evento_buscar_negro)
	end
	last = util.get_time()
	-- Lo siguiente es para que se busque s\u00f3lo un determinado tiempo en cada sentido de giro
	evento_buscar_negro = events.add(get_elapsed, ">=", tiempo, buscar_negro)
	invertir_sentido()
	tiempo = tiempo * 2
	girar()
end

local function avanzar()
	if buscando_negro then
		-- Remueve el evento para que se deje de buscar el color negro
		events.remove(evento_buscar_negro)
		-- Vuelve a agregar el evento que la funci\u00f3n buscar_negro removi\u00f3
		evento_blanco_encontrado = events.add(Grey_1.getValue, '<', COLOR_NEGRO, buscar_negro)
		
		buscando_negro = false
		tiempo = 0.5
		invertir_sentido()
		util.wait(TIEMPO_CENTRADO)
	end
	
	Motors.setvel2mtr(0, MOTOR_VEL, 0, MOTOR_VEL)
end

events.add(Grey_1.getValue, '>=', COLOR_NEGRO, avanzar)

evento_blanco_encontrado = events.add(Grey_1.getValue, '<', COLOR_NEGRO, buscar_negro)

events.go()