Sei sulla pagina 1di 38

MATLAB - ARDUINO

MATLAB
ARDUINO

MATLAB - ARDUINO
Copiamos el archivo arduinoIO dentro de la carpeta de MATLAB que est
en mis documentos.

Extraemos el archivo y luego nos dirigimos a nuestro IDE de arduino.


Dentro del IDE, nos dirigimos a la carpeta de arduinoIO descomprimida,
luego a la carpeta pde/adiosrv y finalmente abrimos el archivo adiosrv.
Este ser el cdigo que me permitir tener el control de mi tarjeta arduino
pero usando comandos desde MATLAB.

Cargamos este programa a la tarjeta arduino, en nuestro caso ser un


arduino UNO.

Nos dirigimos hacia nuestro programa MATLAB y verificamos que en


Current Folder tengamos asignada la direccin de MATLAB en la cual
tenemos nuestra carpeta arduinoIO,
Ejemplo:

C:\Users\JHON\Documents\MATLAB

MATLAB - ARDUINO

Podemos observar que en la seccin Current Folder se muestran los


archivos que estn dentro de la carpeta MATLAB , el archivo arduinoIO se
nota algo transparente eso quiere decir que no est dentro de los campos
donde puede trabajar MATLAB entonces necesitamos agregarlo. Usaremos
la forma ms sencilla haciendo click derecho y siguiendo estos pasos:
Add to Path / Selected Folders and Subfolders

Para poder estar seguros que se agregaron estas carpetas y subcarpetas


nos dirigimos a File / Set Path :

MATLAB - ARDUINO

Y podemos observar que se agrgaron todo lo que

Terminado ese paso vemos que la carpeta ya la carpeta arduinoIO esta


agregada a los campos de trabajo en MATLAB.

Si desligamos y vemos el contenido de la carpeta arduinoIO vemos que


tiene muchos archivos tanto ejemplos como el cdigo que cargamos a
nuestra tarjeta arduino.

MATLAB - ARDUINO
Observamos un archivo install_arduino.m , este debemos llamarlo dentro de
la ventana de comandos de MATLAB con el fin de que todos estos archivos
contenidos sean agregados correctamente y podremos verificar ello al
visualizar el siguiente mensaje.

Ya esta todo listo para comunicarnos con nuestra tarjeta arduino, pero antes
debemos conocer le puerto COM asignado a la tarjeta eso lo hacemos
entrando al Administrador de equipos / Administrador de
dispositivos.

En este caso se asign el COM18.


Conociendo ya lo que es el puerto serie (COM18) nos dirigimos a nuestro
entorno en MATLAB Lo primero sera hacer pruebas de comunicacin, para
ello en la ventana de comandos usamos la siguiente instruccin:
ino = arduino(COM18)
Creamos un objeto llamado ino y le asignamos el puerto COM a utilizar.
Ejecutamos esta instruccin y si observamos nuestra tarjeta veremos que
los pines Tx y Rx se activan por unos momentos. Dentro de MATLAB
tambin vemos que est en la bsqueda de nuestra tarjeta.
Si los pasos anteriores fueron correctos
mensaje, en el cual nos da informacin
arduino. Tambin los pines que tenemos
instrucciones que podemos usar dentro
arduino.

debera mostrarnos el siguiente


de que encontr un script en el
disponibles y finalmente algunas
de MATLAB para el control del

MATLAB - ARDUINO

NOTA: PODEMOS OBSERVAR A LA DERECHA EN LA VENTANA


WORKSPACE EL OBJETO CREADO LLAMADO ino

Para iniciar con la programacin via MATLAB usaremos instrucciones muy


parecidas a las que se usan en arduino .
Por ejemplo para prender el LED del pin 13 que viene por defecto en
nuestra tarjeta , tambin podemos usar cualquier otro . Mandamos la
siguiente instruccin:

ino.pinMode(13,ouput) : Este comando, configura el pin 13 de la tarjeta


