0% encontró este documento útil (0 votos)
53 vistas6 páginas

Proyecto Carro Seguidor Linea

El proyecto consiste en construir un carro seguidor de línea utilizando VHDL y la tarjeta Basys2, que sigue un trazado negro mediante sensores infrarrojos y motores DC. Se emplea modulación por ancho de pulso (PWM) para controlar la velocidad de los motores y se detallan las conexiones y el código necesario para implementar el movimiento del carro. Además, se incluyen conceptos clave como el controlador de motor y la construcción de señales PWM en VHDL.

Cargado por

Juver Gomez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
53 vistas6 páginas

Proyecto Carro Seguidor Linea

El proyecto consiste en construir un carro seguidor de línea utilizando VHDL y la tarjeta Basys2, que sigue un trazado negro mediante sensores infrarrojos y motores DC. Se emplea modulación por ancho de pulso (PWM) para controlar la velocidad de los motores y se detallan las conexiones y el código necesario para implementar el movimiento del carro. Además, se incluyen conceptos clave como el controlador de motor y la construcción de señales PWM en VHDL.

Cargado por

Juver Gomez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 6

Proyecto Carro seguidor de línea con VHDL y Basys2

Parte I: Movimiento del carro seguidor de línea


Profesor: Jonathan Álvarez Ariza
Arquitectura de Computadores
Facultad de Ingeniería
UMD

 Objetivo: El propósito del proyecto es realizar un carro seguidor


de línea usando VHDL y la tarjeta Basys2. La idea del carro
seguidor de línea es seguir un trazado con una cinta negra
usando componentes como sensores infrarrojos, motores DC
(corriente continua), controlador de motor, y la tarjeta Basys2.
Para programar el robot usaremos las sentencias concurrentes
when, with-select, case, process e if.
 Glosario
1. Controlador de motor: Es un dispositivo que permite mover
el motor en ambos sentidos (adelante-atrás). Dado a que los
pines de la FPGA (Spartan 3E) no proporcionan la corriente
suficiente para mover los motores, el controlador de motor
permite la amplificación de corriente para su movimiento.
2. Sensor infrarrojo: Es un dispositivo reflectivo, es decir, un
haz de luz sale de un “emisor” y “retorna” si hay un objeto o
color blanco. En este caso el retorno de este haz puede
tomarse como un ‘0’ y el no retorno como un ‘1’. Estos bits (‘1’,
‘0’) son detectados por la Basys2 para el movimiento del carro
seguidor de línea.
3. Frecuencia (f): Número de veces que se repite una señal por
segundo, su unidad son los Hertz (Hz).
4. Periodo (T): Tiempo que dura un ciclo de la señal.
5. Motor: Dispositivo (máquina eléctrica) que transforma voltaje
y corriente en movimiento rotativo.

1. Parte I: Moviendo el carro seguidor de línea

Para esta parte usaremos el controlador de motor y un concepto


llamado PWM (modulación por ancho de pulso) que permitirá variar la
velocidad de cada motor. Lo anterior se realiza para que el vehículo
siga la línea y no se salga. La modulación por PWM tiene la función de
la figura 1. Al controlador de motor se le aplica una señal digital como
se muestra en la figura 1. Dependiendo el tiempo en que la señal dura
en ‘1’ denominado (TH), se aumenta o se disminuye la velocidad del
motor. Típicamente para los motores DC y controladores de motor, esta
señal tiene una frecuencia de 1000 Hz (mil ciclos por segundo).
Mediante VHDL construiremos esta señal. Además de los anteriores
conceptos existen otros como ciclo útil (k) o tiempo en ‘0’ (TL).
Un segundo aspecto que debemos tener en cuenta es el tipo de
controlador (controlador de motor) que usaremos y sus conexiones. La
apariencia de este controlador aparece en la figura 2. El controlador
tiene una entrada de voltaje (5V-Supply voltage) que será suministrado
con la batería (power bank) dado a cada grupo. Las entradas de control
(Control signal inputs) permiten activar o desactivar el motor con la
señal PWM que se describió anteriormente. Por último, las salidas a los
motores (Output to motors) permiten conectar los motores
directamente para su funcionamiento.

Figura 1. Modulación por ancho de pulso PWM.

Figura 2. Controlador de motor DC usado en el robot seguidor de


línea.
1.1 Conexiones al motor
En caso de que se entreguen los motores por separado, la idea es
pegarlos a la base en impresión 3D entregada a cada grupo (Alinear
muy bien los motores). Para mover los motores se deben escoger cuatro
pines de la tarjeta Basys2 que se llamaran “motores” para conectarlos a
las entradas IN1 a IN4 en el controlador de motor (ver figura 2).
Además de lo anterior, conectar el cable del power bank a las entradas
supply voltaje y cada motor a los pines (MotorA y MotorB).

1.2 Construcción de la señal PWM: Fundamentos

Para construir la señal de PWM usaremos las sentencias concurrentes


