Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
Abstract
This report documents the codes, diagrams and evidence of operation for the 4 degrees of
freedom robotic arm system that is controlled by RF (radio frequency) communicating 2
Amiba 2 FPGA's, by sending commands from a push button control for the arm movement
and displaying on 7 segment displays the direction of the arm movement. The implemented
codes were made in VHDL.
Índice
Resumen ................................................................................................................................. 1
Abstract ................................................................................................................................... 1
Problemática planteada ........................................................................................................... 2
Criterios de elección para los componentes de nuestro sistema: ............................................ 3
Características de nuestros componentes ............................................................................... 3
Circuitos esquemáticos: .......................................................................................................... 6
Cálculos realizados ................................................................................................................. 8
Códigos HDL........................................................................................................................ 10
Para el transmisor ........................................................................................................... 10
Programa principal: MASTER .......................................................................... 11
Componente U1: RS232 ...................................................................................... 13
Archivo de restricción de usuario (.ucf): ........................................................... 21
1
Para el receptor ............................................................................................................... 21
Código TOP SLAVE R ........................................................................................ 22
Componente U1: RS232 ...................................................................................... 27
Componentes U2, U3, U4 y U5: Servo_pos ........................................................ 35
Componente U6: DIV_CLK ............................................................................... 36
Componente U7: Display Result ......................................................................... 37
Archivo de restricciones de usuario (.ucf): ........................................................ 38
Fotos y video ........................................................................................................................ 40
Conclusiones......................................................................................................................... 43
Fuentes bibliográficas ........................................................................................................... 44
Problemática planteada
3
o Puerto de expansión a protoboard (P1)
o Puerto de expansión hembra (P2)
o Puerto de expansión para LCD 16x2 (P3)
5
Circuitos esquemáticos:
Para el diseño de los arreglos de 2 resistencias de 10 [kΩ] del control de 8 push buttons nos
basamos en el esquemático del manual de usuario de INTESC para la FPGA amiba 2 (ver
figura _)
6
• FPGA esclava (Ver figura 7): Para esta FPGA se conectaron los servomotores de la
estructura del brazo robótico y el módulo de recepción de RF XV-MK-5V, además
se utilizaron sus leds incorporados para el reconocimiento y comprobación de la
recepción de los comandos de movimiento y el despliegue de mensajes indicadores
del desplazamiento en los 4 displays de 7 segmentos incorporados a la FPGA (ver
figura 8).
Servomotores
SG90
7
Figura 8.- Diagrama esquemático –
FPGA Maestra para displays de 7
segmentos
Cálculos realizados
• Para el PWM:
Para el control del desplazamiento de nuestros servomotores se consideraron
desplazamientos máximos de 90° para no comprometer el cableado y generar alguna posible
falla o desconexión de los servomotores de la FPGA, el calculo se hizo considerando la figura
9.
8
𝑅𝑎𝑛𝑔𝑜 = 2𝑚𝑠 − 1𝑚𝑠 = 1𝑚𝑠
Frecuencia necesaria:
𝑅𝑎𝑛𝑔𝑜 1𝑚𝑠 −1
𝑓𝑛𝑒𝑠 = ( )−1 = ( ) = 90𝑘ℎ𝑧
𝑟𝑒𝑠𝑜𝑙𝑢𝑖𝑐𝑖ó𝑛 90
Divisor de frecuencia:
𝑓𝑒𝑛𝑡𝑟𝑎𝑑𝑎 50𝑀ℎ𝑧
𝐸𝑠𝑐𝑎𝑙𝑎 = = = 555.55
𝑓𝑠𝑎𝑙𝑖𝑑𝑎 90𝑘ℎ𝑧
Al ser el ciclo útil del 50%:
555.55
𝐸𝑠𝑐𝑎𝑙𝑎 = = 277
2
En 90khz:
1
𝑡 = = 11.11𝑢𝑠
90𝑘ℎ𝑧
En 90 iteraciones 1ms:
(11.11𝑢𝑠)(90) = 1𝑚𝑠
Para 20ms:
20(90) = 1800
Por lo que en el código se contará 1800 veces para comparar el pwm
Ya que son 90 grados, se le agrega un offset de 90 a la posición.
• Para la potencia consumida por los servomotores y el consumo por hora continua de
operación:
𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎 = 𝐶𝑜𝑟𝑟𝑖𝑒𝑛𝑡𝑒 𝑐𝑜𝑛𝑠𝑢𝑚𝑖𝑑𝑎 ∗ 𝑇𝑒𝑛𝑠𝑖ó𝑛 𝑑𝑒 𝑎𝑙𝑖𝑚𝑒𝑛𝑡𝑎𝑐𝑖ó𝑛
Los servomotores consumen una corriente de 550mA y se alimentan con 5V
𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎 = 4(550𝑚𝐴 ∗ 5𝑉) + 20𝑚𝑊 = 11.02𝑊
La potencia por hora:
11.02 ∗ 1ℎ𝑟 = 11.02𝑊/ℎ𝑜𝑟𝑎
• Longitud de onda de la radiofrecuencia
La longitud de onda se calcula con:
𝜆 = 𝑐/𝑣
9
Donde c es la velocidad de la luz y v es la frecuencia en Hertz:
𝜆 = 3𝑥108 /433𝑀ℎ𝑧
𝜆 = 0.693 𝑚
Al ser las ondas usadas para la transmisión electromagnéticas la forma de propagación tiene
la forma de estas las cuales son sinusoidales.
Códigos HDL
10
Archivo RS232.vhd: Con la ayuda de la librería de intesc se modificaron los valores para
adaptarse a la frecuencia de los módulos de transmisión de datos, este programa monitorea
el pulso que se envía conteniendo los datos que se enviarán a la FPGA que controla nuestro
brazo mecánico.
• Programa principal: MASTER
----------------------------------------------------------------------
------------
-- MEXILOGICS: CÓDIGO PARA MANDAR EL ESTDO DE 8 PUSHBUTTONS, YA QUE SE
NECESITAN 2 BOTONES
-- PARA CADA GRADO DE LIBERTAD, SE MANDARÁN A OTRA FPGA POR MEDIO DE
UN MÓDULO DE RADIO
-- FRECUENCIA
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity MASTER is
port(
CLK: in STD_LOGIC;
SWITCHES: in STD_LOGIC_VECTOR (7 downto 0);
TX: out STD_LOGIC
);
end MASTER;
11
RX_IN : out std_logic;
DOUT : out std_logic_vector(7 downto 0)
);
end component RS232;
begin
----------------------------------------------------------------------
-- Machine: STATE
----------------------------------------------------------------------
------------------------------------
-- Next State Logic (combinatorial)
------------------------------------
STATE_NextState: process (STATE)
begin
NextState_STATE <= STATE;
-- Set default values for outputs and signals
-- ...
case STATE is
when ASIGNA =>
DATAIN_s <= SWITCHES;
NextState_STATE <= ENVIA;
when ENVIA =>
if TX_FIN_s = '0' then
NextState_STATE <= ENVIA;
TX_IN_s <= '1';
elsif TX_FIN_s = '1' then
NextState_STATE <= ASIGNA;
TX_IN_s <= '0';
end if;
--vhdl_cover_off
when others =>
null;
--vhdl_cover_on
end case;
end process;
------------------------------------
12
-- Current State Logic (sequential)
------------------------------------
STATE_CurrentState: process (clk)
begin
if clk'event and clk = '1' then
STATE <= NextState_STATE;
end if;
end process;
end Behavioral;
entity RS232 is
--contantes en el generic
);
port ( CLK : in std_logic ; --Reloj de
FPGA
RX : in std_logic ;
--Pin de recepcin de RS232
TX_INI : in std_logic ;
--Debe ponerse a '1' para inciar transmisin
13
RX_IN : out std_logic ; --Se
pone a '1' cuando se ha recibido un Byte. Solo dura un
--Ciclo de reloj
DATAIN : in std_logic_vector(7
downto 0); --Puerto de datos de entrada para transmisin
DOUT : out std_logic_vector(7 downto 0)
--Puerto de datos de salida para recepcin
);
end RS232;
14
signal tx_maquina : natural range 0 to 6 := 0
;
signal n : natural
range 0 to 10 := 0 ;
begin
process(CLK)
begin
if rising_edge(CLK) then
rx_vector2 <= rx_vector;
end if;
end process;
----------------------------------------------
RECEPCION: process(CLK)
begin
if rising_edge(CLK) then
if paralelo_paso = 0 then
n <= 0;
15
paralelo_paso <= 2;
elsif paralelo_paso = 2 then
--el siguiente
if clk_flanco = '1' then
paralelo_paso <= 4;
else
--recepcion
if n < 10 then
paralelo_paso <= 3;
else
n <= 10;
paralelo_paso <= 6;
end if;
end if;
elsif paralelo_paso = 4 then
16
--que se ha recibido el BYTE y regresa al paso 0
(esperando otra recepcin)
DOUT<= dout_paralelo(8 downto 1);
clk_ini <= '0';
n <= 0;
paralelo_paso <= 0;
--clk_flanco
process(CLK)
begin
if rising_edge(CLK) then
if clk_ini = '1' then
if clk_baud < (CLKBAUD2-1) then
clk_baud <= clk_baud + 1;
clk_flanco <= '0';
else
clk_baud <= 0;
TRANSMICION: process(CLK)
begin
if rising_edge(CLK) then
if tx_maquina = 0 then
TX <= '1';
tx_n <= 0;
17
TX_FIN <= '0';
tx_maquina <= 1;
else
tx_maquina <= 0;
end if;
--de transmisin
TX <= '0';
tx_maquina <= 2;
tx_maquina <= 3 ;
TX <=tx_data(0);
18
else
tx_maquina <= 2;
end if;
tx_maquina <= 4;
else
tx_maquina <= 5;
end if;
tx_maquina <= 2;
else
19
--Si ya esta en el ltimo estado, espera a que pongamos
TX_INI a '0' antes de regresar al
--de BYTES
tx_maquina <= 5 ;
else
tx_maquina <= 0;
end if;
end if;
end if;
end process;
process(CLK)
begin
if rising_edge(CLK) then
if clk_tx_ini = '1' then
if clk_tx_baud < (BAUD_FPGA2-1) then
clk_tx_baud <= clk_tx_baud + 1;
clk_tx_flanco <= '0';
else
clk_tx_baud <= 0;
20
end Behavioral;
##Clock signal
Net "clk" LOC = E7 | IOSTANDARD=LVCMOS33;
#Net "clk" TNM_NET = sys_clk_pin;
#TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;
##TX
Net "tx" LOC = E15 | IOSTANDARD=LVCMOS33;
#SWITCHES
Net "switches<0>" LOC = F15 | IOSTANDARD = LVCMOS33; #D1
Net "switches<1>" LOC = D15 | IOSTANDARD = LVCMOS33; #D2
Net "switches<2>" LOC = B15 | IOSTANDARD = LVCMOS33; #D3
Net "SWitches<3>" LOC = B13 | IOSTANDARD = LVCMOS33; #D4
Net "SWitches<4>" LOC = A11 | IOSTANDARD = LVCMOS33; #D5
Net "SWitches<5>" LOC = C9 | IOSTANDARD = LVCMOS33; #D6
Net "SWitches<6>" LOC = A8 | IOSTANDARD = LVCMOS33; #D7
Net "SWitches<7>" LOC = C6 | IOSTANDARD = LVCMOS33; #D8
21
• U6-DIV_CLK.vhd : divisor de reloj para que los datos puedan ser apreciados en el
display.
• U7-Display_result.vhd : muestra el tipo de movimiento que se está realizando en
displays de 7 segmentos
entity SLAVE_R is
port(
CLK: in STD_LOGIC; --RELOJ
LEDS: out STD_LOGIC_VECTOR (7 downto 0); --MUESTRA DE LECTURA
DOF1,DOF2,DOF3,DOF4: out std_logic; --CONTROL DE SERVOMOTORES
RX: in STD_LOGIC; --INGRESO DE DATOS DEL RECEPTOR
ANode,dsply: out std_logic_vector (7 downto 0); --CONEXIÓN A
DISPLAY DE 7 SEG
);
22
end SLAVE_R;
begin
23
RX => RX,
TX_INI => tx_in_s,
TX_FIN => tx_fin_s,
TX => TX,
RX_IN => rx_in_s,
DATAIN => datain_s,
DOUT => dout_s
);
24
------------------------------------
-- Next State Logic (combinatorial)
------------------------------------
Sreg0_NextState: process (Sreg0)
begin
NextState_Sreg0 <= Sreg0;
-- Set default values for outputs and signals
-- ...
case Sreg0 is
when RECIBE =>
if RX_IN_S = '1' then
NextState_Sreg0 <= MUESTRA;
elsif RX_IN_S = '0' then
NextState_Sreg0 <= RECIBE;
end if;
when MUESTRA =>
asigna_led <= DOUT_S;
NextState_Sreg0 <= RECIBE;
--vhdl_cover_off
when others =>
null;
--vhdl_cover_on
end case;
end process;
------------------------------------
-- Current State Logic (sequential)
------------------------------------
Sreg0_CurrentState: process (clk)
begin
if clk'event and clk = '1' then
Sreg0 <= NextState_Sreg0;
end if;
end process;
25
else
counter2 <= counter2 + 1;
end if;
end if;
end process;
26
if pos3 = x"7E" then
if asigna_led(4) = '1' then
pos3 <= pos3;
elsif asigna_led(5) = '1' then
pos3 <= pos3 - '1';
end if;
elsif pos3 = x"01" then
if asigna_led(4) = '1' then
pos3 <= pos3 + '1';
elsif asigna_led(5) = '1' then
pos3 <= pos3;
end if;
else
if asigna_led(4) = '1' then
pos3 <= pos3 + '1';
elsif asigna_led(5) = '1' then
pos3 <= pos3 - '1';
end if;
end if;
end if;
end process;
end Behavioral;
27
-- MEXILOGICS: CONTROL POR PROTOCOLO RS232 UTILIZANDO LA LIBRERÍA DE
INTESC
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity RS232 is
--contantes en el generic
);
port ( CLK : in std_logic ; --Reloj de
FPGA
RX : in std_logic ;
--Pin de recepcin de RS232
TX_INI : in std_logic ;
--Debe ponerse a '1' para inciar transmisin
--Ciclo de reloj
DATAIN : in std_logic_vector(7
downto 0); --Puerto de datos de entrada para transmisin
DOUT : out std_logic_vector(7 downto 0)
--Puerto de datos de salida para recepcin
);
end RS232;
28
CONSTANT FPGA_CLK2 : INTEGER := FPGA_CLK;
begin
process(CLK)
29
begin
if rising_edge(CLK) then
rx_vector2 <= rx_vector;
end if;
end process;
----------------------------------------------
RECEPCION: process(CLK)
begin
if rising_edge(CLK) then
if paralelo_paso = 0 then
n <= 0;
--el siguiente
if clk_flanco = '1' then
paralelo_paso <= 4;
else
30
--SI no hay flanco, esta condicin indica la
salida y el trmino de la
--recepcion
if n < 10 then
paralelo_paso <= 3;
else
n <= 10;
paralelo_paso <= 6;
end if;
end if;
elsif paralelo_paso = 4 then
--clk_flanco
process(CLK)
begin
if rising_edge(CLK) then
31
if clk_ini = '1' then
if clk_baud < (CLKBAUD2-1) then
clk_baud <= clk_baud + 1;
clk_flanco <= '0';
else
clk_baud <= 0;
TRANSMICION: process(CLK)
begin
if rising_edge(CLK) then
if tx_maquina = 0 then
TX <= '1';
tx_n <= 0;
tx_maquina <= 1;
else
32
tx_maquina <= 0;
end if;
--de transmisin
TX <= '0';
tx_maquina <= 2;
tx_maquina <= 3 ;
TX <=tx_data(0);
else
tx_maquina <= 2;
end if;
33
if tx_n < 9 then
tx_maquina <= 4;
else
tx_maquina <= 5;
end if;
tx_maquina <= 2;
else
--de BYTES
tx_maquina <= 5 ;
else
tx_maquina <= 0;
end if;
34
end if;
end if;
end process;
process(CLK)
begin
if rising_edge(CLK) then
if clk_tx_ini = '1' then
if clk_tx_baud < (BAUD_FPGA2-1) then
clk_tx_baud <= clk_tx_baud + 1;
clk_tx_flanco <= '0';
else
clk_tx_baud <= 0;
end Behavioral;
----------------------------------------------------------------------
------------
-- MEXILOGICS: CONTROL DE SERVOMOTOR SG90 EL CUAL CUENTA CON 90 GRADOS
DE MOVIMIENTO
-- SE COMPARA EN UN TIEMPO DE 20MS PARA DAR LA SEÑAL
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Servo_pos is
port (
clk: in std_logic;
posi: in std_logic_vector (6 downto 0); --POSICIÓN MÁXIMA DE
180
servo: out std_logic
);
35
end Servo_pos;
begin
pos_comp <= "1011010" when unsigned(posi) > "1011010" else posi; --SI
EXCEDE LOS 90 GRADOS SE QUEDA EN ESE VALOR
pwmi <= unsigned('0' & pos_comp) + 90; --SI NO EXCEDE 90 GRADOS
ENTONCES MODIFICA LA POSICIÓN
counter: process(clk) begin --CONTROL DEL PWM PARA DAR LOS VALORES QUE
SE COMPARAN EN 2O MS
if rising_edge(clk) then
if cnt = 1799 then --CONTADOR PARA LOS 90 GRADOS
cnt <= (others => '0');
else
cnt <= cnt + 1;
end if;
end if;
end process;
servo <= '1' when (cnt < pwmi) else '0'; --ASIGNACIÓN DEL PWM A LA
SALIDA
end Behavioral;
--Declaracin de entidad
entity DIV_CLK is
port(
clk: in std_logic; --reloj de 50MHz
SAL_400Hz: inout std_logic --salida 2.5ms
);
end DIV_CLK;
----------------------------------------------------------------------
------------
36
--Declaracin de la arquitectura
architecture Behavioral of DIV_CLK is
--Declaracin de seales de divisores
signal conta_1250us : integer range 1 to 62_500 := 1; --pulso de 1250
us@400Hz (0.25ms)
begin
--Divisor 2.5ms = 400Hz
--Divisor nodos
process(clk) begin
if rising_edge(clk) then
if(conta_1250us = 62_500) then --cuenta 1250us (50MHz = 62500)
SAL_400Hz <= not(SAL_400Hz); --Genera un barrido de 2.5ms
conta_1250us <= 1;
----------------------------------------------------------------------
------------
--fin de la arquitectura
end Behavioral;
entity Display_result is
Port(
);
end Display_result;
37
-- Declaracin de seales de la multiplexacin y asignacin de U-D-C al
disp
38
##Clock signal
Net "clk" LOC = E7 | IOSTANDARD=LVCMOS33;
//DISPLAYS
Net "dsply<7>" LOC = K13 | IOSTANDARD=LVCMOS33;
Net "dsply<6>" LOC = L15 | IOSTANDARD=LVCMOS33;
Net "dsply<5>" LOC = M15 | IOSTANDARD=LVCMOS33;
Net "dsply<4>" LOC = P15 | IOSTANDARD=LVCMOS33;
Net "dsply<3>" LOC = P14 | IOSTANDARD=LVCMOS33;
Net "dsply<2>" LOC = K15 | IOSTANDARD=LVCMOS33;
Net "dsply<1>" LOC = L14 | IOSTANDARD=LVCMOS33;
Net "dsply<0>" LOC = N15 | IOSTANDARD=LVCMOS33;
//ANODOS
Net "anode<7>" LOC = K12 | IOSTANDARD=LVCMOS33;
Net "anode<6>" LOC = J13 | IOSTANDARD=LVCMOS33;
Net "anode<5>" LOC = K11 | IOSTANDARD=LVCMOS33;
Net "anode<4>" LOC = H13 | IOSTANDARD=LVCMOS33;
Net "anode<3>" LOC = G13 | IOSTANDARD=LVCMOS33;
Net "anode<2>" LOC = H12 | IOSTANDARD=LVCMOS33;
Net "anode<1>" LOC = F13 | IOSTANDARD=LVCMOS33;
Net "anode<0>" LOC = G12 | IOSTANDARD=LVCMOS33;
##LED VERDES
Net "leds<7>" LOC = N1 | IOSTANDARD=LVCMOS33;
Net "leds<6>" LOC = R4 | IOSTANDARD=LVCMOS33;
Net "leds<5>" LOC = P7 | IOSTANDARD=LVCMOS33;
Net "leds<4>" LOC = R9 | IOSTANDARD=LVCMOS33;
Net "leds<3>" LOC = P13 | IOSTANDARD=LVCMOS33;
Net "leds<2>" LOC = M4 | IOSTANDARD=LVCMOS33;
Net "leds<1>" LOC = M6 | IOSTANDARD=LVCMOS33;
Net "leds<0>" LOC = M11 | IOSTANDARD=LVCMOS33;
39
Fotos y video
40
Figura 15.- Módulo transmisor de
433Mhz con antena helicoidal
41
Figura 16.- Brazo robótico de 4
grados de libertad y sus
servomotores
42
Figura 17.- FPGA slave con el
módulo receptor y displays que
indican el movimiento realizado
Conclusiones
43
y adaptar el control del brazo robótico según nuestras necesidades específicas, brindándonos
una experiencia de usuario optimizada. La integración de módulos de radiofrecuencia ha
eliminado las limitaciones físicas de los cables, permitiendo una libertad de movimiento sin
restricciones. Esto ha abierto nuevas posibilidades en términos de alcance y flexibilidad de
uso del brazo robótico, ya que ahora podemos controlarlo desde una distancia considerable.
Además, el control intuitivo y la retroalimentación en tiempo real que proporciona este
sistema nos han brindado un mayor grado de precisión y seguridad en nuestras operaciones.
La capacidad de controlar el brazo robótico de forma remota nos ha permitido realizar tareas
complejas y delicadas con mayor facilidad y confianza.
Galván Escobar Adrián Raúl
El desarrollo de este sistema me permitió comprender el algoritmo necesario para la
transmisión serial de datos, ya que tanto el receptor como el emisor deben de trabajar a
determinada frecuencia. Asimismo, la implementación del PWM (modulación por ancho de
pulso) nos permitió el control del desplazamiento de los servomotores.
Una de las principales características que resalto del proyecto es que con el uso de los
módulos de radiofrecuencia ya no hubo necesidad del uso de cableado para este sistema. Por
otro lado, para el diseño de sistemas que involucren componentes que tendrán que soportar
cargas o esfuerzos es importante considerar que función realizara cada componente, dado
que, para el caso de este proyecto, se tuvo que tener una mayor consideración en los
servomotores encargados de la rotación y el agarre de las piezas, ya que estos deben de ejercer
más fuerza (para el caso del servomotor de agarre) o deben de soportar más peso (para el
caso del servomotor de la base de nuestro brazo robótico).
Fuentes bibliográficas
44
[7] [20:39, 16/6/2023] +52 1 55 3412 6050: INTESC. (2021a, julio 30). Librería RS232 -
INTESC. https://intesc.mx/libreria-rs232/
[8] Del Valle Hernández, L. (2021, 4 mayo). Tutorial RF 433 MHz con Arduino.
Programar fácil con Arduino. https://programarfacil.com/blog/arduino-blog/rf-433-mhz-
arduino-fs1000a/
45