Arduino, como salida digital.
ino.digitalWrite(13,1): Pone en alto el pin 13.
Anlogamente usar ino.digitalWrite(13,0) : Pone el pin 13 en estado bajo.
Si deseamos hacer por ejemplo el Blink de led es mejor usar el editor de
MATLAB ya que si usamos
la ventana de comandos ya no podramos hacer
% Blink
algn cambio por ejemplo
de algn pin o el tiempo de encendido y apagado.
ino.pinMode(13,'output');
while 1
ino.digitalWrite(13,1);
pause(1); % retardo 1 seg.
ino.digitalWrite(13,0);
pause(1); % retardo 1 seg.
end

MATLAB - ARDUINO

Nota: Para salir del bucle presionamos CONTROL+C .


Ahora debemos tener en cuenta que lo nico que podra interferir con
nuestra programacin ser querer abrir nuevamente el puerto que
asignamos ocasionando el siguiente error.

Este mensaje se muestra ya que tenemos el puerto abierto y se est


utilizando. Si deseramos terminar la comunicacin con la tarjeta arduino
deberemos colocar el siguiente comando:
Debemos eliminar el objeto arduino que creamos al cual llamamos ino .

Al ejecutar este comando podemos observar que el objeto que tenamos en


la ventana WORKSPACE (ventana donde se guardan variables y
objetos) ya no aparece.
Si tenemos algn problema con lo anterior podemos usar la otra alternativa
ya con comandos puro en MATLAB y de la misma manera eliminar el puerto
serie que estbamos usando.
delete(instrfind({'Port'},
{'COM18'}))
LECTURA DE LOS PINES DIGITALES
Tambin podemos leer que valor tiene en algn momento unos de los pines
digitales usando el comando digitalRead() , dela siguiente manera

MATLAB - ARDUINO

ESCRITURA DIGITAL DE SALIDA: Ya vimos esta parte


Si un pin ha sido configurado como salida, para colocar un estado alto 1 o
bajo 0 en dicha salida, se usa el comando:
ino.digitalWrite(13, 1)
ino.digitalWrite(13, 0)

LECTURA DE ENTRADA ANLOGA


Las entradas anlogas, son pines de la tarjeta Arduino, que pueden recibir
voltajes en un rango de 0 a 5 voltios. tiles cuando se requiere un sensor
que represente el valor de una variable anloga, como por ejemplo: la
temperatura. Suministran un valor entero entre 0 y 1023, proporcional al
valor de voltaje de la entrada anloga. El comando para leer es:
ino.analogRead(0);
Ejemplo:

clc ; clear all; close all;


ino = arduino('COM18');
% creacion de objeto
ino
lectura=ino.analogRead(0);
fprintf('Lectura tomada : %i\n',lectura);

MATLAB - ARDUINO

Nota : fprintf (%i,variable) ; para imprimir una variable


colocamos el tipo de la variable y que variable deseamos imprimir.

DETECCIN DE MOVIMIENTO:
Usando el sensor PIR , mandaremos el mensaje detectado!! , cuando sea
detectado algn movimiento.
clc ; clear all; close all;
ino=arduino('COM18');
ino.pinMode(8,'input');%definimos pin8 como entrada
while 1
sensor=ino.digitalRead(8);
if sensor==1
fprintf('detectado!!\n');
end
if sensor==0
fprintf('Nada!!\n');
end
pause(0.1);
end

MATLAB - ARDUINO

Lectura de seal
ARDUINO

analgica con SIMULINK-

MATLAB - ARDUINO

Uso del sensor PIR , grfica del pin de dato (ALTO - BAJO)

MATLAB - ARDUINO

Display ctodo comn


Este ejemplo muestra un mensaje HOLA con un retardo de un
tiempo T por letra.
ARDUIN

DISPLAY

clc;clear all;close all;


O

