sábado, 29 de enero de 2011

Diseño, construcción y descripción en VHDL de un carro seguidor de líneas y evasor de obstáculos con una FPGA SPARTAN 3E



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:

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;

 
  Conclusiones
·         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.

15 comentarios:

  1. se puede usar en una gal 22V10 y solo el detector de objetos para un carro?

    ResponderEliminar
  2. Segun tengo entendido las gal 22V10 se programan en el lenguaje VHDL y este codigo precisamente esta desarrollado en ese lenguaje...

    ResponderEliminar
  3. Hola me encantaría tener tu código.. en el archivo del ise me lo podrías pasar gracias... diverus67@gmail.com

    ResponderEliminar
  4. Tienes una lista de materiales para construirlo???

    ResponderEliminar
  5. No tengo la lista a la mano ... pero según recuerdo los materiales son comunes y los encontramos facilmente en una tienda de electrónica

    ResponderEliminar
    Respuestas
    1. tendras tu reporte del proyecto o tu diagrama de conexion que usaste, mi correo es ricardo.moralesm72@gmail.com

      Eliminar
    2. hola buen día, mi correo es orysez@gmail.com
      me 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

      Eliminar
    3. Perdón amiga, tienes razón, todo el código está en la página, antes que
      todo 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

      Eliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. hola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com

    ResponderEliminar
  8. hola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com

    ResponderEliminar
  9. hola ayuda es para un evade obstaculo o un seguidor de linea .. seria genial si me contestaran este es mi correo ,,, mi_crank@hotmail.com

    ResponderEliminar
  10. hola buen día, mi correo es orysez@gmail.com
    me 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

    ResponderEliminar
  11. 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

    ResponderEliminar