Universidad Autónoma de Nuevo León
Facultad de Ingeniería Mecánica y
Eléctrica
Programación con Matlab
Producto Integrador de Aprendizaje
NOMBRE Dillan Alejandro Trigo López
MATRÍCULA 1869547
CARREA Ingeniero Mecatronico
Maestro: M.C Manuel Munguia Macario
Salón: CIS 2
Día: L-M-V
Grupo: 002
Hora: M1
Semestre: Enero - Junio 2020
San Nicolás de los Garza, 30 de Mayo de 2020
INDICE
Introducción...................................................................................................... 2
Desarrollo.......................................................................................................... 3
¿Qué es un Guide? .......................................................................................... 4
Diseño ............................................................................................................... 5
Construcción .................................................................................................... 6
Resultado final.................................................................................................. 7
Código General................................................................................................. 8
Código que hace los cálculos de la tabla....................................................... 13
Ejemplos ........................................................................................................... 16
Conclusión ........................................................................................................ 19
Bibliografías...................................................................................................... 20
2
INTRODUCCIÓN
Para la realización de este proyecto hicimos un guide, que se define como una
interfaz gráfica, con el fin de aportarnos ayuda en alguna de las materias cursadas
durante la carrera, en nuestro caso nos basamos en la materia de Mecánica de
materiales. El proyecto se realizó con el fin de ayudarnos y a realizar cálculos de
manera más rápida y efectiva, ya que hay veces que de la manera analítica no son
correctos.
El proyecto se basa en darnos la gravedad específica de un fluido dándonos así
como resultado su respuesta en diferentes sistemas existentes como lo es el
sistema inglés y así aportándonos también su densidad, peso y volumen
específico.
Quisimos adentrarnos a hacer un programa que, si bien no fuera extremadamente
complejo y fuera lo suficientemente sencillo como para que cualquiera pudiera
utilizarlo y aún más importante que tenga una amplia variedad de usos.
3
DESARROLLO
¿Qué es un Guide?
Una interfaz gráfica es el vínculo entre el usuario y un programa computacional,
constituida generalmente por un conjunto de comandos o menús, instrumentos y
métodos por medio de los cuales el usuario se comunica con el programa durante
las operaciones que se desean realizar, facilitando la entrada y salida de datos e
información.
Una interfaz es una de las partes más importantes de cualquier programa puesto
que determina qué tan factible y preciso será el desempeño del programa ante los
comandos que el usuario pretenda ejecutar. Aunque un programa sea muy
poderoso, si se manipula por medio de una interfaz pobremente elaborada, tendrá
poco valor para un usuario inexperto. Es por esto que las interfaces gráficas tienen
una gran importancia para usuarios inexpertos o avanzados de cualquier
programa ya que facilitan su uso.
MATLAB nos permite realizar GUIs de una manera sencilla usando una
herramienta llamada GUIDE (GUI Development Environment). En este capítulo
presentaremos una introducción muy completa a las técnicas en MATLAB para
crear interfaces gráficas.
GUIDE (Graphical User Interfase Development Environment) es un juego de
herramientas que se extiende por completo en el soporte de MATLAB, diseñadas
para crear GUIs (Graphical User Interfaces) fácil y rápidamente, prestando ayuda
en el diseño y presentación de los controles de la interfaz, reduciendo la labor al
grado de seleccionar, tirar, arrastrar y personalizar propiedades.
El beneficio que proporciona el uso de GUIs es evidente, ya que permiten al
usuario ejecutar cómodamente código desarrollado en MATLAB sin necesidad de
cumplir la incómoda sintaxis funcional necesaria cuando se trabaja desde la línea
de órdenes.
A diferencia de la ejecución de funciones o scripts de MATLAB, la ejecución de
GUIs no predetermina el flujo de ejecución del código. Es el usuario, a través de
su interacción con el GUI, el que determina el orden en que se ejecutan las
4
diferentes órdenes y funciones desarrolladas. Otra diferencia importante es que la
ejecución no termina cuando finaliza la ejecución del script o función, sino que el
GUI permanece abierto, permitiendo al usuario invocar la ejecución de ese u otro
código desarrollado. El desarrollo de GUIs se realiza en dos etapas:
Diseño de los componentes (controles, menús y ejes) que formarán el GUI.
Codificación de la respuesta de cada uno de los componentes ante la
interacción del usuario.
Diseño
Se quiso usar un diseño sencillo, que fuera práctico y rápido de usar para el
usuario, por lo general en los problemas de mecánica de fluidos para encontrar
todos las propiedades de un fluido te dan la gravedad específica, así que esta
5
tabla se puede usar rápidamente ya sea para resolver el problema en segundos o
comprobar que tu procedimiento y resultados está correcto.
Construcción
1.- Lo primero que hay que hacer es colocar un cuadro de “static text” y un cuadro
de “edit text”, al primero se le modifica su string de modo que el usuario conozca el
lugar donde debe introducir la gravedad específica, a el cuadro de “edit text” se le
borra su string para que el usuario no tenga que estar borrando los datos
predeterminados para poder introducir el valor de su gravedad específica, a este
elemento se le asignara el tag “sg” por comodidad.
2.- Después se añade un botón al cual se le cambiara su string por la palabra
“Calcular”, de esta forma el usuario entenderá rápidamente la función que tiene
este botón, no es necesario editar el tag de este elemento pues en la parte del
código su única función será llevar a cabo todas las operaciones una vez sea
presionado.
3.- Se ponen algunos cuadros de “static text” para señalar las propiedades y a qué
sistema de unidades pertenecen, estos cuadros de “static text” no tienen ninguna
otra función que la de señalar.
6
4.- Se ponen algunos cuadros de “static text” para señalar las unidades y a qué
sistema de unidades pertenecen, estos cuadros de “static text” no tienen ninguna
otra función que la de señalar, además, se añaden cuadros de “static text” donde
los valores serán mostrados al ser introducida una sg y el botón “calcular” haya
sido presionado.
5.- A cada uno de estos cuadros de “static text” se les asignara un tag de una letra
y un número para representar la fila de propiedad y la columna en la que se
encuentra el valor que será asignado a este tag, por ejemplo:
La gravedad especifica usa el símbolo sg1 como tag, representando la primer fila y
la primer columna, hasta el sg6 que representa a la primer fila y la última columna
de valores (ignorando las columnas de unidades y de señalamiento), lo mismo
aplica para el resto de propiedades, en el caso de estas sus tags serían: d1 a d6
para la densidad, p1 a p6 para el peso específico y v1 a v6 para el volumen
especifico, esto facilita bastante el trabajo de programación.
Resultado final
7
Código General
function varargout = TablaFluidos(varargin)
% TABLAFLUIDOS MATLAB code for TablaFluidos.fig
% TABLAFLUIDOS, by itself, creates sg1 new TABLAFLUIDOS or raises
the existing
% singleton*.
%
% H = TABLAFLUIDOS returns the handle to sg1 new TABLAFLUIDOS or the
handle to
% the existing singleton*.
%
% TABLAFLUIDOS('CALLBACK',hObject,eventData,handles,...) calls the
local
% function named CALLBACK in TABLAFLUIDOS.M with the given input
arguments.
%
% TABLAFLUIDOS('Property','Value',...) creates sg1 new TABLAFLUIDOS
or raises the
% existing singleton*. Starting from the left, property value pairs
are
% applied to the GUI before TablaFluidos_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property
application
% stop. All inputs are passed to TablaFluidos_OpeningFcn via
varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only
one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help TablaFluidos
% Last Modified by GUIDE v2.5 29-May-2020 23:36:11
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @TablaFluidos_OpeningFcn, ...
'gui_OutputFcn', @TablaFluidos_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
8
end
% End initialization code - DO NOT EDIT
% --- Executes just before TablaFluidos is made visible.
function TablaFluidos_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to TablaFluidos (see VARARGIN)
% Choose default command line output for TablaFluidos
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes TablaFluidos wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = TablaFluidos_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
function sg_Callback(hObject, eventdata, handles)
% hObject handle to sg (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of sg as text
% str2double(get(hObject,'String')) returns contents of sg as sg1
double
% --- Executes during object creation, after setting all properties.
function sg_CreateFcn(hObject, eventdata, handles)
% hObject handle to sg (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
9
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as
sg1 double
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as
sg1 double
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
10
%Gravedad Especifica
Sg = str2double(get(handles.sg,'string'));
set(handles.sg1,'string',Sg);
set(handles.sg2,'string',Sg);
set(handles.sg3,'string',Sg);
set(handles.sg4,'string',Sg);
set(handles.sg5,'string',Sg);
set(handles.sg6,'string',Sg);
%Densidad Sistema Absoluto
D1= Sg*1000;
set(handles.d1,'string',D1);
D2= Sg*1;
set(handles.d2,'string',D2);
D3= Sg*62.4;
set(handles.d3,'string',D3);
%Peso Especifico Sistema Absoluto
P1= Sg*9810;
set(handles.p1,'string',P1);
P2= Sg*981;
set(handles.p2,'string',P2);
P3= Sg*2009;
set(handles.p3,'string',P3);
%Peso Especifico Sistema Tecnico
P4= D1;
set(handles.p4,'string',P4);
P5= D2;
set(handles.p5,'string',P5);
P6= D3;
set(handles.p6,'string',P6);
%Densidad Sistema Tecnico
D4= P4/9.81;
set(handles.d4,'string',D4);
D5= P5/981;
set(handles.d5,'string',D5);
D6= P6/32.2;
set(handles.d6,'string',D6);
%Volumen Especifico Sistema Absoluto
V1= 1/D1;
set(handles.v1,'string',V1);
V2= 1/D2;
set(handles.v2,'string',V2);
V3= 1/D3;
set(handles.v3,'string',V3);
%Volumen Especifico Sistema Tecnico
V4= 1/D4;
set(handles.v4,'string',V4);
V5= 1/D5;
set(handles.v5,'string',V5);
V6= 1/D6;
set(handles.v6,'string',V6);
function edit4_Callback(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit4 as text
11
% str2double(get(hObject,'String')) returns contents of edit4 as
sg1 double
% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit5_Callback(hObject, eventdata, handles)
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit5 as text
% str2double(get(hObject,'String')) returns contents of edit5 as
sg1 double
% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit6_Callback(hObject, eventdata, handles)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit6 as text
% str2double(get(hObject,'String')) returns contents of edit6 as
sg1 double
12
% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit7_Callback(hObject, eventdata, handles)
% hObject handle to edit7 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit7 as text
% str2double(get(hObject,'String')) returns contents of edit7 as
sg1 double
% --- Executes during object creation, after setting all properties.
function edit7_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit7 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
% Hint: edit controls usually have sg1 white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
Código que hace los cálculos de la tabla
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in sg1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
En esta parte (Sg = str2double(get(handles.sg,'string'));) se guarda el
dato más importante, dentro de la variable “Sg”, así cuando el usuario
introduzca la gravedad específica dentro del recuadro “edit text”, además
13
de que tiene que ser convertido de un valor “str” a un valor numérico para
que se puedan llevar a cabo los cálculos en el resto del programa,
después este valor es introducido en cada uno de los cuadros de “static
text” con las etiquetas sg1 a sg6, a continuación se muestra el código que
realiza esto.
.
%Gravedad Especifica
Sg = str2double(get(handles.sg,'string'));
set(handles.sg1,'string',Sg);
set(handles.sg2,'string',Sg);
set(handles.sg3,'string',Sg);
set(handles.sg4,'string',Sg);
set(handles.sg5,'string',Sg);
set(handles.sg6,'string',Sg);
Dentro de esta parte se realizan los cálculos para obtener los valores de
densidad del fluido en el sistema absoluto de unidades, y estos valores se
guardan en las variables D1 a D3, donde el numero representa la columna
a la que pertenece el valor al que se le será asignado su cuadro de “static
text” (de d1 a d3).
%Densidad Sistema Absoluto
D1= Sg*1000;
set(handles.d1,'string',D1);
D2= Sg*1;
set(handles.d2,'string',D2);
D3= Sg*62.4;
set(handles.d3,'string',D3);
En este segmento se realizan los cálculos para obtener los valores de peso
específico del fluido en el sistema absoluto de unidades, y estos valores se
guardan en las variables P1 a P3, donde el numero representa la columna
a la que pertenece el valor al que se le será asignado su cuadro de “static
text” (de p1 a p3).
%Peso Especifico Sistema Absoluto
P1= Sg*9810;
set(handles.p1,'string',P1);
P2= Sg*981;
set(handles.p2,'string',P2);
P3= Sg*2009;
14
set(handles.p3,'string',P3);
En este segmento se realizan los cálculos para obtener los valores de peso
específico del fluido en el sistema tecnico de unidades, y estos valores se
guardan en las variables P4 a P6, donde el numero representa la columna
a la que pertenece el valor al que se le será asignado su cuadro de “static
text” (de p4 a p6).
%Peso Especifico Sistema Tecnico
P4= D1;
set(handles.p4,'string',P4);
P5= D2;
set(handles.p5,'string',P5);
P6= D3;
set(handles.p6,'string',P6);
Dentro de esta parte se realizan los cálculos para obtener los valores de
densidad del fluido en el sistema absoluto de unidades, y estos valores se
guardan en las variables D4 a D6, donde el numero representa la columna
a la que pertenece el valor al que se le será asignado su cuadro de “static
text” (de d4 a d6).
%Densidad Sistema Tecnico
D4= P4/9.81;
set(handles.d4,'string',D4);
D5= P5/981;
set(handles.d5,'string',D5);
D6= P6/32.2;
set(handles.d6,'string',D6);
En este segmento de código se utilizan los valores de D1 a D6 divididos
entre 1 par obtener los valores de volumen especifico del fluido en el
sistema absoluto y técnico de unidades, y estos valores se guardan en las
variables D1 a D3 (absoluto) y de D4 a D6 (técnico), donde el numero
representa la columna a la que pertenece el valor al que se le será
asignado su cuadro de “static text” (de d1 a d3 en absoluto y de d4 a d6
en técnico).
%Volumen Especifico Sistema Absoluto
15
V1= 1/D1;
set(handles.v1,'string',V1);
V2= 1/D2;
set(handles.v2,'string',V2);
V3= 1/D3;
set(handles.v3,'string',V3);
%Volumen Especifico Sistema Tecnico
V4= 1/D4;
set(handles.v4,'string',V4);
V5= 1/D5;
set(handles.v5,'string',V5);
V6= 1/D6;
set(handles.v6,'string',V6);
Ejemplos
1.- Calculo de “Aceite Mineral”, introducimos “0.91” y en la tabla aparece
la conversión a otros sistemas de unidades.
2.- Cálculo de “Gasolina”, introducimos “0.68” y en la tabla aparece la
conversión a otros sistemas de unidades.
16
3.- Cálculo de “Cloroformo”, introducimos “1.530” y en la tabla aparece la
conversión a otros sistemas de unidades.
4.- Cálculo de “Ácido Clorhídrico”, introducimos “0.7” y en la tabla
aparece la conversión a otros sistemas de unidades.
5.-Cálculo de “Diesel (Gasolina) ”, introducimos “0.880” y en la tabla
aparece la conversión a otros sistemas de unidades.
17
6.- Cálculo de “Mercurio”, introducimos “13.6” y en la tabla aparece la
conversión a otros sistemas de unidades. Este es bastante mayor que los
anteriores.
CONCLUSIÓN
Durante la realización de la GUIDE en Matlab buscábamos que el programa fuera
sencillo, pero a la vez cumpliera una importante función dentro de una materia que
pudiera ser relacionada con cálculos complejos, para de esta manera lograr
facilitarnos ciertos procesos, así fue como llegamos a la realización de una tabla
de propiedades de fluidos, ya que esta desplegaría las propiedades más
importantes de un fluido dependiendo de su gravedad especifica .Al inicio de este
Producto integrador de aprendizaje teníamos ideas muy diferentes sobre que
realizar, iniciamos con una calculadora simple, luego una calculadora científica; al
programar estas GUI nos fue más sencillo realizar la programación de las
operaciones las cuales nos daría por resultado las propiedades de los fluidos. Las
operaciones realizadas en el código de la GUI no son complejas pero debido a la
gran cantidad de estas fue una ardua labor el programarlas. En un inicio la tabla
de propiedades de fluidos facilitará los cálculos mediante la gravedad especifica y
reducirá el tiempo de cálculo de estas en la realización de trabajos relacionados
con FÍSICA, Mecánica de Fluidos, Potencia Fluida o Termodinámica. Al concluir
este producto integrador de aprendizaje reforzamos el uso de las operaciones y
cálculos en Matlab, también aprendimos el uso y funcionamiento de una GUI en
Matlab, lo cual nos ayudara en la creación de nuevos programas y facilitar
soluciones para problemas futuros.
18
BIBLIOGRAFÍAS
https://www.google.com/search?q=que+es+un+guide+en+matlab+png&tbm
=isch&ved=2ahUKEwi3rrLr7NzpAhUIYKwKHdFOAc4Q2-
cCegQIABAA&oq=que+es+un+guide+en+matlab+png&gs_lcp=CgNpbWcQ
A1CRIViHLmC6L2gAcAB4AIABaYgBgQOSAQMzLjGYAQCgAQGqAQtnd3
Mtd2l6LWltZw&sclient=img&ei=7vrSXrf_KYjAsQXRnYXwDA&bih=821&biw
=1440&rlz=1C5CHFA_enMX895MX895#imgrc=aaQOpuHFm38cuM
http://bibing.us.es/proyectos/abreproy/11986/fichero/CAP%C3%8DTULO+3
%252FCAP%C3%8DTULO+3.pdf
19