ino=arduino('COM18');
3
B
T=0.5; % Tiempo en segundos
% Declaracion de salidas
4 para uso de
C DISPLAY
ino.pinMode(2,'output'); % A
5 % B
D
ino.pinMode(3,'output');
ino.pinMode(4,'output');
%
C
6
E
ino.pinMode(5,'output'); % D
7
G
ino.pinMode(6,'output'); % E
ino.pinMode(7,'output');
8 % F
F
ino.pinMode(8,'output'); % G
while 1 % Mensaje HOLA
%H
ino.digitalWrite(2,0);
ino.digitalWrite(3,1);
ino.digitalWrite(4,1);
ino.digitalWrite(5,0);
ino.digitalWrite(6,1);
ino.digitalWrite(7,1);
ino.digitalWrite(8,1);
pause(T);
%O
ino.digitalWrite(2,1);
ino.digitalWrite(3,1);
ino.digitalWrite(4,1);
ino.digitalWrite(5,1);
ino.digitalWrite(6,1);
ino.digitalWrite(7,1);
ino.digitalWrite(8,0);
pause(T);
%L
ino.digitalWrite(2,0);
ino.digitalWrite(3,0);
ino.digitalWrite(4,0);
ino.digitalWrite(5,1);
ino.digitalWrite(6,1);
ino.digitalWrite(7,1);
ino.digitalWrite(8,0);
pause(T);
%A
ino.digitalWrite(2,1);
ino.digitalWrite(3,1);
ino.digitalWrite(4,1);
ino.digitalWrite(5,0);
ino.digitalWrite(6,1);
ino.digitalWrite(7,1);
ino.digitalWrite(8,1);
pause(T);

%
%
%
%
%
%
%

A
B
C
D
E
F
G

%
%
%
%
%
%
%

A
B
C
D
E
F
G

%
%
%
%
%
%
%

A
B
C
D
E
F
G

%
%
%
%
%
%
%

A
B
C
D
E
F
G

MATLAB - ARDUINO

SERVO:
Para el uso de los servomotores con ayuda de la librera arduinoIO ,
necesitamos cargar otro cdigo en la tarjeta arduino ,el cual est dentro de
la carpeta arduinoIO , pdr , llamado motorsrv .
Pero antes de abrir ese archivo necesitamos una librera llamada AFMotor ,
esta librera est diseada en realidad para usar un shield de ADAFRIUT ,
como el que se puede observar :

Solo nos basta descargar la librera y luego colocarla dentro la carpeta


llamada libraries.
Link: https://github.com/adafruit/Adafruit-Motor-Shield-library

MATLAB - ARDUINO

Luego de ello ahora nos dirigimos a nuestro entorno de arduino, abrimos el


archivo motorsrv y lo cargamos a nuestra tarjeta.

MATLAB - ARDUINO
Terminado ello, ya podremos tener el control de los servomotores, como
mximo dos , de ello parte que el uso del arduinoIO me limita poder
tener el control de los pines totales o su funcionalidad como tal.

clc;clear all;close all;


ino=arduino('COM18');
fprintf('Control de servomotor\n');
ino.servoAttach(1); % activa el servo1 en el pin 10
ino.servoAttach(2); % activa el servo1 en el pin 9
ino.servoStatus;
% el estado de los pines usados para servos
ino.servoWrite(1,0); % posicin inicial para ambos servos
ino.servoWrite(2,0);
while 1
angulo1=input('Ingrese angulo de servo1: ');
angulo2=input('Ingrese angulo de servo2: ');
ino.servoWrite(1,angulo1);
ino.servoWrite(2,angulo2);
pause(1);
end

MATLAB - ARDUINO
Arduino y GUIDE:
Este ejemplo consistir en obtener los valores presentes en los pines
analgicos de nuestra tarjeta ARDUINO. Crearemos una interfaz para su
visualizacin y un botn el cual me permita actualizar los datos.
Para ingresar al GUIDE que nos ofrece Matlab podemos hacerlo de dos
formas:
Escribiendo en la lnea de comandos:

guide

O dirigindonos en la parte superior del men y escoger: GUIDE

Obteniendo esta nueva ventana:

Dentro de esta ventana seleccionamos:

MATLAB - ARDUINO
Blank GUI (Default): La opcin de interfaz
grfica
de
usuario
en
blanco
(viene
predeterminada), nos presenta un formulario
nuevo, en el cual podemos disear nuestro
programa.

