Вы находитесь на странице: 1из 11

Para la comunicación matlab arduino.

Se debe descargar previamente una carpeta de la pagina


http://www.mathworks.com/academia/arduino-software/arduino-
matlab.html donde se encuentra la librería arduino.m, donde la
comunicación arduino-matlab ya esta creada. Se ejecuta el archivo
install_arduino.m en matlab y el siguiente paso es correr el
programa arduino.m que nos permite la conexión entre el matlab y
nuestra tarjeta arduino.

Programación en matlab
Para la realización del código en matlab estos son los los
comandos principales a utilizar:

Borrar cualquier comunicación existente entre matlab y el puerto


USB
delete(instrfind({'Port'},{'COM4'}))

Crear una variable global y utilizar la librería arduino.m


especificando el puerto COM a utilizar
global variable;
variable = arduino('puerto COM a utilizar');

Declarar los pines del arduino como salidas o entradas según sea
el caso, esto es por medio del comando pinMode
variable.pinMode(numero de pin, 'output o input');

Para indicar a arduino que coloque una pin en estado alto o bajo
se utiliza el comando digitalWrite seguido del numero de pin a
utilizar y el valor digital que deseamos que represente 0 ó 1;

Variable.digitalWrite(pin, salida);
Borrar Crear variable
comunicaciones global
existentes

Declarar el
puerto com a
utilizar

Relizar la Declarar
programación entradas y
salidas
Programación en arduino
Para la programación del arduino, dentro de la carpeta descargada
anteriormente se busca el archivo adiosrv.pde se abre y se carga
en el arduinio, que simplemente lee los datos recibidos por el
matlab por medio del puerto USB.

Programación en picc.
el pic se encarga de interpreta los resultado del arduino,
mostrado en la tablilla de leds y codificarlos a un lenguaje
mejor entendido por el operador esto es en un mensaje de
texto mostrado en una pantalla de cristal liquido. Esto es
conectando las salidas del arduino con los pines que
declaramos de entrada en el microcontrolador.

Mostrar un Evaluar las


mensaje de entradas
verificacion

Revisar las
condiciones

Mostrar el Borrar los


resultado de la mensajes de la
evaluación. pantalla
DIAGRAMA

MATLAB

ARDUINO

