El proyecto está basado en dos funciones básicas del carro, seguir líneas y evadir obstáculos, dichas funciones se describen mediante dos módulos en VHDL para la implementación en hardware dispusimos de 6 sensores, tres infrarrojos, y tres de fin de carrera. Además de un puente H para el control de los servos.
Para conectar el puente H, hacemos lo siguiente: conectamos los pines 1, 8, 9, 16 a alimentación. Los pines 4, 5, 12, 13 van conectados a tierra. Los pines 2, 7, 10, 15 son las entradas uno, dos, tres, y cuatro respectivamente. Los pines 3, 6, 11, 14 son las salidas uno, dos, tres, y cuatro respectivamente.
En nuestro caso debíamos controlar solo dos servomotores por lo que un puente H era suficiente y su conexión seria así:
Las salidas de los sensores de fin de carrera van conectados como si fuesen switchs y van a la SPARTAN, en esta se procesan y sus salidas van conectadas a las entradas del puente H para mover los servos. En esto básicamente se basaría el hardware del evasor de obstáculos.
Una vez controlado la parte del evasor de obstáculos, seguimos con el seguidor de líneas, lo más idóneo fue subdividirlo en secciones, diseñadas dependiendo de las posibles combinaciones realizables de encendido de los tres led’s (mostrando un cero apagado, cuando cualquier sensor está sobre la línea negra, o un uno –encendido, cuando se desvía), al ser tres sensores se crearon las ocho combinaciones siguientes:
Una vez controlado la parte del evasor de obstáculos, seguimos con el seguidor de líneas, lo más idóneo fue subdividirlo en secciones, diseñadas dependiendo de las posibles combinaciones realizables de encendido de los tres led’s (mostrando un cero apagado, cuando cualquier sensor está sobre la línea negra, o un uno –encendido, cuando se desvía), al ser tres sensores se crearon las ocho combinaciones siguientes:
Sensores Infrarrojos | Descripción | ||
Izquierdo | Central | Derecho | |
0 | 0 | 0 | En medio de un cruce de líneas |
0 | 0 | 1 | En medio de un cruce de líneas |
0 | 1 | 0 | En medio de un cruce de líneas |
0 | 1 | 1 | A la derecha de las líneas |
1 | 0 | 0 | En medio de un cruce de líneas |
1 | 0 | 1 | Sobre la línea |
1 | 1 | 0 | A la izquierda de la línea |
1 | 1 | 1 | Totalmente fuera de las líneas |
Cuando el carro se encuentre sobre la línea, se mantiene el curso hacia el frente. Cuando el carro se encuentre a la derecha de la línea, se direccionaba hacia la izquierda. Cuando el robot se encontraba a la izquierda de la línea, se direccionaba hacia la derecha. Para el resto de las combinaciones se continuaba con la orden de control anterior.
DISEÑO O--O
Se comenzó a desarrollar por funciones:
- Seguir líneas
- Evadir obstáculos.
La placa que se incorporo al carro se puede visualizar en la siguiente imagen:
CÓDIGO:
--------------------------------------------
-- Carrito Seguidor de Lìneas----
----------Evasor de obstáculos-------------
--------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity compl is
Port ( s_fcc, s_fcd, s_fci, reset, ss, c, i, d : in STD_LOGIC;
clk: inout STD_LOGIC;
e1, e2, e3, e4 : out STD_LOGIC);
end compl;
architecture Behavioral of compl is
constant N : integer := 28; -- tamaño de bits para bajar de frecuencia
signal a: std_logic;
signal q_reg, q_reg1, q_reg2, q_next, q_next1, q_next2 : unsigned (N-1 downto 0);
signal sel : std_logic_vector (1 downto 0);
begin
process (s_fcc, s_fcd, s_fci,c,d,i,clk,ss,reset)
begin
if (reset = '0') then
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
if (ss= '1') then
if (s_fcc = '1' ) then
a<= '1';
if(clk'event and clk = '1' ) then
q_reg <= q_next;
end if;
q_next <= q_reg + 1;
sel <= std_logic_vector(q_reg(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira derecha
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
when others =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
end case;
end if;
if (s_fcd = '1') then
a<= '1';
if(clk'event and clk = '1' ) then
q_reg1 <= q_next1;
end if;
q_next1 <= q_reg1 + 1;
sel <= std_logic_vector(q_reg1(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
when "10" =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
q_next1 <= q_reg1;
when others =>
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
sel <="00";
a <='0';
end case;
end if;
if (s_fci = '1') then
a<= '1';
if(clk'event and clk = '1' and a = '1') then
q_reg2 <= q_next2;
end if;
q_next2 <= q_reg2 + 1;
sel <= std_logic_vector(q_reg2(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira izquierda
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
when "10" =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
q_next2 <= q_reg2;
when others =>
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
sel <="00";
a <='0';
end case;
end if;
else
if (c = '1' and d = '0' and i= '0') then
---- Seguir ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
end if;
if (c = '1' and d = '1' and i= '0') then
--- GIRAR DERECHA
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
end if;
if (c = '0' and d = '1' and i= '0') then
--- GIRAR DERECHA
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
end if;
if (c = '0' and d = '0' and i= '1') then
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
end if;
if (c = '1' and d = '0' and i= '1') then
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
end if;
end if;
elsif (reset = '1') then
e1<= '1';
e2<= '1';
e3<= '1';
e4<= '1';
end if;
end process;
end Behavioral;
--------------------------------------------
-- Carrito Seguidor de Lìneas----
----------Evasor de obstáculos-------------
--------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity compl is
Port ( s_fcc, s_fcd, s_fci, reset, ss, c, i, d : in STD_LOGIC;
clk: inout STD_LOGIC;
e1, e2, e3, e4 : out STD_LOGIC);
end compl;
architecture Behavioral of compl is
constant N : integer := 28; -- tamaño de bits para bajar de frecuencia
signal a: std_logic;
signal q_reg, q_reg1, q_reg2, q_next, q_next1, q_next2 : unsigned (N-1 downto 0);
signal sel : std_logic_vector (1 downto 0);
begin
process (s_fcc, s_fcd, s_fci,c,d,i,clk,ss,reset)
begin
if (reset = '0') then
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
if (ss= '1') then
if (s_fcc = '1' ) then
a<= '1';
if(clk'event and clk = '1' ) then
q_reg <= q_next;
end if;
q_next <= q_reg + 1;
sel <= std_logic_vector(q_reg(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira derecha
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
when others =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
end case;
end if;
if (s_fcd = '1') then
a<= '1';
if(clk'event and clk = '1' ) then
q_reg1 <= q_next1;
end if;
q_next1 <= q_reg1 + 1;
sel <= std_logic_vector(q_reg1(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
when "10" =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
q_next1 <= q_reg1;
when others =>
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
sel <="00";
a <='0';
end case;
end if;
if (s_fci = '1') then
a<= '1';
if(clk'event and clk = '1' and a = '1') then
q_reg2 <= q_next2;
end if;
q_next2 <= q_reg2 + 1;
sel <= std_logic_vector(q_reg2(N-1 downto N-2));
case sel is
when "00"=>
---- retrocede
e1<= '1';
e2<= '0';
e3<= '1';
e4<= '0';
when "01" =>
--- gira izquierda
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
when "10" =>
---- GIRA ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
q_next2 <= q_reg2;
when others =>
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
sel <="00";
a <='0';
end case;
end if;
else
if (c = '1' and d = '0' and i= '0') then
---- Seguir ADELANTE
e1<= '0';
e2<= '1';
e3<= '0';
e4<= '1';
end if;
if (c = '1' and d = '1' and i= '0') then
--- GIRAR DERECHA
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
end if;
if (c = '0' and d = '1' and i= '0') then
--- GIRAR DERECHA
e1<= '1';
e2<= '0';
e3<= '0';
e4<= '1';
end if;
if (c = '0' and d = '0' and i= '1') then
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
end if;
if (c = '1' and d = '0' and i= '1') then
--- gira izquierda
e1<= '0';
e2<= '1';
e3<= '1';
e4<= '0';
end if;
end if;
elsif (reset = '1') then
e1<= '1';
e2<= '1';
e3<= '1';
e4<= '1';
end if;
end process;
end Behavioral;
· VHDL es un lenguaje muy poderoso que nos permite describir de manera muy sencilla funciones básicas para el manejo del carro.
· A los sensores de fin de carrera se los puede ver como switchs para recibir la señal desde la FPGA y luego enviarla a los servomotores.
· Para la implementación de los circuitos, se debe alimentar con una fuente externa ya que la SPARTAN no proporciona mucha corriente para el movimiento de los servomotores.
· Es necesario probar cada función por separado y luego unir todo en una sola unidad para poder depurar el programa en caso de errores.
se puede usar en una gal 22V10 y solo el detector de objetos para un carro?
ResponderEliminarSegun tengo entendido las gal 22V10 se programan en el lenguaje VHDL y este codigo precisamente esta desarrollado en ese lenguaje...
ResponderEliminarHola me encantaría tener tu código.. en el archivo del ise me lo podrías pasar gracias... diverus67@gmail.com
ResponderEliminarTienes una lista de materiales para construirlo???
ResponderEliminarNo tengo la lista a la mano ... pero según recuerdo los materiales son comunes y los encontramos facilmente en una tienda de electrónica
ResponderEliminartendras tu reporte del proyecto o tu diagrama de conexion que usaste, mi correo es ricardo.moralesm72@gmail.com
Eliminarhola buen día, mi correo es orysez@gmail.com
Eliminarme harías un gran favor ayudandome con el código del carrito seguidor de línea, ¿será que me lo puedas pasar?
y si esta a tu disposición que me orientaras para encontrar mas información sobre el tema
Perdón amiga, tienes razón, todo el código está en la página, antes que
Eliminartodo mi nombre es Miguel.
Bueno, el detalle es que yo estoy usando el entorno de programación "ISE
Project Navigator", bueno, cuando voy al esquemático no me genera el
diagrama donde deberían aparecer las entradas ni las salidas, entonces creo
que algo debo estar haciendo mal yo.
Me gustaría de favor pudieras orientarme para solucionar estos detalles, ya
que vengo trabajando sin ningún antecedente en la basys 2 solamente por dos
semanas y creo que no es mucho tiempo para armar un proyecto como este.
Gracias, de antemano y que tengas lindo día =)
orysez@gmail.com
Este comentario ha sido eliminado por el autor.
ResponderEliminarhola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com
ResponderEliminarhola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com
ResponderEliminarhola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com
ResponderEliminarhola buen día, mi correo es orysez@gmail.com
ResponderEliminarme harías un gran favor ayudandome con el código del carrito seguidor de línea, ¿será que me lo puedas pasar?
y si esta a tu disposición que me orientaras para encontrar mas información sobre el tema
Hola que tal! Crees que me puedas oh tendrás alguna foto de las posiciones en las que están los infrarrojos! Oh una foto del carro ya armado!? mi correo es davidcleto045@gmail.com
ResponderEliminaren el basy 3podria funcionar
ResponderEliminar