Primero colocamos un panel el cual contendr


todas mis ventanas, textos o botones que
podamos crear.

Al hacer
doble
nos
aparecer
propiedades
del
podemos cambiar
como el color, el
contenido , y el
asigna cuando se

click al panel creado,


una ventana con las
mismo.
En
ella
algunos
parmetros
tamao de la letra , el
nombre que se le
crea ( tag )

MATLAB - ARDUINO
Seguimos agregando ms cosas a nuestro interfaz como podra ser el ttulo
con un Static Text

MATLAB - ARDUINO

Seguimos agregando, cajas de texto y un botn que me permitir actualizar


los datos:
Obteniendo como resultado la siguiente interfaz:

MATLAB - ARDUINO
Esta interfaz an no tiene alguna utilidad solo me muestra lo que yo eh
creado en mi entorno del GUIDE.
A continuacin si nos dirigimos a MATLAB podemos ver que se ha creado un
cdigo para nuestra interfaz. Este cdigo encierra las caractersticas o
valores que se han asignado para la creacin de la ventana. Y tambin
podemos detallar aquellas funciones que en realidad son subrutinas que se
ejecutaran cuando se produzca el evento dependiendo de la programacin
que se le d.

Lo%siguiente
es tener
que deseamos
realizar:to the command line.
--- Outputs
fromclaro
thislofunction
are returned

function varargout = guide_pines_analogicos_OutputFcn(hObject,


eventdata,
handles)los valores presentes en las entradas analgicas
Mostraremos
% varargout cell array for returning output args (see VARARGOUT);
de la tarjeta arduino.
% hObject
handle to figure
Para actualizar
la of
ayuda
del
% eventdata
reserved estos
- to bedatos,
definedloinharemos
a future con
version
MATLAB
% handles
structure
with
handles
and
user
data
(see
GUIDATA)
botn
ACTUALIZAR.
% Get default command line output from handles structure
varargout{1}
= lo
handles.output;
Primeramente
que haremos es conectar nuestro GUIDE con la placa

arduino es por ello que nos dirigimos hacia la parte final del cdigo que
me grafica
la ventana
con,
textos, botones, etc., y agregamos las
global
ino; toda
% variable
global
ino
siguientes
lneas.
global
lect_A0;
global
global
global
global
global

lect_A1;
lect_A2;
lect_A3;
lect_A4;
lect_A5;

ino=arduino('COM6'); % creacion de objeto


lect_A0=ino.analogRead(0);
lect_A1=ino.analogRead(1);
lect_A2=ino.analogRead(2);
lect_A3=ino.analogRead(3);
lect_A4=ino.analogRead(4);
lect_A5=ino.analogRead(5);
set(handles.lectura_A0,'String',lect_A0);
set(handles.lectura_A1,'String',lect_A1);
set(handles.lectura_A2,'String',lect_A2);
set(handles.lectura_A3,'String',lect_A3);
set(handles.lectura_A4,'String',lect_A4);
set(handles.lectura_A5,'String',lect_A5);

MATLAB - ARDUINO

Las lneas de rojo me indicaran a partir de donde yo debo de agregar.


Primero creamos la variable global ino, lect_A0, lect_A1, lect_A2, lect_A3,
lect_A4, lect_A5, lo cual me permitir que sean usadas en todas las
funciones que tenemos.
Seguidamente creamos el objeto ino y le asignamos el puerto al que
tenemos nuestro arduino en mi caso es el COM6.
Tomamos lecturas de los pines analgicos y lo guardamos en las variables
que habamos creado.
Seguidamente
estas
cantidades
numricas
las seteamos en cada cuadro de
% --- Executes
on button
press
in boton_actualizar.
texto
vaco boton_actualizar_Callback(hObject,
que tambin creamos en nuestro guide.
function
eventdata, handles)
% hObject

handle to boton_actualizar (see GCBO)