MICROCONTROLADOR
PROGRAMA MATLAB
global a;
axes(handles.axes2)
fondo=imread('fondo.jpg');
image(fondo);
axis off
a.digitalWrite(10,0);
a.digitalWrite(11,0);
a.digitalWrite(12,0);
a.analogWrite(3,40);
x=0;
vid=videoinput('winvideo',1);
while (x==0)
val=a.digitalRead(2);
if(val==0)
x=0;
elseif(val==1)
x=1;
end
end
pause(1);
c=getsnapshot(vid);
a.analogWrite(3,0);
RGB=c;
axes(handles.axes2)
image(c);
axis off
c1=c(:,:,1);
c2=c(:,:,2);
c3=c(:,:,3);
x1=mean2(c1)
x2=mean2(c2)
x3=mean2(c3)
I = rgb2gray(RGB);
threshold = graythresh(I);
BW = not(im2bw(I,threshold));
bw = bwareaopen(BW,1500);
se = strel('disk',2);
bw = imclose(bw,se);
bw = imfill(bw,'holes');
[B,L] = bwboundaries(bw,'noholes');
figure; imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1),'w','LineWidth', 4)
end
stats = regionprops(L,'Area','Centroid');
threshold = 0.94;
metric=0;
for k = 1:length(B)
boundary = B{k};
delta_sq = diff(boundary).^2;
perimeter = sum(sqrt(sum(delta_sq,2)));
area = stats(k).Area;
metric = 4*pi*area/perimeter^2
metric_string = sprintf('%2.2f',metric);
if metric > threshold
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'ko');
end
text(boundary(1,2)-
35,boundary(1,1)+13,metric_string,'Color','y','FontSize',14,
'FontWeight','bold');
end
title(['La métrica indica que conforme se acerca a 1 ','el
objeto es más redondo']);
if (metric>0.8)
fprintf('circulo ')
forma=1;
elseif (metric<0.8 && metric>0.6)
fprintf('cuadro ')
forma=2;
elseif (metric<0.6)
fprintf('triangulo ')
forma=3;
end
if (x1>x2) && (x1>x3)
fprintf('rojo\n')
a.digitalWrite(10, 1);
if (forma==1)
a.digitalWrite(7, 1);
elseif (forma==2)
a.digitalWrite(8, 1);
elseif (forma==3)
a.digitalWrite(9, 1);
end
pause(5);
a.digitalWrite(7, 0);
a.digitalWrite(8, 0);
a.digitalWrite(9, 0);
a.digitalWrite(10, 0);
elseif (x2>x1) && (x2>x3)
fprintf('verde\n')
a.digitalWrite(11, 1);
if (forma==1)
a.digitalWrite(7, 1);
elseif (forma==2)
a.digitalWrite(8, 1);
elseif (forma==3)
a.digitalWrite(9, 1);
end
pause(5);
a.digitalWrite(7, 0);
a.digitalWrite(8, 0);
a.digitalWrite(9, 0);
a.digitalWrite(11, 0);
elseif (x3>x1) && (x3>x2)
fprintf('azul\n')
a.digitalWrite(12, 1);
if (forma==1)
a.digitalWrite(7, 1);
elseif (forma==2)
a.digitalWrite(8, 1);
elseif (forma==3)
a.digitalWrite(9, 1);
end
pause(5);
a.digitalWrite(7, 0);
a.digitalWrite(8, 0);
a.digitalWrite(9, 0);
a.digitalWrite(12, 0);
end
PROGRAMA ARDUINO

#if defined(__AVR_ATmega1280__) ||
defined(__AVR_ATmega2560__)
#define INTERNAL INTERNAL1V1
#endif

void setup() {
int i;
for (i=0;i<20;i++) {
pinMode(i,INPUT);
digitalWrite(i,0);
}
Serial.begin(115200);
}
void loop() {
static int s = -1;
static int pin = 13;
int val = 0;
int agv = 0;
int dgv = 0;
if (Serial.available() >0) {
val = Serial.read();
switch (s) {
case -1:
if (val>47 && val<90) {
s=10*(val-48);
}
if ((s>40 && s<90) || (s>90 && s!=340)) {
s=-1;
}
break;
case 0:
if (val>98 && val<117) {
pin=val-97;
s=1;
}
else {
s=-1;
}
break;
case 1:
if (val>47 && val<50) {
if (val==48) {
pinMode(pin,INPUT);
}
else {
pinMode(pin,OUTPUT);
}
}
s=-1;
break;
case 10:
if (val>98 && val<117) {
pin=val-97;
dgv=digitalRead(pin);
Serial.println(dgv);
}
s=-1;
break;
case 20:
if (val>98 && val<117) {
pin=val-97;
s=21;
}
else {
s=-1;
}
break;
case 21:
if (val>47 && val<50) {
dgv=val-48;
digitalWrite(pin,dgv);
}
s=-1;
break;
case 30:
if (val>96 && val<103) {
pin=val-97;
agv=analogRead(pin);
Serial.println(agv);
}
s=-1;
break;
case 40:
if (val>98 && val<117) {
pin=val-97;
s=41;
}
else {
s=-1;
}
break;
case 41:
analogWrite(pin,val);
s=-1;
break;
case 90:
if (val==57) {
Serial.println(1);
}
s=-1;
break;
case 340:
switch (val) {
case 48:
analogReference(DEFAULT);
break;
case 49:
analogReference(INTERNAL);
break;
case 50:
analogReference(EXTERNAL);
break;
default:
break;
}
s=-1;
break;
default:
s=-1;
}
}
}
PROGRAMA MICROCONTROLADOR
#include <16f84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#use fast_io(B)
#use fast_io(A)
#define use_portb_lcd TRUE
#include <lcd.c>
int i;
void main()
{
set_tris_a(0b10000);
output_a(0);
set_tris_b(0x00);
output_b(0);
lcd_init();
i=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"Bienvenido ");
delay_ms(200);
while(TRUE)
{
if (input(PIN_A0) && input(PIN_A3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"triangulo rojo ");
delay_ms(100);
}
else if (input(PIN_A0) && input(PIN_A4)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"triangulo verde ");
delay_ms(100);
}
else if (input(PIN_A0) && input(PIN_B3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"triangulo azul ");
delay_ms(100);
}
else if (input(PIN_A1) && input(PIN_A3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"cuadro rojo ");
delay_ms(100);
}
else if (input(PIN_A1) && input(PIN_A4)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"cuadro verde ");
delay_ms(100);
}
else if (input(PIN_A1) && input(PIN_B3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"cuadro azul ");
delay_ms(100);
}
else if (input(PIN_A2) && input(PIN_A3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"circulo rojo ");
delay_ms(100);
}
else if (input(PIN_A2) && input(PIN_A4)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"circulo verde ");
delay_ms(100);
}
else if (input(PIN_A2) && input(PIN_B3)) {
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"circulo azul ");
delay_ms(100);
}
}
}

Вам также может понравиться