Você está na página 1de 12

Diseo, construccin y descripcin en VHDL de un carro seguidor de lneas y evasor de obstculos con una FPGA SPARTAN 3E

El proyecto est basado en dos funciones bsicas del carro, seguir lneas y evadir obstculos, dichas funciones se describen mediante dos mdulos en VHDL para la implementacin en hardware dispusimos de 6 sensores, tres infrarrojos, y tres de fin de carrera. Adems 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 alimentacin. 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 debamos controlar solo dos servomotores por lo que un puente H era suficiente y su conexin 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 bsicamente se basara el hardware del evasor de obstculos. Una vez controlado la parte del evasor de obstculos, seguimos con el seguidor de lneas, lo ms idneo fue subdividirlo en secciones, diseadas dependiendo de las posibles combinaciones realizables de encendido de los tres leds (mostrando un cero apagado, cuando cualquier sensor est sobre la lnea negra, o un uno encendido, cuando se desva), al ser tres sensores se crearon las ocho combinaciones siguientes:

Sensores Infrarrojos Descripcin Izquierdo Central Derecho En medio de 0 0 0 un cruce de lneas En medio de 0 0 1 un cruce de lneas En medio de 0 1 0 un cruce de lneas A la 0 1 1 derecha de las lneas En medio de 1 0 0 un cruce de lneas Sobre la 1 0 1 lnea A la 1 1 0 izquierda de la lnea Totalmente 1 1 1 fuera de las lneas Cuando el carro se encuentre sobre la lnea, se mantiene el curso hacia el frente. Cuando el carro se encuentre a la derecha de la lnea, se direccionaba hacia la izquierda. Cuando el robot se encontraba a la izquierda de la lnea, se direccionaba hacia la derecha. Para el resto de las combinaciones se continuaba con la orden de control anterior. DISEO O--O

Se comenz a desarrollar por funciones: Seguir lneas Evadir obstculos. La placa que se incorporo al carro se puede visualizar en la siguiente imagen:

CDIGO: --------------------------------------------- Carrito Seguidor de Lneas-------------Evasor de obstculos-------------------------------------------------------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; -- tamao 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<= e2<= e3<= e4<= '0'; '1'; '0'; '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 ---e1<= e2<= "00"=> retrocede '1'; '0';

e3<= '1'; e4<= '0'; when "01" => --- gira derecha e1<= '0'; e2<= '1'; e3<= '1'; e4<= '0'; when ---e1<= e2<= others => GIRA ADELANTE '0'; '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 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 ---e1<= e2<= "10" => GIRA ADELANTE '0'; '1'; <= q_next1;

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 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 ---e1<= e2<= "10" => GIRA ADELANTE '0'; '1'; <= q_next2;

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; Conclusiones VHDL es un lenguaje muy poderoso que nos permite describir de manera muy sencilla funciones bsicas para el manejo del carro. A los sensores de fin de carrera se los puede ver como switchs para recibir la seal desde la FPGA y luego enviarla a los servomotores. Para la implementacin 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 funcin por separado y luego unir todo en una sola unidad para poder depurar el programa en caso de errores.

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity seguidor is port(start,clock,sensor_i,sensor_d:in std_logic; motor_i,motor_d :out std_logic); end seguidor; architecture solucion of seguidor is type estados is (s0,s1,s2,s3); signal es,ep:estados; begin process(clock) begin if clock='1' and clock'event then ep<=es; end if; end process; process(ep) begin es<=ep; case ep is when s0 => motor_i<='0'; motor_d<='0'; if start='1' then es<=s1; else es<=s0; end if; when s1 => motor_i<='1'; motor_d<='1'; if sensor_i='0' and sensor_d='1' then es<=s2; elsif sensor_i='1' and sensor_d='0' then es<=s3; end if; when s2 => motor_i<='0'; motor_d<='1'; if sensor_i='0' and sensor_d='1' then es<=s2; else es<=s1; end if; when s3 => motor_i<='1'; motor_d<='0'; if sensor_i='1' and sensor_d='0' then es<=s3; else es<=s1; end if;

end case; end process; end solucion;

Você também pode gostar