% eventdata
- to
defined in pero
a future
of MATLAB
Con
lo anterior reserved
ya tenemos
la be
visualizacin,
ahoraversion
estos datos
estarn
%
handles
structure
with
handles
and
user
data
(see
GUIDATA)
cambiando constantemente, es por ello que usamos un botn para la
global ino;
actualizacin.
global lect_A0;
global lect_A1;

Nos
dirigimos
a la funcin de nuestro botn y agregamos algo similar a lo
global
lect_A2;
global lect_A3;
anterior.
global lect_A4;
global lect_A5;

%tomamos nuevas lecturas


lect_A0=ino.analogRead(0);
lect_A1=ino.analogRead(1);
lect_A2=ino.analogRead(2);
lect_A3=ino.analogRead(3);
lect_A4=ino.analogRead(4);
lect_A5=ino.analogRead(5);
set(handles.lectura_A0,'String',lect_A0);
set(handles.lectura_A1,'String',lect_A1);
set(handles.lectura_A2,'String',lect_A2);
set(handles.lectura_A3,'String',lect_A3);
set(handles.lectura_A4,'String',lect_A4);
set(handles.lectura_A5,'String',lect_A5);

MATLAB - ARDUINO

Declaramos las variables globales con el fin de poder usarlas dentro de esta
funcin , luego tomamos las lecturas y las mostramos en los cuadros vacos.
lectura_A0, lectura_A1, lectura_A2, lectura_A3, lectura_A4, lectura_A5
Son los nombres de las cuadros vacos, a cada uno le seteamos la
lectura de cada pin analgico.
Para finalizar, lo que podemos agregar es que al cerrar la ventana de nuestro GUIDE
creado, se pueda tambin finalizar la comunicacin serial establecida entre MATLAB
y arduino.
Es por ello que hacemos uso de la siguiente funcin Buscamos CloseRequestFcn,
para encontrarla hacemos doble click en el rea de trabajo que nos ofrece
inicialmente el guide (la cuadricula).

Buscamos CloseRequestFcn y hacemos click en el icono del lpiz con hoja.


Notaremos que se crea una funcin dentro del cdigo de nuestro GUIDE que
estbamos anteriormente configurando.

MATLAB - ARDUINO

Esta nueva funcin nos ayudara mucho, ya que si nosotros cerramos el guide sin
haber terminado la comunicacin, dejaramos el puerto serial abierto. Entonces con
el uso de esta funcin la cual se ejecuta cuando se cierra la interfaz creada,
hacemos que se termine la comunicacin serial.
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject
handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of
MATLAB
% handles
structure with handles and user data (see
GUIDATA)
% Hint: delete(hObject) closes the figure
delete(hObject);

Lo que agregamos a nuestro cdigo de esta funcin es lo siguiente:


% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject
handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of
MATLAB
% handles
structure with handles and user data (see
GUIDATA)

delete(instrfind({'Port'},{'COM6'}));
% Hint: delete(hObject) closes the figure
delete(hObject);

MATLAB - ARDUINO
Resultado:

AGREGANDO IMGENES A NUESTRO GUIDE:


Para agregar imgenes o graficas de alguna funcin, hacemos uso de la
herramienta axes presente en la paleta del guide.

Al colocarla se asignara un nombre para el espacio de nuestra grfica, en


realidad esta herramienta sirve para plotear alguna funcin o seal, pero sin

MATLAB - ARDUINO
ningn problema tambin la podemos usar para colocar una imagen en esa
caja que nos ofrece

Al entrar a sus propiedades de este bloque, observamos algunos parmetros


que podramos editar pero por ahora solo debemos verificar el nombre
asignado al componente, el cual lo encontramos en la seccin tag :
axes1.

Confirmado ello, ya podremos hacer una pequea aplicacin. Sera una