process e if. Estas sentencias concurrentes se caracterizar por
necesitar una señal de reloj para trabajar. La variable se incrementará
cada cierto tiempo hasta un valor máximo. En un segundo momento
esta misma variable se comparará con un valor que indica cuanto debe
durar en ‘1’. Si la variable es superior a este valor se colocará en ‘0’.
Para declarar una variable en VHDL lo debemos hacer SIEMPRE
dentro de un process, la estructura quedaría de la siguiente forma:

entity Ropwm is
Port ( CLK : in STD_LOGIC;
Reset : in STD_LOGIC;
MotorDer : out STD_LOGIC_VECTOR (1 downto 0);
MotorIzq : out STD_LOGIC_VECTOR (1 downto 0));
end Ropwm;

architecture Behavioral of Ropwm is

begin

MD: process(CLK, Reset) --Process con señal de reloj


variable contadorMD: integer range 0 to 50000:=0;--Variable entera en el
rango 0 a 50000
begin

if(CLK='1' and CLK'event and Reset='0')then --if para preguntar por


señal de reloj (si hay actualizar sistema)

end if;

end process;
end Behavioral;
Algoritmo 1. Ejemplo de Código VHDL con variable. La variable se
usará para PWM.
Para probar el motor derecha o izquierda antes de agregar la señal
PWM colocaremos al anterior código las señales correspondientes.
Como se puede ver en el algoritmo 1, los motores son vectores,
entonces si colocamos al vector de cada motor el valor “01” el motor irá
en una dirección, si se coloca “10”, el motor irá en la otra dirección.
Entonces, el código base quedará de la siguiente manera:
entity Ropwm is
Port ( CLK : in STD_LOGIC;
Reset : in STD_LOGIC;
MotorDer : out STD_LOGIC_VECTOR (1 downto 0);
MotorIzq : out STD_LOGIC_VECTOR (1 downto 0));
end Ropwm;

architecture Behavioral of Ropwm is

begin

MD: process(CLK, Reset) --Process con señal de reloj


variable contadorMD: integer range 0 to 50000:=0;--Variable entera en el
rango 0 a 50000
begin

if(CLK='1' and CLK'event and Reset='0')then --if para preguntar por


señal de reloj (si hay actualizar sistema)
MotorDer<="01";--Motor en una dirección
--MotorDer<="10";--Motor en dirección contraria
end if;

end process;
end Behavioral;

Algoritmo 1. Ejemplo de Código VHDL para movimiento de motores.


Agregar otro process idéntico al de motor a la derecha para mover el
motor izquierdo.
1.2.1 Señal PWM

Una vez se muevan los motores los cambiaremos de velocidad. Para


esto usaremos las variables creadas en cada process junto con la
siguiente información. Para mover el motor debemos tener una señal
como la mostrada en la figura 1. Esta señal debe tener una frecuencia
de 1000Hz o mil ciclos por segundo que se debe hacer con la variable.
Para saber el rango de la variable para cumplir con esta frecuencia
tomaremos las siguientes ecuaciones:
1
f =1000 Hz , T ( periodo)= =0.001 seg
1000 Hz
La tarjeta Basys2 tiene un oscilador que tiene una frecuencia de
50000000Hz (Base de frecuencia), luego:
1
f (base)=50000000 Hz ,T = =20 ns (nano segundos)
50000000 Hz
Entonces el valor máximo de la variable para crear la señal de 1000Hz
sería:
0.001 seg
ValorVariable= =50.000
0.00000002 seg
Opción 2 para calcular:
50.000 .000 Hz
ValorVariable= =50.000
1.000 Hz
Luego la variable será un entero en el rango de 0-50.000. Cuando
llegue a los 50.000 habrán transcurrido 0.001 segundos. De allí que la
variable en el algoritmo1 y 2 tenga este rango.
variable contadorMD: integer range 0 to 50000:=0;--Variable entera en el
rango 0 a 50000

Ahora bien, el contador debe compararse con un valor que indica si la


señal estará en ‘1’ o si estará en ‘0’. Para hacer esto usamos un
condicional (if) con la siguiente estructura:
MD: process(CLK, Reset)
variable contadorMD: integer range 0 to 50000:=0;--Variable entera en el
rango 0 a 50000
constant CicloUtil: integer:=25000;
begin

if(CLK='1' and CLK'event and Reset='0')then


contadorMD:=contadorMD+1;--Incremento de contador en 1
if(contadorMD<=CicloUtil)--Si el contador menor a el ciclo útil.
MotorDer<="01";--Señal en 1 antes de alcanzar el valor de CicloUtil
else
MotoeDer<="00";
end if;

end process;

Aquí la señal se está comparando con el valor de ciclo útil que es


25.000. Como el valor máximo es 50.000, los 25.000 son la mitad lo que
significa que de 0.001 segundos que debe durar la señal, 0.0005
segundos (la mitad) dura en 1 y la otra mitad en ‘0’. En función del
motor esto reduciría la velocidad a la “mitad”.

Variar el valor del ciclo útil y comparar la velocidad del motor en cada
caso.

1.2.2 Preguntas
 Cambiar el valor de periodo (T) para una señal de 2000 Hz y 5000 Hz, ¿Cuál sería el valor
máximo de las variables en estos casos?
 Cambiar el valor del ciclo útil de las señales anteriores a k=0.3, k=0.5, k=0.7.

También podría gustarte