interfaz la cual me muestre fotografas, las cuales podrn pasar y
retroceder con la ayudas de botones.
Primero, guardamos una cantidad de imgenes dentro de la carpeta de
MATLAB (podemos crear una subcarpeta.

MATLAB - ARDUINO

Luego nos dirigimos a nuestro entorno de MATLAB y debemos agregar la


carpeta que contiene nuestras imgenes a los dominios de MATLAB:

Estas imgenes son las que usaremos. Posterior a ello nos dirigimos a
nuestro cdigo generado para la pequea interfaz que creamos con el
function
axes. guide_axes_1_OpeningFcn(hObject, eventdata, handles, varargin)
%
%
%
%
%

This function has no output args, see OutputFcn.


hObject
to figureuna de estas imgenes hacemos uso de los
Por
ejemplohandle
para agregar
eventdata reserved - to be defined in a future version of MATLAB
siguientes
comandos
debemos
handles
structureestos
with los
handles
and agregar:
user data (see GUIDATA)
varargin
command line arguments to guide_axes_1 (see VARARGIN)

% Choose default command line output for guide_axes_1


handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes guide_axes_1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% imagen1

img1=imread('imagen1.jpg');
axes(handles.axes1);
image(img1);
axis off;

MATLAB - ARDUINO

Nota: Se coloca en esta seccin de funcin guide_axes_1_OpeningFcn


porque me permite configurar mi ventana antes de hacerla visible.

Podemos agregarle botones a nuestro guide de la siguiente manera:

Lo siguiente ser la programacin de los botones, que como puede


observarse me permitir un cambio de la imagen tanto posterior y anterior.
Antes de hacer lo anterior primeramente hacemos es que al mostrarse
nuestro guide de imgenes, presente una imagen inicial. Eso lo hacemos
agregando unas lneas de cdigo. Estas lneas lo que hacen es leer mi
imagen con la que iniciare y luego la coloca en el espacio creado por el
axes.
% --- Executes just before guide_axes_1 is made visible.

function guide_axes_1_OpeningFcn(hObject, eventdata, handles, varargin)


%
%
%
%
%

This function has no output args, see OutputFcn.


hObject
handle to figure
eventdata reserved - to be defined in a future version of MATLAB
handles
structure with handles and user data (see GUIDATA)
varargin
command line arguments to guide_axes_1 (see VARARGIN)

% Choose default command line output for guide_axes_1


handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes guide_axes_1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
global img;
global n;
% imagen1
img=imread('imagen1.jpg');
n=2; % variable que me colocara en la imagen 2 al presionar el boton posterior
axes(handles.axes1);
image(img);
axis off;

MATLAB - ARDUINO

Para el botn posterior agregamos los casos para ir cambiando la imagen


cada vez que suceda el evento.
% --- Executes on button press in boton_posterior.

function boton_posterior_Callback(hObject, eventdata, handles)


% hObject
% eventdata
% handles

handle to boton_posterior (see GCBO)


reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)

global img;
global n;
switch n
case 1
img=imread('imagen1.jpg');
case 2
img=imread('imagen2.jpg');
case 3
img=imread('imagen3.jpg');
case 4
img=imread('imagen4.jpg');
case 5
img=imread('imagen5.jpg');
end
n=n+1;
if n==6
n=1;
endPara el botn anterior tenemos:
axes(handles.axes1);
image(img);
%
---off;
Executes on button press in boton_anterior.
axis

function boton_anterior_Callback(hObject, eventdata, handles)


% hObject
% eventdata
% handles

handle to boton_anterior (see GCBO)


reserved - to be defined in a future version of MATLAB
structure with handles and user data (see GUIDATA)

global img;
global n;
switch n
case 1
img=imread('imagen4.jpg');
case 2
img=imread('imagen5.jpg');
case 3
img=imread('imagen1.jpg');
case 4
img=imread('imagen2.jpg');
case 5
img=imread('imagen3.jpg');
end
n=n-1;
if n==0
n=5;
end
axes(handles.axes1);
image(img);
axis off;

MATLAB - ARDUINO

Obteniendo:

Lo siguiente ser acoplar el arduino, con la finalidad de ahora usar dos


pulsadores para el cambio de imagen.
En el pin2 ser para la anterior, y el pin3 para posterior.
Circuito:

Creamos nuestro guide el cual contendr las imgenes que deseamos


mostrar:

MATLAB - ARDUINO

Colocamos nuestro cdigo en esta seccin ya que es necesario primero


conectarme con nuestra tarjeta arduino y seguidamente mostrar una
imagen de inicio.

% --- Executes just before guide_axes_con_arduino is made visible.


function guide_axes_con_arduino_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject
handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% varargin
command line arguments to guide_axes_con_arduino (see VARARGIN)
% Choose default command line output for guide_axes_con_arduino
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes guide_axes_con_arduino wait for user response (see UIRESUME)
% uiwait(handles.figure1);
global ino; % variable global que me permite usarla en otras funciones del programa
ino=arduino('COM33');
% creacin de objeto ino
ino.pinMode(3,'input'); % pulsador posterior
% imagen1
img=imread('imagen1.jpg'); %
axes(handles.axes1);
image(img);
axis off;

imagen de inicio

% logo arduino
img1=imread('logo_arduino.png');
axes(handles.axes2);
image(img1)
axis off;
% logo matlab
img2=imread('logo_matlab.png');
axes(handles.axes3);
image(img2)
axis off;

MATLAB - ARDUINO

function varargout = guide_axes_con_arduino_OutputFcn(hObject, eventdata, handles)


% varargout cell array for returning output args (see VARARGOUT);
% hObject
handle to figure
% eventdata reserved - to be defined in a 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;
global ino;
n=1;
while 1
post=ino.digitalRead(3); % pulsador posterior
ant=ino.digitalRead(2); % pulsador anterior
pause(0.1);
if ant==0
n=n-1;
end
if n==0
n=5;
end
if post==0
n=n+1;
if n==6
n=1;
end
end
switch n
case 1
img=imread('imagen1.jpg');
case 2
img=imread('imagen2.jpg');
case 3
img=imread('imagen3.jpg');
case 4
img=imread('imagen4.jpg');
case 5
img=imread('imagen5.jpg');
end
axes(handles.axes1);
image(img);
axis off;

No olvidndonos de crear la funcin para cerrar el puerto a la vez que se cierra el


guide.
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject
handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
delete(instrfind({'Port'},{'COM33'}));
% Hint: delete(hObject) closes the figure
delete(hObject);

MATLAB - ARDUINO

GUIDE CONTROL SERVOMOTOR:


Creamos nuestro guide, y usaremos para el cambio del ngulo de nuestro
motor un slider.
Como sabemos servomotores giran de 0 a 180 grados, entonces este slider
deber tomar como mnimo un valor de 0 y como mximo un valor de 180
(valor extremos).

Entonces, configuramos las propiedades del slider para tener valores de 0 a


180.

MATLAB - ARDUINO
Tambin hacemos que este slider tenga un evento o rutina a la hora de
ocasionar algn cambio en su barra. Solo damos click derecho, View
Callbacks, Callback.

La programacin:
Lo primero que hacemos es dirigirnos a la funcin la cual me da la apertura
a la creacin de mi interfaz, dentro de ella colocamos unas imgenes base
las cuales terminada esta funcin sern visualizadas en nuestro GUIDE.
% --- Executes just before guide_control_servo_slider is made visible.
function guide_control_servo_slider_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject
handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% varargin
command line arguments to guide_control_servo_slider (see VARARGIN)
% Choose default command line output for guide_control_servo_slider
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes guide_control_servo_slider wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% logo arduino
img1=imread('logo_arduino.png');
axes(handles.axes1);
image(img1)
axis off;
% logo matlab
img2=imread('logo_matlab.png');
axes(handles.axes2);
image(img2)
axis off;
% servo
img3=imread('servo_imagen.jpg');
axes(handles.axes3);
image(img3)
axis off;

% --- Outputs from this function are returned to the command line.
function varargout = guide_control_servo_slider_OutputFcn(hObject, eventdata, handles)
Despus te tener las imgenes mostradas lo que se hace es ya
% varargout cell array for returning output args (see VARARGOUT);
% iniciar
hObject la comunicacin
handle to figurecon arduino.
% eventdata reserved - to be defined in a 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;
global ino; % variable global ino
ino=arduino('COM33'); % creacion de objeto
ino.servoAttach(1); % activa el servo1 en el pin 10

MATLAB - ARDUINO

Seguidamente dentro de esa funcin llamada slider1_Callback lo que


hacemos es colocar las siguientes lneas de cdigo, se observa que esta funcin
ocurrir cuando se produzca algn movimiento en el slider.
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject
handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
%
get(hObject,'Min') and get(hObject,'Max') to determine range of slider
global ino;
global angulo;
handles.slider1 = get(hObject,'Value');
angulo = round(handles.slider1);
ino.servoWrite(1,angulo);

Y nunca olvidndonos de cerrar el puerto.


% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject
handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
delete(instrfind({'Port'},{'COM33'}));
% Hint: delete(hObject) closes the figure
delete(hObject);

Comunicacin Serial:
La comunicacin serial se da cuando trasferimos datos de bit a bit en un
tiempo determinado, uno despus de otro.
Matlab puede enviar y recibir datos por el puerto serie de la computadora y
acceder a eso.

MATLAB - ARDUINO
Buffer:
Es el muy importante entender la naturaleza del buffer para que luego no
tengamos algn problema (error) al escribir nuestro cdigo.
Existen dos buffer, uno para el envio y el otro para recepcin de datos.
Luego los daos se almacenan en una lista llamada buffer
El buffer tiene un tamao finito.
Buffer:
Inicia el buffer vaco.
Cada nuevo valor que llega es almacenado dentro de una lista, donde el
ltimo valor que recibimos se coloca en la parte inferior de esta lista(los
datos ms recientes).
Si mi programa est listo para leer los datos almacenados, se sita en la
parte superior de la lista (datos ms antiguos).
Una vez que se lee un byte de datos, este se borra automticamente del
buffer.
Los datos que son los siguientes en leer se colocan en la posicin superior
cuando ocurre lo anterior.
Tan pronto como el buffer est lleno y se enva ms datos, el ms antiguo
datos se descarta para hacer espacio para nuevos datos.
Configurando el puerto serial:
Primeramente nosotros necesitamos crear un objeto serial esto lo hacemos
de la siguiente manera.

Este comando lo que hace es crear un objeto serial llamo ino en el


COM20. No es necesario tener aun conectado un dispositivo que tenga
asignado ese puerto. Nosotros podemos crear los puerto serie que
deseemos pero solo vamos a poder comunicarnos con uno eso lo veremos
un poco ms adelante.

Este objeto serial llamado ino toma algunos parmetros por defecto.
Como la velocidad de transmisin, el timeout, los bits de transmisin, etc.
Colocando el nombre del objeto podemos ver algunas configuraciones
bsicas de nuestro objeto serial.

MATLAB - ARDUINO

Hasta ahora no hemos configurado o iniciamos la comunicacin serial solo


hemos creado un objeto que nos permitir a nosotros configurarle los
parmetros, a su vez leer y enviar datos.
Cambiando la velocidad de transmisin:
Por defecto se adopta a una velocidad de 9600 baudios (bits/seg).Par
configurarla lo hacemos de la siguiente manera.

Tambin podemos hacerlo justo al iniciar nuestro objeto serial:

Y para visualizar el cambio colocamos nuevamente ino en la ventana de


comandos.

Verificando cambios usando get:


Usamos el mtodo get para obtener algn parmetro que se haya podido
configurar.

MATLAB - ARDUINO

Tambin:

Verificando el estado de conexin:

Recibiendo datos de arduino.


En el arduino escribimos el siguiente cdigo:

MATLAB - ARDUINO

En el editor de MATLAB:
clc;clear all;close all;
ino=serial('COM33'); % objeto serial asociado al COM33
("ARDUINO")
ino.Baudrate=9600; % colocamos a una velocidad de 9600
baudios
fopen(ino); % abrimos el objeto serial asociado al
objeto ino
data=fscanf(ino); % leemos el dato enviado
disp(data); % mostramos data adquirida

Obteniendo:

GUIDE DETECTOR DE COLORES RGB

Potrebbero piacerti anche